算法的 autoref

算法的 autoref
\usepackage{algorithm,algpseudocode}
\usepackage{hyperref}

所以当我

\begin{algorithm}
\caption{Baseline}\label{ALG_baseline}
\begin{algorithmic}[1]
...
\end{algorithmic}
\end{algorithm}

输出看起来会像这样:

--------------------------------------
Algorithm 1: Baseline
--------------------------------------
...
--------------------------------------

很明显,已经有一个计数器了。

\autoref{ALG_baseline} is simply linked to with a number.

将导致

[1] is simply linked to with a number.

我怎样才能进行 autoref 输出

[Algorithm 1] is ...

反而?

答案1

\autoref只有与相应的宏一起使用才能完全起作用\....autorefname,即\sectionautorefname等等。

hyperref从其特定的标签信息中提取参考信息,其中也存储了相关的计数器名称。

这意味着,如果计数器名为foo,则\fooautorefname必须存在——否则它将被忽略(并向控制台发送警告)。

algorithm环境有一个同名的计数器,因此

\newcommand{\algorithmautorefname}{Algorithm}

将提供hyperref正确的信息。

\documentclass{article}

\usepackage{algorithm,algpseudocode}
\usepackage{hyperref}

\newcommand{\algorithmautorefname}{Algorithm}

\begin{document}
\begin{algorithm}
\caption{Baseline}\label{ALG_baseline}
%\begin{algorithmic}[1]
%
%\end{algorithmic}
\end{algorithm}

\autoref{ALG_baseline} is simply linked to with a number.

\end{document}

在此处输入图片描述

请注意,该cleveref软件包提供了类似的功能,但是,也必须设置名称,\crefname{algorithm}{algorithm}{algorithms}等等。

更新

这解决了 OP 关于检测计数器名称的评论。

文件摘录.log

计数器定义写入.log文件为c@foo=\countY,其中Y是空闲计数器寄存器的编号并且并不重要(除了少数例外)。

\@float@every@algorithm=\toks16
\c@algorithm=\count88

后来我们发现

\c@ALG@line=\count89
\c@ALG@rem=\count90
\c@ALG@nested=\count91
\ALG@tlm=\skip43
\ALG@thistlm=\skip44
\c@ALG@Lnr=\count92
\c@ALG@blocknr=\count93
\c@ALG@storecount=\count94
\c@ALG@tmpcounter=\count95
\ALG@tmplength=\skip45

这意味着,那ALG@line(很可能)是行号计数器。

然而,由于@名称中的用途,它是一个‘隐藏’计数器!

答案2

我花了半个小时才弄清楚,我必须使用 \renewcommand{} 而不是仅仅使用 \newcommand 来覆盖 hyperref 默认算法名称。

相关内容