我通常希望 latexmk 默认使用 pdflatex 和 synctex,因此我在我的 RC 文件中有以下内容,并且一切运行正常:
$pdf_mode = 1;
$pdflatex = 'pdflatex -interaction=nonstopmode -synctex=1 %O %S';
但是,我想使用 xelatex 和 synctex 将某些文档编译为 PDF。如何更改我的 RC 文件,以便 latexmk 仍然默认使用 pdflatex 和 synctex,但如果我传递单个命令行选项,它将改用 xelatex 和 synctex?
我尝试了(以及许多其他方法)以下 RC 文件:
$pdf_mode = 1;
$pdflatex = 'pdflatex -interaction=nonstopmode -synctex=1 %O %S';
$xelatex = 'xelatex -interaction=nonstopmode -synctex=1 %O %S';
使用此文件,latexmk
不带参数的调用仍可按预期工作,但运行latexmk -xelatex
或latexmk -pdfxe
抛出错误消息:
Latexmk: Log file says output to 'foo.pdf'
Latexmk: ===For rule 'xelatex', actual output 'foo.pdf'
======appears not to match expected output 'foo.xdv'
Failure to make 'foo.xdv'
Latexmk: Errors, so I did not complete making targets
Collected error summary (may duplicate other messages):
xelatex: failed to create output file
Latexmk: Use the -f option to force complete processing,
unless error was exceeding maximum runs of latex/pdflatex.
有之前有关于此主题的类似帖子但那里给出的解决方案仅适用于旧版本的 latexmk。根据作者的评论,程序的行为从那时起就发生了变化,并且 latexmk 现在应该“做你想做的事”,尽管我还没能弄清楚。
答案1
latexmk 拆分 xelatex 编译。来自文档
Latexmk 首先使用 xelatex 生成 xdv 文件,并执行所有需要的额外运行(包括 bibtex 等)。之后,它才使用 xdvipdfmx 从 xdv 文件生成 pdf 文件。
为了获得这种行为,变量的原始定义$xelatex
包含-no-pdf
开关:
# xelatex is used to give xdv file, not pdf file
$xelatex = 'xelatex -no-pdf %O %S';
如果您想改变变量,您也应该使用开关。
答案2
在 v4.54c 中,除了添加变量之外$xelatex
,流程还更改为xelatex
使用该标志运行,并且仅在作业结束时-no-pdf
运行一次,这显然加快了编译时间。因此,当使用该标志运行时,需要输出。xdvipdfmx
-xelatex
latexmk
xdv
这里有几个选项:
- 将您的更改
$xelatex
为$xelatex = -no-pdf -interaction=nonstopmode -synctex=1 %O %S
- 与您链接的问题中的答案没有什么不同,不要覆盖变量
$xelatex
,而是添加push @extra_xelatex_options, '-synctex=1' ;
。