Kyo_s_s Homepage
mylatexformatでタイプセット時間短縮
LaTeX
mylatexformat とは?

mylatexformat というパッケージを用いると、 (u)pLaTeX(\text{u})\text{p}\LaTeX に限りプリアンブル部をキャッシュにすることができ、 タイプセット時にそれを読み込むことでタイプセットが高速になります。

詳しくは、 https://doratex.hatenablog.jp/entry/20211206/1638749451 で紹介されています。

これを latexmk で簡単に使えるようにする手法が https://tasusu.hatenablog.com/entry/2022/04/07/044634 で紹介されているのですが、 このままだとプリアンブル部を書き換えたときに、自分で fmt ファイルを削除する必要があります。

プリアンブル変更時に自動でキャッシュ再生成を行う

fmt ファイルを作成する時に同時にそのときのプリアンブルも保存しておき、プリアンブルに差分があったときに自動でキャッシュファイルを作り直すようにPerlスクリプトを書いたので、メモしておきます。

Warning

このままだと subfiles の使用はできなさそうです。 親のキャッシュファイルを使用して子ファイルをタイプセットするべきですが、この処理を組み込んでいません。 https://qiita.com/JyJyJcr/items/69769c88eea9d0dae152 でsubfilesを使用する上での.latexmkrc が公開されています。

この.latexmkrcでは pLaTeX\text{p}\LaTeX が指定されていますが(私が所属している学科の卒業論文テンプレートがpLaTeX\text{p}\LaTeXのためです)、 おそらく upLaTeX\text{up}\LaTeX でもこのまま動くと思います。

~/.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");
}

簡単に説明すると、

となっています。

ChatGPTにPerlの文法を教わりながら書いたため、もっといい感じにできそうです。適宜更新していこうと思います。

© 2025 Kyo_s_s