Crie uma referência cruzada inteligente para uma linha em um ambiente 'algorítmico' usando \autoref

Crie uma referência cruzada inteligente para uma linha em um ambiente 'algorítmico' usando \autoref

Para definir o nome do \autorefcomando para um algoritmo que uso:

\newcommand{\algorithmautorefname}{Algorithm}

gosto comentouaqui. Eu também gostaria de poder me referir a linhas dentro de um algorithmicambiente com 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}me dá corretamenteAlgoritmo 1. Além disso, eu também gostaria de \autoref{algl:y}gerarlinha 2. Até agora estou usando: line~\ref{algl:y}.

Vendo omesma respostavocê pode definir os nomes autoref por: \....autorefname. Mas então ele menciona que alguns contadores estão ocultos, por exemplo a numeração das linhas: \c@ALG@line. É possível criar um nome autoref para eles?

Eu tentei:

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

mas nenhum funciona e apenas o primeiro é compilado.

Se possível, como posso criar uma \autorefnamelinha em um algorithmicambiente.

Responder1

O contador de linha está ocultohyperrefé \autorefporque o contador é escalonado usando \addtocounter{ALG@line}{1}em vez de \refstepcounter{ALG@line}. O patch a seguir corrige isso, permitindo definir \ALG@lineautorefname:

insira a descrição da imagem aqui

\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}

Responder2

A seguir está uma cleverefsolução baseada em -. Nota: \cref(a macro de usuário principal do cleverefpacote) funciona de maneira muito semelhante ao \autoref, exceto que na verdade é muito mais poderoso e flexível que o \autoref. Por exemplo, \crefpode receber vários argumentos; veja o código abaixo para ver um exemplo. Outras boas notícias: cleverefestá programado "pronto para uso" para saber que as linhas em um algorithmicambiente devem ser chamadas, bem, de "linhas" - não há necessidade de fornecer essa configuração você mesmo.

insira a descrição da imagem aqui

\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}

informação relacionada