mylatexformat というパッケージを用いると、 に限りプリアンブル部をキャッシュにすることができ、 タイプセット時にそれを読み込むことでタイプセットが高速になります。
詳しくは、 https://doratex.hatenablog.jp/entry/20211206/1638749451 で紹介されています。
これを latexmk で簡単に使えるようにする手法が https://tasusu.hatenablog.com/entry/2022/04/07/044634 で紹介されているのですが、
このままだとプリアンブル部を書き換えたときに、自分で fmt
ファイルを削除する必要があります。
fmt
ファイルを作成する時に同時にそのときのプリアンブルも保存しておき、プリアンブルに差分があったときに自動でキャッシュファイルを作り直すようにPerlスクリプトを書いたので、メモしておきます。
このままだと subfiles
の使用はできなさそうです。
親のキャッシュファイルを使用して子ファイルをタイプセットするべきですが、この処理を組み込んでいません。
https://qiita.com/JyJyJcr/items/69769c88eea9d0dae152 でsubfilesを使用する上での.latexmkrc
が公開されています。
この.latexmkrc
では が指定されていますが(私が所属している学科の卒業論文テンプレートがのためです)、
おそらく でもこのまま動くと思います。
$latex = 'internal mylatex platex %A %O %S';$bibtex = 'pbibtex %O %B';$dvipdf = 'dvipdfmx %O -o %D %S';$makeindex = 'mendex %O -o %D %S';$max_repeat = 10;$pdf_mode = 3;
sub get_preamble_from_tex { my ($base) = @_; open(my $fh, '<', "$base.tex") or die "Could not open file '$base.tex' $!"; my $preamble = ''; while (my $line = <$fh>) { last if $line =~ /^\s*\\begin\{document\}|\\endofdump\b/; $preamble .= $line; } close $fh; return $preamble;}
sub save_preamble { my ($base) = @_; unless (-e "$base.preamble") { Run_subst("touch $base.preamble"); } my $preamble = get_preamble_from_tex($base); open(my $fh, '>', "$base.preamble") or die "Could not open file '$base.preamble' $!"; print $fh $preamble; close $fh;}
sub make_fmt { my ($engine, $base) = @_; print "mylatex: making $base.fmt in ini mode... \n"; save_preamble($base); Run_subst("$engine -ini -jobname=\"$base\" \\\&$engine mylatexformat.ltx %S");}
sub is_different_preamble { my ($base) = @_; if (-e "$base.preamble") { my $preamble = get_preamble_from_tex($base); open(my $fh, '<', "$base.preamble") or die "Could not open file '$base.preamble' $!"; my $old_preamble = do { local $/; <$fh> }; close $fh; return $preamble ne $old_preamble; } else { return 1; }}
sub mylatex { my ($engine, $base, @args) = @_; my $com = join(' ', @args); if (!-e "$base.fmt" || is_different_preamble($base)) { make_fmt($engine, $base); } print "mylatex: $base.fmt detected, so running normal latex... \n"; return Run_subst("$engine -fmt $base $com");}
簡単に説明すると、
get_preamble_from_tex
: ファイル名を引数として、その .tex
ファイルのプリアンブルを返す。save_preamble
: ファイル名を引数として、その .tex
ファイルのプリアンブルを .preamble
として保存する。make_fmt
: ファイル名と エンジンを引数として、キャッシュファイルを作成する。is_different_preamble
: ファイル名を引数として、保存されているプリアンブルと今のプリアンブルに変更が加えられているかどうかを返す。となっています。
ChatGPTにPerlの文法を教わりながら書いたため、もっといい感じにできそうです。適宜更新していこうと思います。