Тройное обертывание сбоев \colorbox → \NewEnviron → \newenvironment

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

5
задан halfer 28 July 2013 в 10:08
поделиться

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}

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

Надеюсь, я успешно объяснил.

6
ответ дан 14 December 2019 в 08:44
поделиться

Я нашел хитрый трюк, чтобы создать среду, которую можно обернуть в другую. Следует использовать 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
            }%
        }%
    }%
1
ответ дан 14 December 2019 в 08:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: