问完这个问题之后:在算法软件包中更改forall foreach,评论中出现了一些问题。我创建了以下示例文档,有三个问题。
\documentclass{article}
\usepackage{algorithm}
% Need it for floating environment
\usepackage[noend]{algpseudocode}
% Hide endif .etc
\usepackage{caption}
% Need it for \caption*
\algrenewcommand{\algorithmicrequire}{\textbf{Input:}}
\algrenewcommand{\algorithmicensure}{\textbf{Output:}}
\algrenewcommand{\algorithmicforall}{\textbf{for each}}
% \algrenewcommand instead of \renewcommand according to manual
\newcommand{\To}{\textbf{to}}
% Not stated in manual, \Return and \algorithmicreturn are defined, but no \algorithmicstate, why?
\newcommand{\Dosth}{\textbf{Do Something }}
% Need space here, why?
\def\ForEach{\ForAll}
% Define new macro. Fail to use \algorithmicforall, why?
\begin{document}
\begin{algorithm}
\caption*{\textbf{Algorithm:} \textsc{Depth First Search}} \label{alg:dfs1}
\begin{algorithmic}[1]
\Require Graph $\mathcal{G = (V,E)}$
\Ensure Graph $\mathcal{G}$ with its vertices marked with consecutive integers in the order they have been visited by the DFS traversal
\Statex
\State Mark each vertex in $\mathcal{V}$ with $0$ \Comment As ``unvisited''
\State $count \gets 0$
\ForEach{vertex $v \in \mathcal{V}$}
\If{$v$ is marked with $0$}
\State \Call{DFS}{$v$}
\EndIf
\EndFor
\State \Return
\Statex
\Function{DFS}{$v$}
\State $count \gets count + 1$
\State mark $v$ with $count$
\State \Dosth with $v$
\ForEach{vertex $w \in \mathcal{V}$ adjacent to $v$}
\If{$w$ is marked with $0$}
\State \Call{DFS}{$w$}
\EndIf
\EndFor
\State \Return
\EndFunction
\end{algorithmic}
\end{algorithm}
\end{document}
- 为什么没有
\algorithmicstate
定义? - 为什么当我定义一个新命令时需要在其后面添加一个空格?
- 为什么
\def\ForEach{\ForAll}
工作但\def\ForEach{\algorithmicforall}
不起作用
答案1
以下是对您问题的解答。
为什么不呢
\algorithmicstate
?
也许是软件包编写者的疏忽?也许根本就不存在。无论哪种情况,您都可以使用以下命令创建自己的命令版本:
\algnewcommand{\algorithmicstate}{\textbf{State:}}
\newcommand{\Dosth}{\textbf{Do Something }}
% 这里需要空间,为什么?
这个问题在这里得到解答:\newcommand 和间距
为什么能
\def\ForEach{\ForAll}
工作但\def\ForEach{\algorithmicforall}
不能工作?
因为\ForAll
是一个比更复杂的宏\algorithmicforall
。它使用以下命令定义:
\algdef{S}[FOR]{ForAll}[1]{\algorithmicforall\ #1\ \algorithmicdo}
该\algdef
命令做了很多事情,它使用 for 循环所做的事情之一就是为 for 的结束设置一个期望,即\EndFor
。
当您将 定义\ForEach
为时ForAll
,您不会更改 的定义,\ForAll
而只是使其\ForEach
表现得像ForAll
。但是,如果您将其更改ForEach
为 ,\algorithmicforall
则无法为 的结束创建相应的期望,并且代码在遇到 时会失败\EndFor
。