Дело в том, что \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}
и не может быть выполнен.
Надеюсь, мне удастся объяснить.