mylatexformatでLaTeX高速化(latexmk・Overleaf対応)

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ファイルを利用してプリアンブルの展開を省略できます.

Overleafで使う

latexmkを使っているので,overleafでも使えます.

  1. 上記内容のlatexmkrcを作成する.
  2. MenuからTeXエンジンを"LaTeX"にする.

注意点

元記事にもあるように,プリアンブルの内容を変えたら,fmtファイルを削除し再生成する必要があります.自作マクロなど頻繁に変える部分をfmtから除く方法は元記事を参照.上記コードではfmtファイルをlatexmkの削除対象に追加してあるので,latexmk -c main.texでfmtファイルも削除されます.Overleafでは"Recompile from scratch"をしてください.