如何配置 latexmk

利用latexmkrc来生成自己的latexmk

Posted by Elton on May 23, 2019

$\LaTeX$ 文档的编译过程通常比较复杂,尤其是有参考文献的情况下, 需要多次编译并调用外部命令。这个问题可以通过 latexmk 工具来解决。

latexmk 需要自己进行简单的配置后才能使用起来比较顺手。 建议在个人根目录的 $HOME/.latexmkrc文件中配置个人的使用习惯, 然后在项目的工作目录的 latexmkrc 文件配置项目相关的编译方法, 如使用 xelatex 或开启 -shell-escape 等。

下面是我推荐的一些配置,更详细的说明参见 latexmkrc 的文档。

$pdf_mode = 1;

默认使用 pdflatex 编译生成 pdf。 如果使用 xelatex 可以设为 5(需要 TeX Live 2017 以上)。 我个人由于需要使用不同的引擎,所以默认设为 1, 然后用命令行参数切换不同的引擎,比如 latexmk -xelatex

$pdflatex = "pdflatex -file-line-error -halt-on-error -interaction=nonstopmode -synctex=1 %O %S";

给编译命令添加额外的参数:-file-line-error 使报错输出文件和行号; -halt-on-error-interaction=nonstopmode 使编译遇到错误时立即停止; -synctex=1 则开启 synctex 的功能。

$xelatex = "xelatex -file-line-error -halt-on-error -interaction=nonstopmode -no-pdf -synctex=1 %O %S";\
$xdvipdfmx = "xdvipdfmx -E -o %D %O %S";

xelatex 的 -no-pdf 参数使编译时只生成 xdv 文件,最后才用 xdvipdfmx 生成 pdf, 这样可以节省嵌入图片耗费的时间(需要 TeX Live 2017 以上)。 注意 -E 参数可以避免一些字体嵌入问题(见 https://github.com/CTeX-org/ctex-kit/issues/352 )。

$bibtex_use = 1.5;

通常 bbl 文件是由 BibTeX 编译 bib 文件生成的,在清理辅助文件时可以删掉; 但是有时并没由提供 bib 文件,只有 bbl(比如 arxiv 上的 TeX 源码), $bibtex_use = 1.5 可以自动检测根据条件清理 bbl 文件(需要 TeX Live 2018 以上)。

$out_dir = "latex.out";

编译时将所有生成文件(包括辅助文件)写到 latex.out 目录下。注意这个配置虽然可以使目录更加整洁,但是可能导致一些软件的功能受影响,建议谨慎选择。

$preview_mode = 1;

编译完成后自动打开 pdf;还可以用 $pdf_previewer 配置 pdf 阅读器, 以及 $preview_continuous_mode 连续自动编译。

$clean_ext = "hd nav snm synctex.gz xdv";

额外需要清理的辅助文件;如配置过 $out_dir 就不再需要了。

add_cus_dep('nlo', 'nls', 0, 'nlo2nls');\
sub nlo2nls {\
   system("makeindex -s nomencl.ist -o \"$_[0].nls\" \"$_[0].nlo\"");\
}\
push @generated_exts, "nlo", "nls";

一些宏包需要额外的编译命令, 比如 nomencl 宏包需要调用 makeindex 命令将 nlo 文件编译成 nls 文件, 所以要手动配置这个编译过程。

完整的配置文件如下:

$pdf_mode = 1;

$pdflatex = "pdflatex -file-line-error -halt-on-error -interaction=nonstopmode -synctex=1 %O %S";

$xelatex = "xelatex -file-line-error -halt-on-error -interaction=nonstopmode -no-pdf -synctex=1 %O %S";

$xdvipdfmx = "xdvipdfmx -E -o %D %O %S";

$bibtex_use = 1.5;
$out_dir = "latex.out";

$preview_mode = 1;
$clean_ext = "hd nav snm synctex.gz xdv";
add_cus_dep('glo', 'gls', 0, 'glo2gls');

sub glo2gls {
system("makeindex -s gglo.ist -o \"$_[0].gls\" \"$_[0].glo\"");
}

push @generated_exts, "glo", "gls";
add_cus_dep('nlo', 'nls', 0, 'nlo2nls');

sub nlo2nls {
system("makeindex -s nomencl.ist -o \"$_[0].nls\" \"$_[0].nlo\"");
}

push @generated_exts, "nlo", "nls";