少写一个收尾的 $,LaTeX 不会告诉你错在哪里。它会一直跑到段落末尾才报 ! Missing $ inserted.,而输出里的单词会挤成一团斜体。数学模式 的本质就在这里:它不是切换字体,而是切换规则本身。你敲的空格会消失,字母会变成变量名,+ 和 = 两侧会自动获得固定的间距。本页梳理进入 LaTeX 数学模式的两个入口——行内的 $…$ 与 \(…\),以及独立成行的 \[…\]——并说明为什么唯独要避开 $$…$$,以及为什么在公式里写一个普通单词需要 \text{}。
进入数学模式后到底改变了什么
变的有三件事:你敲的空格会消失、每个字母都成为变量名并排成数学斜体、每个符号都被赋予一个「类别」,两侧的间距由此自动算出。所以 a+b 和 a + b 会输出得分毫不差;反过来,输入 log x 得到的是「logx」——l、o、g、x 四个变量的乘积。写成函数 \log x,log 就会排成正体,并在 x 前面留出一点细空。同样是这三个字母,在 TeX 眼里完全是两回事。
% identical output: spaces in the source are ignored
$a+b$ \qquad $a + b$
% "logx" (four variables) vs. the function name
$log x$ \qquad $\log x$这个「类别」是 TeX 的核心机制之一。公式里的每个成分都会被归为普通原子(Ord)、大型算符(Op)、二元运算符(Bin)、关系符(Rel)、开括号、闭括号或标点之一,相邻两者的间距则由这对类别查表得出。= 属于关系符,所以两侧各带一个 \thickmuskip——默认为 5mu。在 10pt 的文档里 18mu 等于 1em 即 10pt,于是这一侧的空隙正好是 2.78pt。数字不必记住,值得记住的是这个想法:间距来自意义。想手动加空隙时,可用 \,(细空)、\;、\quad 和 \qquad。
这些规则只在数学模式内部生效。所以在正文里直接写 \to 或 \alpha 会报错,而不只是难看:在数学模式之外,那条间距规则根本不存在。把 A \to B 写进正文,pdflatex 就会回你一句 ! Missing $ inserted.。要用数学符号,先进入数学模式——于是就说到入口了。
行内公式该用 $…$ 还是 \(…\)
输出完全一样。不同的只是 出错时会发生什么。$ 在 TeX 里的类别码是 3,也就是所谓「数学切换」,开始和结束用的是同一个字符:$ 是开关,不是括号。而 \( 与 \) 在 latex.ltx 中被定义为两个不同的宏,各自都会先检查「现在是否处于数学模式」再动作。少写一个定界符时两者表现迥异,原因就在这里。
% one closing $ dropped: this compiles, and prints "We compare xandyinthetext."
We compare $x and $y$ in the text.
% the same mistake with \( \): pdflatex stops on this very line
We compare \( x and \( y \) in the text.上面第一行可怕之处正在于它 能编译通过。TeX 把从第一个 $ 到第二个 $ 之间的内容当作公式,丢掉「x and 」里的所有空格并排成斜体,剩下的那个 $ 最终在段落末尾绊倒,抛出 ! Missing $ inserted.——报告的行号指向 \end{document},而版面上印的是「We compare xandyinthetext.」。第二行犯的是同样的错,但第二个 \( 发现数学模式已经打开,于是 就在那一行 报出 ! LaTeX Error: Bad math environment delimiter.。不必逐行翻查长段落,这点差别在实际工作中比听上去重要得多。
实用的判断是:新开始写的文档,尤其是公式多的文档,把 \(…\) 定为默认。 短短的 $…$ 全世界都看得懂,若编辑器能给配对上色也完全够用,不值得为它改写已有的稿件。环境形式 \begin{math}…\end{math} 作用相同,但放在行内实在太长,几乎无人使用。另外,若想在正文里印出美元符号本身,写 \$。
独立成行的公式用 \[…\] 排版
重要或体量大的公式要从段落中提出来,单独占一行。不需要编号就用 \[ … \],需要编号就用 equation 环境。\[…\] 与环境形式的 displaymath 完全是一回事:默认居中,若给文档类加上 fleqn 选项则改为左对齐。它的上下会插入 \abovedisplayskip 与 \belowdisplayskip——10pt 文档中各为 10pt——这段垂直留白正是「独立成行」的观感来源。
The following identity holds.
\[
\int_0^1 x^2 \, dx = \frac{1}{3}
\]
It is one of the first integrals anyone computes.这里有一个知道之后会豁然开朗的事实:一旦载入 amsmath,\[ 与 \] 就会 被 equation* 环境本身取代——amsmath.sty 的最后两行正是 \DeclareRobustCommand{\[}{\begin{equation*}} 和 \DeclareRobustCommand{\]}{\end{equation*}}。所以在 amsmath 之下,「该用 \[…\] 还是 equation*」这个问题并不成立:它们就是同一样东西。只需按「要不要编号」在 equation 和 \[…\] 之间选择即可。
| 写法 | 编号 | 备注 |
|---|---|---|
\[ … \] | 无 | LaTeX 的写法;在 amsmath 下就是 equation* |
displaymath | 无 | 与 \[ \] 相同的环境形式;冗长,少用 |
equation | 有 | 自动连续编号;加 \label 后可用 \ref 或 \eqref 引用 |
equation* | 无 | 需要 amsmath;载入后 \[ \] 的真身 |
$$ … $$ | 无 | plain TeX 的写法;不要使用(见下节) |
为什么唯独不能用 $$…$$
$$…$$ 是 plain TeX 打开陈列公式的写法,LaTeX 从未把它写进面向作者的文档。它并非被禁止——LaTeX 自己内部就在用。latex.ltx 里写着 \def\equation{$$\refstepcounter{equation}},equation 和 eqnarray 的底层都是 $$。问题在于:当 你自己 敲下 $$ 时,就直接绕过了 LaTeX 的宏层,而文档类选项和 amsmath 的机制正是搭在那一层上的。
fleqn选项失效。fleqn.clo重新定义的只有四样东西——\[、\]、equation和eqnarray——从不碰$$。在带[fleqn]的article中实测:\[a=b\]从左边距起 25pt 处开始,而$$a=b$$依然居中,两者在纸面上相差 135pt。- 垂直间距会变。 当
\[位于段落开头时,它会先悄悄插入一个宽度为行宽 0.6 倍的隐形盒子,然后才执行$$。这个小把戏是为了让 TeX 相信「上一行很长」;没有它,TeX 会选用短版间距(\belowdisplayshortskip,6pt)。实测中$$版本下方的空白正好窄了 4pt。 \qedhere会跑错位置。 在 amsthm 的proof环境里给最后一个公式加\qedhere:写成\[…\]时证毕符号会靠在右边距上;写成$$…$$时它却紧贴公式,还把整条公式挤离中心。- amsmath 添加的一切都会失效。 既然 amsmath 下的
\[就是equation*,敲下$$也就丢掉了\tag、\qedhere以及编号自动避让所依赖的地基。
AMS 的 Short Math Guide for LaTeX(version 2.0, 2017/12/22,随 TeX Live 2024 分发)持同样立场,强烈劝阻使用 $$,理由有二:它从未被写进 LaTeX 的命令集文档;它会妨碍 fleqn 之类功能的正常运作。结论很短:不编号的陈列公式用 \[…\],编号的用 equation。若接手了满是 $$ 的稿件,现在就机械地替换掉,将来加入 fleqn 或证明环境的那天就会平静地度过。
在公式里写单词:为什么需要 \text{}
在数学模式里字母就是变量,所以 if 是 i 与 f 的乘积,area 是四个变量的乘积。要把一个单词 当作单词 放进去——正体、间距正确——就用 amsmath 的 \text{…}。它的内容以正文字体和正文间距排版,你在其中敲的空格也会保留,所以 \text{ for all } 两侧的空隙都在。反过来,在 \text{…} 里写 $…$,那一段又会切回数学模式。
\[
f(x) = x^2 \quad \text{for all } x \in \mathbb{R},
\qquad v_{\text{max}} = 3.
\]\text 的好处是 会跟随周围的尺寸。amstext.sty 中的定义用 \mathchoice 为陈列、文本、上下标、二级上下标四种语境各分配一个字号。测一下上面 v_{\text{max}} 里的「max」,高 6.19pt——正是上下标字号;同样的东西写成 \mbox{max} 则是 8.85pt,以正文大小赖在下标里,与周围格格不入。\mbox 是通用的「装进盒子」命令,本来就不是数学工具。另外,\text 在文本模式中被调用时会退回 \mbox,所以在不确定被哪种模式调用的宏里使用也很安全。忘记载入 amsmath 则会得到 ! Undefined control sequence.。
文本样式与陈列样式:同一个公式为何看起来不同
数学模式有四种 样式,TeX 会依上下文自动挑选:行内用 文本样式,小到不至于破坏行高;独立成行用 陈列样式,留有余裕;上下标用 上下标样式;上下标的上下标用 二级上下标样式。这就是同一个 \sum_{i=1}^{n} 在行内时范围小小地挂在符号右侧、在陈列公式中却大大地置于上下方的原因。
- 求和与积分的范围:陈列样式中,
\sum的范围位于符号上下方;文本样式中则位于右侧。\int的变化方式相同。 - 分数:
\frac在陈列样式中较大,在文本样式中紧凑而小。若想不受语境影响地固定大小,请用 amsmath 的\dfrac与\tfrac。 - 上下标:每嵌套一层就缩小一级,到二级上下标样式为止不再更小。
样式也可以手动切换:\displaystyle、\textstyle、\scriptstyle、\scriptscriptstyle。常见用法是想让正文中的求和范围上下排布时写 $\displaystyle\sum_{i=1}^{n} i$。但要注意,在正文里大量使用 \displaystyle 会让行高参差不齐,段落起伏。惯例是 只在某一处确实需要时 才用。
% limits sit at the right of the sign
Inline: $\sum_{i=1}^{n} i$
% limits forced above and below
Forced: $\displaystyle\sum_{i=1}^{n} i$函数名要写成命令:\sin、\log、\lim
由上述规则可知,敲 sin x 写下的是 s、i、n、x 的乘积。正确做法是使用 专门的命令,例如 \sin。LaTeX 预先定义了常见的函数名与算符,它们都排成正体,后面还会自动带一点细空。仅用 \mathrm{sin} 把字形改成正体并不能换来这段空隙——实测中 \log x 在「log」与「x」之间留出 1.8pt,而 \mathrm{log} x 则输出成挤在一起的「logx」。
- 三角与双曲:
\sin\cos\tan\cot\sec\csc;\sinh\cosh\tanh\coth;反函数\arcsin\arccos\arctan。 - 对数与指数:
\log\ln\lg\exp。 - 极限与上下确界:
\lim\limsup\liminf\sup\inf\max\min\varinjlim\varprojlim。 - 代数及其他:
\arg\det\dim\gcd\ker\hom\deg\Pr;取模用\bmod和\pmod。
\[
\lim_{n \to \infty} \left(1 + \frac{1}{n}\right)^{n} = e,
\qquad \sin^2\theta + \cos^2\theta = 1.
\]这份名单中的一部分——\lim、\max、\min、\sup、\inf、\det、\gcd、\Pr 等——在陈列样式下会把下标放在 正下方。所以 \lim_{n\to\infty} 在独立成行时位于「lim」的正下方,在行内时则在右下角。若要添加名单上没有的算符(如 rank 或 Hom),就用 amsmath 的 \operatorname{…} 与 \DeclareMathOperator——那是 amsmath 那一页的话题。