我正在尝试将用\NewEnviron (包'environ')创建的环境包装成一个旧的好\newenvironment
\NewEnviron{test}{\colorbox[gray]{0.7}{\BODY}}
\newenvironment{wrapper}{\begin{test}}{\end{test}}
\begin{wrapper}
debug me
\end{wrapper}然而,这给了我一个奇怪的错误:
LaTeX错误:输入行15上的\begin{test}以\end{LaTeX}结尾。LaTeX错误:输入行15上的\begin{wrapper}以\end{document}结尾。
如果我用\NewEnviron{test}{aaa(\BODY)bbb}代替\newenvironment{test}{aaa(}{)bbb} --一切都像预期的那样工作!似乎\NewEnviron由于某种原因未能找到它的终点。
我正在尝试使用包装在\colorbox中的“floatfig”魔法,所以我需要一种将\colorbox转换成一个环境并将其包装到另一个环境中的方法。我可以定义一个新命令,但这不是一个好主意。
发布于 2010-05-26 13:58:37
问题是,\NewEviron和\newenvironment以不同的方式工作。
1) \newenvironment{test}{aaa(}{)bbb}定义了两个命令:\test是aaa(,\endtest是)bbb。
\begin{test}被扩展为\test。
\end{test}被扩展到\endtest,并检查您的作用域是否以begin{test}而不是\begin{something else}开始,例如\begin{wrapper}。
2) \NewEviron{test}{aaa(\BODY)bbb}以不同的方式定义了\test。首先,\test使用以下技巧捕获\BODY
\def\test#1\end{\def\BODY{#1}aaa(\BODY)bbb\testcontinue}(名称\testcontinue可能不同)并插入aaa(\BODY)bbb。然后,\testcontinue检查某些输入行上的\end是否以\end{test}而不是\end{something else}结尾。不需要宏\endtest,因为它从未被执行过。
看看你的代码:
\begin{wrapper}
debug me
\end{wrapper} \begin{wrapper}被扩展为\begin{test}。然后将\begin{test}扩展为\test。\test抓到\BODY。注意!\BODY等于debug me。现在,\testcontionue在\BODY被\end{test}结束后检查\end。这不是真的。\end{test}不存在。有\end{wrapper}。
您想说的是,\end{wrapper}必须扩展到\end{test}。但是包装之前的\end被
macro \test: #1\end{\def\BODY{#1}aaa(\BODY)bbb\testcontinue}也不能执行。
我希望我能成功地解释。
发布于 2010-05-26 17:16:10
我发现了一个麻木不仁的技巧,可以创建一个可以包装在另一个环境中的环境。我们应该像这样使用saveBoxes:
\newenvironment{example}[2][]{%
\newsavebox{\exampleStore} % Box storage
\begin{lrbox}{\exampleStore} % Start capturing the input
}{%
\end{lrbox} % Stop capturing the input
\colorbox[gray]{0.7}{%
\usebox{\NBstorage} % Load the box's contents
}%
}%
}%https://stackoverflow.com/questions/2909764
复制相似问题