Beamerやbiblatex, TikZなどを使っていると,コンパイルに異様に時間がかかってしまうことないですか?実はbeamerなどでは,コンパイル時間の大半はプリアンブルのファイル読み込みと読み込んだ先の構文解析・マクロ展開に費やされています.
最近,mylatexformatを使ってプリアンブル展開を前処理すると,コンパイルを高速化できるよという素晴らしい記事がありました.
doratex.hatenablog.jp
ここではカスタムシェルスクリプトではなくlatexmkを使って,maylatexformatを簡単に使えるようにします.
やり方は,以下の内容のlatexmkrc
を対象TeXファイルのディレクトリに置くだけです.デフォルトはuplatex+dvipdfmxになっています.$pdf_mode
を1にするとpdflatexでコンパイルされます.
$pdf_mode = 3; $dvipdf = 'dvipdfmx %O -o %D %S'; $latex = 'internal mylatex uplatex %A %O %S'; $pdflatex = 'internal mylatex pdflatex %A %O %S'; $clean_ext = "$clean_ext fmt"; sub mylatex { my ($engine, $base, @args) = @_; my $com = join(' ', @args); unless (-e "$base.fmt"){ print "mylatex: making $base.fmt in ini mode... \n"; Run_subst("$engine -ini -jobname=\"$base\" \\\&$engine mylatexformat.ltx %S"); } print "mylatex: $base.fmt detected, so running normal latex... \n"; return Run_subst("$engine -fmt $base $com"); }
あとは普段どおりにlatexmkするだけです.
解説
latexmkでは独自定義したPerlの関数を呼ぶことができます.上では$latex = 'internal mylatex %O %S';
の部分で,通常のlatexの代わりにmylatex
という関数を呼んでいます.
main.tex
をコンパイルしているとします.mylatex関数は
main.fmt
がない場合はuplatexをINIモードで呼び出してmain.fmt
を生成main.fmt
がある場合はそれを使用してuplatexで対象ファイルをコンパイル
ということをやっているだけです.
これにより,初回のみfmtファイルが生成され,2回目以降のコンパイルではfmtファイルを利用してプリアンブルの展開を省略できます.
注意点
元記事にもあるように,プリアンブルの内容を変えたら,fmtファイルを削除し再生成する必要があります.自作マクロなど頻繁に変える部分をfmtから除く方法は元記事を参照.上記コードではfmtファイルをlatexmkの削除対象に追加してあるので,latexmk -c main.tex
でfmtファイルも削除されます.Overleafでは"Recompile from scratch"をしてください.