为什么 pdfTeX 使用相同的排版指令会给出不同的结果?

为什么 pdfTeX 使用相同的排版指令会给出不同的结果?

我注意到 pdfTeX 中存在奇怪的行为,但不知道该如何解释。以下两个示例中的 pdf 文件看起来不同。 texlive-lang-czechslovak必须安装软件包才能尝试这些示例。我还在此处附上了我生成的 pdf 文件:例子1.pdf例子2.pdf

示例1

\showboxbreadth=\maxdimen
\showboxdepth=\maxdimen
\let\oldshipout\shipout
\def\shipout{\global\let\shipout\oldshipout\afterassignment\myboat\setbox255=}
\def\myboat{\aftergroup\myship}
\def\myship{\showbox255\shipout\box255}
\nonstopmode
\let\originput\input
\def\input utf8off {\let\clearmubyte\empty \let\input\originput}
\originput docby.tex
\let\originput\undefined
\def\Black{\pdfliteral{0 g 0 G}}
\let\Green\Black
\hsize=210mm\advance\hsize by-3cm
\def\outputhook{\hoffset=\ifodd\pageno1.5cm\else1.5cm\fi\advance\hoffset by-1in}
\def\ins #1{\ifirst {#1}{^^73udo}{\end}{++}}
\let\isnameprinted-

\parindent=20pt
\indent\llap{\hskip-\parindent\bf1.\hfill}Test.
\ins \jobname

\bye
sudo perl -i -pe "s/datestyle = 'iso, mdy'/datestyle = 'iso, ymd'/" /etc/postgresql/*/main/postgresql.conf \
&& sudo /etc/init.d/postgresql restart

示例2

\showboxbreadth=\maxdimen
\showboxdepth=\maxdimen
\let\oldshipout\shipout
\def\shipout{\global\let\shipout\oldshipout\afterassignment\myboat\setbox255=}
\def\myboat{\aftergroup\myship}
\def\myship{\showbox255\shipout\box255}
\nonstopmode
\let\mubyte=\undefined \let\mubytein=\undefined
\input docby.tex
\def\Black{\pdfliteral{0 g 0 G}}
\hsize=210mm\advance\hsize by-3cm
\def\outputhook{\hoffset=\ifodd\pageno1.5cm\else1.5cm\fi\advance\hoffset by-1in}
\def\ins #1{\ifirst {#1}{^^73udo}{\end}{++}}
\let\isnameprinted-

\parindent=20pt
\indent\llap{\hskip-\parindent\bf1.\hfill}Test.
\ins \jobname

\bye



sudo perl -i -pe "s/datestyle = 'iso, mdy'/datestyle = 'iso, ymd'/" /etc/postgresql/*/main/postgresql.conf \
&& sudo /etc/init.d/postgresql restart

重现步骤:

$ pdfcsplain bad_letter_e-1.tex
$ pdfcsplain bad_letter_e-2.tex
$ pdftoppm bad_letter_e-1.pdf e1
$ pdftoppm bad_letter_e-2.pdf e2
$ md5sum e1-1.ppm e2-1.ppm
b08f8cd73e037280f8cdef7057c0e1a9  e1-1.ppm
a5818433399c443ad9fee8deb35208d9  e2-1.ppm

我们看到哈希值不同。如果我们在 pdf viewer 中打开这些 pdf 文件,放大到 400% 并进行比较,我们会看到单词“postgresql.conf”中的字母“e”发生了移动。

\showbox以上两个例子使用了相同的排版指令,从输出中可以看出。

这是区别\showbox

--- bad_letter_e-1.log
+++ bad_letter_e-2.log
@@ -145,7 +145,6 @@
 ...\ttsmall s
 ...\ttsmall q
 ...\ttsmall l
-...\pdfliteral{0 g 0 G}
 ...\ttsmall /
 ...\ttsmall *
 ...\ttsmall /

那么,\pdfliteral这会影响排版吗?这是正确的行为吗?如果\pdfliteral不是原因,还能如何解释呢?

答案1

Poppler pdf 渲染库是罪魁祸首 - pdf 文件本身没有问题。可以通过先转换pdfps,然后ps转换为图像来检查:

$ pdf2ps bad_letter_e-1.pdf
$ pdf2ps bad_letter_e-2.pdf
$ pstopnm bad_letter_e-1.ps
$ pstopnm bad_letter_e-2.ps
$ md5sum bad_letter_e-1*.ppm bad_letter_e-2*.ppm
a879acaaab2af4bd4a3c8563ec0c7c48  bad_letter_e-1001.ppm
a879acaaab2af4bd4a3c8563ec0c7c48  bad_letter_e-2001.ppm

现在哈希值总和相等。

相关内容