こんにちは、びしょ〜じょです。これは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のタイトルや著者名が文字化けしないぞい


  1. のちのcommitではn段組にするのを指定できるようにした。