我在用latexmk作为pdf 引擎为了潘多克,也就是说我使用命令
pandoc --pdf-engine=latexmk --pdf-engine-opt=-emulate-aux-dir --pdf-engine-opt=-aux-directory=aux \
test.md -o test.pdf
将test.md编译成test.pdf文件。
执行此操作时,latexmk 会发出警告信息:
Latexmk: In reading rule 'pdflatex' in 'aux/input.fdb_latexmk',
destination has different name than configured...
使用类似的命令,我有时会收到相当类似的抱怨:
Latexmk: In reading rule 'xdvipdfmx' in 'aux/input.fdb_latexmk',
name of destination file is not current one; I'll flag rule as out of date.
我是猜测pandoc 在后台进行了一些重命名(aux 文件夹中的所有文件都是input
.tex、.log 等),并且 latexmk 不喜欢命令不符合<filename>.tex
-><filename>.pdf
通常的命名方式,但我不完全确定,因为据我所知,这个错误消息没有记录下来。
我不确定是否应该问約翰·柯林斯或有关它的 pandoc 邮件列表:但有人可以确认这个错误信息没有记录下来,并猜猜我应该如何解释它?
答案1
当我尝试更好地理解这个错误时,我发现了以下情况:
pandoc test.md --pdf-engine=latexmk --pdf-engine-opt=-emulate-aux-dir --pdf-engine-opt=-aux-directory=aux -o test.pdf
给出:
Rc files read:
NONE
Latexmk: Run number 1 of rule 'pdflatex'
Latexmk: Run number 2 of rule 'pdflatex'
但
pandoc --pdf-engine=latexmk --pdf-engine-opt=-emulate-aux-dir --pdf-engine-opt=-aux-directory=aux test.md -o test.pdf
给出:
Rc files read:
NONE
Latexmk: In reading rule 'pdflatex' in 'aux/input.fdb_latexmk',
destination has different name than configured...
Latexmk: Run number 1 of rule 'pdflatex'
所以顺序很重要:输入文件的名称应该之前调用 pandoc 时的选项。
答案2
问题中报告的现象是由于 pandoc 使用临时目录来存放中间文件(input.tex
和input.pdf
)造成的。每次运行时都会使用一个名称不同的新临时目录。然后 latexmk 给出的警告消息就是由于这一点以及 latexmk 使用 auxdir 来保存运行之间的信息。由于 latexmk 会根据当前运行的情况进行调整,因此会获得正确的结果,并且可以安全地忽略警告。
然而,警告确实表明 latexmk 检测到了潜在用户可能需要了解的异常情况。在这种情况下,可以改进工作流程以从使用 latexmk 中获得更多优势,而无需消息。(此外,消息需要改进,我已经为 latexmk 的下一个版本(可能是 v. 4.76)做了改进。)
详细诊断
Pandocinput.tex
将从源文件生成的文件放在临时目录中。它使用 latexmk 的选项(或 pdflatex 选项,如果使用的话)将其编译为input.pdf
同一目录中的文件--output-directory
。然后,它将 .pdf 文件复制/移动到最终目标,最后删除临时目录。下次使用 pandoc 时,临时目录会有所不同。在 latexmk 运行之间,有关文件状态的信息将保留在input.fdb_latexmk
latexmk 警告消息中提到的文件中;这包括有关文件的信息input.pdf
。在下次运行时,随着临时目录名称的更改,latexmk 会报告它看到的内容,因为它与它通常处理的情况不符。它会根据新情况进行调整。'input.tex` 文件名称的目录部分也会发生变化,但 latexmk 通常通过检测源文件更改的方法正确处理,因此它不会报告这一点。
解决方案 1
通过为 pandoc 提供适当的选项来使用输出目录,例如,
--pdf-engine-opt=-output-directory=out
或者
--pdf-engine-opt=-outdir=out
然后 pandoc 会在指定目录中生成中间文件input.tex
和input.pdf
文件,但在运行结束时不会删除它们。这实际上适用于 pandoc 使用的 pdf 引擎 latexmk 和 pdflatex。
这样做的一个小优点是,如果重新运行 pandoc 时 .md 源文件没有更改,latexmk 不再运行 pdflatex,因为文件的input.tex
位置没有更改。原始方法总是导致 latexmk 至少运行一次 pdflatex。
您也可以只使用输出目录,而无需单独使用辅助目录。这在当前 pandoc 手册中有记录。
我测试过,该解决方案至少适用于当前版本 pandoc 2.16.1。
解决方案 2
也可以仅使用 pandoc 生成(独立).tex 文件,然后将 latexmk 应用于该文件。在类 Unix 操作系统(例如 Linux、macOS)下,当源文件为 trymd.md 时,以下命令有效
pandoc trymd.md -s -o aux/trymd.tex \
&& latexmk -auxdir=aux -outdir=. -emulate-aux-dir -pdf -quiet aux/trymd.tex \
&& rm trymd.fls
(如果您使用 MS-Windows,当然您必须使用合适的等效版本。)
现在,所有中间文件都只位于 aux 目录中。它们还具有与 .md 源文件相同的基本名称,因此将此方法应用于多个源文件不会导致文件之间发生干扰。(相比之下,将所有工作留给 pandoc 会导致中间文件只有一个基本名称 . input
)
解决方案 3(建议)
(我还没有实现这一点,至少现在还没有。)应该可以配置 latexmk 让 pandoc 在运行 pdflatex 之前将 .md(或其他文件)转换为中间 .tex 文件。然后你可以直接执行latexmk file.md
,而无需在 latexmk 配置文件中提及 pandoc。
这是一个更普遍情况的实际例子,其中 .tex 文件不是由用户编写的,而是由其他源文件以编程方式生成的。