parbox 和算法中的循环有冲突吗?

parbox 和算法中的循环有冲突吗?

我开始使用 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 页那样重新定义以获得更好的格式。

在此处输入图片描述

相关内容