2011-03-04 25 views
6

Obecnie używam programu Beamer i pakietu list, aby ładnie wydrukować kod w blokach Beamer. Więc co robię wygląda następująco:Wystąpił problem z tworzeniem nowego środowiska, które rozpoczyna/kończy inne środowisko.

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

Teraz uważam, że to kłopotliwe, aby uruchomić za każdym block i lstlisting warunkach. Chciałabym mieć prosty codeblock środowisko, które właśnie to robi:

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

Tak, próbowałem coś takiego:

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

ale niestety, dokument Beamer nie kompiluje się z powodu następującego błędu :

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

? 

Czy jest jakiś sposób, aby to zrobić?

W Problem with creating a newenvironment in LaTeX, Andreas Grech miał ten sam problem, ale mógł go rozwiązać, ponieważ był inny sposób wejścia/wyjścia z otaczającego środowiska. Ale w przypadku środowiska Beamer block wydaje się, że nie ma innego sposobu niż wykonanie \begin{block}...\end{block}.

+0

Czy problem został rozwiązany? – Werner

Odpowiedz

0

Miałem ten sam problem i nie mogłem znaleźć rozwiązania. Moim obejściem było użycie polecenia \ lstinputlisting i podanie kodu w osobnym pliku. To świetnie, jeśli masz prawdziwy kod, który chcesz dołączyć. Nie w przypadku małych przykładów.

Innym rozwiązaniem jest umieszczenie fragmentu kodu w zmiennej przed uruchomieniem środowiska {frame}, a następnie odniesienie do niego. Jak to zrobić jest wyjaśnione w dokumentacji lateksu-beamer. Umożliwiłoby to również wykorzystanie niestandardowego środowiska/polecenia.

0

I „rozwiązany” to za pomocą pakietu na fancyvrb\VerbatimOut (Patrz write environmnet body verbatim to a file), aby utworzyć tymczasowy plik, który następnie może być dostarczony z 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} 

Z jakiegoś powodu nie mogłem się środowiska argumentu opcjonalne.

Używane tak:

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

Not optymalne rozwiązanie, ale działa, myślę.