2011-03-04 19 views
6

Actualmente estoy usando Beamer y el paquete de listado para imprimir código en bloques de Beamer. Así que lo que estoy haciendo es así:Problema al crear un nuevo entorno que inicia/finaliza otro entorno

\begin{block}{} 
\begin{lstlisting} 
int foobar(void) { return 0; } 
\end{lstlisting} 
\end{block} 

Ahora, me resulta engorroso para iniciar el cada vez de blocklstlisting y entornos. Me gustaría tener un simple medio ambiente codeblock que sólo lo hace:

\begin{codeblock} 
int foobar(void) { return 0; } 
\end{codeblock} 

tanto, he intentado algo así como:

\lstnewenvironment{codeblock} 
{\begin{block}{}} 
{\end{block}} 

Pero, por desgracia, el documento Beamer ya no se compila, con el siguiente error :

! Missing } inserted. 
<inserted text> 
       } 
l.178 \end{frame} 

? 

¿Hay alguna manera de hacer esto?

En Problem with creating a newenvironment in LaTeX, Andreas Grech tuvo el mismo problema, pero podría resolverlo ya que había otra forma de entrar o salir del entorno circundante. Pero en el caso del entorno Beamer block, parece que no hay otra manera que hacer \begin{block}...\end{block}.

+0

¿Se ha resuelto este problema? – Werner

Respuesta

0

Tuve el mismo problema y no pude encontrar una solución para ello. Mi solución fue utilizar el comando \ lstinputlisting y tener el código en un archivo separado. Eso es genial si tienes un código real que quieras incluir. No es así para pequeños ejemplos.

Otra solución es poner el código snipplet en una variable antes de iniciar el entorno {frame} y luego hacer referencia a él. Cómo hacer esto se explica en los documentos de latex-beamer. También le permitiría emplear su entorno/comando personalizado.

0

I "resuelto" mediante el uso de la fancyvrb del paquete \VerbatimOut (Ver write environmnet body verbatim to a file) para crear un archivo temporal que puede ser incluido en lstinputlisting:

\usepackage{fancyvrb} 
\usepackage{listings} 

\newenvironment{blocklisting}[1] 
{\begingroup\lstset{#1}\VerbatimOut{blocklisting-tmp.txt}} 
{\endVerbatimOut\begin{block}{Code}\lstinputlisting{blocklisting-tmp.txt}\end{block}\endgroup} 

Por alguna razón no pude hacer que el entorno de argumento opcional, sin embargo.

usados ​​como esto:

\begin{document} 
\begin{frame}[fragile] 
\frametitle{Whatever} 
\begin{blocklisting}{language=Java, basicstyle=\Huge} 
Code 
\end{blocklisting} 

\begin{blocklisting}{} 
Code 2 
\end{blocklisting} 
\end{frame} 
\end{document} 

No es la solución óptima, pero funciona, supongo.

Cuestiones relacionadas