Markdown 里写 LaTeX 公式

Markdown 写作约 4 分钟

行内公式写在单个美元符号之间,比如 $E = mc^2$,块级公式写在各占一行的双美元符号之间。Markdown 本身没有数学语法,靠应用的渲染器识别出这些定界符,再交给 TeX 引擎排版,常见的引擎是 KaTeX 或 MathJax。妙言用的是 KaTeX 0.16.0,随应用打包,所以公式渲染不需要联网。最常见的几类问题是美元符号被当成公式、某些环境需要套一层外壳,以及下划线在引擎看到之前就被 Markdown 吃掉了。

行内公式和块级公式

静止时的能量是 $E = mc^2$。

$$
\int_0^1 x^2 \, dx = \frac{1}{3}
$$

行内公式嵌在句子里,排版紧凑,块级公式单独居中,运算符是完整大小,求和与积分的上下限会放在符号的上下方。公式只是句子的一部分就用行内,想让读者专门看它就用块级。

妙言识别四对定界符,分别是 $...$、$$...$$、\(...\) 和 \[...\],后两种是 LaTeX 原生写法。可以混用,不过行内和块级各自固定一套写法,笔记在不同应用之间搬运会省心很多。

最常用的写法

想写的 写法
分数 \frac{a}{b}
平方根、n 次根 \sqrt{x}、\sqrt[3]{x}
上标、下标 x^2、x_i,多个字符要加花括号,比如 x^{10}、x_{ij}
带上下限的求和 \sum_{i=1}^{n} x_i
积分 \int_a^b f(x)\,dx
希腊字母 \alpha、\beta、\pi、\Omega
公式里的文字 \text{if } x > 0
极限 \lim_{t \to \infty}

\frac、\sum、\int、\sqrt 和 \text 在 KaTeX 文档里都列为支持。dx 前面的 \, 加一个细空格,这是积分常见的排版习惯。

矩阵、分段函数和对齐公式

$$
\begin{pmatrix} a & b \\ c & d \end{pmatrix}
$$

$$
f(x) = \begin{cases} x^2 & x \ge 0 \\ 0 & x < 0 \end{cases}
$$

$$
\begin{aligned}
a &= b + c \\
  &= d
\end{aligned}
$$

用 & 分列,用 \\ 换行。KaTeX 把 matrix、pmatrix、bmatrix、cases、align、aligned 等列为支持的环境。在妙言里要把 aligned 套在 $$ 里面。KaTeX 的 auto-render 扩展默认能识别裸写的 \begin{align},但妙言的定界符只有上面这四对,裸写的 \begin{align} 在这里不会被识别成公式,套一层 $$ 的写法在更多应用里也都能用。

它实际是怎么工作的

Markdown 解析器并不知道什么是公式,看到 a_b_c 可能把下划线当成强调,看到 \\ 可能把一个反斜杠当成转义,所以应用必须在 Markdown 解析之前先把公式保护起来,之后再把原文交给 TeX 引擎。

妙言分两步做这件事。先用一个预处理找出代码段和代码块之外的公式范围,跳过被转义的定界符,把里面的内容挡在解析器之外。解析后的 HTML 再装进网页视图,由 KaTeX 的 auto-render 脚本扫描四对定界符,替换成排好版的结果。KaTeX 默认忽略 code 和 pre 标签,所以代码块里的公式不会被渲染。

引擎之间的差别也在这里。KaTeX 快,同步渲染,支持 LaTeX 的一个子集。MathJax 是另一个常见引擎,Typora 官网说它支持大部分 MathJax 扩展,包括 mhchem 和 AMSmath。公式如果来自用了冷门宏包的论文,先在编辑器里实测,再决定能不能依赖。妙言内置的 KaTeX 0.16.0 完全从应用内文件运行。

美元符号和价格

单个 $ 同时也是货币符号,这是最常见的坑。妙言对此有一道保护,美元符号后面跟着数字,数字后面又不是数学的延续字符,就当作货币处理,所以 It costs $5 today 保持文本,$2+2$ 仍然是公式,因为数字后面的 + 算作数学延续。别的编辑器未必有这道保护,笔记要在各处都正常显示的话,最好手动加上反斜杠转义。

门票 \$5,升级版 \$10。

美元符号前面加反斜杠就是告诉渲染器不要动它。妙言开启了转义处理,预处理也会跳过被转义的定界符。

出问题怎么查

  1. 什么都没渲染,美元符号原样显示。 结束定界符缺失,或者跨过了代码段,公式不能在代码段里开始、在外面结束。
  2. 公式在某个下划线处被截断。 文本被当成了 Markdown,妙言已经做了保护,其他应用里可以写成 \_ 或改用块级。
  3. 块级公式留在段落里并多出换行。 把 $$ 各占一行,前后空一行。妙言也会清理单段 $$ 块里的换行。
  4. 花括号错误。 每个 { 都要有对应的 },括号不配对时引擎不会排版。
  5. 某个命令没有效果。 该命令可能不在 KaTeX 的支持列表里,先查 KaTeX 的 Supported Functions 页面,再判断是不是 bug。

想验证安装是否正常,新建一篇笔记贴上下面三段,按 ⌘3 进入预览或按 ⌘\ 打开分栏。

行内:$\sqrt{2}$

$$
\sum_{i=1}^{n} i = \frac{n(n+1)}{2}
$$

价格:\$5

看到根号、带上下限的求和以及普通文本 $5,就说明引擎和转义都在正常工作。妙言的演示模式里公式同样可用,见 Markdown 转幻灯片,其余语法见 Markdown 语法速查。

需要知道的限制

  • KaTeX 覆盖笔记里的大部分需求,但不是全部 LaTeX,像导言区里用 \newcommand 定义的宏和宏包在 Markdown 笔记里无法使用。
  • 公式在预览里渲染,编辑区显示的是源码。
  • PDF、HTML 和图片导出都来自渲染后的预览,重要的公式导出后要看一眼。

常见问题

妙言的公式需要联网吗

不需要,KaTeX 随应用打包。这一类功能里需要联网的是 PlantUML,它会发到公共服务器渲染。

KaTeX 和 MathJax 怎么选

需要某个只有 MathJax 才有的扩展,就用提供它的编辑器。普通的代数、微积分、矩阵和对齐公式,KaTeX 够用而且渲染快。

怎么写字面的美元符号

前面加反斜杠写成 \$5,或者放进行内代码。

公式能自动编号吗

Typora 官网说开启后可以自动给公式编号。妙言没有公式编号的设置,KaTeX 在部分环境里支持用 \tag{1} 给行加标签,可以手动编号。