Тройная упаковка \ colorbox → \ NewEnviron → \ newenvironment не работает

Я пытаюсь обернуть среду, созданную с помощью \NewEnviron (пакет 'Environment'), в старый добрый \newenvironment:

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

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

Однако это дает мне странную ошибку:

Ошибка LaTeX: \ begin {test} в строке ввода 15 заканчивается \ end {wrapper}. Ошибка LaTeX: \ begin {wrapper} в строке ввода 15 заканчивается \ end {document}.

Если заменить \NewEnviron{test}{aaa(\BODY)bbb} на \newenvironment{test}{aaa(}{)bbb} - все работает как положено! Кажется, что \NewEnviron по какой-то причине не может найти свой конец.

Я пытаюсь творить чудеса с floatfig, завернутым в \colorbox, поэтому мне нужен способ преобразовать \colorbox в среду и обернуть ее в другую. Я могу определить новую команду, но это не очень хорошая идея.


person kolypto    schedule 26.05.2010    source источник


Ответы (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, используя следующий трюк

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

и не может быть исполнен.

Надеюсь, мне удастся объяснить.

person Alexey Malistov    schedule 26.05.2010
comment
Ваше объяснение отличное, спасибо! Полагаю, это означает, что я не могу перенести его в другую среду? или, может быть, есть трюк, о котором я не знаю? - person kolypto; 26.05.2010
comment
Почему вы не хотите использовать \newenvironment? - person Alexey Malistov; 26.05.2010
comment
Мне нужно создать экологическую версию \colorbox и я не знаю, как это сделать :) - person kolypto; 26.05.2010
comment
принято: без ваших объяснений я бы не смог. Спасибо, земляк! :) - person kolypto; 27.05.2010
comment
+1 Отличное объяснение. Я просмотрел код NewEnviron и не мог понять причудливой постановки Уиллом своих аргументов. - person Charles Stewart; 27.05.2010

Я нашел хитрый трюк, чтобы создать среду, которую можно обернуть в другую. Следует использовать 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
            }%
        }%
    }%
person kolypto    schedule 26.05.2010