今さら人に聞けない、Beamerの基本

>
この記事は [TeX & LaTeX Advent Calendar 2015](http://www.adventar.org/calendars/929) の21日目の記事です。
昨日は[hak7a3 さん](http://hak7a3.hatenablog.com/entry/2015/12/20/153805)でした。明日は [u_ribo さん](http://qiita.com/uri/items/02883ef0f3e2962eac52)です。

Advent Calenderも最後の週に入りました。
今回は去年に引き続き、Beamerで自在にプレゼンを作る方法についてまとめます。
Beamerをとりあえず使ってみたい方はこちらへ(去年の記事)： [Beamerによるプレゼンテーション作成Tutorial](http://qiita.com/termoshtt/items/756aec542fb4c812a405)

# 今さら人に聞けない、テーマの基本

参考資料
[Beamer User Guide](http://ftp.jaist.ac.jp/pub/CTAN/macros/latex/contrib/beamer/doc/beameruserguide.pdf): Part III Changing the Way Things Look (P.143-)
ここではこの内容をかいつまんで説明します。

## Beamerにおける５種類のテーマ

Beamerにはテーマの指定の方法が５種類あります：

- Presentation Theme: 全体のテーマを一括で設定する
- Color Theme: 色を指定する
- Font Theme: フォントを指定する
- Inner Theme: フレームの「内側」の外観を設定する(block, itemize等)
- Outer Theme: フレームの「外側」の外観を設定する(header, footer, title等)

基本的にはPresentation Themeを決めて、Color/Font/Inner/Outerを既存の別のものと切り替えて使うと良いでしょう。
見た目のサンプルは上述のマニュアルに沢山のっていますので、そちらを参照してください。

Presentation Themeは

```tex
\usetheme{Madrid}
```

のように使います。これは使ったことがある方が多いと思います。
Color/Font/Inner/Outerを変更する場合はそれぞれ

```tex
\usecolortheme{orchid}
\usefonttheme{professionalfonts}
\useinnertheme{rectangles}
\useoutertheme{tree}
```

のように指定します。
これは`\usepackage`と同じ仕組みで、例えば`\usepackage{color}`がcolor.styを読み込むのと同様に、
`\useoutertheme{tree}`は`beamerouterthemetree.sty`を読み込みます。
beamer[color/font/inner/outer]theme[name].styという命名規則です。
これは私の環境(ArchLinux+TeXLive)では`/usr/share/texmf-dist/tex/latex/beamer/themes/outer/`にあります。
自分の`$TEXMF`を管理しているなら、そこに自作のthemeをインストールすることができるということです。

既存のものを組み合わせるだけならここまでで十分なはずです。

## 16 Inner Themes, Outer Themes, and Templates (P.159-)
ここからはどうやってBeamerがtypesetによってスライドの要素(element)を描画しているのかを見ていきましょう。
以下の内容はユーザーガイドの16章に対応します。
上でPresentation Themeの他に4つのテーマについて列挙しましたが、Inner/Outer ThemeとColor/Font Themeは内部的には果たす役割が異なります。
Inner/Outer Themeはテンプレートを定義し、Color/Fontはそのテンプレートに挿入される文字列に（挿入される直前に）装飾を加えます。
ここではこのテンプレートについて説明しましょう。

まず次のようなフレームを作りたいとしましょう：

```tex
\begin{frame}
  \begin{centering}
    \color{red}
    \textbf{The Title of This Frame.}
    \par
  \end{centering}
  Blah, blah.
\end{frame}
```

BeamerはLaTeX上に構築されているので当然LaTeXのtypesetによって文字を配置することができます。
しかしこのスライドのタイトルであるcentering環境をすべてのスライドに手動で書き込むのは
関数をつかわずにプログラムを書くようなものです。
そこで次のように分離できると望ましいわけです：

```tex
\setbeamertemplate{frametitle}{
  \begin{centering}
    \color{red}
    \textbf{\insertframetitle}
    \par
  \end{centering}
}

\begin{frame}
  \frametitle{The Title of This Frame.}
  Blah, blah.
\end{frame}
```

`\setbeamertemplate`が`frametitle`という名前でcentering環境の部分をテンプレートとして登録しています。
`\frametitle`は`frametitle`という名前のテンプレートを取得し、引数である`The Title of This Frame.`
を`\insertframetitle`の部分に挿入し、その結果をtypesetします。
結果として上記の直接書いたスライドと同じスライドができあがる、という仕組みです。

`frametitle`というのはBeamerが標準で定義している名前で、`beamerouterthemedefault.sty`で定義されています。
新たにテンプレートを定義する際は`\defbeamertemplate`、既に定義されているものを上書きする場合は`\setbeamertemplate`を使います。
どのような名前が定義されているかはテーマによっても異なり、ユーザーガイドには一部しか記載されていません。
自分でテンプレートを修正する際にはstyファイルを読む必要がありそうです。

## 17 Colors, 18 Fonts
上でタイトルに`\color{red}`によって赤色をつけていました。
しかし同じテンプレートを色だけ変えて、あるいはフォントだけ変えて使用したい事は良くあります。
これを解決するために、テンプレートに挿入される前に文字を修飾する機構があります：

```tex
\setbeamercolor{frametitle}{fg=red}
\setbeamerfont{frametitle}{series=\bfseries}
\setbeamertemplate{frametitle}{
  \begin{centering}
    \insertframetitle\par
  \end{centering}
}

\begin{frame}
  \frametitle{The Title of This Frame.}
  Blah, blah.
\end{frame}
```

色については、系統的なカラースキームを生成するために、パレットと呼ばれている中間変数を導入する:

```tex
\setbeamercolor{palette primary}{fg=red}
\setbeamercolor{frametitle}{parent=palette primary}
```

`parent=...`で設定されている色の設定を継承できる。

基本的な機構は以上である。これで`tex/latex/beamer/{color,font,inner,outer}/*.sty`にあるファイルを読むための
基礎知識を提供できたと思う。自分でテーマを自作するには自分の気に入らない部分がどの名前で参照されてるのかを確認し、
その部分を`setbeamer*`で書き換えればいい。

# 最後に
テーマについてしかまとめられず、Beamerの基本と呼ぶには不十分な感がありますがご容赦ください。
マクロの展開の途中部分を書き換えることで出力を調整する感じがXSLTの様な関数型な感じで楽しいです。