beamer

\usetheme{Madrid}\usetheme{Warsaw}\usetheme{Singapore}——LaTeX の発表スライド用クラス beamer が現行のプレゼンテーションテーマとして同梱している 27 個は、一つ残らず都市の名前です。理由は付属マニュアルに本人が書いています。名前のネタが尽きたから、そして選ばれた都市は「自分か共著者が学会やワークショップに参加した場所」だから。この気楽さは beamer 全体の性格でもあります。使い方はほとんど普通の LaTeX 文書と同じで、ただ一点、ページではなく frame が単位 という一事だけが違う。このページはその一点から出発して、frame、オーバーレイ、テーマ、そして verbatim が入った途端に壊れる理由までを順に見ていきます。

普通のドキュメントクラスと違うところ

\documentclass{beamer} を書いた瞬間から、ページを操る道具が効かなくなります。\newpage を frame の中に置いても エラーにも警告にもならず、ただ無視されます——実際に試すと、\newpage をはさんだ二つの段落が 1 枚のスライドに並んで出てきます。理由は単純で、beamer にとってページ送りを決めるのは著者ではなく frame の切れ目だからです。同じ理屈で \section{...} も本文には何も表示しません(目次とナビゲーションに登録されるだけ)。そして \begin{frame} の外に書いた文章は、エラーにならずに テーマの付いていない裸のページ として出力されます。「なぜか変なページが 1 枚混ざる」の原因はたいていこれです。

もう一つ、紙の文書と違うのは寸法です。beamer は用紙ではなく画面を組みます。既定は 4:3 で、beamer.cls\beamer@paperwidth{12.80cm} / \beamer@paperheight{9.60cm} と書かれています——つまり 128 mm × 96 mm。クラスオプションで比率を変えられ、\documentclass[aspectratio=169]{beamer} なら 160 mm × 90 mm の 16:9 になります。TeX Live 2024 同梱版が個別に持っている値は 16101691495443321412013 の八つ。ただし面白いのはその 外れ値の扱い で、リストにない数を渡すと beamer は高さを 9.60 cm に固定したうえで数字を桁で割って比率を計算します。aspectratio=21 と書けば 2:1、つまり幅 19.2 cm のスライドが素直に出てきます。本文の文字サイズは \documentclass[11pt]{beamer} のように指定でき、既定は 11pt です。

frame 環境 — 1 枚のスライドと 1 ページは別物

beamer の主役は frame 環境 です。\begin{frame} から \end{frame} までが論理的な 1 画面で、その中に箇条書き・図・数式を置きます。見出しは \frametitle{...} で付けるか、\begin{frame}{Title} のように環境の引数として渡します。ここで肝心なのは、1 つの frame が 1 ページとは限らない ことです。次節のオーバーレイを使うと、同じ frame から複数ページの PDF が生成され、めくると段階表示に見えます。frame は「論理的な 1 画面」、PDF ページは「その 1 コマ」——beamer のドキュメントでは前者を frame、後者を slide と呼び分けています。

frame は角括弧でオプションを取ります。とくに使うのは、内容が縦にあふれたときの [allowframebreaks] です。これを付けると beamer は frame を必要なだけのページに割り、しかも frame タイトルの末尾にローマ数字を自動で足します——22 項目の箇条書きを流し込むと、1 枚目の見出しは「Long I」、2 枚目は「Long II」になります。他にも縦位置をそろえる [t](上寄せ)・[c](中央)・[b](下寄せ)、テーマの飾りを外して画面いっぱいに図を出す [plain]\againframe から呼び戻すための [label=...]、frame 番号を数えさせない [noframenumbering] があります。次節の [fragile] も同じ場所に書きます。

タイトル情報は article などと同じくプリアンブルで宣言します。\title{...}\author{...}\institute{...}\date{...} を書き、本文では \titlepage を 1 枚の frame に置くとタイトルスライドが組まれます(\maketitle でも同じ結果です)。長めの発表なら \section{...} で区切ると、その情報がスライド上部のナビゲーションに反映されます。区切りを宣言したうえで \tableofcontents を 1 枚の frame に置けば目次スライドになり、\tableofcontents[currentsection] とすれば 現在の節だけを強調 した形になります。各節の頭に自動で差し込みたいときは、プリアンブルで \AtBeginSection[]{...} を使ってこの目次フレームを仕込みます。

オーバーレイ — \pause<2-> の違い

内容を少しずつ提示するのがオーバーレイで、入口は二つあります。\pause は frame の途中に置くだけで、そこから先が次のスライドに送られます——手軽ですが、順番に一つずつ足していく形しか作れません。もう一つは オーバーレイ指定、つまり命令の直後に付ける山括弧 <...> です。\item<1-> は「1 コマ目以降ずっと」、\item<2> は「2 コマ目だけ」、\item<2-> は「2 コマ目以降」。<-2,4-5,7> のように範囲と飛び番号も並べられます。実際に組んで確かめると、\item<3> を付けた項目は 3 コマ目で現れ、\only<2>{...} は 2 コマ目にだけ出て、\uncover<3->{...} は 3 コマ目から見えるようになります。

