我遇到了 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
会显示xyz
not{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}