为什么这三个改变可以修复这个方程编号错误?

为什么这三个改变可以修复这个方程编号错误?

当我使用\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

简单地说,你必须绝不在文档主体中使用\envand \endenv(其中代表定义的环境);参见envtabularx的命令形式(编译问题)举一些例子。

如果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}格式,则不会发生更改。

相关内容