如何诊断为什么 latexmk 调用在一个系统上有效而在另一个系统上无效(Linux 与 Windows)

如何诊断为什么 latexmk 调用在一个系统上有效而在另一个系统上无效(Linux 与 Windows)

我正在尝试获取一个可以在 Linux 和 Windows 上运行的构建脚本。在 Linux 上我们使用 TeXLive,而在 Windows 上我们使用 MikTeX。在这两种情况下,latexmk都会根据pdflatex需要重新运行以解决引用问题。

该脚本源自在 Linux 上的开发,在 Windows 上仅运行一次后就失败了(在 Linux 上latexmk需要运行 3 次pdflatex),我无法弄清楚原因。

在 Linux 上,在运行 1 结束时,系统会mytexfile.aux显示文件已更改。在 Windows 上,不会发生这种情况。因此,在 Windows 上latexmk似乎无需重新运行pdflatex

最初我以为这可能与latexmkPerl 脚本有关,并且可能降低了文件时间戳的精度。然而...

在运行pdflatex命令时(命令latexmk声称会执行,当然是在清理之后),手动在 的第1 次运行和第 2 次运行之间,文件确实没有发生变化。唯一发生变化的两个文件是 和 文件( 、 、保持.aux不变pdflatex.fls.log此外.aux.fdb_latexmk在Windows上,文件为空,而在 Linux 上则不是。.out.toc.toc

目前我还不知道这latexmk是否pdflatex是罪魁祸首,以及 MikTeX 和 TeXLive 中各个软件包之间的版本差异是否在这一切中发挥了重要作用。

那么我该如何进一步诊断这个问题,更重要的是,如何让它在带有 MikTeX 的 Windows 上运行(我不知道为什么在 Windows 上必须是 MikTeX,而在 Linux 上必须是 TeXLive)?

编辑1:我基本上是在对这个问题发表一条评论后error.log文件中进行了 grep。输出如下:

! Package inputenc Error: Invalid UTF-8 byte sequence.
\GenericError  ...
!  ==> Fatal error occurred, no output PDF file produced!

进一步挖掘后,我发现绊倒 LaTeX 引擎的字符似乎是é……不知道为什么它在 Windows 上会出错,但在 Linux 上却不会。


在 Windows(10 x64)上:

版本:latexmk 4.63bMiKTeX-pdfTeX 2.9.7029 (1.40.20) (MiKTeX 2.9.7050 64-bit)

Latexmk: This is Latexmk, John Collins, 17 March 2019, version: 4.63b.
Latexmk: applying rule 'pdflatex'...
Rule 'pdflatex': The following rules & subrules became out-of-date:
      'pdflatex'
------------
Run number 1 of rule 'pdflatex'
------------
------------
Running 'pdflatex -halt-on-error -synctex=0 -interaction=batchmode  -recorder  "mytexfile.tex"'
------------
This is pdfTeX, Version 3.14159265-2.6-1.40.20 (MiKTeX 2.9.7050 64-bit)
entering extended mode
=== TeX engine is 'pdfTeX'
Latexmk: List of undefined refs and citations:
...
Latexmk: Summary of warnings from last run of (pdf)latex:
  Latex failed to resolve 83 reference(s)
Latexmk: Errors, so I did not complete making targets
Latexmk: Use the -f option to force complete processing,
 unless error was exceeding maximum runs, or warnings treated as errors.

在 Linux(Ubuntu 16.04)上:

版本:latexmk 4.41pdfTeX 3.14159265-2.6-1.40.16 (TeX Live 2015/Debian)

注意:省略号表示我为了简洁而删除了一些行(但仅限于命名参考文献的行)。

Latexmk: This is Latexmk, John Collins, 1 January 2015, version: 4.41.
Latexmk: applying rule 'pdflatex'...
Rule 'pdflatex': Rules & subrules not known to be previously run:
   pdflatex
Rule 'pdflatex': The following rules & subrules became out-of-date:
      'pdflatex'
------------
Run number 1 of rule 'pdflatex'
------------
------------
Running 'pdflatex -halt-on-error -synctex=0 -interaction=batchmode  -recorder  "mytexfile.tex"'
------------
This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/Debian) (preloaded format=pdflatex)
 restricted \write18 enabled.
entering extended mode
Latexmk: References changed.
Latexmk: References changed.
Latexmk: Log file says output to 'mytexfile.pdf'
Latexmk: List of undefined refs and citations:
...
Latexmk: Summary of warnings:
  Latex failed to resolve 83 reference(s)
Latexmk: applying rule 'pdflatex'...
Rule 'pdflatex': File changes, etc:
   Changed files, or newly in use since previous run(s):
      'mytexfile.aux'
------------
Run number 2 of rule 'pdflatex'
------------
------------
Running 'pdflatex -halt-on-error -synctex=0 -interaction=batchmode  -recorder  "mytexfile.tex"'
------------
This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/Debian) (preloaded format=pdflatex)
 restricted \write18 enabled.
entering extended mode
Latexmk: Log file says output to 'mytexfile.pdf'
Latexmk: List of undefined refs and citations:
...
Latexmk: Summary of warnings:
  Latex failed to resolve 54 reference(s)
  Latex found 1 multiply defined reference(s)
Latexmk: applying rule 'pdflatex'...
Rule 'pdflatex': File changes, etc:
   Changed files, or newly in use since previous run(s):
      'mytexfile.aux'
      'mytexfile.out'
      'mytexfile.toc'
------------
Run number 3 of rule 'pdflatex'
------------
------------
Running 'pdflatex -halt-on-error -synctex=0 -interaction=batchmode  -recorder  "mytexfile.tex"'
------------
This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/Debian) (preloaded format=pdflatex)
 restricted \write18 enabled.
entering extended mode
Latexmk: Log file says output to 'mytexfile.pdf'
Latexmk: List of undefined refs and citations:
...
Latexmk: Summary of warnings:
  Latex failed to resolve 54 reference(s)
  Latex found 1 multiply defined reference(s)
Latexmk: All targets (mytexfile.pdf) are up-to-date

答案1

我已经太依赖于向latexmk我展示参考文献出了什么问题,我甚至没有想过要查看文件.log。幸运的是菲利佩·奥莱尼克在评论中纠正我。

从中我可以看出:

! Package inputenc Error: Invalid UTF-8 byte sequence.

See the inputenc package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              

\GenericError  ...                                

...接下来是几行(混乱的)代码,似乎表明了原因。

问题似乎出在(基于 Python 的)预处理步骤上,Windows 和 Linux 之间似乎有所不同。在我们为文档提取的源代码中,我可以看到以下字节:当将其作为 Unicode 处理时,解码c3 a9为:é

>>> b"\xc3\xa9".decode('utf-8')
'é'

...但是这些会被转换为latin-1(或者可能是根据语言环境而密切相关的标准 Windows ANSI 代码页),当被视为 UTF-8 时会产生无效的字节序列......这反过来会导致pdflatex阻塞。

相关内容