latexmk 的(未记录的?)错误消息“目标文件的名称不是当前名称;我会将规则标记为过期。”

latexmk 的(未记录的?)错误消息“目标文件的名称不是当前名称;我会将规则标记为过期。”

我在用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.texinput.pdf)造成的。每次运行时都会使用一个名称不同的新临时目录。然后 latexmk 给出的警告消息就是由于这一点以及 latexmk 使用 auxdir 来保存运行之间的信息。由于 latexmk 会根据当前运行的情况进行调整,因此会获得正确的结果,并且可以安全地忽略警告。

然而,警告确实表明 latexmk 检测到了潜在用户可能需要了解的异常情况。在这种情况下,可以改进工作流程以从使用 latexmk 中获得更多优势,而无需消息。(此外,消息需要改进,我已经为 latexmk 的下一个版本(可能是 v. 4.76)做了改进。)

详细诊断

Pandocinput.tex将从源文件生成的文件放在临时目录中。它使用 latexmk 的选项(或 pdflatex 选项,如果使用的话)将其编译为input.pdf同一目录中的文件--output-directory。然后,它将 .pdf 文件复制/移动到最终目标,最后删除临时目录。下次使用 pandoc 时,临时目录会有所不同。在 latexmk 运行之间,有关文件状态的信息将保留在input.fdb_latexmklatexmk 警告消息中提到的文件中;这包括有关文件的信息input.pdf。在下次运行时,随着临时目录名称的更改,latexmk 会报告它看到的内容,因为它与它通常处理的情况不符。它会根据新情况进行调整。'input.tex` 文件名称的目录部分也会发生变化,但 latexmk 通常通过检测源文件更改的方法正确处理,因此它不会报告这一点。

解决方案 1

通过为 pandoc 提供适当的选项来使用输出目录,例如,

--pdf-engine-opt=-output-directory=out

或者

--pdf-engine-opt=-outdir=out

然后 pandoc 会在指定目录中生成中间文件input.texinput.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 文件不是由用户编写的,而是由其他源文件以编程方式生成的。

相关内容