假设我有一个环境 env,其使用方式如下:
\begin{env}
*Text*
\end{env}
是否可以*Text*
在环境定义(顶部或底部)中“使用” - 类似于#1
在命令中使用参数。我知道环境是一个完全不同的构造,实际上由两个包含的命令组成*Text*
。但我想象一个非常酷的黑客,它会在第一个命令中启动扫描文本,并将其存储起来以便在第二个命令中使用。这可能吗?
答案1
原则上,这是environ
包裹作品:
使用环境的优点是它们的内容不被视为宏参数,因此对其中存在的内容的限制更少,并且可以更有效地处理长篇文档文本。
环境的缺点是,有时你确实想收集它们的主体并对整个事物应用某种命令。此包提供了一种定义此类环境的方法:
\NewEnviron{<name>}{<macro code>}[<final code>].
...环境的主体包含在宏内
\BODY
,并且是在...[<final code>]
处执行的代码\end{<name>}
以下是一个小例子:
\documentclass{article}
\usepackage{environ}
\NewEnviron{italics}{\textit{\BODY}}
\begin{document}
\textit{Something}
\begin{italics}
Something
else
\end{italics}
\end{document}
您可以将\BODY
环境主体作为参数传递给任何宏。
答案2
不清楚您是想捕获完整的环境主体,还是只捕获环境主体的第一项。因此,我展示了这两种方法。
为了捕捉完整的身体,我会在需要时使用,lrbox
然后\unhbox
使用它。
对于部分捕获,我将其作为参数提供,然后将\gdef
其放在环境的第一部分中。这样,我就可以在环境的结束部分中使用它的值。
\documentclass{article}
\newsavebox\BODYBOX
\def\BODY{\unhbox\BODYBOX}
\newenvironment{env}
{\begin{lrbox}{\BODYBOX}}
{\end{lrbox}Here is \BODY}
\begin{document}
\begin{env}
The body of my environment. The body of my environment. The body of my environment.
The body of my environment. The body of my environment. The body of my environment.
\end{env}
\noindent\hrulefill
\newenvironment{otherenv}[1]
{\gdef\envvar{#1}\begin{itemize}\item My argument is #1}
{\end{itemize}My argument was \envvar.\par}
\begin{otherenv}{*Text*}
\item ...
\end{otherenv}
\end{document}