Beamer标题设置

3

我目前正在制作自己的Beamer模板(实际上是试图改造现有的PowerPoint设计,以便我可以使用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%

这可以在这些幻灯片标头中看到。对于第一页,标题页看起来很好(我使用蓝色背景颜色以便更清楚显示我的问题),但是对于其他幻灯片,它看起来并不那么好。
标题似乎不支持 '\insertframe(sub)title' 命令。因此,我使用一个解决方法,在第一页的标题栏中显示空的标题栏,如 ifnum\c@framenumber=1,而在所有其他页面上都是空的标题栏。在这些幻灯片上,标题栏由帧标题显示。这基本有效,只是在帧标题和幻灯片顶部边框之间仍有一条小白线可见。
我的第二个问题是:我如何理想地安排我的标题栏中的 frametitle、subtitle 和 logo?我尝试了很多与 beamercolorboxes 相关的东西,然而我对目前所取得的成果并不100%满意。我的尝试是让 frametitle 和 subtitle 分别位于 beamercolorboxes 中(这似乎是最清晰的尝试,因为我可以分别定义每个布局,而不是切换字体大小和颜色),它们相互叠放。然而现在我不知道如何定位 logo。

1
你应该向社区提供一个最小化的工作示例(MWE),以复制当前行为。这是我们能够充分解决您的问题的唯一方式。确保我们可以复制、粘贴和编译您的代码(不仅仅是代码片段),并且能够看到您所看到的内容。 - Werner
@Werner:感谢您的建议,我已经更新并重新编写了这篇条目! - empwilli
1个回答

1
一个快速的解决方法:不使用标题,但确保所有框架都会显示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}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接