为什么“块标题”影响所有内容,而“块主体”仅影响常规块样式?

为什么“块标题”影响所有内容,而“块主体”仅影响常规块样式?

我仍在开发 Beamer 的主题,我发现了一些我无法理解的事情。Beamer 中通常有一个模板,有时还有一个父模板,您可以从中一次将多个模板设置为相同的样式。

现在让我们看一下三种类型的区块:

  1. 常规块
  2. 警报块
  3. 示例块

但据我在手册和代码中看到的那样,它们仅共享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,,alertblockexampleblock

  • 分别使用字体模板block titleblock title alertedblock title example作为标题,其中后两者均继承从第一个开始,
  • 使用字体模板block bodyblock body alertedblock 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
  • alertblockexample block环境分别调用模板block alerted beginblock title example,它们都在中定义beamerbaseauxtemplates.sty
  • 在三个模板中,排版标题时使用一个字体模板,排版正文时使用另一个字体模板。
  • 上面提到的所有六种字体模板都是在 中定义的beamerfontthemedefault.sty

PS:这可能是的设计或实现错误beamer

相关内容