2011-03-04 66 views
6

Tôi hiện đang sử dụng Beamer và gói danh sách để in mã đẹp vào các khối Beamer. Vì vậy, những gì tôi đang làm trông giống như:Sự cố khi tạo môi trường lstnewen môi trường bắt đầu/kết thúc một môi trường khác

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

Bây giờ, tôi thấy nó rườm rà để bắt đầu blocklstlisting môi trường mọi lúc. Tôi muốn có một môi trường đơn giản codeblock mà chỉ làm nó:

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

Vì vậy, tôi đã cố gắng một cái gì đó như:

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

Nhưng thật không may, các tài liệu Beamer không còn biên dịch, với các lỗi sau :

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

? 

Có cách nào để thực hiện việc này không?

Trong Problem with creating a newenvironment in LaTeX, Andreas Grech có cùng một vấn đề, nhưng nó có thể giải quyết được vì có một cách khác để vào/thoát môi trường kèm theo. Nhưng trong trường hợp của môi trường Beamer block, có vẻ như không có cách nào khác ngoài việc thực hiện \begin{block}...\end{block}.

+0

Sự cố này đã được giải quyết chưa? – Werner

Trả lời

0

Tôi gặp vấn đề tương tự và không thể tìm thấy giải pháp cho nó. Cách giải quyết của tôi là sử dụng lệnh \ lstinputlisting và có mã trong một tệp riêng biệt. Đó là tuyệt vời nếu bạn có mã thực sự bạn muốn bao gồm. Không phải như vậy cho các ví dụ nhỏ.

Cách giải quyết khác là đặt đoạn mã vào một biến trước khi bắt đầu môi trường {frame} và sau đó tham chiếu nó. Làm thế nào để làm điều này được giải thích trong tài liệu latex-beamer. Nó cũng sẽ cho phép bạn sử dụng môi trường/lệnh tùy chỉnh của bạn.

0

tôi "giải quyết" này bằng cách sử dụng các fancyvrb gói của \VerbatimOut (Xem write environmnet body verbatim to a file) để tạo ra một tập tin tạm thời mà sau đó có thể được bao gồm với 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} 

Đối với một số lý do tôi không thể làm cho môi trường đối số tùy chọn, mặc dù.

Được sử dụng như thế này:

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

Không phải là giải pháp tối ưu, nhưng nó hoạt động, tôi đoán.

Các vấn đề liên quan