目前的 Hugo 默认不支持数学公式,但是它的扩展能力让我们很容易就能做到。

目前浏览器中常用的数学排版引擎有两个:KaTeXMathJax。KaTeX 轻巧速度快,MathJax 稳重功能丰富。对于普通的个人博客,KaTeX 足够用了。

如果你的 Hugo 也是 PaperMod 主题,下面演示如何添加数学公式排版功能。本文参考了 PaperMod 作者的教程 Math Typesetting

创建数学片段文件

首先,创建片段文件 /layouts/partials/math.html,参考 KaTeX 官网 Auto-render Extension 指南,在其中粘贴如下代码:

<link
  rel="stylesheet"
  href="https://cdn.jsdelivr.net/npm/katex@0.16.21/dist/katex.min.css"
  integrity="sha384-zh0CIslj+VczCZtlzBcjt5ppRcsAmDnRem7ESsYwWwg3m/OaJ2l4x7YBZl9Kxxib"
  crossorigin="anonymous"
/>
<script
  defer
  src="https://cdn.jsdelivr.net/npm/katex@0.16.21/dist/katex.min.js"
  integrity="sha384-Rma6DA2IPUwhNxmrB/7S3Tno0YY7sFu9WSYMCuulLhIqYSGZ2gKCJWIqhBWqMQfh"
  crossorigin="anonymous"
></script>
<script
  defer
  src="https://cdn.jsdelivr.net/npm/katex@0.16.21/dist/contrib/auto-render.min.js"
  integrity="sha384-hCXGrW6PitJEwbkoStFjeJxv+fSOOQKOPbJxSfM6G5sWZjAyWhXiTIIAmQqnlLlh"
  crossorigin="anonymous"
  onload="renderMathInElement(document.body);"
></script>

如果无法访问 jsdelivr 的 CDN,也可以替换为 unpkg 网站的对应资源:

<link
  rel="stylesheet"
  href="https://unpkg.com/katex@0.16.21/dist/katex.min.css"
  integrity="sha384-zh0CIslj+VczCZtlzBcjt5ppRcsAmDnRem7ESsYwWwg3m/OaJ2l4x7YBZl9Kxxib"
  crossorigin="anonymous"
/>
<script
  defer
  src="https://unpkg.com/katex@0.16.21/dist/katex.min.js"
  integrity="sha384-Rma6DA2IPUwhNxmrB/7S3Tno0YY7sFu9WSYMCuulLhIqYSGZ2gKCJWIqhBWqMQfh"
  crossorigin="anonymous"
></script>
<script
  defer
  src="https://unpkg.com/katex@0.16.21/dist/contrib/auto-render.min.js"
  integrity="sha384-hCXGrW6PitJEwbkoStFjeJxv+fSOOQKOPbJxSfM6G5sWZjAyWhXiTIIAmQqnlLlh"
  crossorigin="anonymous"
  onload="renderMathInElement(document.body);"
></script>

当然,为了更加保险,也可以把这些资源下载到本地,放在 Hugo 的 /static 目录下即可。务必记得下载字体,否则渲染会很难看。现代浏览器只需下载 .woff2 格式即可,字体列表可参考 unpkg 这里

设置页面头

修改页面头文件 /layouts/partials/extend_head.html,如果没有的话,请新建它。在其中写入如下代码:

{{ if or .Params.math .Site.Params.math }}
{{ partial "math.html" . }}
{{ end }}

它的意思是,如果页面参数或整站参数包含 math = true,则当前页面会引入 math.html 片段文件。

开启数学模式

如果要整站启用 KaTeX,可以在 hugo.toml 中添加参数 math = true

[params]
math = true

如果只想在某个页面启用数学,可以在它的 Front Matter 中添加 math = true 参数。

+++
math = true
+++

编写数学公式

行内公式使用 \\(\\) 包裹,比如:\(E = mc^2\) 的公式是:

\\(E = mc^2\\)

而块级公式使用 $$ 包裹,比如:

$$
\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}
$$

$$ \int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi} $$