我在关于 LaTeX 的介绍里经常看到推荐使用 \[ … \] 而不是 $$ … $$,但是对这样做的原因却很少解释。有一些书中介绍说「$$ … $$」会产生不良间距,但是依然语焉不详,并没有解释什么间距不良,也没有解释什么样才是「良好的」。 我也在网上搜索过,但是特殊符号都被搜索引擎忽略了,所以没能找到合适的答案。请问 $$ … $$ 相对 \[ … \] 有什么劣势?这些(个)劣势是怎么产生的?

解答

最主要的原因应该是 \[...\] 显然要比裸用 $$...$$ 更容易控制。如果想让行间公式实现特殊效果,重新定义 \[ 和 \] 就可以了,用 $$ 来做是很危险的。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 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

点赞(1)

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部