5

我正在尝试将使用\NewEnviron(package '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{wrapper} 结束。LaTeX 错误:输入第 15 行上的 \begin{wrapper} 以 \end{document} 结尾。

如果我替换\NewEnviron{test}{aaa(\BODY)bbb}\newenvironment{test}{aaa(}{)bbb}- 一切都按预期工作!似乎\NewEnviron由于某种原因未能找到终点。

我正在尝试将 'floatfig' 包装到 a 中来做一些魔术,\colorbox所以我需要一种方法来转换\colorbox为环境并将其包装到另一个环境中。我可以定义一个新命令,但这不是一个好主意。

4

2 回答 2

6

事情就是这样,\NewEviron并且\newenvironment以不同的方式工作。

1)\newenvironment{test}{aaa(}{)bbb}定义了两个命令:\testisaaa(\endtestis )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检查结束\end后的. 这不是真的。缺席。有。\BODY\end{test}\end{test}\end{wrapper}

你想说的\end{wrapper}必须扩展为\end{test}. 但\end在包装纸被吃掉之前

macro \test: #1\end{\def\BODY{#1}aaa(\BODY)bbb\testcontinue}

并且无法执行。

我希望我解释成功。

于 2010-05-26T13:58:37.933 回答
1

我发现了一个 hacky 技巧来创建一个可以包装在另一个环境中的环境。应该像这样使用 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
            }%
        }%
    }%
于 2010-05-26T17:16:10.237 回答