我正在尝试获取一个可以在 Linux 和 Windows 上运行的构建脚本。在 Linux 上我们使用 TeXLive,而在 Windows 上我们使用 MikTeX。在这两种情况下,latexmk
都会根据pdflatex
需要重新运行以解决引用问题。
该脚本源自在 Linux 上的开发,在 Windows 上仅运行一次后就失败了(在 Linux 上latexmk
需要运行 3 次pdflatex
),我无法弄清楚原因。
在 Linux 上,在运行 1 结束时,系统会mytexfile.aux
显示文件已更改。在 Windows 上,不会发生这种情况。因此,在 Windows 上latexmk
似乎无需重新运行pdflatex
。
最初我以为这可能与latexmk
Perl 脚本有关,并且可能降低了文件时间戳的精度。然而...
在运行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.63b
,MiKTeX-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.41
,pdfTeX 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
阻塞。