![Crie uma referência cruzada inteligente para uma linha em um ambiente 'algorítmico' usando \autoref](https://rvso.com/image/348651/Crie%20uma%20refer%C3%AAncia%20cruzada%20inteligente%20para%20uma%20linha%20em%20um%20ambiente%20'algor%C3%ADtmico'%20usando%20%5Cautoref.png)
Para definir o nome do \autoref
comando para um algoritmo que uso:
\newcommand{\algorithmautorefname}{Algorithm}
gosto comentouaqui. Eu também gostaria de poder me referir a linhas dentro de um algorithmic
ambiente 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 \autorefname
linha em um algorithmic
ambiente.
Responder1
O contador de linha está ocultohyperref
é \autoref
porque o contador é escalonado usando \addtocounter{ALG@line}{1}
em vez de \refstepcounter{ALG@line}
. O patch a seguir corrige isso, permitindo definir \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}
Responder2
A seguir está uma cleveref
solução baseada em -. Nota: \cref
(a macro de usuário principal do cleveref
pacote) funciona de maneira muito semelhante ao \autoref
, exceto que na verdade é muito mais poderoso e flexível que o \autoref
. Por exemplo, \cref
pode receber vários argumentos; veja o código abaixo para ver um exemplo. Outras boas notícias: cleveref
está programado "pronto para uso" para saber que as linhas em um algorithmic
ambiente devem ser chamadas, bem, de "linhas" - não há necessidade de fornecer essa configuração você mesmo.
\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}