Skip to content

数学

MathJaxKaTeX 是两个在浏览器中显示数学内容的流行库。尽管这两个库提供了类似的功能,但它们使用的语法不同,并且有不同的配置选项。本文档网站提供了如何轻松地将它们与 MkDocs 的 Material 集成的信息。

配置

以下配置启用了使用 MathJaxKaTeX 渲染块和内联块等式的支持。

MathJax

MathJax 是一个强大且灵活的库,支持多种输入格式,如 LaTeXMathMLAsciiMath,以及各种输出格式,如 HTML、SVG、MathML。要在项目中使用 MathJax,将以下行添加到 mkdocs.yml

window.MathJax = {
  tex: {
    inlineMath: [["\\(", "\\)"]],
    displayMath: [["\\[", "\\]"]],
    processEscapes: true,
    processEnvironments: true
  },
  options: {
    ignoreHtmlClass: ".*|",
    processHtmlClass: "arithmatex"
  }
};

document$.subscribe(() => { // (1)!
  MathJax.typesetPromise()
})
  1. 这将 MathJax 与 即时加载 集成。
markdown_extensions:
  - pymdownx.arithmatex:
      generic: true

extra_javascript:
  - javascripts/mathjax.js
  - https://polyfill.io/v3/polyfill.min.js?features=es6
  - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js

查看额外的配置选项:

KaTeX

KaTeX 是一个轻量级的库,专注于速度和简单性。它支持 LaTeX 语法的一个子集,并可以将数学渲染为 HTML 和 SVG。要在项目中使用 KaTeX,将以下行添加到 mkdocs.yml

document$.subscribe(({ body }) => { // (1)!
  renderMathInElement(body, {
    delimiters: [
      { left: "$",  right: "$",  display: true },
      { left: "$",   right: "$",   display: false },
      { left: "\\(", right: "\\)", display: false },
      { left: "\\[", right: "\\]", display: true }
    ],
  })
})
  1. 这将 KaTeX 与 即时加载 集成。
extra_javascript:
  - javascripts/katex.js
  - https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.7/katex.min.js  # (1)!
  - https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.7/contrib/auto-render.min.js

extra_css:
  - https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.7/katex.min.css
  1. 或者,你可以通过覆盖 HTML 文件来通过 script 标签添加这些 JavaScript 和 CSS 文件。

使用

使用块语法

块必须在 $...$\[...\] 中单独一行封闭:

block syntax
$$
\operatorname{ker} f=\{g\in G:f(g)=e_{H}\}{\mbox{.}}
$$
\[ \operatorname{ker} f=\{g\in G:f(g)=e_{H}\}{\mbox{.}} \]

使用内联块语法

内联块必须在 $...$\(...\) 中封闭:

内联语法
The homomorphism $f$ is injective if and only if its kernel is only the
singleton set $e_G$, because otherwise $\exists a,b\in G$ with $a\neq b$ such
that $f(a)=f(b)$.

The homomorphism \(f\) is injective if and only if its kernel is only the singleton set \(e_G\), because otherwise \(\exists a,b\in G\) with \(a\neq b\) such that \(f(a)=f(b)\).

比较 MathJax 和 KaTeX

在决定使用 MathJax 还是 KaTeX 时,有几个关键因素需要考虑:

  • 速度:KaTeX 通常比 MathJax 快。如果你的网站需要快速渲染大量复杂的等式,KaTeX 可能是更好的选择。

  • 语法支持:MathJax 支持更广泛的 LaTeX 命令,并可以处理各种数学标记语言(如 AsciiMath 和 MathML)。如果你需要高级的 LaTeX 功能,MathJax 可能更适合。

  • 输出格式:两个库都支持 HTML 和 SVG 输出。然而,MathJax 还提供了 MathML 输出,这对于可访问性至关重要,因为它可以被屏幕阅读器读取。

  • 可配置性:MathJax 提供了一系列配置选项,允许对其行为进行更精确的控制。如果你有特定的渲染需求,MathJax 可能是更灵活的选择。

  • 浏览器支持:虽然两个库在现代浏览器中都工作得很好,但 MathJax 对旧浏览器的兼容性更广。如果你的受众使用各种浏览器,包括旧的浏览器,MathJax 可能是更安全的选项。

总的来说,KaTeX 以其速度和简单性而闪耀,而 MathJax 则以牺牲速度来提供更多的功能和更好的兼容性。两者之间的选择将在很大程度上取决于你的特定需求和约束。