我仍在开发 Beamer 的主题,我发现了一些我无法理解的事情。Beamer 中通常有一个模板,有时还有一个父模板,您可以从中一次将多个模板设置为相同的样式。
现在让我们看一下三种类型的区块:
- 常规块
- 警报块
- 示例块
但据我在手册和代码中看到的那样,它们仅共享Parent Beamer-Template blocks
定义为:
\defbeamertemplateparent{blocks}{block begin,block end,%
block alerted begin,block alerted end,%
block example begin,block example end}
{}
据我所知,所有其他模板,尤其是标题和正文都没有链接。
但鉴于这个 MWE
\documentclass{beamer}
\setbeamerfont{block title}{size=\scriptsize}
\setbeamerfont{block body}{size=\scriptsize}
\begin{document}
\begin{frame}
\begin{alertblock}{An alert block}
Shall alert people
\end{alertblock}
\begin{exampleblock}{An example block}
Shall explain something to people
\end{exampleblock}
\begin{block}{A general block}
For everything else
\end{block}
\end{frame}
\end{document}
结果是:
正如您在该图中所看到的,所有标题都设置为\scriptsize
,但只有常规的正文更改block
为\scriptsize
,其他的保持其自然大小。
这是为什么?我问这个问题是因为我没有看到任何链接。例如,block alerted begin
定义为:
\defbeamertemplate*{block alerted begin}{default}
{
\par\vskip\medskipamount%
\begin{beamercolorbox}[colsep*=.75ex]{block title alerted}
\usebeamerfont*{block title alerted}\insertblocktitle%
\end{beamercolorbox}%
{\parskip0pt\par}%
\ifbeamercolorempty[bg]{block title alerted}
{}
{\ifbeamercolorempty[bg]{block body alerted}{}{\nointerlineskip\vskip-0.5pt}}%
\usebeamerfont{block body alerted}%
\begin{beamercolorbox}[colsep*=.75ex,vmode]{block body alerted}%
\ifbeamercolorempty[bg]{block body alerted}{\vskip-.25ex}{\vskip-.75ex}\vbox{}%
}
那么,警告和示例块标题的字体大小怎么会发生变化呢?我忽略了什么?
答案1
有三个环境block
,,alertblock
和exampleblock
- 分别使用字体模板
block title
、block title alerted
和block title example
作为标题,其中后两者均继承从第一个开始, - 使用字体模板
block body
、block body alerted
和block body example
作为其主体,它们之间没有继承。
% beamerfontthemedefault.sty, lines 81-86
\setbeamerfont{block body}{}
\setbeamerfont{block body alerted}{}
\setbeamerfont{block body example}{}
\setbeamerfont{block title}{size=\large,parent={structure,block body}}
\setbeamerfont{block title alerted}{parent={block title,alerted text}}
\setbeamerfont{block title example}{parent={block title,example text}}
(关联到相关源代码行)
因此
- 当你更改字体模板时
block title
,它会影响三个环境中的标题,而 - 当您更改字体模板时,它只会影响环境
block body
中的标题。block
parent=block body
可以通过为这两个字体模板指定来实现一致的继承关系,请参阅
\documentclass{beamer}
\setbeamerfont{block body alerted}{parent=block body}
\setbeamerfont{block body example}{parent=block body}
\setbeamerfont{block title}{size=\scriptsize}
\setbeamerfont{block body}{size=\scriptsize}
\begin{document}
\begin{frame}
\begin{alertblock}{An alert block}
Shall alert people
\end{alertblock}
\begin{exampleblock}{An example block}
Shall explain something to people
\end{exampleblock}
\begin{block}{A general block}
For everything else
\end{block}
\end{frame}
\end{document}
一些源文件参考(使用默认主题):
- 所有三个环境均在 中定义
beamerbaselocalstructure.sty
。 block
环境调用模板block begin
,该模板定义在beamerinnerthemedefault.sty
alertblock
和example block
环境分别调用模板block alerted begin
和block title example
,它们都在中定义beamerbaseauxtemplates.sty
。- 在三个模板中,排版标题时使用一个字体模板,排版正文时使用另一个字体模板。
- 上面提到的所有六种字体模板都是在 中定义的
beamerfontthemedefault.sty
。
PS:这可能是的设计或实现错误beamer
。