2011-03-04 10 views
6

Attualmente sto utilizzando Beamer e il pacchetto di elenchi per stampare codice in blocchi di Beamer. Quindi quello che sto facendo è simile a:Problema durante la creazione di un lstnewenvironment che avvia/termina un altro ambiente

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

Ora, trovo ingombrante per avviare l'everytime block e lstlisting ambienti. Mi piacerebbe avere un semplice codeblock ambiente che solo lo fa:

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

Così, ho provato qualcosa di simile:

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

Ma, purtroppo, il documento Beamer non compila, con il seguente errore :

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

? 

C'è un modo per farlo?

In Problem with creating a newenvironment in LaTeX, Andreas Grech aveva lo stesso problema, ma poteva risolverlo poiché c'era un altro modo per entrare/uscire dall'ambiente circostante. Ma nel caso dell'ambiente Beamer block, sembra che non ci sia altro modo che fare \begin{block}...\end{block}.

+0

Questo problema è stato risolto? – Werner

risposta

0

Ho avuto lo stesso problema e non sono riuscito a trovare una soluzione. La mia soluzione alternativa era usare il comando \ lstinputlisting e avere il codice in un file separato. È fantastico se hai codice reale che vuoi includere. Non così per piccoli esempi.

Un'altra soluzione alternativa consiste nel mettere lo snipplet di codice in una variabile prima di avviare l'ambiente {frame} e quindi fare riferimento ad esso. Come farlo è spiegato nei documenti Latex-beamer. Ti permetterebbe anche di usare il tuo ambiente/comando personalizzato.

0

I "risolto" questo utilizzando il pacchetto di fancyvrb\VerbatimOut (Vedi write environmnet body verbatim to a file) per creare un file temporaneo che poi possono essere inclusi con 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} 

Per qualche motivo non ho potuto rendere l'ambiente-tesi opzionale, però.

usati in questo modo:

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

Non è la soluzione ottimale, ma funziona, immagino.

Problemi correlati