我正在尝试读取 Beamer 默认外部主题的源代码(文件beamerouterthemedefault.sty
)。第 144 行有以下代码:
\defbeamertemplate*{frametitle}{default}[1][left]
{
\ifbeamercolorempty[bg]{frametitle}{}{\nointerlineskip}%
% more things here
}
我的问题很简单:这样做的目的是什么?这与Beamer 颜色\nointerlineskip
的背景有何关联?frametitle
编辑:我检查了 Bitbucket 上的存储库,但没有找到任何提示(我希望通过“责备”找到一些有启发性的提交消息 - 但什么也没有。)
答案1
beamer@frameslide
在 的环境定义中,上方beamerbaseframe.sty
有一个空白:vbox
frametitle
\ifx\beamer@frametitle\@empty%
\setbox\beamer@frametitlebox=\box\voidb@x%
\else%
\setbox\beamer@frametitlebox=\vbox{
\vbox{}%
{\parskip0pt\usebeamertemplate***{frametitle}\vskip0.25em}%
}%
\fi%
现在假设我们\nointerlineskip
从 的模板代码中删除 行,那么和frametitle
之间将会有垂直空间:vbox
frametitle
.\vbox(0.0+0.0)x0.0
.\glue(\lineskip) 1.0
.\hbox(19.136+0.0)x324.79259
垂直空间来自\lineskip
,因为默认情况下盒子的高度frametitle
大于\baselineskip
。
当背景颜色为frametitle
空时,这个额外的垂直空间通常不显眼。但如果背景颜色存在,而且标题也存在,这个空间就显得多余了:
为了摆脱这个多余的空间,我们还可以修补beamer@frameslide
,删除多余的vbox{}
。
\documentclass{beamer}
\usepackage{xpatch}
\usetheme{Copenhagen}
\begin{document}
\section{First Section}
\begin{frame}
\frametitle{Default frame title}
\end{frame}
\makeatletter
% remove \nointerlineskip in frametitle template
\xpatchcmd{\beamer@@tmpl@frametitle}{\nointerlineskip}{\relax}{}{}
\makeatother
\begin{frame}
\frametitle{Frame title without nointerlineskip}
\end{frame}
\makeatletter
% undo the above patch
%\xpatchcmd{\beamer@@tmpl@frametitle}{\relax}{\nointerlineskip}{}{}
% patch in another way: modify beamer@frameslide environment
\xpatchcmd{\endbeamer@frameslide}{\vbox{}}{}{}{}
\makeatother
\begin{frame}
\frametitle{Frame title without empty vbox}
\end{frame}
\end{document}