2010-05-26 75 views
5

我试图总结与\NewEnviron(包“ENVIRON”)创建的环境变成一个老好\newenvironment三包装失败

\NewEnviron{test}{\colorbox[gray]{0.7}{\BODY}} 
\newenvironment{wrapper}{\begin{test}}{\end{test}} 

\begin{wrapper} 
debug me 
\end{wrapper} 

然而,这给了我一个奇怪的错误:

LaTeX Error: \begin{test} on input line 15 ended by \end{wrapper}. LaTeX Error: \begin{wrapper} on input line 15 ended by \end{document}.

如果我\newenvironment{test}{aaa(}{)bbb}取代\NewEnviron{test}{aaa(\BODY)bbb} - 按预期工作的一切!似乎\NewEnviron由于某种原因未能找到其结尾。

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

回答

6

事情是\NewEviron\newenvironment以不同的方式工作。

1)\newenvironment{test}{aaa(}{)bbb}定义了两种命令:\testaaa(\endtest)bbb

\begin{test}扩大到\test

\end{test}扩大到\endtest和你的示波器开始begin{test}\begin{something else},例如\begin{wrapper}检查。

2)\NewEviron{test}{aaa(\BODY)bbb}以不同方式定义\test。首先使用下面的特技

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

所有\test渔获的\BODY的(名称\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 catch \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} 

并且不能执行。

我希望我能成功解释一下。

+0

你的解释很棒,谢谢!我想这意味着我无法将其包装到另一个环境中?或者也许有一个我不知道的技巧? – kolypto 2010-05-26 14:11:52

+1

为什么你不想使用'\ newenvironment'? – 2010-05-26 14:25:21

+0

我需要创建'\ colorbox'的环境版本,不知道该怎么做:) – kolypto 2010-05-26 16:02:30

1

我发现了一个奇怪的技巧来创建一个可以被另一个环绕的环境。一个应该使用像这样的保存箱:

\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 
      }% 
     }% 
    }%