投影机如何处理新命令?

投影机如何处理新命令?

有人知道我为什么在这里出错吗?类似的代码适用于乳胶中的文档类“幻灯片”。

\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

beamerframe非常复杂,因为它必须处理覆盖规范-beamer最终用户几乎无需担心固有问题。也就是说,您设置了一个看似单一的frame环境,而beamer却将其转换为多个幻灯片(可能)。

beamer还读到全部的 frame环境,以便管理它的多个实例,技术上来说,它缺少你的\sld\end{frame}其他文档类有其他管理它的方法,因为它们不提供/缺乏beamer 覆盖规范,因此仅处理frames 一次。


以下是更长更详细的讨论:

这种将“一件事”(单一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}

相关内容