我正在尝试将使用 \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 以\ end 结束 . LaTeX错误:输入行15上的\ begin 以\ end 结束 .
如果我用 \newenvironment{test}{aaa(}{)bbb}
替换 \NewEnviron{test}{aaa(\BODY)bbb}
- 一切都按预期工作!似乎 \NewEnviron
由于某种原因未能找到它的结局 .
我将'm trying to do some magic with ' floatfig'包装成 \colorbox
所以我需要一种方法将 \colorbox
转换为环境并将其包装到另一个环境中 . 我可以定义一个新命令,但这不是一个好主意 .
2 回答
问题是
\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
(名称
\testcontinue
可能不同)并插入aaa(\BODY)bbb
. 然后\testcontinue
检查某些输入行上的\end
由\end{test}
而不是\end{something else}
结束 . 不需要宏\endtest
,因为它永远不会被执行 .看看你的代码:
\begin{wrapper}
扩展为\begin{test}
. 然后\begin{test}
扩展为\test
.\test
catch\BODY
. 注意!\BODY
等于debug me
. 现在\testcontionue
在\end{test}
_结束\end{test}
之后检查\end
. 这不是真的 .\end{test}
缺席 . 有\end{wrapper}
.你想说
\end{wrapper}
必须扩展到\end{test}
. 但是\end
之前包装被吃掉了并且无法执行 .
我希望我成功解释 .
我发现了一个hacky技巧来创建一个可以包装在另一个环境中的环境 . 应该使用像这样的saveBoxes: