使用 \autoref 在“算法”环境中创建对某一行的智能交叉引用

使用 \autoref 在“算法”环境中创建对某一行的智能交叉引用

\autoref要设置我使用的算法的命令名称:

\newcommand{\algorithmautorefname}{Algorithm}

喜欢评论这里。我还希望能够使用 来引用algorithmic环境中的线路line x

\begin{algorithm}
\label{alg:myalg}
\begin{algorithmic}[1]
  \State Do X 
  \State Do Y \label{algl:y}
  \State $x = y + z$
\end{algorithmic}
\end{algorithm}

\autoref{alg:myalg}给了我正确的算法 1。此外,我还想\autoref{algl:y}生成2号线. 到目前为止我正在使用:line~\ref{algl:y}

看到同样的答案您可以通过以下方式定义自动引用名称:\....autorefname。但是他提到一些计数器是隐藏的,例如行号:\c@ALG@line。是否可以为它们创建一个自动引用名称?

我努力了:

\newcommand{\ALGlineautorefname}{line}
\newcommand{\ALG_lineautorefname}{line}
\newcommand{\ALG@lineautorefname}{line}

但没有一个能工作,只有第一个能编译。

如果可能的话,我如何\autorefname在环境中创建一条线路algorithmic

答案1

行计数器隐藏于hyperref因为\autoref计数器是使用\addtocounter{ALG@line}{1}而不是 来步进的\refstepcounter{ALG@line}。以下补丁程序纠正了这个问题,允许您定义\ALG@lineautorefname

在此处输入图片描述

\documentclass{article}

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

\makeatletter
\patchcmd{\ALG@step}{\addtocounter{ALG@line}{1}}{\refstepcounter{ALG@line}}{}{}
\newcommand{\ALG@lineautorefname}{Line}
\makeatother

\newcommand{\algorithmautorefname}{Algorithm}

\begin{document}  

See \autoref{alg:myalg}, specifically \autoref{algl:y}.

\begin{algorithm}
  \caption{An algorithm}\label{alg:myalg}
  \begin{algorithmic}[1]
    \State Do X 
    \State Do Y \label{algl:y}
    \State $x = y + z$
  \end{algorithmic}
\end{algorithm}

\end{document}

答案2

以下是cleveref基于 的解决方案。注意:\cref(包的主要用户宏cleveref)的工作方式与 非常相似\autoref,只是它实际上比 更强大、更灵活\autoref。例如,\cref可以接受多个参数;请参阅下面的代码以获取示例。另一个好消息:cleveref是“开箱即用”的,知道algorithmic环境中的行应该称为“行”——无需自己提供此设置。

在此处输入图片描述

\documentclass{article}
\usepackage{algorithm,algpseudocode}
\usepackage[colorlinks]{hyperref}
\usepackage[noabbrev,capitalize,nameinlink]{cleveref}
\begin{document}

\begin{algorithm}
\caption{Baseline}\label{ALG_baseline}
\begin{algorithmic}[1]
  \State Do X 
  \State Do Y        \label{algl:y}
  \State $x = y + z$ \label{algl:sum}
\end{algorithmic}
\end{algorithm}
\cref{algl:y} in \cref{ALG_baseline} is \dots

\cref{algl:y,algl:sum} of the algorithm are based on \dots
\end{document}

相关内容