\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 同梱版が個別に持っている値は 1610・169・149・54・43・32・141・2013 の八つ。ただし面白いのはその 外れ値の扱い で、リストにない数を渡すと 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 にも効くので、「このコマだけ太字」も同じ文法で書けます。
% 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 種類あり、名前を見ればどの種類かが分かる ようになっています。冒頭で触れた都市名(Madrid・Warsaw・Berlin・Singapore ほか)は プレゼンテーションテーマ、つまり全体を一括で決めるものです。カラーテーマの命名はもっと徹底していて、マニュアル自身が種明かしをしています。空を飛ぶ動物(albatross・beetle・crane)は色をすべて自前で指定する「完全な」カラーテーマ、花(lily・orchid・rose)は block などの中身の色だけを変えるインナーカラーテーマ、海の生き物(whale・dolphin・seahorse)はヘッダ・フッタ・サイドバーの配色を変えるアウターカラーテーマです。つまり \usecolortheme{whale} と書いた時点で、それが枠まわりだけを触る指定だと名前が教えてくれます。
| 命令 | 決めるもの | 例 |
|---|---|---|
\usetheme | レイアウト・ナビゲーション・配色を一括で | \usetheme{Madrid}(都市名) |
\usecolortheme | 配色だけを差し替える | \usecolortheme{seahorse}(海の生き物=外側) |
\usefonttheme | 見出しと本文の書体 | \usefonttheme{serif}, \usefonttheme{professionalfonts} |
\useinnertheme | 中身の体裁(箇条書きの記号、block の形) | \useinnertheme{rounded} |
\useoutertheme | 枠の体裁(ヘッダ・フッタ・サイドバー) | \useoutertheme{infolines} |
実務では、まず \usetheme{...} を一つ選び、気に入らない部分だけを下の四つで上書きするのが早道です。ナビゲーションバーが邪魔なら Madrid や Boadilla、逆に現在位置を見せたいなら Frankfurt や Warsaw のように、目的から選びます。より現代的な見た目が欲しければ、標準添付ではありませんが TeX Live に別パッケージとして入っている metropolis(\usetheme{metropolis})が定番です。なお、テーマを何度も切り替えて迷うのは時間の無駄になりがちです——聴衆が見るのは配色ではなく中身なので、早めに一つ決めて内容に戻ってください。
block と columns — 枠で囲む、左右に分ける
内容を枠で囲んで目立たせるには block 環境 を使います。\begin{block}{Title}…\end{block} で、テーマの配色に合った見出し付きボックスになります。警告調の alertblock、例示用の exampleblock も同じ書き方で、定理・定義には theorem・definition 環境がそのまま使えます(beamer は amsthm を自動で読み込みます)。スライドを左右に分けるには columns 環境 の中に \column{幅} を並べます——図と説明を横に置くときの定番です。
\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 環境や listings の lstlisting(ソースコードの表示)を 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>{...} を差し込めます。
\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 を読み込むなど、エンジンに合わせた和文対応をプリアンブルに足してください。
\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=169か43を最初に固定する。あとから変えると図の配置が全部ずれます。 - 1 枚の密度 — 箇条書きは 3〜5 項目まで。あふれたら
[allowframebreaks]で逃げるより、frame を分けるほうが読みやすくなります。 - コードやログ —
verbatim・lstlisting・mintedを含む frame には必ず[fragile]を付け、\end{frame}を単独行にする。 - 図を大きく見せたい frame —
[plain]を付けるとテーマの枠飾りが外れ、画面いっぱいに使えます。 - 配布用の PDF — 講演用と配布用は別物です。オーバーレイをたたんだ
handout版と話者ノートの作り方は「ハンドアウト・配布資料」で扱っています。