Showkeys 和 eqref 在方程式中打印不需要的标签

Showkeys 和 eqref 在方程式中打印不需要的标签

以下 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那些\eqrefs 后面。

相关内容