Создайте интеллектуальную перекрестную ссылку на строку в «алгоритмической» среде, используя \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's, \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}

Связанный контент