Hyperref、cleveref 和 algpseudocode 相同标识符警告

Hyperref、cleveref 和 algpseudocode 相同标识符警告

我收到警告

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

你应该改变加载顺序(推动algpseudocodehyperrefhyperref)并重新定义查看线路内的目的地的方式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=falsehyperref 选项来解决此问题。

\usepackage[hypertexnames=false]{hyperref}

hyperref 选项 hypertexnames 有什么作用?为什么这样做有效。

(编辑:)如何运作

这里的问题是每行都有链接名称ALG@line.<line number>。因此,如果文档中有两种算法,它们对应的行将具有相同的链接名称。

正如其他答案所建议的那样,解决此问题的一种方法是将链接名称格式更改为类似的格式ALG@line.<algorithm name>.<line number>

解决此问题的另一种方法是以某种方式<line number>在每个算法开始时不重置链接名称的组件。这可以使用 来实现hypertexnames=falsehyperref 选项 hypertexnames 有什么作用?很好地解释了此选项的作用:

使用选项hypertexnameshyperref 除了使用链接类型之外,还使用相应的计数器来构造链接名称。想象一下,您有两个章节,每个章节有一个部分,外加一个表格。链接名称将是:

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

相关内容