我正在使用算法包。当我用 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.
我有两个问题:
- 为什么会发生这种情况?
- 我怎样才能将 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}
可能还有其他/更好/更优雅的解决方案。