定制 algorithm/algpseudocode 包

定制 algorithm/algpseudocode 包

问完这个问题之后:在算法软件包中更改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}
  1. 为什么没有\algorithmicstate定义?
  2. 为什么当我定义一个新命令时需要在其后面添加一个空格?
  3. 为什么\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

相关内容