Я пытаюсь перенести среду, созданную с \NewEnviron
(пакет 'окружает') в старую пользу \newenvironment
:
\NewEnviron{test}{\colorbox[gray]{0.7}{\BODY}}
\newenvironment{wrapper}{\begin{test}}{\end{test}}
\begin{wrapper}
debug me
\end{wrapper}
Однако это дает мне странную ошибку:
ЛАТЕКСНАЯ Ошибка: \begin {тест} на входной строке 15 законченных \end {обертка}. ЛАТЕКСНАЯ Ошибка: \begin {обертка} на входной строке 15 законченных \end {документ}.
Если я заменяю \NewEnviron{test}{aaa(\BODY)bbb}
с \newenvironment{test}{aaa(}{)bbb}
— все работает как ожидалось! Это походит \NewEnviron
сбои для нахождения его конца по некоторым причинам.
Я пытаюсь сделать некоторое волшебство с 'floatfig', перенесенным в a \colorbox
таким образом, мне нужен способ преобразовать \colorbox
к среде и переносят его в другой. Я могу определить новую команду, но это не очень хорошая идея.
Дело в том, что \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}
и не может быть выполнен.
Надеюсь, я успешно объяснил.
Я нашел хитрый трюк, чтобы создать среду, которую можно обернуть в другую. Следует использовать 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
}%
}%
}%