2010-05-26 8 views
5

Próbuję owinąć środowisko stworzone z \NewEnviron (pakiet 'environ') w starej dobrej \newenvironment:Triple-owijanie Colorbox → NewEnviron → newenvironment nie

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

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

Jednak to daje mi dziwny błąd:

LaTeX Error: \begin{test} on input line 15 ended by \end{wrapper}. LaTeX Error: \begin{wrapper} on input line 15 ended by \end{document}.

Gdybym zastąpić \NewEnviron{test}{aaa(\BODY)bbb} z \newenvironment{test}{aaa(}{)bbb} - wszystko działa jak należy! Wygląda na to, że \NewEnviron nie może znaleźć końca z jakiegoś powodu.

Próbuję zrobić trochę magii z "floatfig" owiniętym w \colorbox, więc potrzebuję sposobu na przekształcenie \colorbox w środowisko i zawinięcie go w inne. Mogę zdefiniować nowe polecenie, ale nie jest to dobry pomysł.

Odpowiedz

6

Chodzi o to, że \NewEviron i \newenvironment działa na różne sposoby.

1) \newenvironment{test}{aaa(}{)bbb} definiuje dwa polecenia: \test jest aaa( i \endtest jest )bbb.

\begin{test} został rozszerzony do \test.

\end{test} jest rozszerzona do \endtest i sprawdza, czy zakres zaczyna się begin{test} raczej \begin{something else} np \begin{wrapper}.

2) \NewEviron{test}{aaa(\BODY)bbb} definiuje \test w inny sposób. Przede wszystkim \test połowów \BODY stosując następującą sztuczkę

\def\test#1\end{\def\BODY{#1}aaa(\BODY)bbb\testcontinue} 

(nazwa \testcontinue mogą być różne) i wstawia aaa(\BODY)bbb. Następnie \testcontinue sprawdza, czy \end w niektórych wierszach wejściowych zakończył się \end{test} zamiast \end{something else}. Makro \endtest nie jest potrzebne, ponieważ nigdy nie jest wykonywane.

Spójrz na kodzie:

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

\begin{wrapper} jest rozszerzona do \begin{test}. Następnie \begin{test} jest rozszerzany do \test. \test złapać \BODY. Uwaga! \BODY jest równy debug me. A teraz \testcontionue sprawdza , która \end po \BODY zakończyła się \end{test}. To nie prawda. \end{test} jest nieobecny. Istnieje \end{wrapper}.

Chcesz powiedzieć, że \end{wrapper} musi zostać rozszerzone na \end{test}. Ale \end przed owijki została zjedzona przez

macro \test: #1\end{\def\BODY{#1}aaa(\BODY)bbb\testcontinue} 

i nie może być wykonana.

Mam nadzieję, że uda mi się wytłumaczyć.

+0

Twoje wyjaśnienie jest wspaniałe, dziękuję! Myślę, że to oznacza, że ​​nie mogę zawinąć go do innego środowiska? a może jest sztuczka, której nie znam? – kolypto

+1

Dlaczego nie chcesz używać '\ newenvironment'? –

+0

Potrzebuję stworzyć środowiskową wersję '\ colorbox' i nie mam pojęcia, jak to zrobić :) – kolypto

1

Znalazłem hacky trick, aby stworzyć środowisko, które można owinąć w innym. Należy użyć saveBox takich jak to:

\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 
      }% 
     }% 
    }% 
Powiązane problemy