算法 LaTeX \EndForAll 和“有些块未关闭!!!”

算法 LaTeX \EndForAll 和“有些块未关闭!!!”

我是 LaTeX 软件包的新手algorithm,需要帮助弄清楚如何调试下面的 MWE,它给出了六个错误。它看起来很复杂,但一半的错误都是同一件事,而且在一个案例中我显然没有\EndForAll正确使用,尽管它看起来很直观(而且网上没有关于它的任何信息)。我对这个\end{algorithmic}错误特别好奇,它说Error: Some blocks are not closed!!! 我在打开的每个块上都提供了End语句,所以我不明白这个错误是什么。

我将非常感谢您的反馈。

\documentclass[]{article}
\usepackage{algorithm}
\usepackage[noend]{algpseudocode}
\renewcommand{\algorithmicforall}{\textbf{for each}}

\begin{document}


\begin{algorithm}
  \caption{algorithm}\label{euclid}
  \begin{algorithmic}[1]
  \Procedure{myalgo}{}
  \State $\textit{things} \gets \textit{stuff}$
  \State $g(thing)$ \gets \text{stuff }(\textit{material})$
  \Comment{comment}{}
  \ForAll{{$stuff$ in $things$}} :
  \State \text{Material }(\textit{stuff})
  \Comment{stuff}{}
  \State \text{\it{k}} = (\textit{stuff}, \textit{things})
  \EndForAll
  \If {$k$ is good}:
  \State $things$
  \EndIf
  \ForAll{{$things$ in $stuff$}} :
  \State $abs\bigg|{stuff} - {things}\bigg|$
  \State Material \bigg\{$abs \bigg|{stuff} - {things}\bigg|$\bigg\}
  \Comment{Ending}{}
  \EndProcedure
  \end{algorithmic}
\end{algorithm}


\end{document}

答案1

没有\EndForAll,但是\EndFor。你漏了一个。

您对变量和函数名称的处理也不一致。这是经过编辑的版本,其中包含几个辅助宏。进入和退出数学模式时要小心。

\documentclass[]{article}
\usepackage{amsmath}
\usepackage{algorithm}
\usepackage[noend]{algpseudocode}
\renewcommand{\algorithmicforall}{\textbf{for each}}

\newcommand{\var}[1]{\mathit{#1}}
\newcommand{\func}[1]{\mathrm{#1}}

\begin{document}


\begin{algorithm}
  \caption{algorithm}\label{euclid}
  \begin{algorithmic}[1]
  \Procedure{myalgo}{}
  \State $\var{things} \gets \var{stuff}$
  \State $g(\var{thing}) \gets \func{stuff}(\var{material})$
  \Comment{comment}{}
  \ForAll{$\var{stuff}$ in $\var{things}$}:
  \State $\func{Material}(\var{stuff})$
  \Comment{stuff}{}
  \State $k = (\var{stuff}, \var{things})$
  \EndFor
  \If {$k$ is good}:
  \State $\var{things}$
  \EndIf
  \ForAll{$\var{things}$ in $\var{stuff}$}:
  \State $\func{abs}\big|\var{stuff} - \var{things}\big|$
  \State $\func{Material} \bigl\{\func{abs} \big|\var{stuff} - \var{things}\big|\bigr\}$
  \Comment{Ending}{}
  \EndFor
  \EndProcedure
  \end{algorithmic}
\end{algorithm}


\end{document}

请注意,这\bigg太大了!

在此处输入图片描述

答案2

您犯了几个语法错误:

  1. 第二\State,你$之后看到了一个虚假的迹象(thing)

  2. 结束命令是\EndFor,不是\EndForAll

修正后的代码:

\documentclass[]{article}
\usepackage{amsmath}
\usepackage{algorithm}
\usepackage[noend]{algpseudocode}
\renewcommand{\algorithmicforall}{\textbf{for each}}

\begin{document}


\begin{algorithm}
  \caption{algorithm}\label{euclid}
  \begin{algorithmic}[1]
  \Procedure{myalgo}{}
  \State $\textit{things} \gets \textit{stuff}$
  \State $g(thing) \gets \text{stuff }(\textit{material})$
  \Comment{comment}{}
  \ForAll{{$stuff$ in $things$}} :
  \State \text{Material }(\textit{stuff})
  \Comment{stuff}{}
  \State \text{\it{k}} = (\textit{stuff}, \textit{things})
  \EndFor
  \If {$k$ is good}:
  \State $things$
  \EndIf
  \ForAll{{$things$ in $stuff$}} :
  \State $abs\bigg|{stuff} - {things}\bigg|$
  \State Material \bigg\{$abs \bigg|{stuff} - {things}\bigg|$\bigg\}
  \EndFor
  \Comment{Ending}{}
  \EndProcedure
  \end{algorithmic}
\end{algorithm}


\end{document}

输出:

在此处输入图片描述

texdoc algpseudocode在终端中使用来访问algorithmicx系统中该捆绑包的文档。

相关内容