Beamerを書く
こんにちは、びしょ〜じょです。これはcoins Advent Calendar2015 20日目の記事ですが、あまり大学と関係ないです。
さて、先日は一発ネタ大会でネタを披露しました。 ネタの解説という愚かな行為をすると、5分でスライド20枚捌くというものでしたがリハーサルなど一切せず臨んだため、なんと4分で終わってしまいました。ありがとうございました。 で、だ。早口おじさんという印象もどうかなと思ってきたのでスライドについて書きます。LaTeXについて書くけどLaTeX Advent Calendarなどに投書しないということは、まぁその程度の内容です。
前の記事と同じようなことが書きたい。前回はあまりにも適当だったので。
みなさんはスライドショーとか作るときに何使ってますか(中略)ということでBeamerのアレです。リポジトリのcommit d05c4c7を解説します。
LuaLaTeX使ったので\zw
とか出てきますが気にせず脳内変換してください。
やったことは
- section/subsection開始時にTOCページを挿入
- タイトルをTOCページに挿入
- フッターに現フレーム数/総フレーム数を挿入
上からみていきます。
section/subsection開始時にTOCページを挿入
なんとなく入れたくなったわけですな。97行目からの\AtBeginSection
、\AtBeginSubsection
がソレ。
98行目でifがいっぱいあるが、これはTOCを入れたくなかったり次のTOCだけ消したりするため。
99、100、107、108行目の\switchなんちゃら
は、上のほうのboolを切り替えてます(\ifnofooter
、\ifnoheader
)。
肝は101〜105行目です。
\begin{frame}<beamer>%
\begin{multicols}{2}%
\tableofcontents[currentsection,sectionstyle=show/shaded,subsectionstyle=show/shaded]%
\end{multicols}%
\end{frame}%
今スライドはsectionが25個くらいあってアレだったのでmulticolパッケージを用いて2段組にしています1。
で、\tableofcontents
にオプション引数を渡しています。
-
currentsection
を表示 -
sectionstyle=show/hide
が他のsectionをどう表示するか
と、みたまんまです。subsectionも同じです。
で、106行目でtocpage
というカウンタをインクリメントしています。これは後ほど効いてきます。
といったぐあいにTOCページができたわけだ。\AtBeginSection
の説明をするだけで終わりですね。
タイトルをTOCページに挿入
86行目からの\setbeamertemplate{beamer}
です。
\beamercolorbox
は便利なんじゃ(天才博士bot並の感想)。で、colorboxにheaderのboxを突っ込む。88行目ですね。ミソは。
\noheaderfalse
なら\thetitle
を突っ込む。だけ。で、この\thetitle
は実は自家製で、
\long\def\beamer@title[#1]#2{ %
\def\thetitle{#2}%
\def\inserttitle{#2}%
\def\beamer@shorttitle{#1}%
}%
\title
の定義場所を探して、無事突き止めたbeamerbasetitle.styから借用した。ごっそさん。上記2行目でわかるように\thetitle
をここで頂く。で、使う。
87〜89行がsectionで、90〜92行がsubsection。
フッターに現フレーム数/総フレーム数を挿入
注意
フレーム数 is not ページ数です。フレーム数というのはframe環境の数で、ページ数はコンパイルしてpdfにしたときのpdfのページ数です。
やることといえば根性です。Beamerなものをコンパイルすると .navファイルというものが生成される。ここをよくみてみるとなんか色々書いてある。
例えば\beamer@documentpages
なんてものがある。locate beamer.cls
とかやると/usr/share/texmf-dixt/tex/latex/beamer
というディレクトリが"くさい"ことに気づく。
そのへんで、例えば.navファイルの下のほうにある\beamer@documentages
とかをag
コマンドなんかで拾ってみると、beamerbasemisc.sty
というものがでてきた。
\AtEndDocument
の中で .navファイルに色々書き込んでいるようだ。
ん、たしちゃおw
\AtEndDocument{ %
\clearpage%
\beamer@tempcount=\c@page\advance\beamer@tempcount by -1%
\if@filesw%
\immediate\write\@auxout{\string\@writefile{nav}%
{\noexpand\headcommand{\noexpand\def\noexpand\inserttotaltocpage{\thetocpage}}}}%
\fi%
}%
.navファイルに\inserttotaltocpage
というものを作る。まず\thetocpage
を32行目で定義し、ここで伏線回収、106、120行目の\stepcounter{tocpage}
が効くわけやな。
TOCページを挿入するたびにtocpage
がインクリメントされ、コンパイル1回めにTOCページの数がわかる。
これが .navファイルに書かれ、コンパイル2回めに .navファイルの中身が読まれ、\inserttotaltocpage
というコマンドが機能するようになる。
で、47、48行目に怪しげなカウンタを定義する。
\newcounter{currentwotocframenumber}%
\newcounter{wotoctotalframenumber}%
で、71行目からのね…。
\setbeamertemplate{footline}{ %
\leavevmode%
\vspace{1\zw}
\begin{beamercolorbox}{footline}%
\tiny%
\hspace{.4\zw}\hbox{\ifnofooter\else\insertsectionhead\ifx\insertsubsectionhead\empty\else{}.\insertsubsectionhead\fi\fi}%
\setcounter{wotoctotalframenumber}{\inserttotalframenumber}% とりあえずwotoctotalframenumberに総フレーム数をセット
\addtocounter{wotoctotalframenumber}{-\inserttotaltocpage}% TOCページ数を引く
\addtocounter{wotoctotalframenumber}{-1}% 1引く(これを表示するフレーム自身の分)
\setcounter{currentwotocframenumber}{\theframenumber}% currentwotocframenumberに現フレーム数をセット
\addtocounter{currentwotocframenumber}{-1}% 1引く
\addtocounter{currentwotocframenumber}{-\thetocpage}% 現TOCページ数を引く
\hfill\hbox{\ifnofooter\else\thecurrentwotocframenumber/\thewotoctotalframenumber\fi\hspace{.8\zw}}%
\end{beamercolorbox}%
}%
あ〜〜〜〜\(\LaTeX\)最高!! Power Pointはクソ!!!!!!!!!
などと言ってると老害認定されるので気をつけよう。気合で何でも書けるということは気合で色々書く必要があるということです。が、 もっと拡張しよう、拡張するときはソースを参考にすると参考になる、いいぞ、頑張れ。
Beamer + LuaLaTeX Ultimate fuckin' awesome Tip
\documentclass
のオプションにunicode
を渡すとpdfのタイトルや著者名が文字化けしないぞい
-
のちのcommitではn段組にするのを指定できるようにした。 ↩