我一直在研究 Beamer 的框架创建代码的内部结构,试图自定义我创建的主题。我的目标是在noframenumbering
提供框架选项的幻灯片上隐藏页码。但这不是我的问题。在弄清楚如何做到这一点的过程中,我花了相当多的时间追踪内部结构,比如\beamer@@@@frame
看看它在哪里实际使用了headline
模板,然后那是我不知道该怎么做。
以下是我的总结思考我目前已经搞清楚了。(请记住,我对 TeX 不太熟悉,所以我可能会误用“调用”等术语。)在我的主文档中,我可能会使用命令\frame
或\begin{frame}
。无论哪种方式,执行最终都会在宏中结束\beamer@framecommand
。这反过来又调用\beamer@frame
,然后调用\beamer@@@frame
,然后又调用\beamer@@@@frame
。
看起来典型的执行路径\beamer@@@@frame
以
% buried within conditionals
\let\beamer@howtotreatframe\beamer@doseveralframes
% ...
\beamer@howtotreatframe
然后我去看看的定义\beamer@doseveralframes
,这相当于
% stuff
\def\beamer@doifinframe{%
\begin{beamer@frameslide}%
#1%
\end{beamer@frameslide}%
}
% stuff
然后我查看beamer@frameslide
文件前面的环境定义。我看到它创建了一个框\beamer@frametitlebox
来存储框架标题,然后在
\setbox\beamer@framebox=\vbox{%
\nobreak\vbox{}\nobreak\par\nobreak\beamer@entrycode\nobreak%
\nointerlineskip\unvbox\beamer@frametitlebox%
% etc.
}
% ...
\beamer@undolabels
\beamer@framenotesend
\box\beamer@framebox
好的,这就是frametitle
使用模板的地方(?),但我没有看到任何关于的内容headline
,即使检查了我从这些快速代码片段中遗漏的许多宏的定义。
headline
从另一端来看,我看到的唯一使用模板的地方是在
\def\ps@navigation{%
\def\@oddhead{%
% stuff
\beamer@typesetheadorfoot{headline}% (effectively \usebeamertemplate***{headline})
% other stuff
}%
}
但我没有看到它\ps@navigation
,也\@oddhead
没有在任何地方使用它,只有定义。缺少的环节是什么?
答案1
追踪beamer
到底发生了什么就像试图解开煮过头的意大利面条。然而,grep
可以提供一些起点:
beamer.cls
:
\RequirePackage{beamerbaserequires}
beamerbaserequires.sty
:
\RequirePackage{beamerbaseframecomponents}
beamerbaseframecomponents.sty
:
\def\ps@navigation{
这是定义新的页面样式 - 如plain
或empty
。样式名称为navigation
。定义oddhead
just 本质上是告诉 LaTeX 在奇数页的页眉中输入什么内容,如果文档是单面的,则在所有页面的页眉中输入什么内容。
和:
\pagestyle{navigation}
表示将其用作默认页面样式。
编辑:请注意,我是反向执行此操作grep
,然后反转结果的顺序,以便beamer
从类文件向前跟踪的使用情况。