我想提取并复制几个相当随意的环境的内容,并在文档末尾重复它们。该extract
包对我来说不起作用,因为环境内容太复杂了。所以我接下来尝试的etoolbox
是environ
:
\NewEnviron{foo}{%
\xappto\mystorage{\BODY}%
%% actual environment stuff
\BODY
}
对于纸面上的小型玩具示例,这种方法是可行的,但在我的真实文档中,我立即遇到了超出扩展的 TeX 容量的问题\BODY
。
因此我认为我想要的是一个扩展的机制仅第一层的\BODY
。也就是说,如果有意义的话,我想用给予环境的文字内容替换它。
我画了一个小概念演示:
\documentclass{article}
\usepackage{etoolbox}
\usepackage{environ}
\def\mystorage{}
\NewEnviron{foo}{%
\def\xBODY{\expandonce\BODY}%
\xappto\mystorage{\xBODY^^J}
\BODY}
\newcommand{\quz}{Xyzzy}
\begin{document}
\begin{foo}
Hello \quz{} World
\end{foo}
\typeout{\mystorage}
\end{document}
我希望这里发生的是\mystorage
包含Hello \quz {} World
。但我还没有设法让它工作(通过对\expandafter
和进行各种排列组合\protectify
);我要么得到\xBODY
(当然在那时毫无意义),要么得到Hello Xyzzy{} World
(扩展太多)。
答案1
您\mystorage
只是在积累第一级扩展\body
(加上一些^^J
您不想要的,除非写入文件)
你被最后的误导了,\typeout
因为它在展示之前就充分扩展了论点,所以你得到了
Hello Xyzzy{} World
正如你所说,但如果你改变\typeout
到
\typeout{\meaning\mystorage}
然后你会看到的实际定义\mystorage
显示为
macro:->Hello \quz {} World
因此显示两种环境下的结果:
macro:->Hello \quz {} World\par Hello2 \quz {} World2\par
如果你使用
\xappto\mystorage{\xBODY\par}
或者更灵活地使用
\xappto\mystorage{\noexpand\begin{foo2}\xBODY\noexpand\end{foo2}}
生产
macro:->\begin {foo2}Hello \quz {} World\end {foo2}\begin {foo2}Hello2 \quz {}
World2\end {foo2}
这样您就可以定义foo2
环境来对保存的文本执行任何您需要的操作。