![算法的 autoref](https://linux22.com/image/335399/%E7%AE%97%E6%B3%95%E7%9A%84%20autoref.png)
\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 默认算法名称。