LaTeXを速くする
最終更新日
公開日
LaTeXのコンパイルが遅い場合の対処法
目次
(私の環境では)1,2ページのコンパイルに数分かかっていたのが,以下の項目を全て対策すると,1,2ページなら1秒以内,数十ページでも数秒でコンパイルできるようになった.
LuaLaTeX → upLaTeX
- LuaLaTeXは高機能だが遅い.LuaLaTeX特有の機能を使っていない場合は,upLaTeXに変える
mylatexformatでプリコンパイル
- 特に多くのパッケージを
\usepackage{}
していると,プリアンブルのコンパイルが重い.プリアンブルだけmylatexformat
でプリコンパイルするとかなり速くなる - 注意:LuaLaTeXはmylatexformatに対応していなくて?私の環境では使えなかった.upLaTeXを使おう
分割コンパイル
- 数十ページとかになると,全体をまとめてコンパイルすると遅い.
docmute
やsubfiles
パッケージを使って,分割コンパイルすると速くなる
Windows → WSL2
- Windows Desktop版のtexliveを使うのではなく,WSL2でLinux CLI版のtexliveを使うと速くなる(なぜなのかはよく分からない)
- 注意:WSL2を使う場合の一般的な話だけど,
*.tex
ファイルはWSL2のファイルシステムに配置する.WSL2でWindows側のファイルシステムを参照すると遅い
画像の前処理・無視
- PNG画像の場合は,
extractbb
で画像サイズを前計算すると速くなることがある(研究室の後輩がこれで爆速になった) draft
モードを使うと枠だけになるので多少速くなる.\documentclass[*, draft]{*}
とすればよい
コンパイルレシピの見直し
- 特にVSCodeの
LaTeX Workshop
拡張機能でデフォルトのレシピそのままだと遅いことがある.TeXwikiなどを参考に最適化する
参考(私の設定)
高速化に関係のある部分を一部抜粋して紹介する
~/.latexmkrc
#!/usr/bin/env perl
# $latex = 'uplatex %O -kanji=utf8 -synctex=1 -halt-on-error -file-line-error %S';
$latex = 'internal mylatexcmd uplatex %A %O -kanji=utf8 -synctex=1 -halt-on-error -file-line-error %S';
$max_repeat = 5;
# BibTeX
$bibtex = 'upbibtex %O %B';
$biber = 'biber %O --bblencoding=utf8 -u -U --output_safechars %B';
# index
$makeindex = 'mendex %O -o %D %S';
# DVI / PDF
$dvipdf = 'dvipdfmx %O -o %D %S';
$pdf_mode = 3; # generate pdf from dvi
# %O:オプション
# %S:ソースファイル
# %D:出力ファイル
# mylatexformatによる,プリアンブルの前処理
# ref: https://tasusu.hatenablog.com/entry/2022/04/07/044634
sub mylatexcmd {
my ($engine, $base, @args) = @_;
my $com = join(' ', @args);
unless (-e "$base.fmt"){
print "mylatexcmd: making $base.fmt in ini mode... \n";
Run_subst("$engine -ini -jobname=\"$base\" \\\&$engine mylatexformat.ltx %S");
}
print "mylatexcmd: $base.fmt detected, so running normal latex... \n";
return Run_subst("$engine -fmt $base $com");
}
.vscode/settings.json
{
"latex-workshop.latex.tools": [
{
"name": "latexmk(uplatex)",
"command": "latexmk",
"args": ["-outdir=%OUTDIR%", "%DOC%"]
}
],
"latex-workshop.latex.recipes": [
{
"name": "uplatex",
"tools": ["latexmk(uplatex)"]
}
]
}
main.tex
% \endofdump
\RequirePackage{plautopatch}
\documentclass[
autodetect-engine,dvipdfmx-if-dvi,
ja=standard,
a4paper,
% draft,
]{bxjsreport}
% 分割コンパイル用のパッケージ
\usepackage{docmute}
\begin{document}
% 分割したファイル(sub_file.tex)を読み込み
\include{sub_file}
\end{document}
sub_file.tex
\csname docmute\endcsname
\RequirePackage{plautopatch}
\documentclass[
autodetect-engine,dvipdfmx-if-dvi,
ja=standard,
a4paper,
]{bxjsreport}
\begin{document}
hoge hoge
\end{document}