最主要的原因应该是 \[...\] 显然要比裸用 $...$ 更容易控制。如果想让行间公式实现特殊效果,重新定义 \[ 和 \] 就可以了,用 $ 来做是很危险的。LaTeX 标准文档类的让行间公式居左的 fleqn 选项就是通过重定义 \[ 和 \] 来实现的。
下面我们再来看一下关于所谓间距不对的问题。LaTeX 的 \[ 是这么定义的:
\def\[{% \relax\ifmmode \@badmath \else \ifvmode \nointerlineskip \makebox[.6\linewidth]{}% \fi $%%$ BRACE MATCH HACK \fi }可以看到 \[ 加入了查错机制:不能在数学模式中使用。除此之外,它在水平模式(可以简单理解为在源文件中,\[ 和上文之间没有空行或者 \par)下的行为与 $ 是完全一致的,问题出在垂直模式(可以简单理解为在源文件中,\[ 和上文之间有空行或者 \par)下。 用于表示进入数学模式的记号 $ 与其他字母或者符号类似,是只能出现在水平模式下的。也就是说当 TeX 在垂直模式下看到 $ 时,就会自动开启新的段落进入水平模式了。接下来 TeX 又看到一个 $,TeX 就会进入「行间数学模式」,要进行一系列操作了。其中之一就是结束当前段,分段为行。这个段落是由最开始的 $ 开启的,段落除了段首用于缩进的盒子和最后填充段尾的 \parfillskip 以外并没有其他实际内容,所以这个段落只有一行,这一行的高度和深度都是 0pt。接下来 TeX 就会用「厚度」为 \baselineskip-\prevdepth 的胶(glue)将这一行「粘」在垂直列的底部(由于是段落的首行,其实还要加上一个厚度为 \parskip 的胶)。\prevdepth 只能在垂直模式下使用,记录当前垂直列中最后一个盒子的深度。总之,如果在垂直模式下使用 $,就会导致公式前面有一个多余的空行。 现在回过头来看 LaTeX 的 \[。当它用 \ifvmode 探测到处于垂直模式时,会先使用 \nointerlineskip 设置 \prevdepth 为 -1000pt。-1000pt 是一个标志值,表示不需要我们之前提到的行间胶,直接把盒子放在垂直列底部就可以了。\[ 随后使用的 \makebox[.6\linewidth]{} 会进入水平模式,并放一个宽为 0.6\linewidth 的空水平盒子。最后再使用 $ 进入行间数学模式。也是会产生一个空行,但是空行的高度和深度都为 0pt,并且抑制了行间胶,就看不出来了。
空盒子的宽度为 .6\linewidth 是让数学公式与上文的距离总是为 \abovedisplayskip,与下文的距离总是为 \belowdisplayskip,而不是可能会出现的 \abovedisplayshortskip 和 \belowdisplayshortskip。因为此时实际上并不知道上文最后一行的长度,LaTeX 在这里认为「宜宽不宜窄」。
amsmath 宏包重定义了 \[ 和 \],此时它们实际上是一个 equation* 环境。虽然 amsmath 的定义比较复杂,但是并没有用 LaTeX 上面的这一套机制,实际排版效果与裸用 $ 完全一致。可能是看到了 LaTeX 的这一机制也有一些问题(比如 [1] 和 [2])。
总之,我们的建议是不要在垂直模式下使用行间公式。
[1]: math mode - What are the differences between $, \[, align, equation and displaymath?
[2]: math mode - Why is \[ ... \] preferable to $ ... $?
选自:
作者:李清
链接:https://www.zhihu.com/question/27589739/answer/37255728
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
发表评论 取消回复