从头开始设计自定义 Beamer 主题

从头开始设计自定义 Beamer 主题

无论我如何努力寻找,我都找不到任何有关从头开始创建 Beamer 主题的信息,而不是从内置的内部、外部和颜色主题中将其拼凑在一起,也许使用未经解释的神秘命令来修改一两个 Beamer 模板。

我想要这样做的原因是没有任何内置的内部、外部和颜色主题都符合我的品味。它们都可以立即识别为 Beamer,并且它们之间的视觉差异非常小。

我想要实现的是类似于某些 PowerPoint 模板的功能: powerpoint 模板 1 powerpoint 模板 2

我也想把美丽的powerdot主题(见画廊) 到 Beamer,因为 Powerdot 需要将所有图像都转换为 EPS,非常不方便。

那么我该如何处理所有这些几何装饰并在其上方/下方/上面放置文本呢?哦,我差点忘了说我知道一个简单的解决方案“包含一个空白的幻灯片 PDF 作为背景图像”,但这并不好玩。

答案1

构建自己的主题:没有人强迫您利用预定义的内部、外部、颜色和字体主题。看看这个主题: 是吗一眼就能认出是 Beamer

但是,我们来看一个实际的例子:这是一个用一小时制作的主题,因此仅用于演示。可以做很多改进。参考是您的其中一张图片。

我们之所以这样称呼这个新主题,texsx主要是因为我对名称没有太多幻想。因此,我们在目录中创建以下文件:

  1. beamercolorthemetexsx.sty
  2. beamerinnerthemetexsx.sty
  3. beamerouterthemetexsx.sty
  4. beamerthemetexsx.sty
  5. texsx-example.tex

为了构建主题,我们可能会利用 TikZ:很可能你可以避免它,但问题有魔法标签,所以我觉得几乎有义务(即使真正的原因是:使用 TikZ 更快;))。

因此我们保持beamerthemetexsx.sty非常简单:

\mode<presentation>

% Requirement
\RequirePackage{tikz}

% Settings
\useinnertheme{texsx}
\useoutertheme{texsx}
\usecolortheme{texsx}

\setbeamertemplate{navigation symbols}{}
\setbeamertemplate{blocks}[rounded][shadow=true]  

\mode<all>

我们加载主题,删除导航符号并定义块方面。

现在,让我们开始在inner主题中定义标题页。因为我们需要测试我们正在做的事情,所以首先最好设置示例文档:

\documentclass{beamer}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\title{There Is No Largest Prime Number}
\date[ISPN ’80]{27th International Symposium of Prime Numbers}
\author[Euclid]{Euclid of Alexandria \texttt{[email protected]}}

\usetheme{texsx}

\begin{document}

\begin{frame}
\titlepage
\end{frame}

\end{document}

到目前为止,没有什么奇怪或困难的。是时候构建标题页了;我将按以下步骤进行:

  • 利用background模板设置标题页背景
  • 定义一个title page模板,其中实际设置标题、作者和日期。

所描述的操作翻译beamerinnerthemetexsx.sty如下:

\mode<presentation>

\setbeamertemplate{background}{
  \begin{tikzpicture}
  \useasboundingbox (0,0) rectangle(\the\paperwidth,\the\paperheight);
  \fill[color=brown] (0,2) rectangle (\the\paperwidth,\the\paperheight);
  \fill[color=orange] (0,0) rectangle(2.95,1.9);
  \fill[color=blue!50!cyan!80] (3.05,0) rectangle(\the\paperwidth,1.9);
  \ifnum\thepage>1\relax%
   \fill[white,opacity=1] (0,0) rectangle(\the\paperwidth,\the\paperheight);
   \fi
  \end{tikzpicture}
}

