Markdown 里写 LaTeX 公式
行内公式写在单个美元符号之间,比如 $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。
美元符号前面加反斜杠就是告诉渲染器不要动它。妙言开启了转义处理,预处理也会跳过被转义的定界符。
出问题怎么查
- 什么都没渲染,美元符号原样显示。 结束定界符缺失,或者跨过了代码段,公式不能在代码段里开始、在外面结束。
- 公式在某个下划线处被截断。 文本被当成了 Markdown,妙言已经做了保护,其他应用里可以写成
\_或改用块级。 - 块级公式留在段落里并多出换行。 把
$$各占一行,前后空一行。妙言也会清理单段$$块里的换行。 - 花括号错误。 每个
{都要有对应的},括号不配对时引擎不会排版。 - 某个命令没有效果。 该命令可能不在 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} 给行加标签,可以手动编号。
