在小节中使用参考命令 \ref 或 \eqref 时出错

在小节中使用参考命令 \ref 或 \eqref 时出错

在此处输入图片描述

每当我在小节级别时,我都无法正确引用。第一次引用“运动方程,4.1”没问题,但下一个引用,即“重新排列(4.1.3)”,应该是“重新排列(4.11)”。

以下是一段代码:

\begin{equation} 
(Ms^2+Cs+K)X(s)=F(s) 
\end{equation} \label{eq:modal11} 
Rearranging \eqref{eq:modal11} yields:

答案1

(发布这个答案主要是为了核对是否已被回答)

首先,这里重新显示了您的屏幕截图的相关部分,其中交叉引用指向小节标题而不是前面的等式:

在此处输入图片描述

\documentclass{report}
\usepackage{amsmath}    % for "\eqref" macro
\usepackage[colorlinks]{hyperref}
\begin{document}
%%% Just to recreate the OP's setup:
\setcounter{chapter}{4}    \refstepcounter{section}
\setcounter{subsection}{2} \setcounter{equation}{10}
\subsection{Here we go} % create a dummy subsection-level header
\label{sec:herewego}

\noindent
Assuming the initial conditions to be zero yields:
\begin{equation} 
(Ms^2+Cs+K)X(s)=F(s) 
\end{equation}  \label{eq:modal11}%% "\label" outside equation env.
Rearranging \eqref{eq:modal11} yields:
\end{document} 

正如 David Carlisle 在评论中所观察到的,问题出现的原因是你放置了方程式特定的\label指令外部环境equation。果然,移动\label指令里面环境equation——比如说,紧接着\begin{equation}——并重新编译两次,就交叉引用而言,会产生所需的结果:

在此处输入图片描述


你可能会问,“为什么需要把与方程相关的\label指令里面环境equation中?”要回答这个问题,有必要仔细看看 LaTeX 的机制是如何\label运作\ref的。

  • \label-机制\ref的工作原理是\label锁定一个内部的低级 LaTeX 宏,称为\@currentlabel。LaTeX 将此宏与最近通过\refstepcounter指令递增的计数器变量相关联。顾名思义,不仅递增计数器变量,而且还以在发出指令时\refstepcounter“唤醒”宏的方式进行。\@currentlabel\label

  • 重要的是,并非所有计数器递增操作在文档中的全局范围方面都是相同的。一些计数器(主要是与 、 等分段命令关联的计数器\chapter\section\subsection全局可见的,也就是说,它们在再次被修改(最有可能是通过指令)\@currentlabel之前,一直与全局(即文档范围)级别的计数器相关联。\@currentlabel\label

  • 相反,其他计数器变量(特别是与equationtheoremfiguretable环境相关的变量)在其各自的环境中递增。(附言:在figuretable环境中,计数器变量由\caption指令递增。这就是为什么需要将\label指令这两个环境的指令\caption。)人们可能会认为这些计数器是它们各自环境的“本地”计数器。如果\label在这些环境中遇到指令,则\@currentlabel宏将锁定到目标计数器,就机制而言\label,一切都很好\ref

  • 相反,如果\label指令在 LaTeX 环境结束后才运行,LaTeX 就不再“知道”该环境中最近增加的计数器(如果有的话)。因此,当指令\label运行时,\@currentlabel它会与最近标记的“全局”计数器变量相关联;就您的示例文档而言,这恰好是计数器subsection。(附言:如果在上面显示的示例代码中,删除指令\subsection并重新编译两次,就会发现交叉引用现在指向节级计数器(“4.1”)。)

这个故事的寓意是什么?如果使用 LaTeX 环境(例如equationtheorem),这些环境会增加计数器变量,并希望交叉引用它们,则必须将\label指令里面那些环境。

相关内容