如何删除自定义 algorithmicx 块末尾的那行多余的行?

如何删除自定义 algorithmicx 块末尾的那行多余的行?

我正在使用该algorithmicx包并创建了一个名为的自定义块\On,但即使使用该noend选项,algpseudocode我也会在块末尾得到一个额外的空白行。

这是一个完整的例子:

\documentclass[a4paper]{report}

\usepackage{algorithmicx}
\usepackage{algorithm}
\usepackage[noend]{algpseudocode}

% Defines custom \On ... \EndOn block
\algblockdefx[ON]{On}{EndOn}
  [2]{\textbf{on}~#1~\textbf{from}~#2~\textbf{do}}

\begin{document}
  \begin{algorithm}
    \begin{algorithmic}
      \On{$foo$}{$bar$}
        \State baz
      \EndOn
    \end{algorithmic}
  \end{algorithm}
\end{document}

结果如下:

algorithmicx 包中的自定义 ON-block

如您所见,我得到了一个额外的空白行。但是,像\If和 这样的预定义块\For可以按预期使用该noend选项。

我已阅读过文档几次,但仍然不知道如何解决这个问题。

我正在使用 MacTeX(TeX Live)2013 的 pdflatex。

答案1

我最近遇到了同样的问题,但在查看源代码后我想出了以下解决方法algpseudocode

% Tell algorithmicx not to print an empty line if `noend' option is set 
\makeatletter
\ifthenelse{\equal{\ALG@noend}{t}}%
  {\algtext*{EndOn}}
  {}%
\makeatother

在此处输入图片描述

我认为,对每个用户定义块进行这样的修复可以视为 中的一个错误algpseudocode。也许你应该给维护者发一封电子邮件...


编辑:如果您决定不使用该noend选项,则“On”块的以下定义可能更有意义。

\algnewcommand\algorithmicon{\textbf{on}}
\algnewcommand\algorithmicfrom{\textbf{from}}
\algblockdefx[ON]{On}{EndOn}[2]
  {\algorithmicon\ #1\ \algorithmicfrom\ #2\ \algorithmicdo}
  {\algorithmicend\ \algorithmicon}

在此处输入图片描述

完整代码

\documentclass[a4paper]{report}

\usepackage{algorithmicx}
\usepackage{algorithm}
\usepackage[noend]{algpseudocode}

% Defines custom \On ... \EndOn block
\algnewcommand\algorithmicon{\textbf{on}}
\algnewcommand\algorithmicfrom{\textbf{from}}
\algblockdefx[ON]{On}{EndOn}[2]
  {\algorithmicon\ #1\ \algorithmicfrom\ #2\ \algorithmicdo}
  {\algorithmicend\ \algorithmicon}

% Tells algorithmicx not to print an empty line if `noend' is set 
\makeatletter
\ifthenelse{\equal{\ALG@noend}{t}}%
  {\algtext*{EndOn}}
  {}%
\makeatother

\begin{document}
  \begin{algorithm}
    \begin{algorithmic}
      \On{$foo$}{$bar$}
        \State baz
      \EndOn
    \end{algorithmic}
  \end{algorithm}
\end{document}

答案2

尝试这个

\algblockdefx[ON]{On}{EndOn}
[2]{\textbf{on}~#1~\textbf{from}~#2~\textbf{do}}
{\vspace{-\baselineskip}}

只需将垂直空间拉伸至 0


例如

\documentclass{article}
\usepackage{algpseudocode}
\begin{document}
%case block 
\algblockdefx[caseBlock]{case}{endCase}
[1]{\textbf{case} #1 \textbf{of}}
{\textbf{end case}}
%
%caseToken block
\algblockdefx[caseTokenBlock]{caseToken}{endCaseToken}
[1]{\textbf{#1: }}
{\vspace{-\baselineskip}}
%
%noEnd block
\algblockdefx[noEndBlock]{noEnd}{noEndEnd}
[1]{#1}
{\vspace{-\baselineskip}}
%

\begin{algorithmic}[0]
  \Procedure{\textit{factor}}{}
  \noEnd{\textbf{Begin}}
  \case{token}
  \caseToken{(}
  \State match(\textbf{(})
  \State exp
  \State match(\textbf{)})
  \endCaseToken
  \caseToken{\textit{number}}
  \State match(\textit{\textbf{number}})
  \endCaseToken
  \noEnd{\textbf{else: } \textit{error}}
  \noEndEnd
  \endCase
  \noEndEnd
  \EndProcedure
\end{algorithmic}
\end{document}

没有结局

相关内容