为什么没有 amsmath 包时方程环境不会出错?

为什么没有 amsmath 包时方程环境不会出错?

据我了解,equation环境是在amsmath包中定义的,因此在尝试编译以下文档时可能会出现错误pdflatex

\documentclass{article}

\begin{document}

\begin{equation}
a=b+c
\end{equation}

\end{document} 

但我在运行此文件时没有收到任何错误,并且生成了pdflatex带有方程式的 PDF 输出。这究竟是如何工作的?a + b = c

答案1

你写了:

据我了解,equation环境是在amsmath包中定义的

这不太正确。equation环境是在 LaTeX 内核中定义的——amsmath如果包在前言中加载,则会重新定义。


为了完整起见,这里是文件latex.ltx(“内核”)中的相关代码:

\@definecounter{equation}
\def\equation{$$\refstepcounter{equation}}
\def\endequation{\eqno \hbox{\@eqnnum}$$\@ignoretrue}
\def\@eqnnum{{\normalfont \normalcolor (\theequation)}}

其中\eqno是所谓的“原始”指令,它\hbox{\@eqnnum}以 作为其参数。基本上,\equation启动显示数学模式并增加一个名为 的计数器equation,而\endequation排版方程编号(默认情况下在最右边)并关闭显示数学模式。

这是来自的代码amsmath.sty;请注意,由于\renewenvironment指令,该代码取代了内核提供的内容:

\renewenvironment{equation}{%
  \incr@eqnum
  \mathdisplay@push
  \st@rredfalse \global\@eqnswtrue
  \mathdisplay{equation}%
}{%
  \endmathdisplay{equation}%
  \mathdisplay@pop
  \ignorespacesafterend
}

显然,此设置比 LaTeX 内核中执行的设置更为复杂。最重要的实质性差异来自这样一个事实:如果amsmath加载了,则可以在环境中插入splitalignedgathered环境equation。此外,amsmath在后台执行一些奇特的测量操作,以确定是否有必要将方程编号“推低”一点,以避免与过长的方程发生冲突。

如果你真的对细节感兴趣,我鼓励你检查一下文件中包含的信息amsmath.pdf。打开命令窗口并键入texdoc amsmath.pdf以在 pdf 查看器中启动该文件。

相关内容