我正在使用该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}
结果如下:
如您所见,我得到了一个额外的空白行。但是,像\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}