命令挙動隠れているときの場所
\pause以降を次のスライドへ送る順に追加されるので問題にならない
\uncover<2->{...}指定コマで現れる常に確保(レイアウトがずれない)
\onslide<2->{...}指定コマで表示、それ以外は隠す常に確保
\only<2>{...}指定コマにだけ出力する確保しない(あとの内容が詰まる)
\alert<2>{...}指定コマで強調色に変える常に表示されているので確保される
[<+->]リスト環境に付けると全項目を自動で順送りにする\uncover と同じ扱い

この表の三列目が、実務でいちばん効いてきます。\uncover\onslide は隠れている間も場所を確保するので、項目が現れてもまわりが動きません。\only は出力そのものを出し入れするため、隠れているぶんの場所が詰まり、あとの行が上下にずれます。式の一部を差し替えるような用途では \only が正解ですが、箇条書きを順に見せるだけなら \uncover[<+->] を使うほうが安全です。\alert<2>{...} と同じ書き方は \textbf\textcolor にも効くので、「このコマだけ太字」も同じ文法で書けます。

latex
% the blunt instrument: everything after \pause moves to the next slide
\begin{frame}{Results}
  \begin{itemize}
    \item First point
    \pause
    \item Second point
  \end{itemize}
\end{frame}

% overlay specifications: say exactly which slides each piece belongs to
\begin{frame}{Results}
  \begin{itemize}
    \item<1-> Always there
    \item<2-> From slide two
    \item<3>  Slide three only
  \end{itemize}
  \only<2>{Shown on slide 2, and takes no space otherwise}
  \uncover<3->{Space is reserved from the start, ink appears on slide 3}
\end{frame}

% the same stepwise reveal, without numbering each item by hand
\begin{frame}{Results}
  \begin{itemize}[<+->]
    \item Observation
    \item Interpretation
    \item Limitation
  \end{itemize}
\end{frame}

テーマ — 都市名・空を飛ぶ動物・花・海の生き物

テーマは 5 種類あり、名前を見ればどの種類かが分かる ようになっています。冒頭で触れた都市名(MadridWarsawBerlinSingapore ほか)は プレゼンテーションテーマ、つまり全体を一括で決めるものです。カラーテーマの命名はもっと徹底していて、マニュアル自身が種明かしをしています。空を飛ぶ動物albatrossbeetlecrane)は色をすべて自前で指定する「完全な」カラーテーマ、lilyorchidrose)は block などの中身の色だけを変えるインナーカラーテーマ、海の生き物whaledolphinseahorse)はヘッダ・フッタ・サイドバーの配色を変えるアウターカラーテーマです。つまり \usecolortheme{whale} と書いた時点で、それが枠まわりだけを触る指定だと名前が教えてくれます。

命令決めるもの
\usethemeレイアウト・ナビゲーション・配色を一括で\usetheme{Madrid}(都市名)
\usecolortheme配色だけを差し替える\usecolortheme{seahorse}(海の生き物=外側)
\usefonttheme見出しと本文の書体\usefonttheme{serif}, \usefonttheme{professionalfonts}
\useinnertheme中身の体裁(箇条書きの記号、block の形)\useinnertheme{rounded}
\useoutertheme枠の体裁(ヘッダ・フッタ・サイドバー)\useoutertheme{infolines}

実務では、まず \usetheme{...} を一つ選び、気に入らない部分だけを下の四つで上書きするのが早道です。ナビゲーションバーが邪魔なら MadridBoadilla、逆に現在位置を見せたいなら FrankfurtWarsaw のように、目的から選びます。より現代的な見た目が欲しければ、標準添付ではありませんが TeX Live に別パッケージとして入っている metropolis\usetheme{metropolis})が定番です。なお、テーマを何度も切り替えて迷うのは時間の無駄になりがちです——聴衆が見るのは配色ではなく中身なので、早めに一つ決めて内容に戻ってください。

block と columns — 枠で囲む、左右に分ける

内容を枠で囲んで目立たせるには block 環境 を使います。\begin{block}{Title}…\end{block} で、テーマの配色に合った見出し付きボックスになります。警告調の alertblock、例示用の exampleblock も同じ書き方で、定理・定義には theoremdefinition 環境がそのまま使えます(beamer は amsthm を自動で読み込みます)。スライドを左右に分けるには columns 環境 の中に \column{幅} を並べます——図と説明を横に置くときの定番です。

latex
\begin{frame}{Comparison}
  \begin{columns}
    \column{0.5\textwidth}
      \begin{block}{Before}
        The old estimate.
      \end{block}
    \column{0.5\textwidth}
      \begin{alertblock}{After}
        The corrected one.
      \end{alertblock}
  \end{columns}
\end{frame}

verbatim を入れると壊れる理由と [fragile]

