答案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
相反,其他计数器变量(特别是与
equation
、theorem
、figure
和table
环境相关的变量)在其各自的环境中递增。(附言:在figure
和table
环境中,计数器变量由\caption
指令递增。这就是为什么需要将\label
指令后这两个环境的指令\caption
。)人们可能会认为这些计数器是它们各自环境的“本地”计数器。如果\label
在这些环境中遇到指令,则\@currentlabel
宏将锁定到目标计数器,就机制而言\label
,一切都很好\ref
。相反,如果
\label
指令在 LaTeX 环境结束后才运行,LaTeX 就不再“知道”该环境中最近增加的计数器(如果有的话)。因此,当指令\label
运行时,\@currentlabel
它会与最近标记的“全局”计数器变量相关联;就您的示例文档而言,这恰好是计数器subsection
。(附言:如果在上面显示的示例代码中,删除指令\subsection
并重新编译两次,就会发现交叉引用现在指向节级计数器(“4.1”)。)
这个故事的寓意是什么?如果使用 LaTeX 环境(例如equation
和theorem
),这些环境会增加计数器变量,并希望交叉引用它们,则必须将\label
指令里面那些环境。