(严格来说,这是一个关于 XeLaTeX 和软件包的问题xcolor
,但我认为问题实际上出在 PDF 的颜色模型上。)
我遇到了 PDF 中颜色不匹配的问题。例如,我截取了一个颜色值作为 RGB,在我的文档中声明它,但结果颜色完全不同。举例来说:
两种颜色都是从屏幕上截取的——左侧是从 XeLaTeX 生成的 PDF 中截取的。右侧是原始颜色,我在 LaTeX 中尝试使用了其 RGB 值(以防我的问题不清楚:上面的颜色不同,但它们具有相同的 HSB 值)。
因此,我认为 RGB 可能无法毫无损失地映射到 PDF 使用的任何颜色模型,并尝试了显而易见的替代方案 - CMYK,毕竟,它经常用于印刷(对吧?)。同样,颜色偏离了,但现在不那么明显了。
另一个例子(这次使用 CMYK 值):
该颜色应该具有 CMYK 值 (0.94、0.63、0.04、0.07)。我在代码中声明了颜色,如下所示:
\definecolor{primary}{cmyk}{0.94,0.63,0.04,0.07}
图片的下半部分由 TikZ 创建。上半部分实际上是我通过 包含的 EPS。EPSincludegraphics
是在 Inkscape 中创建的。使用颜色选择器检查时,上述两种颜色都没有正确的 CMYK 值:
顶部是 (0.96, 0.67, 0.08, 0.19)。底部是 (0.92, 0.61, 0.06, 0.09)。
(顺便说一句,当我尝试在 Inkscape 中输入“正确的” CMYK 值时,它会“自动更正”我的值到其他值。怎么回事?)
现在,这似乎根本不是一个与 TeX 相关的问题。但长话短说,
如何可靠地重现 pdfLaTeX/XeLaTeX 中的颜色?
我知道这个问题是由于 PNG(即上述屏幕截图的格式)使用自己的颜色模型而造成的,因此屏幕截图在您的电脑上看起来可能与在我的电脑上不同。但由于我将颜色粘贴到同一张图片中,我认为不同之处应该被保留。
答案1
PDF 的颜色模型非常复杂,而且非常灵活。您可以在 PDF 规范的第 8.6 节中阅读有关它的所有信息(您可以下载它这里)。有许多印前工具可用于管理 PDF 的色彩空间工作流程。Adobe Acrobat Professional 有一个“输出预览”工具,我就是使用它的。
PDF 支持多种颜色空间:灰色、cmyk、rgb、索引、LAB、deviceN。这允许使用专色(及其色调)、特殊金属或清漆油墨、6 色印刷、双色调、多色调、套准色等。您可以在同一个 PDF 中使用多个这样的颜色空间(尽管对于打印,您需要至少将每个页面转换为某个公共空间)。同一颜色空间系列甚至可以有多个变体(例如 sRGB 和扫描仪或数码相机使用的 RGB 变体;具有不同网点增益的 cmyk 等)。
当涉及透明度时,情况会变得更加复杂(请参阅规范的第 11.7 节):为了将一个对象叠加在另一个对象上,PDF 查看器需要将它们转换为通用的“混合”颜色空间,该空间可以在 PDF 中以各种方式指定(包括在“页面组”级别:这解释了为什么在页面上包含透明度可以改变该页面上其他对象的外观,因为这些对象现在必须经过颜色空间转换)。存在各种限制和特殊情况,例如设备颜色无法可靠地转换为基于 CIE 的空间(例如 sRGB)。由于透明度组可以嵌套,因此在渲染过程中可能会有多轮颜色空间转换。
TeX 支持
现在通过 获得 latex 支持xcolor
:如果您xcolor
使用(默认)natural
选项加载,则不会进行颜色空间转换,并且您将可以访问 PDF“DeviceRGB”、“DeviceCMYK”和“DeviceGray”空间。例如,\textcolor[rgb]{1,0,0}{DeviceRGB red}
和\textcolor[cmyk]{0,1,1,0}{DeviceCMYK Red}
。您的 PDF 查看器(用于屏幕)或您的打印机驱动程序(用于硬拷贝)将不得不在必要时转换颜色空间。如果您使用类似或xcolor
的选项加载,则将使用 xcolor 手册第 6.3 节中的公式转换为该颜色空间(这些公式不是很复杂 - 将它们与 PDF 规范 10.3 中的公式进行比较,使用 BG(k) 和 UCR(k) 函数等)。rgb
cmyk
xcolor
如果您使用该dvips
路径生成 PDF,那么您可能还可以使用named
和ps
模型访问专色和其他颜色空间。我相信 Context 会让这些事情变得更容易一些,但我并不是根据经验说的。
请记住,将设备色彩空间转换为屏幕色彩空间通常没有明确定义,并且不同的查看者可能会略有不同,从而导致您观察到的不匹配。
pdflatex 的一个好的解决方案是仅使用 deviceRGB(用于屏幕)或 deviceCMYK(用于大多数打印机),然后设置“输出意图”以将设备空间定义为 sRGB IEC61966-2.1。请参阅 PDF 规范的第 14.11.5 节。例如,该pdfx
包可以做到这一点(尽管该包的边缘相当粗糙,您通常需要直接编辑它才能使其工作)。使用校准颜色空间的更“正确”的方法是“默认颜色空间”机制(第 8.6.5.6 节),它指定了一种将 DeviceRGB、DeviceCMYK、DeviceGray 重新映射到与设备无关的基于 CIE 的颜色空间的方法。不过,我不知道有任何 latex 包利用了这个 PDF1.1 功能。(通过源文件进行 Grepping 表明 Context 可能再次对此有所支持)。
不同颜色样本的情况
在第一对图像中,请注意左图右上角有一个灰色三角形。这表示它是屏幕截图中的设备 RGB 颜色。单击“HSB 滑块”指示器左侧的图标,并选择右侧色板的颜色空间,然后您会看到颜色将匹配。
Inkscape“自动校正”CMYK 的情况
也许本文将会有所帮助。
答案2
2020-05-21 更新:我关于 Evince 渲染 pdf 太亮的评论并不正确。详情请参阅评论部分。
扩展 Lev Bishop 的以下评论:
请记住,将设备色彩空间转换为屏幕色彩空间通常没有明确定义,并且不同的查看者可能会略有不同,从而导致您观察到的不匹配。
我注意到 pdf 查看器 Evince 无法按规定呈现颜色。例如,以下带有灰度框的文档:
\documentclass[10pt]{article}
\usepackage[pdftex,rgb]{xcolor}
\definecolor{gray0}{gray}{0}
\definecolor{gray2}{gray}{0.2}
\definecolor{gray5}{gray}{0.5}
\definecolor{gray8}{gray}{0.8}
\definecolor{gray10}{gray}{1}
\begin{document}
%Draw grayscale boxes
\frame{\color{gray0}\rule{2cm}{2cm}}
\frame{\color{gray2}\rule{2cm}{2cm}}
\frame{\color{gray5}\rule{2cm}{2cm}}
\frame{\color{gray8}\rule{2cm}{2cm}}
\frame{\color{gray10}\rule{2cm}{2cm}}
\end{document}
使用 Evince 打开 pdf 并使用 Gpick 选择,结果为:
0.09(实际上,黑色文本没有像 rgb(0, 0, 0) 那样呈现为真黑色)
0.27
0.54
0.81
0.99
截取 pdf 的屏幕截图,用 Gnome 的图像查看器打开:选取的颜色与 Latex 文档中指定的颜色相匹配。
使用 Adobe Reader 打开 pdf 并使用 Photoshop(在 Windows 上)进行选择:挑选的颜色与 Latex 文档中指定的颜色相匹配。
在 Evince 中打开用 LibreOffice 生成的 pdf 文档并选择文本:0.09(同样,黑色文本不会像 rgb(0, 0, 0) 那样呈现为真黑色)
结论:Evince 或其 pdf 后端 Poppler 未按指定方式呈现颜色。
不幸的是,渲染不一致似乎是所有 pdf 查看器的一部分:
https://srg.doc.ic.ac.uk/projects/pdf-errors/results.html
https://link.springer.com/article/10.1007/s10664-018-9600-2
对于感兴趣的人,可以查看 Evince 如何渲染颜色的详细信息:
绘制指定灰色与拾取灰色的图(使用 wolframalpha.com):
Plot[{0, 0.09}, {0.2,0.27}, {0.5,0.54}, {0.8,0.81}, {1,0.99}]
通过数据集拟合曲线:
Fit[{0, 0.09}, {0.2,0.27}, {0.5,0.54}, {0.8,0.81}, {1,0.99}]
线性近似非常接近:grayEvince = 0.9*graySpecified + 0.09
结论:Evince(或 Poppler)特别会将深色渲染得太亮。它将范围 [最暗,最亮] 映射到 [0.09,0.99] 而不是 [0,1]
最后请求:有人能在另一个基于 Poppler 的 PDF 查看器中使用 Gpick 选择黑色吗?这样我们就可以确定渲染问题出在 Evince 还是 Poppler 上。