我曾经了解到,这是不酷可以使用$$
,但为什么呢?为什么\[
不可以作为 的缩写\begin{align}
?我注意到,两者是有区别的,因为在以 开头的块中不能使用&
和。\\
\[
答案1
据我理解,您想知道使用以下五种方法构建显示数学表达式之间有什么区别:
$$
...$$
\[
...\]
\begin{displaymath}
...\end{displaymath}
\begin{equation}
...\end{equation}
\begin{gather*}
...\end{gather*}
。
实际上,您问的是align
环境。但是,我认为,为了在 display-math 方法之间提供直接的比较,最好将重点放在环境上gather*
,该环境将其内容居中并且不生成方程编号。与gather
和环境相比,和环境gather*
的显著附加功能是它们能够沿某些元素(例如等号)垂直对齐方程。align
align*
这第一种方法是用于生成显示方程的“纯 TeX”方法。(“纯 TeX”是指 Knuth 编写的一组宏,旨在使所谓的“TeX 基元”可用于普通排版目的。TeXBook 第$$
287 页提供了说明符的完整说明。)
但是,使用该$$
方法启动和终止显示数学模式在 LaTeX 文档中现在已经严重弃用。请参阅帖子“为什么 \[ ... \] 比 $$ ... $$ 更好?”详细讨论为什么应该不是$$ ... $$
使用 LaTeX(或其后继版本,如 pdfLaTeX、XeLaTeX 等)时直接使用。
这第二种方法和\[
是Leslie Lamport 对 Plain-TeX ...方法\]
的重新实现。定义和命令的 LaTeX 代码包含在文件中:$$
$$
\[
\]
latex.ltx
\def\[{%
\relax\ifmmode
\@badmath
\else
\ifvmode
\nointerlineskip
\makebox[.6\linewidth]{}%
\fi
$$%%$$ BRACE MATCH HACK
\fi
}
\def\]{%
\relax\ifmmode
\ifinner
\@badmath
\else
$$%%$$ BRACE MATCH HACK
\fi
\else
\@badmath
\fi
\ignorespaces
}
基本上,\[
和\]
充当精心设计的打开和关闭指令的包装器。如果在 TeX 已经处于数学模式时遇到语句,或者在TeX 处于以下任一状态时遇到语句,$$
则会生成错误消息\[
\]
不是完全处于数学模式,或者处于“内部”数学模式。您可能会问,“什么是‘内部’数学模式?”“内部”数学模式的一个主要示例是组内的材料\left<x> ... \right<y>
,其中<x>
和<y>
表示合适的分隔符,例如(
和)
。如果 LaTeX\]
在内部数学模式下遇到,它会生成以下错误消息:
! LaTeX Error: Bad math environment delimiter.
(如果您直接使用$$
,您会收到一条略显隐晦的错误信息。)
此外,该命令\[
还会检查 TeX 是否处于所谓的“垂直模式”;这种情况通常出现在段落的开头。如果是这种情况,即 TeX 处于垂直模式,则\nointerlineskip
执行该指令以避免插入一些额外的所显示方程式正上方的垂直空间。
以下示例说明了这个问题,该示例对比了两种情况。在这两种情况下,代码都以一串破折号开头,然后是空行(插入段落分隔符并将 TeX 切换到垂直模式),然后是显示的方程式。在第一种情况下,显示的方程式是通过\[...\]
; 生成的,在第二种情况下,$$...$$
则使用 。请注意,在第二种情况下,会插入一些额外的(可能不需要的)垂直空格多于显示的等式;在第一种情况下不会发生这种情况,\nointerlineskip
这是由于指令的一部分\[
。
\documentclass{article}
\setlength\textwidth{1in} % use a very narrow measure for this example
\begin{document}
\noindent
---------------
\[ u=vwxz\]
---------------
$$u=vwxz$$
---------------
\end{document}
LaTeX 代码第三种方法简单来说就是:
\def\displaymath{\[}
\def\enddisplaymath{\]\@ignoretrue}
也就是说,它(本质上)等同于第二种方法,同时可以说更易于阅读和调试。更易于调试的意思是,这些命令不像和那样容易被\[
忽视\]
。
请注意,前三种方法不是生成方程编号。
就像在 LaTeX 中实现的那样——但没有加载amsmath
包——第四种方法(\begin{equation}
... \end{equation}
) 是:
\@definecounter{equation}
\def\equation{$$\refstepcounter{equation}}
\def\endequation{\eqno \hbox{\@eqnnum}$$\@ignoretrue}
\def\@eqnnum{{\normalfont \normalcolor (\theequation)}}
因此,第四种方法还为(内部生成的)
$$
命令对提供了一个“包装器”,同时添加了一个用括号括起来的右对齐方程编号。(该\eqno
宏是一个 TeX 宏,在第 186-7 页和 TeXBook 的其他地方进行了描述;它插入了一个由 给出的方程编号\@eqnum
。)但是,请注意,与 的情况不同,在执行
\[...\]
时不会执行任何测试来检查 TeX 是否处于垂直模式。因此,如果您在段落开头启动环境,您可能会在该方程式上方获得一些额外的(可能不需要的!)垂直空间。这是经常遇到的劝告的原因之一\begin{equation}
equation
绝不在段落开头开始显示等式。
最后,关于通过加载包提供的\begin{gather*}
...方法。在研究此方法的详细信息之前,有必要提一下,包提供了命令和,它们充当(甚至更复杂的)“包装器”——您猜对了——纯 TeX构造。该包重新定义了环境,并为\end{gather*}
amsmath
amsmath
\mathdisplay
\endmathdisplay
$$
amsmath
equation
未编号方程式称为equation*
:
\renewenvironment{equation}{%
\incr@eqnum
\mathdisplay@push
\st@rredfalse \global\@eqnswtrue
\mathdisplay{equation}%
}{%
\endmathdisplay{equation}%
\mathdisplay@pop
\ignorespacesafterend
}
\newenvironment{equation*}{%
\mathdisplay@push
\st@rredtrue \global\@eqnswfalse
\mathdisplay{equation*}%
}{%
\endmathdisplay{equation*}%
\mathdisplay@pop
\ignorespacesafterend
}
如您所见,equation
和equation*
环境最终调用\mathdisplay
和\endmathdisplay
命令,而后者又调用 TeX$$
指令。顺便说amsmath
一下,重新定义LaTeX 命令\[
如下\]
:
\DeclareRobustCommand{\[}{\begin{equation*}}
\DeclareRobustCommand{\]}{\end{equation*}}
(请注意,由于displaymath
是根据\[
和\]
命令定义的,所以当与amsmath
包结合使用时,它的外观也可能会发生变化。)
然后,继续讨论环境代码gather*
:
\newenvironment{gather*}{%
\start@gather\st@rredtrue
}{%
\endgather
}
其中\start@gather
命令定义为
\def\start@gather#1{%
\RIfM@
\nomath@env
\DN@{\@namedef{end\@currenvir}{}\@gobble}%
\else
$$%
#1%
\ifst@rred \else \global\@eqnswtrue \fi
\let\next@\gather@
\fi
\collect@body\next@
}
隐式定义的命令\endgather
执行以下指令:
\math@cr \black@\totwidth@ \egroup
$$\ignorespacesafterend
从检查这些代码行中得到的主要结论是——无需深入太多细节,其中许多细节与 align、align*、gather、gather* 等环境可以排版多行连续的显示数学材料有关——环境gather*
最终也会调用$$
TeX 宏,同时处理相当多的管理和错误避免步骤。
总共,从所有这些中应该可以充分清楚的一点是,$$
直接使用构造是不必要的,甚至是鲁莽的,因为这样做可能会导致各种混乱的失误。替代方法 2 到 5 可以避免这些问题,因此应该始终优先于使用$$
命令对。
答案2
$$
在 LaTeX 中根本不支持,它是原始的 TeX 语法,只是碰巧大多数时候都能正常工作。例如,标准 LaTeX 类都有一个fleqn
对齐而不是居中的选项。即使没有选项,和\[ \]
的行为在段落开头也是不同的,在哪里\[
$$
\[
\nointerlineskip
\makebox[.6\linewidth]{}%
在做之前$$
答案3
在之前的答案中已经描述了差异,我只是为了说明垂直空间而在这里添加此图像:
这是从以下代码中获得的:
\documentclass{article}
\begin{document}
\hrule
\[ E=mc^2\]
\hrule
$$E=mc^2$$
\hrule
\[ E=mc^2\]
\hrule
$$E=mc^2$$
\hrule
\end{document}
请注意构造所添加的垂直空间\[..\]
,此外,前后空间不对称。除此之外,\[..\]
还会进行一些错误检查,在我看来,其用处仅限于真正的初学者LaTeX
。
这是另一张图片:
从此代码获得:
\documentclass{article}
\begin{document}
\noindent
abc\hrulefill\par
\[ E=mc^2\]
abc\hrulefill\par
$$E=mc^2$$
abc\hrulefill\par
\[ E=mc^2\]
abc\hrulefill\par
$$E=mc^2$$
abc\hrulefill\par
\end{document}
请注意由于使用而导致的不连贯的垂直间距\[..\]
。
我没有在这里包含图像,但人们可以检查这些不一致之处确实消失了\usepackage{amsmath}
(原因从复制的代码中可以清楚地看出)。Mico 的回答我知道我的观点是极端少数派的,但显然,只有对使用者来说,amsmath
才能令人信服地论证最好不要$$
直接使用。
当然$$
不符合语法精神LaTeX
,但\[
inLaTeX2e
在处理垂直间距方面与其他数学环境不一致。因此,我个人认为,当我不加载 时amsmath
,我宁愿避免\[
。
答案4
对我来说最重要的附加答案之一:该包将自动处理包含在但不包含在内cleveref
的方程式。\begin{equation}
\[