以下 MWE 产生了不良结果,如下所示:
\documentclass[11pt, a4paper, twoside]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage[notref, notcite]{showkeys}
\begin{document}
\begin{equation}\label{eqA}
b = 1
\end{equation}
\begin{equation}
\label{eqB}
x^p
\overset{ \eqref{eqA} }{=} b^p
\overset{ \eqref{eqA} }{=} 1
\end{equation}
\end{document}
如您所见,当使用 时\eqref
,似乎会showkeys
重新打印 的标签eqB
,即不是我想要的(尽管使用了notref
)。有谁知道为什么会这样,以及是否有办法纠正这个问题(比用 替换更好\eqref
,\ref
后者确实能正常工作)?
答案1
我通过修改后的代码来说明这种情况:
\documentclass[twocolumn]{article} % twocolumn for smaller snapshot
\usepackage{amsmath}
\usepackage[notref, notcite]{showkeys}
\begin{document}
A numbered equation
\begin{equation}\label{eqA}
b = 1
\end{equation}
Cite using \verb+\ref+
\begin{equation}\label{eqB}
\ref{eqA}
\end{equation}
Cite using \verb+\eqref+
\begin{equation}\label{eqC}
\eqref{eqA}
\end{equation}
Cite using \verb+\eqref+ with \verb+\label+ at the end
\begin{equation}
\eqref{eqA}
\label{eqD}
\end{equation}
Cite using \verb+\eqref+ without \verb+\label+
\begin{equation}
\eqref{eqA}
\end{equation}
\end{document}
\label
如您所见,只要在 之前\eqref
,而未\ref
触及 ,就会发生问题。
这里发生了什么?该包showkeys
重新定义\label
以完成其原始工作,然后定义一个名为的宏\SK@lab
:
% \label{FOO} does the usual stuff and also
\gdef\SK@lab{\smash{\SK@labelcolor\showkeyslabelformat{FOO}}}%
\SK@lab
然后,打印方程编号时将使用此宏。amsmath
使用该包时,打印方程编号涉及一个名为的宏\tagform@
,顾名思义,该宏控制方程标记的外观。为了确保方程以相同的标记形式引用,amsmath
将其定义\eqref
为包装器\ref
\newcommand{\eqref}[1]{\textup{\tagform@{\ref{#1}}}}
现在包装showkeys
开始发挥作用:由于打印标签也应该打印标签旁边的标签,因此showkeys
重新定义\tagform@
为
\let\SK@tagform@\tagform@ % make a copy of original definition
\def\tagform@#1{%
% [...] other stuff
\SK@tagform@{#1}%
\rlap{\kern\marginparsep\SK@lab}\SK@lab@relax}%
其中\SK@tagform@
是原始 ( amsmath
) 的 定义\tagform@
。该\rlap
内容是打印侧面标签的内容。完成此操作后,宏\SK@lab@relax
(顾名思义)\let
将\SK@lab
转换为\relax
。
现在我们看到发生了什么:当你\label
在等式内部调用时,宏\SK@lab
会保存当前标签,以便稍后\tagform@
打印等式标签时使用;但\eqref
也使用,因此错误地打印了\tagform@
的当前值。\SK@lab
长话短说:如果你的等式包含一些,\eqref
那么就把它放在\label
那些\eqref
s 后面。