似乎以下代码不能按预期工作(即,将 打印\end{frame}
为逐字彩色代码。而是\end{frame}
由 LaTeX 解释:
\documentclass[10pt,a4paper]{beamer}
\usepackage{minted}
\begin{document}
\begin{frame}[fragile]{Test}
\begin{minted}{latex}
\begin{frame}{Title exemple}
This is an exemple.
\end{frame}
\end{minted}
This is never shown !
\end{frame}
\end{document}
编译时出现一堆错误:
Runaway argument?
! File ended while scanning use of \FancyVerbGetLine.
<inserted text>
\par
l.9 \end{frame}
应该怎样做才能使这个示例顺利编译?
答案1
这是由于选项beamer
的fragile
工作方式——它打破了两者minted
和 verbments
(以及任何类似的东西)。该fragile
选项导致框架的内容被写入临时文件,以便beamer
可以处理逐字内容。问题是beamer
假设当前框架在遇到以 开头的行时就结束了\end{frame}
。它没有办法检测 是否\end{frame}
真的在minted
环境中,因此不能按字面意思理解。因此,给出的示例minted
和都将失败。verbments
有几种方法可以解决这个问题。
- 最简单的方法是使用
fragile=singleslide
。这将禁用覆盖,从而beamer
避免使用临时文件和相关问题。 - 另一个解决方案是 Jubobs 提供的答案中的方法:只需缩进环境(无论是
minted
还是pyglist
)。由于环境\end{frame}
中的minted
现在以空格字符开头,因此beamer
将不再将其解释为框架的结尾。不幸的是,如果采用这种方法,您的代码将缩进一个或多个空格,这可能不是理想的。您可以使用 的minted
选项gobble
来解决这个问题。例如,如果您缩进 4 个空格,那么gobble=4
。您还可以使用autogobble
自动删除前导空格字符的选项。
答案2
另一种解决方案(归功于托马斯·F·斯特姆) 使用tcolorbox
命令tcboutputlisting
和tcbinputlisting
。
\documentclass{beamer}
\usepackage[minted]{tcolorbox}
\begin{document}
\begin{tcboutputlisting}
\begin{frame}{equation}
$a = b$
\end{frame}
\end{tcboutputlisting}
\begin{frame}[fragile]{Example}
\tcbinputlisting{listing only}
\end{frame}
\end{document}
答案3
带缩进的方法对我来说不起作用,我想使用多张幻灯片。因此,另一个可能的解决方案是使用选项escapeinside
来minted
欺骗 Beamer 不检测\end{frame}
。优点是您不必使用fragile=singleslide
。
\begin{frame}[fragile]{How to make a Beamer slide}
\begin{minted}[escapeinside=||]{latex}
\begin{frame}{Title}{Subtitle}
Body
\end{frame||}
\end{minted}
\end{frame}
您可以使用\end{frame||}
来结束您的代码片段:这将转为 LaTeX 但不执行任何操作。