为什么在算法环境中放置 \COMMENT 很重要?

为什么在算法环境中放置 \COMMENT 很重要?

我正在使用算法包。当我用 COMMENT 开始 FORALL 时,LaTeX 的行为就像我创建了一个无效的循环体。如果我把它放在第二行,先用 STATE,一切就都好了。

演示:

\documentclass[a4paper,10pt]{article}
\usepackage{algorithmic}
\begin{document}
\begin{algorithmic}
\FORALL{ $a \in B$}
    \STATE X
    \COMMENT{Blah.}
\ENDFOR
\end{algorithmic}
\end{document}

如果你颠倒 STATE 和 COMMENT 的顺序,那么这将无法编译。

The error messages are 4 "Something's wrong--perhaps a missing \item..."
3 for the \STATE, and 1 for the \ENDFOR.

我有两个问题:

  1. 为什么会发生这种情况?
  2. 我怎样才能将 COMMENT 作为循环中的第一个项目?

编辑:所以我注意到有一种方法可以在 \FORALL 之后立即添加注释,如下所示

\FORALL[comment]{loop condition}

但我实际上想将注释放在循环中第一个语句的正上方——这与循环条件无关。

我可以使用 \vspace 标签来做到这一点,但这会留下注释的开始括号,即循环旁边的 '{',其主体位于下方,即

\FORALL[\vspace{0.5cm} comment]{loop condition}

如下所述,可以使用语句解决该问题

\FORALL{loop condition}
  \STATE \COMMENT{blah}
  \STATE X
\ENDFOR

但现在生成的注释在编号算法环境中将具有其自己的行号。

答案1

您需要algorithmic通过 来“欺骗”环境,使其仅在一行上发布注释\STATE \COMMENT{Blah}。这样做的原因(回答您的第一个问题)是因为algorithmic环境将其内容处理为列表(类似于\begin{enumerate}...\end{enumerate}\begin{itemize}...\end{itemize})。并且,在类似的上下文中,它需要一个命令,例如\item移动到下一个项目,甚至启动列表。这样的命令是\STATE。使用以下最小示例应该可以回答这两个问题:

\documentclass[a4paper,10pt]{article}
\usepackage{algorithmic}
\begin{document}
\begin{algorithmic}
\FORALL{$a \in B$}
    \STATE \COMMENT{Blah.} % single line comment
    \STATE X
    \COMMENT{Blah.}
\ENDFOR
\end{algorithmic}
\end{document}​

带行注释的算法

编辑:上述方法仅在您不使用行号时才有效。如果您使用行号(通过\begin{algorithmic}[1]),则可以定义一个新的宏\LCOMMENT{<comment>}(“Line COMMENT”的缩写)来实现此目的:

\documentclass[a4paper,10pt]{article}
\usepackage{algorithmic}
\makeatletter
\newcounter{ALC@tempcntr}% Temporary counter for storage
\newcommand{\LCOMMENT}[1]{%
    \setcounter{ALC@tempcntr}{\arabic{ALC@rem}}% Store old counter
    \setcounter{ALC@rem}{1}% To avoid printing line number
    \item \{#1\}% Display comment + does not increment list item counter
    \setcounter{ALC@rem}{\arabic{ALC@tempcntr}}% Restore old counter
}%
\makeatother
\begin{document}
\begin{algorithmic}[1]
\FORALL{ $a \in B$}
    \LCOMMENT{Blah.} % single line comment
    \STATE X
    \COMMENT{Blah.}
\ENDFOR
\end{algorithmic}
\end{document}​

带有行注释而不带行号的算法

可能还有其他/更好/更优雅的解决方案。

相关内容