正如下面的文章中提到的,$$...$$
不应该在 LaTeX 中使用:
为什么 \[ ... \] 比 $$ ... $$ 更可取?
如果$$...$$
不被使用而\[...\]
必须使用 ,为什么$$...$$
仍然可用?为什么不能$$...$$
映射到\[...\]
?
答案1
在 INITEX 中,$
没有预定义的含义。其中第一行plain.tex
是
\catcode`$=3
为该角色赋予其常用的“数学移位”功能。任何字符可以被赋予这个含义,但 Knuth 以此为开端,然后 LaTeX 也效仿。
在下面的考虑中,$
将表示“类别代码为 3 的字符”。
如何$
工作?有几种情况需要考虑。
如果 TeX 处于垂直模式,它将启动水平模式并重新读取
$
标记。如果 TeX 处于受限水平模式,它会丢弃
$
并进入内联数学模式。如果 TeX 处于(不受限制的)水平模式,它会查看下一个标记无需扩大; 叫它吨。 如果吨然后
$
TeX 进入显示数学模式并丢弃发现的$
标记。如果吨不是$
,那么 TeX 进入内联数学模式,丢弃$
标记并重新读取吨。如果 TeX 处于显示数学模式,它会寻找下一个标记无需扩大; 叫它吨。 如果吨是
$
,TeX 结束显示数学模式(并做很多事情)。如果吨不是$
,则 TeX 发出错误消息并插入$
,这会导致结束显示数学模式(假设用户点击回车或\errorstopmode
不起作用)。标记吨重读。在两种情况下,均恢复水平模式,无需插入\indent
和\parskip
粘贴。如果 TeX 处于内联数学模式,它会结束它(做很多事情)并恢复水平模式(受限或不受限制)。
\eqno
注意:关于和有一些微妙之处\leqno
,但与大局无关。
您可以看到,这$$
在语言中是某种程度上硬连线的:它不是诸如\halign
或\par
之类的原始事物,我们可以随意赋予其新的含义(当然,知道我们在做什么)。
LaTeX 诞生时,提供了宏\(
、\)
和用于启动/关闭内联数学模式和显示数学模式。但由于格式基于 Plain TeX,并且许多人已经习惯使用\[
进入和退出数学模式,Leslie Lamport 决定不禁用它,这可以通过简单的指令实现\]
$
\catcode`$=12
在定义了所有使用数学模式的宏之后。为什么不禁用它?因为从 Plain TeX 移植代码会更容易。但是,$$...$$
手册中没有提到,原因很充分:当fleqn
使用该选项时,此构造无法正确运行;用构建的数学显示$$...$$
无论如何都会居中。对于用\[...\]
或等效displaymath
环境构建的数学显示则并非如此。
使其成为$$...$$
非法意味着也$...$
将使内联数学模式也成为非法。现在不是一个选择,它可能在 LaTeX 诞生之初就已经可以做到了。现在这么做会破坏数千份旧文档。
为什么不能$$...$$
映射到\[...\]
?由于上述原因。它可以通过变成一个活跃的角色来完成$
,作为我的回答定义 `$$$ $$$` 来对齐展示。但是,这违反了其他几个法律规定,因此也不是一种选择。
没有狂热建议用户不要使用$$...$$
;如果人们愿意,他们有自由意志,可以不听专家的意见。他们可能会搬起石头砸自己的脚,但这是他们的问题。
我会继续建议用户不要使用$$...$$
。你想听这个建议吗?好。你不想吗?再好不过了,但如果你的文档坏了,你就得自己承担责任了。
答案2
正确答案是为什么$$...$$
仍然可用是:因为 LaTeX 已经老了。这实际上并不是唯一被弃用的东西;您有\bf
,\it
和朋友,eqnarray
以及eqnarray*
,一堆包,$$...$$
等等。
为什么 LaTeX 没有“清理干净”?首先,你至少需要一定程度的向后兼容性。其次,你让人们使用坏代码;那么会发生什么呢?
LaTeX 是否应该崩溃并出现错误:“嘿,老兄,你最好使用 2014 年的语法,而不是 1992 年的语法,我不会支持这种老旧的垃圾”?(这确实不是一个好主意,考虑到使用 LaTeX 并且不擅长任何编程的人的数量,很高兴它能做一些在他们看来合理的事情。)
是否应该出现警告?(请注意,会出现许多警告,如果人们读到它们,我们在这里回答问题的工作量就会少很多。尤其是$$
,因为它是 TeX 原语,而 LaTeX 层对它的控制很少,它甚至不能发出警告。)
所以剩下的唯一选择是:保留弃用的语法。