创建启动/结束另一个环境的新环境时出现问题

时间:2011-03-04 08:45:33

标签: latex beamer

我目前正在使用Beamer和列表包将漂亮的代码打印到Beamer块中。所以我正在做的事情如下:

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

现在,我发现每次启动blocklstlisting环境都很麻烦。我想要一个简单的codeblock环境,它就是这样做的:

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

所以,我尝试了类似的东西:

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

但不幸的是,Beamer文档不再编译,出现以下错误:

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

? 

有没有办法做到这一点?

Problem with creating a newenvironment in LaTeX中,Andreas Grech遇到了同样的问题,但它可以解决它,因为还有另一种进入/退出封闭环境的方法。但是在block Beamer环境的情况下,似乎除了做\begin{block}...\end{block}之外别无他法。

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,无法找到解决方法。我的解决方法是使用\ lstinputlisting命令并将代码放在单独的文件中。如果您想要包含真正的代码,那就太棒了。小例子不是这样。

另一种解决方法是在启动{frame}环境之前将代码snipplet放入变量中,然后引用它。如何做到这一点在latex-beamer docs中有所解释。它还允许您使用自定义环境/命令。

答案 1 :(得分:0)

我&#34;解决了#34;这可以通过使用fancyvrb软件包\VerbatimOut(请参阅write environmnet body verbatim to a file)创建一个临时文件,然后将其包含在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}

出于某种原因,我无法使environment-argument成为可选项。

像这样使用:

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

不是最佳解决方案,但它确实有效。