mirror of
https://github.com/gohugoio/hugo.git
synced 2026-08-24 15:28:54 +00:00
c23d97904f
1f8ddb8a52 content: clarify resources front matter key descriptions e064ab8528 content: Add deprecation badges to module config page 727ca5563a github: Add push trigger to lint workflow 64dd5c9886 content: Fix typo c5bc6b6515 github: Fix lint workflow faec0c3a0a github: Combine linting actions into a single workflow 06112aeaf2 theme: Miscellaneous template edits 75d4902270 theme: Format templates with gotmplfmt fec2e2a67e content: Document that the language code in a file name must be lowercase 9dbd841ba6 content: Document the src attribute in the Page Resources metadata reference fd3ffef985 content: Fix "build from source" instructions for Windows af4c9cd4d7 content: Miscellaneous edits 408d8b2f0a content: Miscellaneous edits e8804afe6e content: Fix typo d98276be30 content: Updates for v0.161.0 01b1f8fa12 content: Note merge limitation for slice configuration values d2b18f0c8d content: Document page matcher usage for cascading values 45e5bd9ab3 content: Update Cloudflare Worker host/deploy guide b83726b89a content: Document fallback rendering for fenced code blocks 8f1eeb42bc content: Update reference for source code shortcode e8da56303b content: Add gotmplfmt to list of VS Code extensions 950fabbfd6 content: Update FAQ on feature availability error 6411146d24 content: Update quick start guide 38cc39fd51 content: Add Hugo Shortcodes to list of VS Code extensions 72d98b107b content: Misc updates to get validators to pass 9fb0e1ca35 Add a paragraph about sec boundaries e6abf5644f content: Improve syntax highlighting documentation c06193bd1a content: Update go-i18n package reference ce58fef945 Hugo 0.161.1 c7e0f63385 content: Fix package references 7f15fb3bf9 data: Regen docshelper 7483d53b55 Update HUGO_VERSION to 0.161.0 c4abcdb45f security: Add a bullet point about "pragmatic defaults" 3cd7492862 content: Improve explanation of mount removal in module configurations 4099f07bb9 content: Update GitHub Pages workflow example a6c9853a58 content: Fix typo e6f79a938b Update netlify.toml abda3d6659 content: Update Action versions in GitHub Pages workflow example 55dd288fa9 content: Add GitCMS to front-ends tools list 21081f6d49 content: Remove outdated new-in badges b2ec263884 content: Update version references 825e0b8ea9 One more CSS var adjustment 85f95a899b Adjust css.Build var docs a little df48288002 content: Updates for v0.160.0 a82a9b9797 Update HUGO_VERSION to 0.160.0 1155747dc4 content: Improve CSS processing feature description f6ce893974 content: Add css.Build to features 67b8ed1198 content: Fix typos 0f62a67863 content: Fix typo dbb42aed4a content: Document the deploy edition 549f30f933 content: De-emphasize references to the extended edition 8f5c9782d4 content: Add Pages CMS to front-ends documentation b2bfc3af48 Update HUGO_VERSION to 0.159.2 3793156fc5 content: Fix typos bacd4824ef content: Specify function namespace in example 7f2dc0d40a Regen docs.yml 65a851f731 Update HUGO_VERSION to 0.159.1 ce05fe3fc0 content: Adjust variable references in build script examples 8a04f9fe64 content: Improve hosting build script examples 67962ce05c content: Link to Codeberg Pages 404 handling fd248f57ed content: Identify esbuild as the foundation for build functions 62f02879fd content: Remove outdated content 553c407f9e content: Miscellaneous corrections 77e2cad088 content: Add new-in badge for usePackageJSON 0746e1e621 Add a page on using npm dependencies in Hugo Modules 8824850f5c Update HUGO_VERSION to 0.159.0 git-subtree-dir: docs git-subtree-split: 1f8ddb8a5230518f07c50b4b03cba3cae21081c4
197 lines
7.3 KiB
Markdown
197 lines
7.3 KiB
Markdown
---
|
|
title: transform.ToMath
|
|
description: Renders mathematical equations and expressions written in the LaTeX markup language.
|
|
categories: []
|
|
keywords: []
|
|
params:
|
|
functions_and_methods:
|
|
aliases: []
|
|
returnType: template.HTML
|
|
signatures: ['transform.ToMath INPUT [OPTIONS]']
|
|
aliases: [/functions/tomath]
|
|
---
|
|
|
|
{{< new-in 0.132.0 />}}
|
|
|
|
Hugo uses an embedded instance of the [KaTeX][] display engine to render mathematical markup to HTML. You do not need to install the KaTeX display engine.
|
|
|
|
```go-html-template
|
|
{{ transform.ToMath "c = \\pm\\sqrt{a^2 + b^2}" }}
|
|
```
|
|
|
|
> [!note]
|
|
> By default, Hugo renders mathematical markup to [MathML][], and does not require any CSS to display the result.
|
|
>
|
|
> To optimize rendering quality and accessibility, use the `htmlAndMathml` output option as described below. This approach requires an external stylesheet.
|
|
|
|
```go-html-template
|
|
{{ $opts := dict "output" "htmlAndMathml" }}
|
|
{{ transform.ToMath "c = \\pm\\sqrt{a^2 + b^2}" $opts }}
|
|
```
|
|
|
|
## Options
|
|
|
|
Pass a map of options as the second argument to the `transform.ToMath` function. The options below are a subset of the KaTeX [rendering options][].
|
|
|
|
displayMode
|
|
: (`bool`) Whether to render in display mode instead of inline mode. Default is `false`.
|
|
|
|
errorColor
|
|
: (`string`) The color of the error messages expressed as an RGB [hexadecimal color][]. Default is `#cc0000`.
|
|
|
|
fleqn
|
|
: (`bool`) Whether to render flush left with a 2em left margin. Default is `false`.
|
|
|
|
macros
|
|
: (`map`) A map of macros to be used in the math expression. Default is `{}`.
|
|
|
|
```go-html-template
|
|
{{ $macros := dict
|
|
"\\addBar" "\\bar{#1}"
|
|
"\\bold" "\\mathbf{#1}"
|
|
}}
|
|
{{ $opts := dict "macros" $macros }}
|
|
{{ transform.ToMath "\\addBar{y} + \\bold{H}" $opts }}
|
|
```
|
|
|
|
minRuleThickness
|
|
: (`float`) The minimum thickness of the fraction lines in `em`. Default is `0.04`.
|
|
|
|
output
|
|
: (`string`) Determines the markup language of the output, one of `html`, `mathml`, or `htmlAndMathml`. Default is `mathml`.
|
|
|
|
With `html` and `htmlAndMathml` you must include the KaTeX style sheet within the `head` element of your base template.
|
|
|
|
```html
|
|
<link
|
|
rel="stylesheet"
|
|
href="https://cdn.jsdelivr.net/npm/katex@0.16.25/dist/katex.min.css"
|
|
integrity="sha384-WcoG4HRXMzYzfCgiyfrySxx90XSl2rxY5mnVY5TwtWE6KLrArNKn0T/mOgNL0Mmi"
|
|
crossorigin="anonymous"
|
|
>
|
|
```
|
|
|
|
strict
|
|
: {{< new-in 0.147.6 />}}
|
|
: (`string`) Controls how KaTeX handles LaTeX features that offer convenience but aren't officially supported, one of `error`, `ignore`, or `warn`. Default is `error`.
|
|
|
|
- `error`: Throws an error when convenient, unsupported LaTeX features are encountered.
|
|
- `ignore`: Allows convenient, unsupported LaTeX features without any feedback.
|
|
- `warn`: {{< new-in 0.147.7 />}} Emits a warning when convenient, unsupported LaTeX features are encountered.
|
|
|
|
The `newLineInDisplayMode` error code, which flags the use of `\\` or `\newline` in display mode outside an array or tabular environment, is intentionally designed not to throw an error, despite this behavior being questionable.
|
|
|
|
throwOnError
|
|
: (`bool`) Whether to throw a `ParseError` when KaTeX encounters an unsupported command or invalid LaTeX. Default is `true`.
|
|
|
|
## Error handling
|
|
|
|
There are three ways to handle errors:
|
|
|
|
1. Let KaTeX throw an error and fail the build. This is the default behavior.
|
|
1. Set the `throwOnError` option to `false` to make KaTeX render the expression as an error instead of throwing an error. See [options](#options).
|
|
1. Handle the error in your template.
|
|
|
|
The example below demonstrates error handing within a template.
|
|
|
|
## Example
|
|
|
|
Instead of client-side JavaScript rendering of mathematical markup using MathJax or KaTeX, create a passthrough render hook which calls the `transform.ToMath` function.
|
|
|
|
Step 1
|
|
: Enable and configure the Goldmark [passthrough extension][] in your project configuration. The passthrough extension preserves raw Markdown within delimited snippets of text, including the delimiters themselves.
|
|
|
|
[passthrough extension]: /configuration/markup/#passthrough
|
|
|
|
{{< code-toggle file=hugo copy=true >}}
|
|
[markup.goldmark.extensions.passthrough]
|
|
enable = true
|
|
[markup.goldmark.extensions.passthrough.delimiters]
|
|
block = [['\[', '\]'], ['$$', '$$']]
|
|
inline = [['\(', '\)']]
|
|
{{< /code-toggle >}}
|
|
|
|
> [!note]
|
|
> The configuration above precludes the use of the `$...$` delimiter pair for inline equations. Although you can add this delimiter pair to the configuration, you must double-escape the `$` symbol when used outside of math contexts to avoid unintended formatting.
|
|
|
|
Step 2
|
|
: Create a [passthrough render hook][] to capture and render the LaTeX markup.4
|
|
|
|
[passthrough render hook]: /render-hooks/passthrough/
|
|
|
|
```go-html-template {file="layouts/_markup/render-passthrough.html" copy=true}
|
|
{{- $opts := dict "output" "htmlAndMathml" "displayMode" (eq .Type "block") }}
|
|
{{- with try (transform.ToMath .Inner $opts) }}
|
|
{{- with .Err }}
|
|
{{- errorf "Unable to render mathematical markup to HTML using the transform.ToMath function. The KaTeX display engine threw the following error: %s: see %s." . $.Position }}
|
|
{{- else }}
|
|
{{- .Value }}
|
|
{{- $.Page.Store.Set "hasMath" true }}
|
|
{{- end }}
|
|
{{- end -}}
|
|
```
|
|
|
|
Step 3
|
|
: In your base template, conditionally include the KaTeX CSS within the head element.
|
|
|
|
```go-html-template {file="layouts/baseof.html" copy=true}
|
|
<head>
|
|
{{ $noop := .WordCount }}
|
|
{{ if .Page.Store.Get "hasMath" }}
|
|
<link
|
|
rel="stylesheet"
|
|
href="https://cdn.jsdelivr.net/npm/katex@0.16.25/dist/katex.min.css"
|
|
integrity="sha384-WcoG4HRXMzYzfCgiyfrySxx90XSl2rxY5mnVY5TwtWE6KLrArNKn0T/mOgNL0Mmi"
|
|
crossorigin="anonymous"
|
|
>
|
|
{{ end }}
|
|
</head>
|
|
```
|
|
|
|
In the above, note the use of a [noop](g) statement to force content rendering before we check the value of `hasMath` with the `Store.Get` method.
|
|
|
|
> [!note]
|
|
> This conditional approach only identifies math on the current page. Mathematical expressions will not display correctly when one page's content is embedded within another. For example, if a [list page](g) calls the [`Content`][] or [`Summary`][] methods while ranging through its page collection, the list page will not load the KaTeX CSS.
|
|
>
|
|
> If this affects your site, use this conditional logic instead:
|
|
>
|
|
> ```go-html-template {file="layouts/baseof.html" copy=true}
|
|
> {{ $noop := .WordCount }}
|
|
> {{ if or (.Page.Store.Get "hasMath") .IsNode }}
|
|
> <link rel="stylesheet" href="...">
|
|
> {{ end }}
|
|
> ```
|
|
|
|
Step 4
|
|
: Add some mathematical markup to your content, then test.
|
|
|
|
```text {file="content/example.md"}
|
|
This is an inline \(a^*=x-b^*\) equation.
|
|
|
|
These are block equations:
|
|
|
|
\[a^*=x-b^*\]
|
|
|
|
$$a^*=x-b^*$$
|
|
```
|
|
|
|
## Chemistry
|
|
|
|
{{< new-in 0.144.0 />}}
|
|
|
|
You can also use the `transform.ToMath` function to render chemical equations, leveraging the `\ce` and `\pu` functions from the [`mhchem`][] package.
|
|
|
|
```text
|
|
$$C_p[\ce{H2O(l)}] = \pu{75.3 J // mol K}$$
|
|
```
|
|
|
|
$$C_p[\ce{H2O(l)}] = \pu{75.3 J // mol K}$$
|
|
|
|
[KaTeX]: https://katex.org/
|
|
[MathML]: https://developer.mozilla.org/en-US/docs/Web/MathML
|
|
[`Content`]: /methods/page/content/
|
|
[`Summary`]: /methods/page/summary/
|
|
[`mhchem`]: https://mhchem.github.io/MathJax-mhchem/
|
|
[hexadecimal color]: https://developer.mozilla.org/en-US/docs/Web/CSS/hex-color
|
|
[rendering options]: https://katex.org/docs/options.html
|