2010-05-26 10 views
5

estoy tratando de envolver un entorno creado con \NewEnviron (paquete 'ambiental') en una vieja buena \newenvironment:Triple-pack de colorbox → NewEnviron → newenvironment falla

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

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

Sin embargo, esto me da un error extraño:

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

si reemplazo \NewEnviron{test}{aaa(\BODY)bbb} con \newenvironment{test}{aaa(}{)bbb} - todo funciona como se esperaba! Parece que \NewEnviron no puede encontrar su final por alguna razón.

Estoy tratando de hacer un poco de magia con 'floatfig' en un \colorbox así que necesito una forma de convertir \colorbox a un entorno y envolverlo en otro. Puedo definir un nuevo comando pero no es una muy buena idea.

Respuesta

6

Lo que pasa es que \NewEviron y \newenvironment funcionan de diferentes maneras.

1) \newenvironment{test}{aaa(}{)bbb} define dos comandos: \test es aaa( y \endtest es )bbb.

\begin{test} se ha ampliado a \test.

\end{test} se expande a \endtest y comprueba que su alcance se inicia con begin{test} en lugar \begin{something else}, por ejemplo \begin{wrapper}.

2) \NewEviron{test}{aaa(\BODY)bbb} define \test de otra manera. En primer lugar las capturas \test la \BODY utilizando el siguiente truco

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

(nombre \testcontinue puede ser diferente) e inserta aaa(\BODY)bbb. Luego, \testcontinue comprueba que \end en alguna línea de entrada finalizó por \end{test} en lugar de \end{something else}. No se necesita macro \endtest porque nunca se ejecuta.

mirada en su código:

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

\begin{wrapper} se expande a \begin{test}. Luego \begin{test} se expande a \test. \test captura \BODY. ¡Atención! \BODY es igual a debug me. Y ahora \testcontionue comprueba que \end después de \BODY terminó por \end{test}. No es cierto. \end{test} falta. Hay \end{wrapper}.

Quiere decir que \end{wrapper} debe ampliarse a \end{test}. Pero antes de \end envoltorio comido de

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

y no se puede ejecutar.

Espero tener éxito para explicar.

+0

¡Su explicación es genial, gracias! Supongo que eso significa que no puedo envolverlo en otro entorno. o tal vez hay un truco del cual no estoy enterado? – kolypto

+1

¿Por qué no quieres usar '\ newenvironment'? –

+0

Necesito crear una versión medioambiental de '\ colorbox' y no tengo ni idea de cómo hacerlo :) – kolypto

1

He encontrado un truco hacky para crear un entorno que puede ser envuelto en otro. Uno debería usar saveBoxes como este:

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