tcolorbox 使用 beamers begin{frame} 列出错误

tcolorbox 使用 beamers begin{frame} 列出错误

我刚刚开始使用 tcolorbox 包制作 LaTeX 课程的幻灯片。它可以很好地装箱 LaTeX 代码,与包交互listings。但是,当我尝试为 制作示例代码的盒子时遇到了麻烦beamer frame,它失败了。

\documentclass{beamer}
\usepackage[listings]{tcolorbox}

\begin{document}
\begin{frame}[fragile]{Example}

\begin{tcblisting}{listing only} 
\begin{frame}{equation}
$a =  b$
\end{frame}
\end{tcblisting}

\end{frame}
\end{document}

我收到错误“未定义的控制序列 \end{tcblisting}”和其他错误

\end{frame}在输出之前注释掉是可以的。此外,在documentclass 而不是class\end{tcblisting}中运行代码也是可以的。articlebeamer

有人能指出我在这里做错了什么吗?

谢谢

答案1

这不是你,而是beamer... :)

环境frame非常挑剔,因为它必须在实际设置框架之前读取整个内容。为什么?因为当您使用叠加规范(例如\pause,或\only,或\onslide,或...)时,frame必须将分成不同的幻灯片,每个幻灯片可能需要完全相同的布局。因此,在这种情况下,内部\end{frame}实际上tcblisting被误认为是\end{frame}文档末尾的。

在这种情况下,我的建议是将verbatim类似内容放在一个框中第一的,然后在需要的地方使用该框。设置框后,它就可以移植,并且不会影响“棘手的事情”(例如frame):

在此处输入图片描述

\documentclass{beamer}% http://ctan.org/pkg/beamer
\usepackage[listings]{tcolorbox}% http://ctan.org/pkg/tcolorbox
\newsavebox{\codebox}% To store any verbatim content

\begin{document}
% Capture the verbatim content in \codebox
\begin{lrbox}{\codebox}
\begin{tcblisting}{listing only}
\begin{frame}{equation}
$a =  b$
\end{frame}
\end{tcblisting}
\end{lrbox}

\begin{frame}{Example}

\usebox{\codebox}% Insert \codebox

\end{frame}
\end{document}

答案2

这里还有另一种选择。

环境tcblisting将内容保存到文件中,然后将其作为列表或编译文本或两者读取。这个过程可以解耦:

  • 环境tcboutputlisting将内容保存到中间文件中。

  • \tcbinputlisting读取中间文件。

得出:

\documentclass{beamer}
\usepackage[listings]{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}

在此处输入图片描述

只是为了好玩,我添加了一些疯狂的东西。由于清单的内容是 beamer 框架的代码,我们可能想在外框内添加编译后的框架……

这可以通过使用执行系统调用的编译选项来实现tcolorbox。为此,中间文件必须是唯一的。在分离的情况下,compilable listing不能使用该选项,必须直接处理文件名。这就是

\tcbset{listing file=\jobname-listing-myslide}

在下面的代码中:

\documentclass{beamer}
\usepackage[listings,raster,skins]{tcolorbox}

\begin{document}

\tcbset{listing file=\jobname-listing-myslide}% <-- Use a unique name

\begin{tcboutputlisting}
\documentclass{beamer}
\begin{document}
\begin{frame}{equation}
$a =  b$
\end{frame}
\end{document}
\end{tcboutputlisting}

\begin{frame}[fragile]{Example}
\tcbinputlisting{
  listing and comment,pdf comment,run pdflatex,% <-- These options do the trick
  % the rest is just to be colorful and nice:
  enhanced,oversize,
  lower separated=false,
  colframe=red!50!black,colback=yellow!10!white,
  interior style={top color=yellow!5!white,bottom color=yellow!20!white},
  listing options={style=tcblatex,texcsstyle=*\color{red!70!black}},
  comment style={drop lifted shadow},
  sidebyside,sidebyside gap=1mm,raster columns=1
}
\end{frame}

\tcbset{listing file=\jobname.listing}% <-- reset to default

\end{document}

输出为:

在此处输入图片描述

答案3

另一种方法是将下划线框架包装到名为 的新环境中slide

在此处输入图片描述

代码:

\documentclass{beamer}
\usepackage[listings]{tcolorbox}
% define a new environment called slide with two parameters.
\newenvironment{slide}[2]{%
\begin{frame}[fragile,environment=slide]{Example}
\begin{tcblisting}{listing only} 
\begin{frame}{#1}
#2
\end{frame}
\end{tcblisting}
}
{\end{frame}}

\begin{document}

\begin{slide}{equation}
{$a =  b$}
\end{slide}

\end{document}

相关内容