$$、\[、align、equation 和 displaymath 之间有什么区别?

$$、\[、align、equation 和 displaymath 之间有什么区别?

我曾经了解到,这是不酷可以使用$$,但为什么呢?为什么\[不可以作为 的缩写\begin{align}?我注意到,两者是有区别的,因为在以 开头的块中不能使用&和。\\\[

答案1

据我理解,您想知道使用以下五种方法构建显示数学表达式之间有什么区别:

  1. $$...$$
  2. \[...\]
  3. \begin{displaymath}...\end{displaymath}
  4. \begin{equation}...\end{equation}
  5. \begin{gather*}... \end{gather*}

实际上,您问的是align环境。但是,我认为,为了在 display-math 方法之间提供直接的比较,最好将重点放在环境上gather*,该环境将其内容居中并且不生成方程编号。与gather和环境相比,和环境gather*的显著附加功能是它们能够沿某些元素(例如等号)垂直对齐方程。alignalign*


第一种方法是用于生成显示方程的“纯 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*}amsmathamsmath\mathdisplay\endmathdisplay$$amsmathequation未编号方程式称为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
}

如您所见,equationequation*环境最终调用\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

在之前的答案中已经描述了差异,我只是为了说明垂直空间而在这里添加此图像:

测试 Lamport

这是从以下代码中获得的:

\documentclass{article}
\begin{document}
\hrule
\[ E=mc^2\]
\hrule
$$E=mc^2$$
\hrule
\[ E=mc^2\]
\hrule
$$E=mc^2$$
\hrule
\end{document}

请注意构造所添加的垂直空间\[..\],此外,前后空间不对称。除此之外,\[..\]还会进行一些错误检查,在我看来,其用处仅限于真正的初学者LaTeX

这是另一张图片:

Lamport 再次对阵 $$

从此代码获得:

\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}\[

相关内容