2010-05-26 8 views
5

Ich versuche, eine Umgebung mit \NewEnviron (Paket 'environ') in einem alten guten \newenvironment erstellt zu wickeln:Dreifach-Wrapping von colorbox → NewEnviron → newenvironment nicht

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

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

aber das gibt mir ein seltsamer Fehler:

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

Wenn ich ersetzen \NewEnviron{test}{aaa(\BODY)bbb} mit \newenvironment{test}{aaa(}{)bbb} - alles wie erwartet funktioniert! Es scheint, als ob \NewEnviron aus irgendeinem Grund sein Ende nicht findet.

Ich versuche, etwas Magie mit 'floatfig' in eine \colorbox eingewickelt zu machen, also brauche ich eine Möglichkeit, \colorbox in eine Umgebung zu konvertieren und es in eine andere zu wickeln. Ich kann einen neuen Befehl definieren, aber es ist keine sehr gute Idee.

Antwort

6

Die Sache ist, dass \NewEviron und \newenvironment auf verschiedene Arten funktioniert.

1) \newenvironment{test}{aaa(}{)bbb} definiert zwei Befehle: \test ist aaa( und \endtest)bbb ist.

\begin{test} wird auf \test erweitert.

\end{test} auf \endtest und Kontrollen erweitert, dass Ihr Umfang mit begin{test} eher \begin{something else} beginnt, zum Beispiel \begin{wrapper}.

2) \NewEviron{test}{aaa(\BODY)bbb} definiert \test in anderer Weise. Vor allem \test fängt den \BODY den folgenden Trick

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

(Name \testcontinue kann anders sein) und fügt aaa(\BODY)bbb. Dann überprüft \testcontinue, dass \end auf einigen Eingabezeile von \end{test} statt \end{something else} beendet wird. Makro \endtest wird nicht benötigt, da es nie ausgeführt wird.

Blick auf Ihren Code:

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

\begin{wrapper} wird \begin{test} erweitert. Dann wird \begin{test} zu \test erweitert. \test fangen \BODY. Achtung! \BODY entspricht debug me. Und jetzt \testcontionue überprüft , dass \end nach \BODY von \end{test} beendet wird. Es ist nicht wahr. \end{test} fehlt. Es gibt \end{wrapper}.

Sie möchten sagen, dass \end{wrapper} auf \end{test} erweitert werden muss. Aber \end vor Wrapper wurde von

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

und kann nicht ausgeführt werden.

Ich hoffe ich Erfolg zu erklären.

+0

Ihre Erklärung ist großartig, danke! Ich denke, das bedeutet, dass ich es nicht in eine andere Umgebung einbinden kann? oder vielleicht gibt es einen Trick, den ich nicht kenne? – kolypto

+1

Warum möchten Sie '\ newenvironment' nicht verwenden? –

+0

Ich muss eine Umgebungsversion von '\ colorbox erstellen und habe keine Idee, wie es geht :) – kolypto

1

Ich habe einen hacky Trick gefunden, um eine Umgebung zu schaffen, die in eine andere verpackt werden kann. Man sollte saveBoxes wie folgt verwenden:

\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 
      }% 
     }% 
    }%