在纯粹的 .tex 文件里,不存在 Markdown 的干扰,规则非常清晰:
换行统一使用
\\(两个反斜杠)
% 矩阵中换行
\begin{pmatrix}
1 & 2 \\
3 & 4
\end{pmatrix}
% 多行公式中换行
\begin{aligned}
a &= 1 \\
b &= 2
\end{aligned}
这里只需要写 \\,不需要任何额外的转义,因为 LaTeX 编译器直接理解它。
混乱的根源在于:Markdown 解析器和 LaTeX 解析器是两层,反斜杠在每一层都有特殊含义。
在 Markdown 中,反斜杠 \ 本身就是一个转义字符。例如:
\* 会被渲染为普通星号 *,而不是斜体标记。
\\ 会被 Markdown 解析器转义成 一个普通的 \。
这就导致了一个问题,当你在 Markdown 中写:
$$
\begin{pmatrix}
1 & 2 \\
3 & 4
\end{pmatrix}
$$
Markdown 解析器首先处理它,把 \\ 转换成 \。然后交给 KaTeX / MathJax 的内容就变成了:
\begin{pmatrix}
1 & 2 \
3 & 4
\end{pmatrix}
LaTeX 看到单个 \ 后面跟着换行,它不认为这是换行指令,于是报错。
Markdown 先解析,LaTeX 后解析。
规则:在每个 LaTeX 需要 \\ 的地方,Markdown 中要写 \\\\(四个反斜杠)。
这些工具通常有“代码块”或“原始内容”保护机制。
如果在代码块中写 LaTeX,则不需要双重转义,直接写 \\ 即可。 因为代码块内的内容不会被 Markdown 解析器处理。
但是,如果你是在段落中直接写 $$...$$,则依然需要 \\\\。
Jupyter 的 Markdown 单元格使用 MathJax 渲染,规则与情况一相同:需要写 \\\\。
| 环境 | 换行写法 | 备注 |
|---|---|---|
| 纯 LaTeX(.tex 文件) | \\ | 无 Markdown 干扰 |
| Markdown → KaTeX/MathJax(网页) | \\\\ | Markdown 先转义一次 |
| Markdown 代码块内的 LaTeX | \\ | 代码块保护内容 |
| 某些编辑器(Typora 等) | \\ 或 \\\\ | 看平台是否自动处理 |
在 Markdown 中,反斜杠 \ 的转义功能不是无条件的。它只在后面跟着具有特殊 Markdown 含义的标点符号时,才会触发转义。
以下是 Markdown 中具有特殊含义的标点符号(标准定义):
\ ` * _ { } [ ] ( ) # + - . ! | < >
当你写 \*、\_、\[ 等时,Markdown 会把 \ 吃掉,输出普通的 *、_、[。
如果 \ 后面跟着的是普通字母,比如 \t、\f、\text,Markdown 的转义机制不会被触发。它会认为这只是一个普通的反斜杠加字母,原样保留。
\text{平均速度}
这里 \t 是反斜杠加字母 t。字母 t 不在 Markdown 的特殊字符列表中,所以 Markdown 说:“这不是需要我转义的东西,我不管。”于是 \text 被原封不动地传给了 KaTeX。KaTeX 收到 \text,这是它认识的 LaTeX 命令,于是正确渲染了。