我有一篇使用各种软件包的文档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}