verbatim 環境や listingslstlisting(ソースコードの表示)を frame の中に入れると、\begin{frame}[fragile] と書かない限りコンパイルが止まります。厄介なのはエラーの出かたです。TeX Live 2024 で試すと、beamer は行番号ではなくファイル全体を指し示し、こう言ってきます——Runaway argument? に続いて ! File ended while scanning use of \@xverbatim.、そして I suspect you have forgotten a }, causing me to read past where you wanted me to stop. 最後は ! Emergency stop. です。書いた覚えのない \@xverbatim という内部命令の名前が出て、閉じ括弧を忘れたと 断定されます。しかし括弧はどこも壊れていません。この助言に従って中括弧を数え直すと、原因のない場所を延々と探すことになります。

真因は括弧ではなく 読み込みの順序 です。beamer は frame の中身を一度まるごと引数として読み取り、オーバーレイのコマ数だけ組み直します。ところが verbatim は「読むときに文字の扱いを変える」仕組みなので、すでに読み終えた中身に対しては手遅れになる——エラーが Runaway argument?(引数が暴走した)で始まるのはそのためで、まさに引数として読まれている最中に事故が起きています。[fragile] を付けると beamer は別の道を通ります。ユーザガイドの表現を借りれば、frame の中身は いったん外部ファイルに書き出され、読み直され ます。実際にコンパイルすると、作業ディレクトリに .vrb という拡張子のファイルが増えているのが確認できます。中身は frame の本文そのままです。

この「外部ファイル経由」という仕組みが、もう一つの規則を生みます。ユーザガイドが明記しているとおり、[fragile] を付けた frame では \end{frame} を行頭に単独で置かなければなりません(前の空白は可)。beamer は書き出しの終端を「行頭の \end{frame}」という文字列で探しているからで、\end{verbatim} \end{frame} のように 1 行にまとめると、今度は ! File ended while scanning use of \next. という別の内部命令の名前で同じように落ちます。もう一点、verbatim の中では \alert<2>{...} のようなオーバーレイ命令が効きません——文字はそのまま出るのが verbatim の仕事だからです。コードの一部を強調したいときは、beamer 自身が用意している semiverbatim 環境を使ってください。verbatim とほぼ同じですが \{} だけが命令として生き残るので、\alert<2>{...} を差し込めます。

latex
\begin{frame}[fragile]{An algorithm}   % [fragile] -> body goes via a .vrb file
\begin{verbatim}
int main(void) { return 0; }
\end{verbatim}
\end{frame}                            % must be alone on its own line

% to highlight part of a listing, use semiverbatim rather than verbatim
\begin{frame}[fragile]{Highlighted}
\begin{semiverbatim}
for (int i = 2; i < 100; i++)
  \alert<2>{if (is_prime[i])}
\end{semiverbatim}
\end{frame}

コンパイルできる最小の beamer 文書

以下は、テーマ・タイトルスライド・段階表示の箇条書きをそろえた最小構成です。プリアンブルでテーマとタイトル情報を宣言し、本文では最初の frame に \titlepage、次の frame に [<+->] 付きの箇条書きを置いています。frame は二つですが、オーバーレイのぶん PDF は 4 ページに展開されます。日本語のスライドにするなら、LuaLaTeX で luatexja を読み込むなど、エンジンに合わせた和文対応をプリアンブルに足してください。

latex
\documentclass[aspectratio=169,11pt]{beamer}
\usetheme{Madrid}
\usecolortheme{seahorse}

\title{My Talk}
\author{Ada Lovelace}
\institute{Analytical Engine Lab}
\date{\today}

\begin{document}

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

\begin{frame}{Overview}
  \begin{itemize}[<+->]
    \item Background
    \item Method
    \item Results
  \end{itemize}
\end{frame}

\end{document}

発表資料として書くときの順序

beamer は論文を細切れにする道具ではありません。まず発表の流れを「問題・方法・結果・結論」程度に分け、各 frame には主張を一つだけ置きます。本文原稿から長い段落を貼るのではなく、図・式・短い箇条書きへ圧縮してから、段階表示が本当に効く場所だけに \pause<2-> を足してください。オーバーレイは説明の順序を制御する道具であって、装飾ではありません。

  • 画面比を先に決める — 会場の投影環境が分かっているなら aspectratio=16943 を最初に固定する。あとから変えると図の配置が全部ずれます。
  • 1 枚の密度 — 箇条書きは 3〜5 項目まで。あふれたら [allowframebreaks] で逃げるより、frame を分けるほうが読みやすくなります。
  • コードやログverbatimlstlistingminted を含む frame には必ず [fragile] を付け、\end{frame} を単独行にする。
  • 図を大きく見せたい frame[plain] を付けるとテーマの枠飾りが外れ、画面いっぱいに使えます。
  • 配布用の PDF — 講演用と配布用は別物です。オーバーレイをたたんだ handout 版と話者ノートの作り方は「ハンドアウト・配布資料」で扱っています。