Repository: gohugoio/hugo (language: go)

Issue:
Add the other relevant KaTeX options
https://katex.org/docs/options.html

Esp. macros I guess would be useful.


Custom transform.ToMath options not read correctly
This is an unreleased feature, but it needs a fix.


Discussion / hints:

Fix patch:
diff --git a/internal/warpc/katex.go b/internal/warpc/katex.go
index 0a85d94b6a8..2412467a98d 100644
--- a/internal/warpc/katex.go
+++ b/internal/warpc/katex.go
@@ -13,10 +13,30 @@ type KatexInput struct {
 	Options    KatexOptions `json:"options"`
 }
 
+// KatexOptions defines the options for the KaTeX rendering.
+// See https://katex.org/docs/options.html
 type KatexOptions struct {
-	Output       string `json:"output"` // html, mathml (default), htmlAndMathml
-	DisplayMode  bool   `json:"displayMode"`
-	ThrowOnError bool   `json:"throwOnError"`
+	// html, mathml (default), htmlAndMathml
+	Output string `json:"output"`
+
+	// If true, display math in display mode, false in inline mode.
+	DisplayMode bool `json:"displayMode"`
+
+	// Render \tags on the left side instead of the right.
+	Leqno bool `json:"leqno"`
+
+	// If true,  render flush left with a 2em left margin.
+	Fleqn bool `json:"fleqn"`
+
+	// The color used for typesetting errors.
+	// A color string given in the format "#XXX" or "#XXXXXX"
+	ErrorColor string `json:"errorColor"`
+
+	//  A collection of custom macros.
+	Macros map[string]string `json:"macros,omitempty"`
+
+	// Specifies a minimum thickness, in ems, for fraction lines.
+	MinRuleThickness float64 `json:"minRuleThickness"`
 }
 
 type KatexOutput struct {
diff --git a/tpl/transform/transform.go b/tpl/transform/transform.go
index 10a91671d54..bcec9346bba 100644
--- a/tpl/transform/transform.go
+++ b/tpl/transform/transform.go
@@ -211,13 +211,14 @@ func (ns *Namespace) ToMath(ctx context.Context, args ...any) (template.HTML, er
 	katexInput := warpc.KatexInput{
 		Expression: expression,
 		Options: warpc.KatexOptions{
-			Output:       "mathml",
-			ThrowOnError: false,
+			Output:           "mathml",
+			MinRuleThickness: 0.04,
+			ErrorColor:       "#cc0000",
 		},
 	}
 
 	if len(args) > 1 {
-		if err := mapstructure.WeakDecode(args[1], &katexInput); err != nil {
+		if err := mapstructure.WeakDecode(args[1], &katexInput.Options); err != nil {
 			return "", err
 		}
 	}


Test patch:
diff --git a/tpl/transform/transform_integration_test.go b/tpl/transform/transform_integration_test.go
index b030417a234..9e5221c9ae6 100644
--- a/tpl/transform/transform_integration_test.go
+++ b/tpl/transform/transform_integration_test.go
@@ -149,3 +149,24 @@ disableKinds = ['page','rss','section','sitemap','taxonomy','term']
 <span class="katex"><math
 	`)
 }
+
+func TestToMathMacros(t *testing.T) {
+	t.Parallel()
+
+	files := `
+-- hugo.toml --
+disableKinds = ['page','rss','section','sitemap','taxonomy','term']
+-- layouts/index.html --
+{{ $macros := dict 
+    "\\addBar" "\\bar{#1}"
+	"\\bold" "\\mathbf{#1}"
+}}
+{{ $opts := dict "macros" $macros }}
+{{ transform.ToMath "\\addBar{y} + \\bold{H}" $opts }}
+  `
+	b := hugolib.Test(t, files)
+
+	b.AssertFileContent("public/index.html", `
+<mi>y</mi>
+	`)
+}