2015年6月7日日曜日

precompiled preambleを用意して,platexのタイプセットを高速化する

最近dynabook v713を使っていなかったので知人に譲り,これを元手にして,久々にwindowsのデスクトップPCを購入しました.所有しているMacbook Air (mid 2012)に比べてcpuの周波数が2倍,コア数も2倍になったけれど,platex+dvipdfmxによるタイプセットの速度は約60%速くなったくらいで,期待していたほどではありませんでした.TeXがシングルスレッドで動作するようなので,cpuのコア数は速度向上に寄与していないみたいです.

そこでLaTeXのタイプセット速度を向上させる方法がないか検索をしてみたら,
  • precompiled preambleを用意して,preambleの読み込み時間を短縮する.
  • tikzのexternalライブラリを用いて,tikzの絵をいったんpdf化し,それを読み込むことでtikzのタイプセット時間を短縮する.
という方法が見つかりました.

ここでは前者を紹介します.後者も試してみたのですが,可換図を描くライブラリであるtikz-cdのtikzcd環境と相性が悪いらしく,うまく行かなかったため断念しました.
追記:2021/09/19:以前はtikzのマニュアルにtikzcdとimcompatibleである旨が書いてあったと思うのですが,無くなっているようです.利用できるのかも.



precompiled preambleの作成
howtotex.comというブログの「Faster LaTeX part IV: Use a precompiled preamble」という記事でpreambleをprecompileする方法が紹介されています.まず,preambleを動的な部分と静的な部分に分けます.動的というのは,文章を書き上げる際に書き換えの頻度が高いという意味くらいに捉えておけばよいようです.例えば\includeonlyを使って部分タイプセットしているときは,書き換える頻度が高いので,動的と見なします.
preambleの静的な部分と静的な部分を\endofdumpで分けます.つまり,texファイルの\begin{document}よりも前の部分は次のようになります.

% 静的な部分
...
\endofdump
%動的な部分
...
\begin{document}
私はglossaries.styを使っていますが,\endofdumpより前に\usepackage{glossaries}があるとエラーが起きました.glossaries.styは動的な部分に配置してください.

以下ではtexファイルの名前が「mydoc.tex」であるとします.ターミナルを開いてmydoc.texのあるフォルダに移動し,
eptex -ini -jobname="mydoc" "&platex" mylatexformat.ltx mydoc.tex
と打ち込みます.するとmydoc.fmtというファイルが作成されます.このファイルをprecompiled preambleと言っているようです.元の記事では最初のeptexの部分がpdftexで,&platexの部分が&pdflatexになっています.最初のeptexの部分はplatexでも大丈夫でした.
最後に,フォーマットファイルmydoc.fmtを読み込むために,mydoc.texの最初の部分に%&mydocと記述します.
%&mydoc
...
\begin{document}
mydoc.fmtファイルを作った後はpreambleの静的な部分をコメントアウトしてもいいですし,そのままでもmydoc.fmyのほうを読みにいってくれます.静的な部分を独立したファイルにしてもいいみたいです.

私は上記のコマンドを覚えられそうにないので,シェルスクリプト化しました.

特にtikzを使っている場合は,tikzの関連ファイルの読み込みに時間がかかっていたので,短縮されました.MacBook Air (mid 2012 corei-7)でタイプセットに11秒かかっていた200ページくらいの文章が9.5秒くらいにはなりました.但し,あくまでもpreambleの読み込み速度を上げているだけなので,その分の時間短縮にしかならないようです.つまり本文が長くなっても短縮される時間に変わりはほとんどありませんでした.逆に本文が短くなればなるほど体感時間を速く感じると思われます.

preambleが肥大化している人は試してみるとよいのではないでしょうか.