我正在编写一个简单的伪代码,但我遇到了 repeat..until 块的问题。基本上,发生的事情是,此循环结束后的 return 语句与 till 子句呈现在同一行上,这很丑陋,但我找不到办法将其放在自己的一行上使用正确的缩进。
这里你可以举一个例子:
\documentclass[a4paper,10pt]{article}
\usepackage{algorithm}
\usepackage[noend]{algpseudocode}
\begin{document}
\begin{algorithm}
\caption{test di Fermat}\label{alg:test-fermat}
\begin{algorithmic}[1]
\Procedure{testFermat}{$n, prove$}
\Repeat
\State{$a \gets$ numero casuale tra 2 e $n-1$}
\If{$a^n \not\equiv a \bmod n$}
\Return composto
\EndIf
\State{$prove \gets prove - 1$}
\Until{$prove > 0$}
\Return forse primo
\EndProcedure
\end{algorithmic}
\end{algorithm}
\end{document}
我尝试使用 添加换行符\\
,但这会破坏缩进。我尝试使用\algorithmicindent
手动添加缩进,但这会显示“1.5em”而不是空格。我尝试在 后添加\State
或,但这也会破坏缩进。\Statex
\Until
有没有一种简单的方法可以将最后\Return
一行放在单独的一行,而不会破坏缩进?
顺便说一句,这种情况也发生在 If 块内的返回中,但我更担心带有 till 的块,因为 if 的情况看起来不那么糟糕。
编辑:我读过这疑问,但是却不能解决问题。
我不想使用varwidth
,因为因为我必须修复直到循环,所以我必须手动管理所有缩进[varwidth
在循环中间启动环境会破坏其他缩进]。
答案1
这或许是一种状态设计选择,允许人们选择\Return
与其他语句放在同一行或单独放置。要默认将其单独放置,请添加
\algrenewcommand\Return{\State \algorithmicreturn{} }%
到您的文档序言中。
\documentclass[a4paper,10pt]{article}
\usepackage{algorithm}% http://ctan.org/pkg/algorithms
\usepackage[noend]{algpseudocode}% http://ctan.org/pkg/algorithmicx
\algrenewcommand\Return{\State \algorithmicreturn{} }%
\begin{document}
\begin{algorithm}
\caption{test di Fermat}\label{alg:test-fermat}
\begin{algorithmic}[1]
\Procedure{testFermat}{$n, prove$}
\Repeat
\State{$a \gets$ numero casuale tra 2 e $n-1$}
\If{$a^n \not\equiv a \bmod n$}
\Return composto
\EndIf
\State{$prove \gets prove - 1$}
\Until{$prove > 0$}
\Return forse primo
\EndProcedure
\end{algorithmic}
\end{algorithm}
\end{document}
答案2
最简单的解决方案是将返回语句包装在State
命令中,如下所示:
\State{\Return{composto}}