我定义了一系列不同粗细的线段,如下所示。
\documentclass{article}
\usepackage{multido}
\parindent=0sp
\begin{document}
\multido{\dx=0sp+1000sp}{100}{\rule{0.01\linewidth}{\dx}}%
\end{document}
我得到的结果如下。
如果我们将输出放大 6400 倍,我们会注意到有一个间隔,其中相邻的线段具有相同的粗细。换句话说,到 中的任何值x sp
都会y sp
导致笔触具有相同的粗细。
我感兴趣的是找到 PDF 用于确定x
和的公式y
。PDF 或 PDF Viewer 如何定义笔划粗细的舍入规则?
答案1
PDF 成像模型相当复杂。您可以在 PDF 规范的第 10.6 节中阅读相关内容(您可以下载这里)。重点是,当绘制形状时,像素应该被着色,如果它的任何部分与形状相交,无论相交面积有多小。这个想法是为了确保没有形状会因为它与像素网格的对齐方式而消失,尽管误解这条规则可能会导致其他问题,例如当您不使用时,乳胶中的框边框线会消失xcolor
(见这个答案),问题在于先绘制一条黑线,然后在其右侧绘制一个白色矩形,但由于上述规则,白色矩形可能会完全遮住黑线。还有一个可选的“笔触调整”功能,其中线条被四舍五入为整数像素粗细,以确保所有垂直或水平线条都具有相同的粗细,无论它们如何与像素网格对齐(请参阅规范的第 10.6.5 节)。
话虽如此,许多 PDF 查看器实际上并没有实现规范中给出的扫描转换规则。PDF 规范最初主要关注描述打印页面,其中像素要么完全是黑色,要么完全是白色(无论如何,对于大多数打印技术而言)。对于屏幕,大多数人更喜欢抗锯齿渲染,其中像素的变暗程度与覆盖面积成比例。在 Adobe Reader 中,您可以通过首选项设置中“页面显示”下的“平滑线条艺术”复选框在按规范渲染和抗锯齿渲染之间切换。然而,它比这更微妙,因为现在非常细的线条可能会消失,因此还有另一个复选框“增强细线”,它可以选择性地将规范的扫描转换规则重新切换回细线。除了 Adobe Reader,一些其他 PDF 查看器(例如 evince、sumatraPDF)仅使用抗锯齿算法,但它们仍然需要一些启发式方法来使细线可见,其他(例如 xpdf、okular)仅使用规范的扫描转换规则。
编辑并添加几点:
我应该提到零宽度线对“尽可能细”有一个特殊的设备相关的解释,所以最好避免使用它们。
还有另一种很少出现的舍入原因:PDF 中的坐标存储为浮点数的文本表示,截断为小数点后一定位数,例如“10.124”。您可以使用 调整 pdfTeX 中的位数
\pdfdecimaldigits
(在我的 miktex 安装中默认等于 3)。在通常情况下,当距离以 pt 为单位时,截断为 3 位数字对应于舍入到大约 66sp。似乎ps2pdf
默认情况下会舍入到 2 位数字,但可以使用选项进行更改-r
,例如-r10000
(要求 10000dpi 分辨率)将给出具有 5 位小数的 PDF。似乎dvipdfm
默认情况下使用 2 位数字,但可以使用-d
命令行选项进行更改。显然,包含更多数字会使 PDF 文件大小(稍微)更大。
dvips
-D
将对设置分辨率选项给出的值进行四舍五入。dvips -Ppdf
将设置-D8000
为 8000dpi,或四舍五入到最接近的约 600sp。在我的安装中,没有任何特殊选项,dvips
默认为 600dpi 或 8000sp。(在问题给出的示例中,这足够粗糙,导致大约 8 个相邻段具有相同的厚度)。
编辑2:影响问题中给出的示例的最后一个复杂因素:如何\rule
在pdf中表示TeX?有2个选项:作为描边线或填充矩形。dvips
没有任何特殊选项将使用矩形(因为这最适合某些旧的PostScript引擎,例如LaserJet III打印机)。dvips -Ppdf
将使用线条(因为它会加载alt-rule.pro
),这对PDF效果更好,至少对于细规则而言。pdftex
将使用线条来表示窄于1bp的规则,使用矩形来表示较大的规则。dvipdfm
使用线条。 比较问题示例中制作PDF的各种不同方式的结果很有趣:如果仔细查看不同pdf查看器中的某些缩放级别,肯定会有明显的差异。