Minted 无法逃脱 beamer 的 \end{frame}

Minted 无法逃脱 beamer 的 \end{frame}

似乎以下代码不能按预期工作(即,将 打印\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

这是由于选项beamerfragile工作方式——它打破了两者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命令tcboutputlistingtcbinputlisting

\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

带缩进的方法对我来说不起作用,我想使用多张幻灯片。因此,另一个可能的解决方案是使用选项escapeinsideminted欺骗 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 但不执行任何操作。

在此处输入图片描述

相关内容