有没有办法使用 LaTeX 伪代码环境 ( algorithmic
、pseudocode
、clrscode
、algorithm2e
等) 排版 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}