出于空间考虑,我希望浓缩我的伪代码。
我觉得每个块末尾总是有一个 \EndIf 或 \EndFor 有点烦人,尤其是当块内只有一个语句时。例如
\documentclass[a4paper]{article}
\usepackage{algorithmicx}
\usepackage{algorithm} % http://ctan.org/pkg/algorithms
\usepackage{algpseudocode} % http://ctan.org/pkg/algorithmicx
\newcommand*{\Let}[2]{\State #1 $\gets$ \parbox[t]{\linegoal}{#2\strut}}
\algnewcommand\algorithmicinput{\textbf{INPUT: }}
\algnewcommand\Input{\item[\algorithmicinput]}
\algnewcommand\algorithmicoutput{\textbf{OUTPUT: }}
\algnewcommand\Output{\item[\algorithmicoutput]}
\begin{document}
\begin{algorithm}
\begin{algorithmic}[1]
\Procedure{A}{}
\ForAll{$a\in A$}
\If{$a\geq b$}
\State\Return $a$
\EndIf
\EndFor
\EndProcedure
\end{algorithmic}
\end{algorithm}
\end{document}
为了节省空间,我希望删除它们,尽管这可能是非标准的。
一旦我这样做,代码就会因错误而无法编译。
是否有任何“非法”技巧可以将它们从输出 PDF 中删除?
答案1
预防结尾关键字排版
只需将noend
选项传递给algpseudocode
包:在代码中替换即可\usepackage[noend]{algpseudocode}
获得\usepackage{algpseudocode}
为了避免在输入文件\EndIf
中使用\Endfor
(经原帖作者澄清后,发现这是题外话。)
缺少\EndIf
和\EndFor
会产生错误;您不能简单地在输入文件中省略它们。如果您想省去在输入文件中使用这些宏来关闭控制流语句的麻烦,您可以定义一个结合\If
和的宏\EndIf
,另一个结合\ForAll
和的宏\EndFor
,等等。
\documentclass[a4paper]{article}
\usepackage{algorithmicx}
\usepackage{algorithm}
\usepackage{algpseudocode}
\newcommand*{\Let}[2]{\State #1 $\gets$ \parbox[t]{\linegoal}{#2\strut}}
\algnewcommand\algorithmicinput{\textbf{INPUT: }}
\algnewcommand\Input{\item[\algorithmicinput]}
\algnewcommand\algorithmicoutput{\textbf{OUTPUT: }}
\algnewcommand\Output{\item[\algorithmicoutput]}
\begin{document}
\newcommand\sForAll[2]{ \ForAll{#1}#2\EndFor} % snappy version of \ForAll...\EndFor
\newcommand\sIf[2]{ \If{#1}#2\EndIf} % snappy version of \If...\EndIf
\begin{algorithm}
\begin{algorithmic}[1]
\Procedure{A}{}
\sForAll{$a\in A$}{
\sIf{$a\geq b$}{
\State\Return $a$
}
}
\EndProcedure
\end{algorithmic}
\end{algorithm}
\end{document}
答案2
\usepackage[noend]{algorithmic}