Beamerによるプレゼンテーション作成Tutorial

[TeX & LaTeX Advent Calender 2014](http://www.adventar.org/calendars/553) 12/21の記事です

(12/24更新)

BeamerはLaTeXでプレゼンテーションを作成するためのパッケージです。
インストール等は別の記事に譲るとして、
ここでは私がどのようにBeamerを使用してプレゼンを作成しているかという具体的な事についてまとめます。
ちなみに[CloudLaTeX](https://cloudlatex.io/ja)ならログインするだけでBeamer動いたのでインストール面倒な人はぜひ。

## Beamerの特徴

プレゼンを作るソフトとしては

- Presentaion (Microsoft Office)
- Keynote
- Impress (LibreOffice, OpenOffice)
- Stage (Calligra : 旧KOffice)

のようなWYSIWYGの物が主流ですが、
一方でMarkdownをHTMLにしてブラウザでプレゼンテーションを行う
reveal.jsのようなものも最近、特に技術系の勉強会の発表で多いと感じます。
LaTeXによるプレゼンテーションは後者に近いものです。
とりあえず後者をマークアップ系と読んでおきます。

マークアップ系のプレゼンはWYSIWYGの物に比べ以下の利点と難点があります：

利点:

- 自動的に適切に配置してくれる
- 任意のエディタで編集できる
- markup scriptのバージョン管理が容易
- プロプライエタリでない物が多い

難点:

- 位置の微調整が難しい
- コンパイルしないと実際のスライドが見えない

さらにLaTeXを使う場合はLaTeXで書いた論文の一部を流用できます。
(著作権については各自確認してください)

目の前でスライドができあがっていくWYSIWYG系に比べるとマークアップ系はとっつきにくく感じますが、
慣れると少数のマークアップ記述でそこそこ綺麗に配置されたスライドが簡単に作成できるので重宝します。
使いなれたvimやgitで編集・管理できるのも魅力です。
バージョン管理についてはWYSIWYG系でも当然可能ですが、
マークアップ言語ベースの方が各種プログラミングツールと相性が良い事は疑いの余地がありません。

## Tutorial
Beamerでプレゼンを作る際のコツはHTMLを書くときのように文章構造の宣言に集中する事です。

基本となる環境は以下の通りです:

- frame : スライドを作る
- block : 意味のまとまりを定義する
- structure, alert : スライドの重要な部分を強調する
- columns, column : スライド内の構成を定義する
- pause : スライド内の要素を順番に表示させる

これだけで十分実用的なスライドができあがります。

動画の埋め込みについてはややこしいので今回は言及を避けようと思います。
以下のコードはLuaLaTeX + LuaTeX-ja (TeXLive2014)で確認しています。

### frame

スライドを作るにはまずframe環境を作ります。
単純なframeについては`\frame`コマンドも使えます。

```latex
\documentclass[12pt, unicode]{beamer}
\usetheme{CambridgeUS}
\usepackage{luatexja}

\title{Beamer Tutorial}
\author{@termoshtt}
\date[2014/12/21]{\TeX \& \LaTeX Advent Calender 2014 12/21}
\institute[某大学]{某大学院 物理っぽい研究室}
% [..]に省略名が書ける

\begin{document}

\frame{\maketitle}

\begin{frame}{frame title}
\end{frame}

\frame{\centering \Large Thank you for your attention !!}

\end{document}
```

これで3枚のスライドが出きました。
スライドを修飾するには`\usetheme`を指定します。
以下のページでサンプルが見れます：

- 標準 : [Beamer theme gallery](http://deic.uab.es/~iblanes/beamer_gallery/index_by_theme.html)
- Third party : [LaTeX Beamer Themes](http://latex.simon04.net/)

### block
文字や図、箇条書きを箱で囲います。
Bemearのテーマにあわせて箱を修飾してくれるのがblock環境です。
スライドの中で、さらにまとまりを強く表現する為に使っています。

```latex
\begin{frame}{ブロック環境を意味のまとまりとして使う}
  \begin{block}{概略}
    \begin{itemize}
      \item usethemeでテーマを指定するとブロックの領域が装飾される
      \item block, alertblock, exampleblock環境がある
    \end{itemize}
  \end{block}
  \begin{alertblock}{注意}
    \begin{itemize}
      \item blockタイトルないとコンパイルエラーになる
    \end{itemize}
  \end{alertblock}
\end{frame}
```

ちなみに[tcolorbox](www.ctan.org/pkg/tcolorbox)という環境もあり、こちらはBemear以外でも動作するそうです。
(@senopen さんに感謝)

### highlight (structure, alert, color)
スライドの中でも特に強調したい部分は文字の色を変えます。
2段階の強調があります：

- `\structure` : スライドの構成を強調する語句を強調します(青とか)
- `\alert` : 重要な事項を強調します(基本的に赤)

もちろん使い方は自由です。

```latex
\begin{frame}{ブロック環境を意味のまとまりとして使う}
  \begin{block}{概略}
    \begin{itemize}
      \item usethemeでテーマを指定すると\structure{ブロックの領域}が装飾される
      \item block, alertblock, exampleblock環境がある
    \end{itemize}
  \end{block}
  \begin{alertblock}{注意}
    \begin{itemize}
      \item blockタイトルないと\alert{コンパイルエラー}になる
    \end{itemize}
  \end{alertblock}
\end{frame}
```

### columns
Beamerにおいて我々が配置を調整する唯一の高レベルインターフェイス、
それがcolumnsです。とはいえ唯のコラムです。
スライド毎でコラムが指定されるのではなく、
一枚のスライド内で任意に組み合わせる事ができるので、
これだけでそこそこの表現力があります。

```latex
\begin{frame}{columnsを使用した配置}
  \begin{block}{top block}
    ...
  \end{block}
  \begin{columns}[c]  % 中央をあわせる
  %\begin{columns}[t] % 上辺をあわせる
    \begin{column}{0.3\textwidth} % 横幅の30％
      \includegraphics[width=\columnwidth]{figure/fig1.pdf}
    \end{column}
    \begin{column}{0.65\textwidth} % 横幅の65％
      \begin{block}{right block}
        \begin{itemize}
          \item 図の説明とか
        \end{itemize}
      \end{block}
    \end{column}
  \end{columns}
  \begin{block}{bottom block}
    ...
  \end{block}
\end{frame}
```

`\textwidth`を使用する事がポイントです。
これで表示している横幅の長さを取得できるので、コラムの幅の指定が楽になります。
またコラム中で図を挿入する際は`\columnwidth`でコラムの幅を取得すると捗ります。

### 単純なアニメーション
スライドは一枚の絵なので、複数の情報を含んでいる場合
聴衆はどのような順番で見ればいいのかわからなくなります。
この問題を回避するために、順番に情報を小出しにするための機能が`\pause`です：

```latex
\begin{frame}{columnsを使用した配置}
  \begin{block}{top block}
    ...
  \end{block}
  \pause  %% NEW
  \begin{columns}[c]  % 中央をあわせる
  %\begin{columns}[t] % 上辺をあわせる
    \begin{column}{0.3\textwidth} % 横幅の30％
      \includegraphics[width=\columnwidth]{figure/fig1.pdf}
    \end{column}
    \begin{column}{0.65\textwidth} % 横幅の65％
      \begin{block}{right block}
        \begin{itemize}
          \item 図の説明とか
        \end{itemize}
      \end{block}
    \end{column}
  \end{columns}
  \pause  %% NEW
  \begin{block}{bottom block}
    ...
  \end{block}
\end{frame}
```

この`\pause`を挿入するだけでページ送り毎に

1. top blockだけが表示される
2. 図とright blockも表示される
3. bottom blockを含む全てが表示される

のように遷移します。
一回出して消したい場合は`\uncover`を使います。

```latex
\begin{frame}{columnsを使用した配置}
  \begin{block}{top block}
    ...
  \end{block}
  \begin{columns}[c]  % 中央をあわせる
  %\begin{columns}[t] % 上辺をあわせる
    \begin{column}{0.3\textwidth} % 横幅の30％
      \includegraphics[width=\columnwidth]{figure/fig1.pdf}
    \end{column}
    \begin{column}{0.65\textwidth} % 横幅の65％
      \begin{block}{right block}
        \begin{itemize}
          \item<1-> 1以降出現するコメント
          \item<2-> 2以降出現するコメント
        \end{itemize}
      \end{block}
    \end{column}
  \end{columns}
  \uncover<3>{
    \begin{block}{bottom block}
      かわいいおんなのこだと思った?
    \end{block}
  }
  \uncover<4>{
    \begin{block}{bottom block}
      残念さやかちゃんでした
    \end{block}
  }
\end{frame}
```

`\uncover`は表示していない時もその領域を確保しますが、
同じように指定したタイミングでのみ出現する`\only`は確保しません。
入れ替えたい場合は`\overlayarea`, `\overprint`を使用するそうです。
タイミングの指定は`<i>`だとi番目だけ、`<-i>`はi番目まで`<i->`はi番目以降を表します。

## 最後に
皆様風邪には気をつけましょう（反省）

元々以前書いた記事:[Beamerによる発表小技集](http://termoshtt.hatenablog.com/entry/2014/02/17/235005)をQiitaに移植するためにアドベントカレンダに登録したのですが、
書いて見ると雑多でごちゃごちゃした記事になってしまいました。
一応サンプルコードを[gistで公開](https://gist.github.com/termoshtt/5c79107061d004d86d35)しておきます。