% Title page
\defbeamertemplate*{title page}{texsx}[1][]
{ 
   \vskip6cm%
    \begin{beamercolorbox}[wd=12cm,leftskip=3cm,sep=8pt,#1]{title page header}
      \usebeamerfont{title}\inserttitle\par%
    \end{beamercolorbox}%
    \vskip0.75cm%
    \begin{beamercolorbox}[wd=12cm,leftskip=3cm,#1]{author}
      \usebeamerfont{author}\insertauthor%
    \end{beamercolorbox}
     \vskip0.2cm%
    \begin{beamercolorbox}[wd=12cm,leftskip=3cm,#1]{date}
      \usebeamerfont{author}\insertdate%
    \end{beamercolorbox}
  \vfill
}

\mode
<all>

值得注意的是,我们通过\useasboundingbox (0,0) rectangle(\the\paperwidth,\the\paperheight);页码测试来定义自己的边界框,然后仅在标题页上应用背景。

然后我们在模板中title page实际放置了上面提到的元素。我们通过 、 来描述它们的颜色方面beamercolorboxes title page headerauthor因此date我们需要这些定义。让我们将它们添加到beamercolorthemetexsx.sty

\mode<presentation>

% Settings
\setbeamercolor*{title page header}{fg=white}
\setbeamercolor*{author}{fg=white}
\setbeamercolor*{date}{fg=white}

\mode
<all>

现在,如果我们编译我们的例子,我们会得到:

在此处输入图片描述

凉爽的!

让我们继续定义框架标题的方面。这是通过frametitle中名为 的模板完成的beamerouterthemetexsx.sty,如下所示:

\mode<presentation>

% Frame title
\defbeamertemplate*{frametitle}{texsx}[1][]
{
\vskip1cm%
  \begin{beamercolorbox}[wd=\paperwidth,ht=1.2cm]{frametitle} 
  \begin{tikzpicture}
  \useasboundingbox[fill=white](0,0) rectangle(\the\paperwidth,1.2);
  \fill[orange] (0,0) rectangle(2.95,1.2);
  \fill[blue!50!cyan!80] (3.05,0) rectangle(\the\paperwidth,1.2);
   \ifx\insertframesubtitle\@empty%
      {\node[anchor=west, white,font=\large] at (3.2,0.61){\insertframetitle};}
      \else%
      {\node[anchor= west, white,font=\large] at (3.2,0.81){\insertframetitle};%
       \node[anchor= west, white,font=\small] at (3.2,0.41){\insertframesubtitle};}%
      \fi
  \end{tikzpicture}
  \end{beamercolorbox}
}

\mode<all>

基本上,我们利用与标题页相同的概念来绘制一些框;然后我们检查是否存在字幕:相应地,我们设置标题和字幕的位置,或者我们仅使用 TikZ 节点设置框架标题。

我们需要再次测试来验证我们的想法。所以让我们在示例中添加一些内容:

\documentclass{beamer}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\title{There Is No Largest Prime Number}
\date[ISPN ’80]{27th International Symposium of Prime Numbers}
\author[Euclid]{Euclid of Alexandria \texttt{[email protected]}}

\usetheme{texsx}

\begin{document}

\begin{frame}
\titlepage
\end{frame}


\begin{frame} 
\frametitle{There Is No Largest Prime Number} 
\framesubtitle{The proof uses \textit{reductio ad absurdum}.} 
\begin{theorem}
There is no largest prime number. \end{theorem} 
\begin{enumerate} 
\item<1-| alert@1> Suppose $p$ were the largest prime number. 
\item<2-> Let $q$ be the product of the first $p$ numbers. 
\item<3-> Then $q+1$ is not divisible by any of them. 
\item<1-> But $q + 1$ is greater than $1$, thus divisible by some prime
number not in the first $p$ numbers.
\end{enumerate}
\end{frame}

\begin{frame}{A longer title}
\begin{itemize}
\item one
\item two
\end{itemize}
\end{frame}

\end{document}

由于我们也有列表,我们必须定义它们的方面和颜色。所以我们需要添加:

\setbeamercolor*{item}{fg=orange}

在我们的beamercolorthemetexsx.sty和:

% Items
\setbeamertemplate{items}[square]
\setbeamertemplate{sections/subsections in toc}[square]

在 中beamerinnerthemetexsx.sty。将后者的定义放在内部主题中并不是强制性的,但我遵循了 Beamer 风格。

在我看来我们可以编译我们的文档;结果是:

在此处输入图片描述

好的,我同意:颜色不是参考图片中的颜色,并且副标题与标题不完全对齐(这是由于字体大小差异造成的),但新主题就在这里。

答案2

以 Claudio 的回答为起点,我开发了两个主题,并将它们发布出来这里,一个基于 PowerPoint Median 主题,一个基于 Powerdot KlopeSpring 主题。可能还会有更多。

除了 Claudio 演示的技术外,我还使用了textpos包对页面上的文本进行绝对定位。

为了在部分页面和普通框架上实现不同的框架背景,我使用了类似

\newcommand{\sectionframe}{{
    \setbeamertemplate{background}{
      % draw the different background
    }
    \setbeamertemplate{headline}{}
    \frame{\sectionpage}
}}

注意双花括号;里面的一对将所有内容放在一个组中,从而使模板更改保持本地化。

以下是一些图片:

样品幻灯片

答案3

对于那些试图在标题后面使用背景图像的人,你可以调整 Claudio 的精彩答案来获得如下内容:

在此处输入图片描述

例如这是我的beamerinnerthemeubuntu.sty(对于页面标题),ubuntu-background.jpg我的图像在哪里。

\mode<presentation>


% Title page
\defbeamertemplate*{title page}{ubuntu}[1][]
{ 
  \begin{tikzpicture}[overlay, remember picture]
    \node[inner sep=0pt,outer sep=0pt,anchor=north east] at (current page.north east)
    {\includegraphics[width=\the\paperwidth,height=\the\paperheight]{ubuntu-background.jpg}};
  \end{tikzpicture}
    \vskip2cm%
    %% "title page header"  defines the loaded colors.
    \begin{beamercolorbox}[center,sep=8pt,#1]{title page header}
      \usebeamerfont{title}\huge\inserttitle\par%
    \end{beamercolorbox}%
    \vskip0.75cm%
    \begin{beamercolorbox}[wd=12cm,leftskip=3cm,#1]{author}
      \usebeamerfont{author}\textcolor{white}{\insertauthor}%
    \end{beamercolorbox}
     \vskip0.2cm%
    \begin{beamercolorbox}[wd=12cm,leftskip=3cm,#1]{date}
      \usebeamerfont{author}\textcolor{white}{\insertdate}%
    \end{beamercolorbox}
  \vfill
}

\mode
<all>

以及我的外部主题(针对页面):

\mode<presentation>

% Frame title
\defbeamertemplate*{frametitle}{ubuntu}[1][]
{%
  \begin{tcolorbox}[enhanced,sharp corners,spread upwards,frame hidden,boxrule=0pt,interior style tile={width=\paperwidth}{ubuntu-background.jpg},before skip=0pt,halign=center]
    \usebeamercolor{frametitle}\color{fg}
    \insertframetitle
  \end{tcolorbox}
}

\mode<all>

和我的beamerthemeubuntu.sty

% https://tex.stackexchange.com/questions/146529/design-a-custom-beamer-theme-from-scratch
\mode<presentation>

% Requirement
\RequirePackage{tikz}
\usetikzlibrary{positioning,calc}
\RequirePackage{graphicx}

\RequirePackage[sfdefault]{noto}
\RequirePackage[T1]{fontenc}
\RequirePackage[most]{tcolorbox}

% Settings
\useinnertheme{ubuntu}
\useoutertheme{ubuntu}
\usecolortheme{ubuntu}

\setbeamertemplate{navigation symbols}{}
\setbeamertemplate{blocks}[rounded][shadow=true]  

\mode<all>

和我的一起beamercolorthemeubuntu.sty(配置颜色):

\mode<presentation>

% Settings
\setbeamercolor*{title page header}{fg=white}
\setbeamercolor*{author}{fg=white}
\setbeamercolor*{date}{fg=white}
\setbeamercolor*{item}{fg=black}
\setbeamercolor*{frametitle}{fg=white}
\mode
<all>

您可能还喜欢使用:

\begin{tcolorbox}[enhanced,title=My title, frame style tile={width=\paperwidth}{ubuntu-background.jpg}]
    Hello
\end{tcolorbox}

创建类似的东西:

在此处输入图片描述

相关内容