我正在使用cleveref
和hyperref
包。总体来说效果很好,但算法中对行的交叉引用不正确。
我找到了一些其他相关文章,这个和这个。但是,那里给出的解决方案对我来说不起作用。
以下是 MWE:
\documentclass[11pt]{report}
%% algorithms
\usepackage[chapter]{algorithm}
\usepackage{algpseudocode}
%% referencing
\usepackage{hyperref}
\usepackage{cleveref}
\begin{document}
\chapter{First chapter}
\begin{algorithm}[!htb]
\caption{First algorithm}
\begin{algorithmic}[1]
\State A statement in 1st algorithm
\end{algorithmic}
\end{algorithm}
\chapter{Second chapter}
A reference to a line in \cref{alg:secondalg} \ : \cref{step:insecondalg}
\begin{algorithm}[!htb]
\caption{Second algorithm} \label{alg:secondalg}
\begin{algorithmic}[1]
\State A statement in 2nd algorithm \label{step:insecondalg}
\end{algorithmic}
\end{algorithm}
\end{document}
第二章中的步骤\cref
给出了正确的步骤编号,但其链接指向第一章中的算法。
请提供您可能有的任何解决方案/解决方法。
答案1
您会收到一条警告:
pdfTeX warning (ext4): destination with the same identifier (name{[email protected]})
has been already used, duplicate ignored
在这种情况下,hyperref
不会为锚点创建合适的辅助计数器,但您可以自己创建它:它的名称应该是HALG@line
,并且您想将它的表示链接到某些唯一的内容,例如计数器的表示algorithm
。
\documentclass[11pt]{report}
%% algorithms
\usepackage[chapter]{algorithm}
\usepackage{algpseudocode}
%% referencing
\usepackage{hyperref}
\usepackage{cleveref}
\makeatletter
\newcounter{HALG@line}
\renewcommand{\theHALG@line}{\thealgorithm.\arabic{ALG@line}}
\makeatother
\begin{document}
\chapter{First chapter}
\begin{algorithm}[!htb]
\caption{First algorithm}
\begin{algorithmic}[1]
\State A statement in 1st algorithm
\end{algorithmic}
\end{algorithm}
\chapter{Second chapter}
A reference to a line in \cref{alg:secondalg} \ : \cref{step:insecondalg}
\begin{algorithm}[!htb]
\caption{Second algorithm} \label{alg:secondalg}
\begin{algorithmic}[1]
\State A statement in 2nd algorithm \label{step:insecondalg}
\end{algorithmic}
\end{algorithm}
\end{document}