我开始使用 algorithm 包绘制一个算法。但是,我遇到了一个问题,我不能很好地缩进包含循环的 parbox 块,而且似乎 parbox 仍然影响后面的部分:
我的代码是:
\documentclass[twoside, onecolumn, 11pt, a4paper]{article}
\usepackage[english,francais]{babel}
\usepackage{algorithm}
\usepackage[noend]{algpseudocode}
\algnewcommand{\Inputs}[1]{%
\State \textbf{Inputs:}
\Statex \hspace*{\algorithmicindent}\parbox[t]{.9\linewidth}{\raggedright #1}
}
\algnewcommand{\Outputs}[1]{%
\State \textbf{Outputs:}
\Statex \hspace*{\algorithmicindent}\parbox[t]{.9\linewidth}{\raggedright #1}
}
\algnewcommand{\Compute}[1]{%
\State \textbf{Compute:}
\hspace*{\algorithmicindent}\parbox[t]{.9\linewidth}{\raggedright #1}
}
\begin{document}
\begin{algorithm}
\begin{algorithmic}
\Inputs{$X$}
\Compute{
\For{i = 0 to I}
\State do sth in the loop
\EndFor
}
\Outputs{$Y$}
\end{algorithmic}
\end{algorithm}
\end{document}
我得到了 Compute 内容的一个奇怪的大缩进,并且 Output 也有一个缩进,似乎受到了 parbox 的影响。我该如何安排好这个算法?
答案1
我认为您根本不想使用 parbox,因为这不是algorithmicx
您想要的方式。事实上,algorithmicx
它允许您为此目的定义新块。parbox 实现(如果您可以让它工作)也会产生其他意想不到的后果,例如缩进行号。
相反,使用algorithmicx
的块定义语法。确实需要花点时间仔细阅读手册才能理解。我认为最简单的方法是使用元块定义器,\algdef
而不是试图找出哪些派生命令符合您的所需用例(有很多!)。
\documentclass[twoside, onecolumn, 11pt, a4paper]{article}
\usepackage[english,francais]{babel}
\usepackage{algorithm}
\usepackage[noend]{algpseudocode}
\algdef{SnEL}{Inputs}{EndInputs}{1}{\textbf{Inputs:} \State}
\algdef{SnEL}{Outputs}{EndOutputs}{1}{\textbf{Outputs:} \State}
\algdef{SnEl}{Compute}{EndCompute}{\textbf{Compute:}}
\begin{document}
\begin{algorithm}
\begin{algorithmic}
\Inputs $X$
\Compute
\For{$i = 0$ to $I$}
\State do $s$th in the loop
\EndFor
\EndCompute
\Outputs $Y$
\end{algorithmic}
\end{algorithm}
\end{document}
您可能还考虑\For
像手册第 11 页那样重新定义以获得更好的格式。