Environ 包在空内容上的行为不当

Environ 包在空内容上的行为不当

我遇到了 environ 包的一个问题。当环境内容为空时,它会返回错误的 \BODY 值。以下是示例:

\documentclass[12pt]{article}
\usepackage{environ}
\NewEnviron{env}[1]{\BODY}
\begin{document}
\begin{env}{abc}\end{env}
\end{document}

此代码生成\BODY=bc。还可以检查#1=a。结果不仅在内容为空时是错误的,而且在计算结果为空文本时也是错误的,例如当内容被注释掉时。

我使用的软件包的版本是 2014/05/04 v0.3。

谨致问候,Ryszard

答案1

问题是

 \def\collect@@body#1\end#2{% 

如果是括号组,则删除括号#1。你还会看到错误的内容

\begin{env}{abc}{xyz}\end{env}

在这种情况下,它会打印 OK,但\show\BODY会显示xyznot{xyz}

这是修复的一部分,它添加了一个,!因此#1永远不会为空,然后稍后将其删除。它并不完整,因为它仍然会删除括号,{jjj}如下面的示例生成的 lof 所示,它会产生

[macro:->abc] [macro:->]
[macro:->abc] [macro:->jjj]
[macro:->abc] [macro:->{}abc]

但如上面第一行所示,它确实涵盖了问题中的情况。

\documentclass[12pt]{article}
\usepackage{environ}

\NewEnviron{env}[1]{%
  \def\arg{#1}\typeout{[\meaning\arg] [\meaning\BODY]}%
  \BODY}

\makeatletter
\long\def\Collect@Body#1{%
  \@envbody{\expandafter#1\expandafter{\the\@envbody}}%
  \edef\process@envbody{\the\@envbody\noexpand\end{\@currenvir}}%
  \@envbody={}%
  \def\begin@stack{b}%
  \begingroup
  \expandafter\let\csname\@currenvir\endcsname\Collect@@Body
  \edef\process@envbody{%
    \expandafter\noexpand\csname\@currenvir\endcsname!}%
  \process@envbody
}
\long\def\Collect@@Body#1\end#2{%
  \edef\begin@stack{%
    \expandafter\Push@Begins\@gobble#1\begin\end\expandafter\@gobble\begin@stack}%
  \ifx\@empty\begin@stack
    \endgroup
    \@checkend{#2}%
    \expandafter\Addto@Envbody\expandafter{\@gobble#1}%
  \else
    \expandafter\Addto@Envbody\expandafter{\@gobble#1\end{#2}}%
  \fi
  \process@envbody}
\makeatletter

\begin{document}
\begin{env}{abc}\end{env}


\begin{env}{abc}{jjj}\end{env}


\begin{env}{abc}{}abc\end{env}


\end{document}

相关内容