我收到警告
pdfTeX warning (ext4): destination with the same identifier
(name{[email protected]}) has been already used, duplicate ignored
MWE 位于下方。
\documentclass{article}
\usepackage{algpseudocode}
\usepackage{hyperref}
\usepackage{cleveref}
\begin{document}
\begin{algorithmic}
\Procedure{Euclid}{$a,b$}
\EndProcedure
\end{algorithmic}
\begin{algorithmic}
\Procedure{Euclid}{$a,b$}
\EndProcedure
\end{algorithmic}
\end{document}
有机会解决这个问题吗?
答案1
你应该改变加载顺序(推动algpseudocode
后hyperref
hyperref
)并重新定义查看线路内的目的地的方式algorithmic
:
\documentclass{article}
\usepackage{hyperref}
\usepackage{algpseudocode}
\usepackage{cleveref}
\makeatletter
\newcounter{algorithmicH}% New algorithmic-like hyperref counter
\let\oldalgorithmic\algorithmic
\renewcommand{\algorithmic}{%
\stepcounter{algorithmicH}% Step counter
\oldalgorithmic}% Do what was always done with algorithmic environment
\renewcommand{\theHALG@line}{ALG@line.\thealgorithmicH.\arabic{ALG@line}}
\makeatother
\begin{document}
\begin{algorithmic}
\Procedure{Euclid}{$a,b$}
\EndProcedure
\end{algorithmic}
\begin{algorithmic}
\Procedure{Euclid}{$a,b$}
\EndProcedure
\end{algorithmic}
\end{document}
ALG@line.<algnum>.<linenum>
上面我使用插入的<algnum>.
新计数器(每次使用时都会增加)引用了每一行algorithmic
。这使得一个算法中的行号 X 与另一个算法中的相同行号 X 可以区分开来。
不确定这是否会影响保存和恢复的算法。
答案2
采用更现代的方法:
\documentclass{article}
\usepackage{algpseudocode}
\usepackage{hyperref}
\usepackage{cleveref}
% fix anchor names for algorithm lines
\newcounter{Halgorithmic}
\AtBeginEnvironment{algorithmic}{\stepcounter{Halgorithmic}}
\ExpandArgs{c}\newcommand{theHALG@line}{\arabic{Halgorithmic}.\arabic{ALG@line}}
\begin{document}
\begin{algorithmic}
\Procedure{Euclid}{$a,b$}
\EndProcedure
\end{algorithmic}
\begin{algorithmic}
\Procedure{Euclid}{$a,b$}
\EndProcedure
\end{algorithmic}
\end{document}
我们在 的开头注入代码algoritmic
,即 step 一个虚拟计数器Halgorithmic
并定义\theHALG@line
到yield
<current value of Halgorithmic>.<current value of ALG@line>
使用(记录的)事实,即无论何时定义它,hyperref
都使用其锚点,用于每个计数器。\theH<name>
<name>
那个工程
\ExpandArgs{c}\newcommand{theHALG@line}{...}
是相同的
\expandafter\newcommand\csname theHALG@line\endcsname{...}
但它肯定更简单(c
代表c
控制序列名称)。
答案3
可以通过添加hypertexnames=false
hyperref 选项来解决此问题。
\usepackage[hypertexnames=false]{hyperref}
看hyperref 选项 hypertexnames 有什么作用?为什么这样做有效。
(编辑:)如何运作
这里的问题是每行都有链接名称ALG@line.<line number>
。因此,如果文档中有两种算法,它们对应的行将具有相同的链接名称。
正如其他答案所建议的那样,解决此问题的一种方法是将链接名称格式更改为类似的格式ALG@line.<algorithm name>.<line number>
。
解决此问题的另一种方法是以某种方式<line number>
在每个算法开始时不重置链接名称的组件。这可以使用 来实现hypertexnames=false
。hyperref 选项 hypertexnames 有什么作用?很好地解释了此选项的作用:
使用选项
hypertexnames
hyperref 除了使用链接类型之外,还使用相应的计数器来构造链接名称。想象一下,您有两个章节,每个章节有一个部分,外加一个表格。链接名称将是:和
hypertexnames
:chapter.1 section.1.1 table.1.1 chapter.2 section.2.1
没有
hypertexnames
:chapter.3 section.4 table.5 chapter.6 section.7