怎么想到用 latexmk 的呢?写论文呗!

本来呢,我一直习惯于使用命令行手敲

1
pdflatex someting.tex

千万别小看这种重复劳动,它不仅帮你加深记忆,还有最完整的输出,让你一窥 Tex 排版系统的内裤(→_→,一本正经胡说八道中……)。还记得 Archlinux 的哲学名言吗?–Keep it simple and stupid (KISS)–说得太对了呀!

但是啊说到写论文,肯定要有引用文献的啦,这就麻烦了,每次更新参考文献和交叉引用都需要四步走:

1
2
3
4
pdflatex a.tex  # 生成 aux 文件,下一步 bibtex 才能知道需要引用哪几个文献
bibtex a        # 生成 bbl 文件,及将.bib 里面的元数据展开成符合 tex 语法的 bibitem
pdflatex a.tex  # 刷新引用,可能残留一些问号
pdflatex a.tex  # 产生最终结果,所有引用正确显示

这就忍不了了吧?其实我还是能忍的,因为不是每次更新文献就重新编译,可以写一大段再更新一次,这就省事儿多了。真正原因是我像用 VS code 写 latex,下了一个插件叫 Latex Workshop,它默认使用 pdflatex 编译,但我写中文必须要用 xelatex 编译,而且必须要完成自动化。

我看到可以用 latexmk,所以就去简单研究了下,下面进入正题。

命令行使用

1
latexmk

默认情况下会自动编译当前文件夹下所有 tex 文件,默认使用 pdflatex 引擎。

如果想编译得到 PDF 文件,则直接加上选项:

1
latexmk -pdf

如果想编译单个文件:

1
latexmk single_file.tex

要删除临时文件:

1
2
latexmk -c
latexmk -C ## 删除(包含输出文件)

配置文件

  • ~/.latexmkrc:用户全局配置
  • $PWD/latexmkrc:局部文件夹配置

一个简单的配置文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$dvi_previewer = 'start xdvi -watchfile 1.5';
$ps_previewer  = 'start gv --watch';
$pdf_previewer = 'start evince';

$pdf_mode = 1;                              # tex -> pdf
# $pdf_mode = 2;                            # tex -> ps -> pdf
# $pdf_mode = 5;                            # use xelatex, see `man latexmk`
$postscript_mode = 1;                       # tex -> ps
@defalut_files = ('main.tex', 'niam.tex');  # 指定要编译的文件

$pdflatex = 'pdflatex -interaction=nonstopmode -synctex=1 %O %S';
$xelatex = 'xelatex -no-pdf -interaction=nonstopmode -synctex=1 %O %S';

References