积累环境内容

积累环境内容

我想提取并复制几个相当随意的环境的内容,并在文档末尾重复它们。该extract包对我来说不起作用,因为环境内容太复杂了。所以我接下来尝试的etoolboxenviron

\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环境来对保存的文本执行任何您需要的操作。

答案2

该包scontents可以完成这项工作:

\documentclass{article}
\usepackage[store-env=foo]{scontents}
\newcommand{\quz}{Xyzzy}
\pagestyle{empty}
\begin{document}

\begin{scontents}
Hello \quz{} World
\end{scontents}

% show content
\getstored[1]{foo}

% show verbatimized content
\typestored[1]{foo}
\end{document}

输出

相关内容