9

我目前正在使用 Beamer 和列表包将代码漂亮地打印到 Beamer 块中。所以我在做什么看起来像:

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

现在,我发现每次都启动blockand环境很麻烦。lstlisting我想要一个简单的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}

? 

有没有办法做到这一点?

“在 LaTeX 中创建新环境的问题”中,Andreas Grech 遇到了同样的问题,但它可以解决它,因为还有另一种进入/退出封闭环境的方法。但在blockBeamer 环境的情况下,似乎除了做\begin{block}...\end{block}.

4

2 回答 2

0

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

另一种解决方法是在启动 {frame} 环境之前将代码片段放入变量中,然后引用它。Latex-beamer 文档中解释了如何执行此操作。它还允许您使用自定义环境/命令。

于 2011-03-04T10:00:26.813 回答
0

fancyvrb我通过使用包的“解决”这个问题\VerbatimOut(请参阅将环境正文逐字写入文件)创建一个临时文件,然后可以将其包含在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}

不过,出于某种原因,我无法将环境参数设为可选。

像这样使用:

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

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

于 2015-11-25T14:38:03.650 回答