如何使用 LaTeX 伪代码环境排版 goto 和标签?

如何使用 LaTeX 伪代码环境排版 goto 和标签?

有没有办法使用 LaTeX 伪代码环境 ( algorithmicpseudocodeclrscodealgorithm2e等) 排版 goto 和标签?如果能自动正确地缩进标签,那将不胜感激。

答案1

您可以使用行号作为标签,并在“转到”命令中引用它们。

在下面的最小示例中,我使用以下命令定义了“转到”命令(我正在使用algorithmicx):

\algnewcommand{\algorithmicgoto}{\textbf{go to}}%
\algnewcommand{\Goto}[1]{\algorithmicgoto~\ref{#1}}%

\algorithmicgoto提供样式,而\Goto{<label>}是环境中要使用的实际命令algorithmic。以下<label>是使用 在任何行上定义的标签\label{<label>}

在此处输入图片描述

\documentclass{article}
\usepackage{algpseudocode}% http://ctan.org/pkg/algorithmicx
\usepackage{algorithm}% http://ctan.org/pkg/algorithm
\begin{document}
\algnewcommand{\algorithmicgoto}{\textbf{go to}}%
\algnewcommand{\Goto}[1]{\algorithmicgoto~\ref{#1}}%
\begin{algorithm}
  \caption{Euclid’s algorithm}\label{euclid}
  \begin{algorithmic}[1]
    \Procedure{Euclid}{$a,b$}\Comment{The g.c.d. of a and b}
    \State $r\gets a\bmod b$
    \While{$r\not=0$}\Comment{We have the answer if r is 0} \label{marker}
      \State $a\gets b$
      \State $b\gets r$
      \State $r\gets a\bmod b$
    \EndWhile
    \State \textbf{return} $b$\Comment{The gcd is b}
    \State \Goto{marker}
  \EndProcedure
\end{algorithmic}
\end{algorithm}
\end{document}

也可以组合使用\State命令\Goto

\algnewcommand{\Goto}[1]{\State \algorithmicgoto~\ref{#1}}

但是,这会使其无法\Goto与一行上的任何其他内容一起使用,因为它会发出一个\State,从而在算法中开始一个新行。


这是另一种方法,仍然使用algorithmicx。这次我使用了略有不同的版本\Goto(使用xspace)。此外,还定义了一个\Label命令。这会发出一个\State命令,然后\unskip删除由 内部发出的任何水平跳过,algorithmicx以适当的量缩进块。这允许您以自己的样式将“标签”排版到左边距:

在此处输入图片描述

\documentclass{article}
\usepackage{algpseudocode}% http://ctan.org/pkg/algorithmicx
\usepackage{algorithm}% http://ctan.org/pkg/algorithm
\usepackage{xspace}% http://ctan.org/pkg/xspace
\begin{document}
\algnewcommand{\algorithmicgoto}{\textbf{go to}}%
\algnewcommand{\Goto}{\algorithmicgoto\xspace}%
\algnewcommand{\Label}{\State\unskip}
\begin{algorithm}
  \caption{Euclid’s algorithm}\label{euclid}
  \begin{algorithmic}
    \Procedure{Euclid}{$a,b$}\Comment{The g.c.d. of a and b}
    \State $r\gets a\bmod b$
    \Label \texttt{marker:}
    \While{$r\not=0$}\Comment{We have the answer if r is 0}
      \State $a\gets b$
      \State $b\gets r$
      \State $r\gets a\bmod b$
    \EndWhile
    \State \textbf{return} $b$\Comment{The gcd is b}
    \State \Goto \texttt{marker}
  \EndProcedure
\end{algorithmic}
\end{algorithm}
\end{document}

答案2

使用时algorithm2e我使用下面的代码行Goto

\begin{algorithm}[!ht]
    \small
    \SetAlgoNoLine
    \LinesNumbered
    \SetKw{KwGoTo}{go to}

    \Begin{
        \For{$i = 1$ \KwTo $L$}{\label{outer_loop}
            \For{$k = 1$ \KwTo $K$} {
                \If{$k = 10$}{
                    \KwGoTo \ref{outer_loop}\;
                 }
            }
        }
    }
\end{algorithm}

相关内容