我正在使用 beamer 包 (v3.10) 制作有关 LaTeX 的演示文稿。我正在使用 listings (v1.4) 包打印部分 LaTeX 源代码并突出显示关键字。
下面的最小示例似乎无法编译:
\documentclass{beamer}
\usepackage[english,french]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{listings}
\lstset{language=[LaTeX]tex}
\begin{document}
\begin{frame}[fragile]
\begin{lstlisting}
\begin{frame}
\titlepage
\end{frame}
\end{lstlisting}
\end{frame}
\end{document}
使用 latexmk 与 latexila 编辑器时出现此错误:
Missing } inserted
然而,使用带有 latexila 编辑器的 pdftex,我得到了更详细的输出:
\begin{lstlisting} on input line 1 ended by \end{beamer@framepauses}.
Extra }, or forgotten \endgroup
\begin{lstlisting} on input line 1 ended by \end{beamer@frameslide}.
Undefined control sequence
Package Listings Error: Extra \endlstlisting
\begin{beamer@framepauses} on input line 17 ended by \end{lstlisting}.
Extra }, or forgotten \endgroup
\begin{beamer@framepauses} on input line 17 ended by \end{document}.
You can't use `\end' in internal vertical mode
\begin{beamer@framepauses} on input line 17 ended by \end{document}.
经过一番研究,似乎即使将[fragile]
选项传递给\frame
,引用代码的最后一行仍然存在问题:\end{frame}
。
一个解决方法是将此行至少缩进一个空格:
\begin{lstlisting}
\begin{frame}
\titlepage
\end{frame}
\end{lstlisting}
我的结论是:环境中的某行lstlisting
无法开始\end{frame}
。我做错了什么吗?
答案1
beamer
在设置环境时需要做大量的准备工作frame
,因为它可能需要多次解析内容才能完成看似单一的操作幻灯片并把它们分成框架。为了安全起见,您可以将列表内容放在框架外面,然后包含预先排版的框:
\documentclass{beamer}% http://ctan.org/pkg/beamer
\usepackage{listings}% http://ctan.org/pkg/listings
\lstset{language=[LaTeX]tex}
\newsavebox{\codebox}% For storing listings
\begin{document}
\begin{lrbox}{\codebox}
\begin{lstlisting}
\begin{frame}
\titlepage
\end{frame}
\end{lstlisting}
\end{lrbox}
\begin{frame}
\usebox{\codebox}
\end{frame}
\end{document}
答案2
如果您使用“containsverbatim”选项而不是“fragile”,您的最小示例就可以起作用:
\begin{frame}[containsverbatim]{test}
\begin{lstlisting}
\begin{frame}
\titlepage
\end{frame}
\end{lstlisting}
\end{frame}
我在这篇文章中找到了解决方案: https://stackoverflow.com/questions/2981008/latex-issue-with-beamer-and-listings