我目前正在使用Beamer和列表包将漂亮的代码打印到Beamer块中。所以我正在做的事情如下:
\begin{block}{}
\begin{lstlisting}
int foobar(void) { return 0; }
\end{lstlisting}
\end{block}
现在,我发现每次启动block
和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}
?
有没有办法做到这一点?
在Problem with creating a newenvironment in LaTeX中,Andreas Grech遇到了同样的问题,但它可以解决它,因为还有另一种进入/退出封闭环境的方法。但是在block
Beamer环境的情况下,似乎除了做\begin{block}...\end{block}
之外别无他法。
答案 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}
不是最佳解决方案,但它确实有效。