我刚刚开始使用 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}
中运行代码也是可以的。article
beamer
有人能指出我在这里做错了什么吗?
谢谢
答案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}