Erstellen Sie mit \autoref einen intelligenten Querverweis auf eine Zeile in einer „algorithmischen“ Umgebung

Erstellen Sie mit \autoref einen intelligenten Querverweis auf eine Zeile in einer „algorithmischen“ Umgebung

Um den Namen des \autorefBefehls für einen Algorithmus festzulegen, verwende ich:

\newcommand{\algorithmautorefname}{Algorithm}

wie kommentiertHier. Ich möchte auch in der Lage sein, algorithmicmit auf Zeilen innerhalb einer Umgebung zu verweisen 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}gibt mir richtigAlgorithmus 1. Außerdem möchte ich auch \autoref{algl:y}generierenZeile 2. Bisher verwende ich: line~\ref{algl:y}.

Sehen Sie diegleiche AntwortSie können die Autoref-Namen wie folgt definieren: \....autorefname. Dann erwähnt er jedoch, dass einige Zähler ausgeblendet sind, beispielsweise die Zeilennummerierung: \c@ALG@line. Ist es möglich, einen Autoref-Namen für sie zu erstellen?

Ich habe versucht:

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

aber keines funktioniert und nur das erste wird kompiliert.

Wenn möglich, wie kann ich eine \autorefnamefür eine Zeile in einer algorithmicUmgebung erstellen?

Antwort1

Der Zeilenzähler ist ausgeblendet vonhyperrefliegt \autorefdaran, dass der Zähler mit \addtocounter{ALG@line}{1}anstelle von schrittweise erhöht wird \refstepcounter{ALG@line}. Der folgende Patch korrigiert dies und ermöglicht Ihnen die Definition von \ALG@lineautorefname:

Bildbeschreibung hier eingeben

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

Antwort2

Das Folgende ist eine cleverefauf -basierte Lösung. Hinweis: \cref(das Hauptbenutzermakro des cleverefPakets) funktioniert sehr ähnlich wie \autoref, ist aber tatsächlich viel leistungsfähiger und flexibler als \autoref. Beispielsweise \crefkann mehrere Argumente annehmen; ein Beispiel finden Sie im Code unten. Weitere gute Neuigkeiten: cleverefist „out of the box“ so programmiert, dass es weiß, dass Zeilen in einer algorithmicUmgebung, nun ja, „Zeilen“ genannt werden sollten – Sie müssen diese Einrichtung nicht selbst bereitstellen.

Bildbeschreibung hier eingeben

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

verwandte Informationen