Hyperref 的超链接被自定义标签偏移

Hyperref 的超链接被自定义标签偏移

我有一篇使用各种软件包的文档hyperref,包括cleveref和标准 AMS 数学软件包。在一个部分中,我标记了我的第一个方程式以给它一个自定义标签,但没有标记其他方程式,就像

\begin{equation} \label{special-eq}\tag{ABC}
A + B = C
\end{equation}

\begin{equation} \label{eq1}
f(x) = g(x)
\end{equation}

问题是,当我通过 引用 eq1 时,\eqref{eq1}或者\cref{eq1}正确\ref{eq1}的方程编号(例如 (1))出现在文本中,但到该方程生成的超链接会将我带到方程 (ABC)。

似乎hyperref我的自定义标签弄混了。有没有办法纠正超链接?(当然不需要手动操作)

答案1

hyperref包使用单独的计数器来创建链接目标。这些计数器基于常规计数器,例如常规方程计数器是,\theequation而 hyperref 定义\theHequation创建包含方程计数器值的链接目标,例如name{equation.0.1}

但是,当您使用标签时,常规方程计数器不会更新,因此两个或多个方程具有相同的计数器值。这会让 hyperref 感​​到困惑,因为它无法创建两个具有相同名称的链接目标。因此,第二个目标标识符将被忽略,链接将指向第一个。终端和日志文件中会发出警告来指示问题,类似于pdfTeX warning (ext4): destination with the same identifier (name{equation.0.1}) has been already used, duplicate ignored

为了防止出现此问题,您可以修改 hyperref 计数器带标签的方程式,创建一个唯一的名称(另请参阅手动设置 pdflatex 的目标名称)。请注意,您需要在每个标记方程式之后执行此操作。

梅威瑟:

\documentclass{article}
\usepackage{amsmath}
\usepackage{hyperref}
\usepackage{cleveref}
\usepackage{lipsum}
\begin{document}
\begin{equation} \label{special-eq}\tag{ABC}
A + B = C
\end{equation}
\renewcommand*{\theHequation}{notag.\theequation}
\lipsum[1]

\begin{equation} \label{eq1}
f(x) = g(x)
\end{equation}

\begin{equation} \label{special-eq2}\tag{DEF}
D + E = F
\end{equation}
\renewcommand*{\theHequation}{notag2.\theequation}

\begin{equation} \label{eq2}
g(x) = h(x)
\end{equation}

see \Cref{special-eq} and \Cref{eq1} and \Cref{eq2}.
\end{document}

为了使其更加自动化,您可以引入一个新的计数器,该计数器会针对每个方程式(标记方程式和常规方程式)增加,并在 hyperref 目标名称中使用该计数器。可以通过使用包修补equation环境来增加计数器etoolbox,在下面的示例中pretocmd使用,这意味着在命令或环境前面添加了一些代码。在这种情况下,您只需重新定义 hyperref 计数器一次,而不是在每个标记方程式之后重新定义。

代码:

\documentclass{article}
\usepackage{amsmath}
\usepackage{hyperref}
\usepackage{cleveref}
\usepackage{lipsum}
\usepackage{etoolbox}
\begin{document}
\newcounter{taggedeq}
\setcounter{taggedeq}{0}
\pretocmd{\equation}{\stepcounter{taggedeq}}{}{}
\renewcommand*{\theHequation}{\thetaggedeq.\theequation}
\begin{equation} \label{special-eq}\tag{ABC}
A + B = C
\end{equation}

\lipsum[1]

\begin{equation} \label{eq1}
f(x) = g(x)
\end{equation}

\begin{equation} \label{special-eq2}\tag{DEF}
D + E = F
\end{equation}

\begin{equation} \label{eq2}
g(x) = h(x)
\end{equation}

see \Cref{special-eq} and \Cref{eq1} and \Cref{eq2} and \Cref{special-eq2}.

\lipsum
\end{document}

相关内容