Beamer 标题设置
Beamer Headline setup
我目前正在开发自己的 beamer 模板(实际上,我正在尝试改造现有的 power point 设计,以便我可以使用 Latex 进行演示)。
现有模板有一个标题栏,右侧显示徽标,栏下方有一个小彩色栏。此标题栏显示在标题页以及文本幻灯片中。在文本幻灯片中,标题栏还包含当前帧的标题和副标题,每个都有自己的字体大小和颜色。
使用 beamer 用户指南和其他模板,我发现每个框架都有一个标题,有时用于显示当前部分,以及一个通常显示框架标题和副标题的框架标题。标题显示在最上面,然后是框架标题。但是,框架标题未显示在标题页上。
我的设置的一个(我希望尽可能少)工作示例是:
\setbeamercolor*{frametitle}{fg=white,bg=blue}
\setbeamercolor*{framesubtitle}{fg=gray,bg=blue}
\defbeamertemplate*{headline}{formusic}
\ifx\insertframetitle\@empty%
\begin{beamercolorbox}[wd=\paperwidth, ht=1.5cm]{frametitle}
\hfill
\includegraphics[scale=0.15]{logo.png}
\end{beamercolorbox}
\else%
\fi%
\defbeamertemplate*{frametitle}{formusic}
\ifx\insertframetitle\@empty%
\begin{beamercolorbox}[wd=\paperwidth, ht=1.5cm]{frametitle}
\end{beamercolorbox}
\else%
\ifx\insertframesubtitle\@empty%
\begin{beamercolorbox}[wd=\paperwidth, ht=1.5cm]{frametitle}
\raisebox{0.55cm}{\insertframetitle}
\hfill
\includegraphics[scale=0.15]{logo.png}
\end{beamercolorbox}
\else%
\hbox{
\vbox{
\begin{beamercolorbox}[wd=\paperwidth, ht=0.7cm]{frametitle}
\insertframetitle
\end{beamercolorbox}
\begin{beamercolorbox}[wd=\paperwidth, ht=0.7cm]{framesubtitle}
\insertframesubtitle
\end{beamercolorbox}}
\includegraphics[scale=0.15]{logo.png}}
\fi
\fi%
这样的结果可见in these slide headers。首先,标题页看起来不错(我使用蓝色背景颜色来形象化我的问题),但是对于其他幻灯片来说,它看起来不太好。
标题似乎不支持'\insertframe(sub)title'命令。因此,我使用了一种变通方法,在第一页的标题中显示空标题栏 ifnum\c@framenumber=1
,并为所有其他页面显示空标题。在这些幻灯片上,标题栏由 frametitle 显示。这几乎有效,因为在 frametitle 和幻灯片的顶部边框之间仍然可以看到一条小白线。
我的第二个问题是:如何在我的标题栏中理想地排列 frametitle、-subtitle 和 logo?我经常使用 beamercolorboxes,但我对目前所取得的成就并不是 100% 满意。我的尝试是将 frametitle 和副标题放在单独的 beamercolorboxes 中(这似乎是最干净的尝试,因为我可以为每个使用单独定义的布局,而不是切换字体大小和颜色),它们彼此下方。但是现在我不知道如何定位标志。
编辑:根据 Werners 的建议添加了代码示例和图像,并相应地编辑了文本。
快速解决方法:根本不使用标题,但要确保 frametitle 将显示在所有框架上,即使是那些没有 frametitle 的框架:
\documentclass{beamer}
\setbeamertemplate{headline}{}
\setbeamercolor{frametitle}{fg=white,bg=blue}
\setbeamercolor{framesubtitle}{fg=gray,bg=blue}
\makeatletter
\patchcmd{\endbeamer@frameslide}{\ifx\beamer@frametitle\@empty}{\iffalse}{}{\errmessage{failed to patch}}
\makeatother
\makeatletter
\setbeamertemplate{frametitle}{%
\ifbeamercolorempty[bg]{frametitle}{}{\nointerlineskip}%
\@tempdima=\textwidth%
\advance\@tempdima by\beamer@leftmargin%
\advance\@tempdima by\beamer@rightmargin%
\begin{beamercolorbox}[sep=0.3cm,left,wd=\the\@tempdima]{frametitle}
\begin{minipage}{.81\paperwidth}
\usebeamerfont{frametitle}%
\vbox{}\vskip-1ex%
\if@tempswa\else\csname beamer@fteleft\endcsname\fi%
\strut\insertframetitle\par%
{%
\ifx\insertframesubtitle\@empty%
\else%
{\usebeamerfont{framesubtitle}\usebeamercolor[fg]{framesubtitle}\strut\insertframesubtitle\par}%
\fi
}%
\end{minipage}%
\quad\raisebox{-0.3cm}{\includegraphics[width=.1\paperwidth]{example-image-duck}}
\if@tempswa\else\vskip-.3cm\fi% set inside beamercolorbox... evil here...
\end{beamercolorbox}%
}
\makeatother
\begin{document}
\begin{frame}
abc
\end{frame}
\begin{frame}
\frametitle{title}
abc
\end{frame}
\begin{frame}
\frametitle{very long title which possible spans over multiples lines...}
abc
\end{frame}
\begin{frame}
\frametitle{title}
\framesubtitle{subtitle}
abc
\end{frame}
\begin{frame}
abc
\end{frame}
\end{document}
我目前正在开发自己的 beamer 模板(实际上,我正在尝试改造现有的 power point 设计,以便我可以使用 Latex 进行演示)。
现有模板有一个标题栏,右侧显示徽标,栏下方有一个小彩色栏。此标题栏显示在标题页以及文本幻灯片中。在文本幻灯片中,标题栏还包含当前帧的标题和副标题,每个都有自己的字体大小和颜色。
使用 beamer 用户指南和其他模板,我发现每个框架都有一个标题,有时用于显示当前部分,以及一个通常显示框架标题和副标题的框架标题。标题显示在最上面,然后是框架标题。但是,框架标题未显示在标题页上。
我的设置的一个(我希望尽可能少)工作示例是:
\setbeamercolor*{frametitle}{fg=white,bg=blue}
\setbeamercolor*{framesubtitle}{fg=gray,bg=blue}
\defbeamertemplate*{headline}{formusic}
\ifx\insertframetitle\@empty%
\begin{beamercolorbox}[wd=\paperwidth, ht=1.5cm]{frametitle}
\hfill
\includegraphics[scale=0.15]{logo.png}
\end{beamercolorbox}
\else%
\fi%
\defbeamertemplate*{frametitle}{formusic}
\ifx\insertframetitle\@empty%
\begin{beamercolorbox}[wd=\paperwidth, ht=1.5cm]{frametitle}
\end{beamercolorbox}
\else%
\ifx\insertframesubtitle\@empty%
\begin{beamercolorbox}[wd=\paperwidth, ht=1.5cm]{frametitle}
\raisebox{0.55cm}{\insertframetitle}
\hfill
\includegraphics[scale=0.15]{logo.png}
\end{beamercolorbox}
\else%
\hbox{
\vbox{
\begin{beamercolorbox}[wd=\paperwidth, ht=0.7cm]{frametitle}
\insertframetitle
\end{beamercolorbox}
\begin{beamercolorbox}[wd=\paperwidth, ht=0.7cm]{framesubtitle}
\insertframesubtitle
\end{beamercolorbox}}
\includegraphics[scale=0.15]{logo.png}}
\fi
\fi%
这样的结果可见in these slide headers。首先,标题页看起来不错(我使用蓝色背景颜色来形象化我的问题),但是对于其他幻灯片来说,它看起来不太好。
标题似乎不支持'\insertframe(sub)title'命令。因此,我使用了一种变通方法,在第一页的标题中显示空标题栏 ifnum\c@framenumber=1
,并为所有其他页面显示空标题。在这些幻灯片上,标题栏由 frametitle 显示。这几乎有效,因为在 frametitle 和幻灯片的顶部边框之间仍然可以看到一条小白线。
我的第二个问题是:如何在我的标题栏中理想地排列 frametitle、-subtitle 和 logo?我经常使用 beamercolorboxes,但我对目前所取得的成就并不是 100% 满意。我的尝试是将 frametitle 和副标题放在单独的 beamercolorboxes 中(这似乎是最干净的尝试,因为我可以为每个使用单独定义的布局,而不是切换字体大小和颜色),它们彼此下方。但是现在我不知道如何定位标志。
编辑:根据 Werners 的建议添加了代码示例和图像,并相应地编辑了文本。
快速解决方法:根本不使用标题,但要确保 frametitle 将显示在所有框架上,即使是那些没有 frametitle 的框架:
\documentclass{beamer}
\setbeamertemplate{headline}{}
\setbeamercolor{frametitle}{fg=white,bg=blue}
\setbeamercolor{framesubtitle}{fg=gray,bg=blue}
\makeatletter
\patchcmd{\endbeamer@frameslide}{\ifx\beamer@frametitle\@empty}{\iffalse}{}{\errmessage{failed to patch}}
\makeatother
\makeatletter
\setbeamertemplate{frametitle}{%
\ifbeamercolorempty[bg]{frametitle}{}{\nointerlineskip}%
\@tempdima=\textwidth%
\advance\@tempdima by\beamer@leftmargin%
\advance\@tempdima by\beamer@rightmargin%
\begin{beamercolorbox}[sep=0.3cm,left,wd=\the\@tempdima]{frametitle}
\begin{minipage}{.81\paperwidth}
\usebeamerfont{frametitle}%
\vbox{}\vskip-1ex%
\if@tempswa\else\csname beamer@fteleft\endcsname\fi%
\strut\insertframetitle\par%
{%
\ifx\insertframesubtitle\@empty%
\else%
{\usebeamerfont{framesubtitle}\usebeamercolor[fg]{framesubtitle}\strut\insertframesubtitle\par}%
\fi
}%
\end{minipage}%
\quad\raisebox{-0.3cm}{\includegraphics[width=.1\paperwidth]{example-image-duck}}
\if@tempswa\else\vskip-.3cm\fi% set inside beamercolorbox... evil here...
\end{beamercolorbox}%
}
\makeatother
\begin{document}
\begin{frame}
abc
\end{frame}
\begin{frame}
\frametitle{title}
abc
\end{frame}
\begin{frame}
\frametitle{very long title which possible spans over multiples lines...}
abc
\end{frame}
\begin{frame}
\frametitle{title}
\framesubtitle{subtitle}
abc
\end{frame}
\begin{frame}
abc
\end{frame}
\end{document}