当我使用\equation
...\endequation
而不是\begin{equation}
...\end{equation}
时,所有方程式都具有相同的数字(我知道这不是环境的最佳实践;我试图了解潜在的行为),如下例所示。
\documentclass{article}
\usepackage{amsmath}
\begin{document}
The first equation is
\equation
\label{pyth} a^2 + b^2 = c^2.
\endequation
The second equation is
\equation
\label{quad} x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}.
\endequation
Referenced in order: \eqref{pyth} and \eqref{quad}.
\end{document}
在调试时,我发现了三种修复方法,但我不知道它们为什么有效。
1.如果我将其附加\usepackage[colorlinks]{hyperref}
到序言中,则在第一次编译时我会收到错误消息! Argument of \Hy@setref@link has an extra }
,但是当我再次编译时,没有错误,并且方程式编号正确:
2.如果我注释掉\usepackage{amsmath}
(并替换\eqref
为\ref
),即使没有,方程式也会被正确编号hyperref
。
3.由于\begin{
...}
和\end{
...}
建立一个组,如在这个帖子,我尝试提供我自己的组:
The first equation is
\begingroup
\equation
\label{pyth} a^2 + b^2 = c^2.
\endequation
\endgroup
The second equation is
% Only the first one needs to be in a group
\equation
\label{quad} x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}.
\endequation
这也正确地编号了方程式,这很有趣,因为我不知道先验知道方程编号与群的关系。
因此,我的问题是:\equation
...\endequation
和\begin{equation}
...之间有什么区别,\end{equation}
导致它们解决了这个问题?为什么这些解决方案有效?
答案1
简单地说,你必须绝不在文档主体中使用\env
and \endenv
(其中代表定义的环境);参见env
tabularx的命令形式(编译问题)举一些例子。
如果amsmath
没有加载此出现工作,但你失去了amsmath
对环境做出的重要改变equation
,修复了库存的一些弱点。
以下是内核定义:
> texdef -t latex equation endequation
\equation:
macro:->$$\refstepcounter {equation}
\endequation:
macro:->\eqno \hbox {\@eqnnum }$$\@ignoretrue
以下是发生的情况amsmath
:
> texdef -t latex -p amsmath equation endequation
\equation:
\long macro:->\incr@eqnum \mathdisplay@push \st@rredfalse \global \@eqnswtrue \mathdisplay {equation}
\endequation:
\long macro:->\endmathdisplay {equation}\mathdisplay@pop \ignorespacesafterend
如果没有\begin
和\end
部分,则会干扰对于标签、方程式编号和标记的使用至关重要的\mathdisplay@push
和功能。\mathdisplay@pop
失败的另一个原因是\incr@eqnum
:它的定义是
> texdef -t latex -p amsmath incr@eqnum
\incr@eqnum:
macro:->\refstepcounter {equation}\let \incr@eqnum \@empty
你看,当第二个\equation
命令出现时, 的含义\incr@eqnum
与 相同\@empty
:这就是为什么方程编号为不是递增。如果如预期的那样,宏在组中执行,则的定义\incr@eqnum
将在组末尾恢复。这应该可以解释为什么在您的示例中您得到相同的方程编号。
当amsmath
加载时,hyperref
它会假设本地分配确实是环境本地的equation
,但如果不使用\begin{equation}
–\end{equation}
格式,则不会发生更改。