Тройная упаковка \ colorbox → \ NewEnviron → \ newenvironment терпит неудачу - PullRequest
5 голосов
/ 26 мая 2010

Я пытаюсь обернуть среду, созданную с помощью \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 в среду и обернуть ее в другую. Я могу определить новую команду, но это не очень хорошая идея.

Ответы [ 2 ]

6 голосов
/ 26 мая 2010

Дело в том, что \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}

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

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

1 голос
/ 26 мая 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
            }%
        }%
    }%
...