我有一堆算法需要通过引用其中的某些行号来解释。我试图用\crefrange
它,但最简单的例子似乎失败了。
在下面的示例中,在第二页,我使用 引用了第二种算法中的行范围 1-3 \crefrange
。不幸的是,在生成的 PDF 中,当我单击“行 1-3”时,链接将我带到正确的行,但算法错误(即算法一,而不是算法二)。
\documentclass{article}
\usepackage{algorithm,algpseudocode}
\usepackage[colorlinks]{hyperref}
\usepackage[noabbrev,capitalize,nameinlink]{cleveref}
\begin{document}
\section{Page 1}
\cref{a:one:line2} in \cref{a:one} is \dots
\cref{a:one:line2,a:one:line3} of the algorithm are based on \dots
\begin{algorithm}
\caption{Baseline}\label{a:one}
\begin{algorithmic}[1]
\State Do X
\State Do Y \label{a:one:line2}
\State $x = y + z$ \label{a:one:line3}
\end{algorithmic}
\end{algorithm}
\pagebreak
\section{Page 2}
\cref{a:two:line2} in \cref{a:two} is \dots
\crefrange{a:two:line1}{a:two:line3} of the algorithm are based on \dots
\begin{algorithm}
\caption{Baseline}\label{a:two}
\begin{algorithmic}[1]
\State Do X \label{a:two:line1}
\State Do Y \label{a:two:line2}
\State $x = y + z$ \label{a:two:line3}
\end{algorithmic}
\end{algorithm}
\end{document}
pdflatex
如果重要的话,我正在 Ubuntu 上使用 TexStudio 。
答案1
cleveref
当与一起使用时hyperref
,如果您destination with the same identifier has already been used, duplicate ignored
在日志中看到“ ”警告,则通常有效的解决方法是在 hyperref 中禁用 hypertexnames:
\usepackage[hypertexnames=false]{hyperref}
在您的 MWE 中设置此选项可以为我生成正确的超链接。
这个问题的大多数实例在几年前就已修复,因此cleveref
这种解决方法应该没有必要。algorithm
和软件包均受 支持(有关详细信息,请参阅下文)。 看起来和支持之间存在不良交互,需要在 中修复。algorithmicx
algorithm2e
cleveref
cleveref
algorithmicx
hyperref
cleveref
该algorithm
包仅为算法提供单独的浮动环境。所需的唯一支持是为这些算法环境提供默认名称(及其翻译),该包确实提供了该cleveref
功能。该algorithmicx
包提供了一个用于排版实际算法的框架。您通常会加载一个配套的布局包来为您设置算法样式(它会在内部加载包algorithmicx
),而不是加载algorithmicx
包本身。是这些布局包algpseudocode
中最常用的。支持框架,因此其所有布局包如都支持。该包总体上是包的更好的替代品(这就是不支持后者的原因)。该包是的替代品。请参阅algorithmicx
cleveref
algorithmicx
algpseudocode
algorithmicx
algorithmic
cleveref
algorithm2e
algorithmicx
这个 stackchange 答案以获得更完整的解释。