我正在尝试使用 Beamer 在演示幻灯片和讲义中生成伪代码。
我可以在幻灯片中使用 listings 包,只需将其添加[fragile]
到框架环境中即可。但是,在文章模式下,如何使用 lstlistings 环境?下面是一个最小示例。
文件:slides.tex
\documentclass{beamer}
\input{mwe-body.tex}
文件:notes.tex
\documentclass{article}
\usepackage{beamerarticle}
\input{mwe-body.tex}
文件:mwe-body.tex
\usepackage{listings}
\begin{document}
\begin{frame}[fragile]
\frametitle{Frame 1}
test 1
\begin{lstlisting}
int sum = 0;
\end{lstlisting}
\end{frame}
\mode<article>{
test 2
\begin{lstlisting}
int sum = 1;
\end{lstlisting}
}
\end{document}
pdflatex slides.tex
用于生成演示文稿。
pdflatex notes.tex
有以下错误:
Runaway argument?
! Paragraph ended before \lst@next was complete.
<to be read again>
\par
l.18 }
有什么解决办法吗?
答案1
这是逐字类参数的典型特征——您不能不小心将它们作为参数传递给其他宏。如上所述,[fragile]
提供必要的关心lstlisting
在环境内部使用时frame
。对于使用lstlisting
内部<article>
模式,我建议首先将列表捕获到框内:
\documentclass{article}
\usepackage{beamerarticle}
\usepackage{listings}
\newsavebox{\codebox}
\begin{document}
\begin{frame}[fragile]
\frametitle{Frame 1}
test 1
\begin{lstlisting}
int sum = 0;
\end{lstlisting}
\end{frame}
% Store listing inside \codebox
\begin{lrbox}{\codebox}
\begin{lstlisting}
int sum = 1;
\end{lstlisting}
\end{lrbox}
\mode<article>{
test 2
\noindent
\usebox{\codebox}% Print stored listing
}
\end{document}