有人知道我为什么在这里出错吗?类似的代码适用于乳胶中的文档类“幻灯片”。
\documentclass[compress]{beamer}
\newcommand{\sld}{\end{frame} \begin{frame}}
\begin{document}
\begin{frame}
Test -- Page 1
\sld
Test -- Page 2
\end{frame}
\end{document}
答案1
beamer
的frame
非常复杂,因为它必须处理覆盖规范-beamer
最终用户几乎无需担心固有问题。也就是说,您设置了一个看似单一的frame
环境,而beamer
却将其转换为多个幻灯片(可能)。
beamer
还读到全部的 frame
环境,以便管理它的多个实例,技术上来说,它缺少你的\sld
。\end{frame}
其他文档类有其他管理它的方法,因为它们不提供/缺乏beamer
覆盖规范,因此仅处理frame
s 一次。
以下是更长更详细的讨论:
这种将“一件事”(单一frame
环境)复制到“多件事”(众多幻灯片)需要beamer
抓取整个frame
环境前开始处理它。frame
当你查看内部的某些组件时,我们可以看到这种“抓取”beamerbaseframe.sty
:
%
% The frame environment (a trifle ugly...)
%
% Copyright notice: the following code is adapted from code from the
% amsmath package.
\newtoks\beamer@envbody
\def\beamer@frameenv{%
\def\beamer@process@envbody{\endgroup%
\expandafter\expandafter\expandafter\beamer@framecommand\expandafter\beamer@frameoptions\expandafter{\the\beamer@envbody}}%
\global\beamer@envbody{}\def\beamer@begin@stack{b}%
\begingroup
\let\frame\beamer@collect@@body
\def\beamer@process@envbody{\frame}%
\beamer@process@envbody%
}
% Normally not executed; only in containsverbatim context:
\def\endframe{\egroup\begingroup\def\@currenvir{frame}}
\long\def\beamer@push@begins#1\begin#2{\ifx\end#2\else b\expandafter\beamer@push@begins\fi}
\long\def\beamer@collect@@body#1\end#2{%
\def\test{#1}%
\edef\beamer@begin@stack{\beamer@push@begins#1\begin\end \expandafter\@gobble\beamer@begin@stack}%
\ifx\@empty\beamer@begin@stack
\global\beamer@envbody\expandafter{\the\beamer@envbody#1}%
\def\reserved@a{#2}
\ifx\reserved@a\beamer@frametext%
\endgroup%
\let\@next=\beamer@process@envbody % A little tricky! Note the grouping
\@checkend{#2}%
\else%
% ok, just expand it, presumably it will generate the desired \end{frame}
\let\@next=\beamer@process@expander%
\fi
\else
\global\beamer@envbody\expandafter{\the\beamer@envbody#1\end{#2}}%
\let\@next=\beamer@process@envbody%
\fi
\@next
}
注意\beamer@frameenv
,从根本上讲,环境的开始frame
调用\beamer@process@envbody
,它会扩展为\frame
,它会扩展为\beamer@collect@@body
。进一步往下我们会\beamer@collect@@body
看到范围text 被定义为包括\end
。更具体地说,
\long\def\beamer@collect@@body#1\end#2{...}
这意味着宏抓取从环境开始直到\end
进入参数的所有内容#1
,并将环境名称作为\end
进入参数的参数#2
。在抓取这些参数的阶段(不仅是类别代码已修复,但同时)TeX 必须看可见的\end
。
在您的例子中,唯一可见的\end
是“第二个” frame
。因此,frame
您认为是两个的东西在 TeX 看来却是一个。而且,对于没有附带 的frame
奇数\end{frame}
( 的扩展) ,TeX 会抱怨。\sld
\begin{frame}