为什么 xelatex 会从相同的确定性源生成不同的文件?

为什么 xelatex 会从相同的确定性源生成不同的文件?

以简单的 Latex 源文件为例:

\documentclass{article}
\usepackage{lipsum}
\usepackage{amsgen}
\begin{document}
\lipsum[1-10]
\end{document}

当使用“latex”处理时,您总是会得到相同的 DVI 文件,除日期外,其他所有地方都相同。

当使用“pdflatex”处理(多次)时,您会得到相同的 PDF 文件,但 ID 和日期除外,“lualatex”也是一样。

但是使用“xelatex”多次处理后,您会得到大小各异的 PDF 文件。使用“vimdiff”可以轻松看到差异。

为什么使用“xelatex”的处理不确定——对于相同的来源不一样?

答案1

该问题与驱动程序 xdvipdfmx 有关。为了生成字体的唯一标签,使用了随机数。尝试

xelatex -no-pdf test

xdvipdfmx test.xdv
pdffonts test.pdf

标签将改变如下

LYKESP+CMR10
CBIVMK+CMR10
...

每次跑步

xdvipdfmx test.xdv

答案2

似乎不同的是某些部分的实际二进制编码。我相信 pdf 渲染完全没有变化。根据我的经验,文件大小仅改变了正负 1 个字节(mac os x)。我已经对两个这样的 pdf 进行了十六进制模式的 ediff,以下是第一个差异出现的快照:

引用

因此,相对于部分嵌入的字体,第一个差异出现在 pdf 的一部分中。我不知道是什么原因造成的。

一般来说,我可以想象,如果你有某个 213 字节的东西必须存储在 256 字节中,那么最后 43 字节可能是随机内存,而且如果将一个或多个这样的东西一起压缩,那么你得到的结果会有所不同。解压缩时,结构终止符后(或给定数量的字节后)会有一些不同的随机垃圾。就像非编码 DNA。这也许并不是那么非编码,但我们不要离题。

我想只有熟悉 XeTeX 源代码的人才能给出令人信服的回答。

不要担心C-M-'未定义的东西,我正试图通过我忘记的键盘快捷键来捕捉它。

相关内容