Cree una referencia cruzada inteligente a una línea en un entorno 'algorítmico' usando \autoref

Cree una referencia cruzada inteligente a una línea en un entorno 'algorítmico' usando \autoref

Para establecer el nombre del \autorefcomando para un algoritmo utilizo:

\newcommand{\algorithmautorefname}{Algorithm}

me gusta comentadoaquí. También me gustaría poder hacer referencia a líneas dentro de un algorithmicentorno con 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 da correctamenteAlgoritmo 1. Además, también me gustaría haber \autoref{algl:y}generadolínea 2. Hasta ahora estoy usando: line~\ref{algl:y}.

viendo elmisma respuestapuede definir los nombres de autoref mediante: \....autorefname. Pero luego menciona que algunos contadores están ocultos, por ejemplo la numeración de líneas: \c@ALG@line. ¿Es posible crear un nombre autoref para ellos?

Yo he tratado:

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

pero ninguno funciona y solo se compila el primero.

Si es posible, ¿cómo puedo crear una \autorefnamelínea en un algorithmicentorno?

Respuesta1

El contador de líneas está ocultohyperrefEs \autorefporque el contador se escalona usando \addtocounter{ALG@line}{1}en lugar de \refstepcounter{ALG@line}. El siguiente parche corrige esto, permitiéndole definir \ALG@lineautorefname:

ingrese la descripción de la imagen aquí

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

Respuesta2

La siguiente es una cleverefsolución basada en -. Nota: \cref(la macro de usuario principal del cleverefpaquete) funciona de manera muy similar a \autoref, excepto que en realidad es mucho más potente y flexible que \autoref. Por ejemplo, \crefpuede aceptar varios argumentos; vea el código a continuación para ver un ejemplo. Más buenas noticias: cleverefestá programado "listo para usar" para saber que las líneas en un algorithmicentorno deben llamarse, bueno, "líneas"; no es necesario que proporcione esta configuración usted mismo.

ingrese la descripción de la imagen aquí

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

información relacionada