在 TikZ 中使用不透明度会使整个页面在打印时变得“更粗糙”

在 TikZ 中使用不透明度会使整个页面在打印时变得“更粗糙”

在我的文档中,一些图形使用了opacity。在 PDF 查看器中,一切看起来都很好,但是当我打印文档时,出现这些图形的页面变得更加“粗糙”;文本看起来更暗,不那么平滑。

这是可以在 TikZ 或 LaTeX 中修复的问题吗,或者与打印机有关?

编辑: 虽然我还没有验证这个例子(目前无法访问打印机),但我相信这会产生相同的结果:

\documentclass[a4paper, 11pt]{article}

\usepackage[T1]{fontenc}
\usepackage[fulloldstylenums]{kpfonts}
\usepackage{microtype}
\usepackage{lipsum}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
  \node [%
    draw,
    rectangle,
    fill=black,
    minimum size=5cm,
    opacity=0.5,
  ] {};
  \draw [semithick] (6cm, 0cm) -- (8cm, -2cm);
\end{tikzpicture}
\lipsum[5]
\end{document}

具有不透明度:

With opacity

无不透明度:

Without opacity

正如我所说,它不会好像有区别,但打印时不透明度应该显得“更粗糙”:文本不那么平滑,对角线会变得更粗。同样,我还没有能够验证这个确切的例子(我最感兴趣的是在我打印文档的打印机上测试它,它位于我的工作地点)。

答案1

透明效果是 PDF(≥ 1.4)的一个相对较新的功能,许多打印机尚未“开箱即用”地支持该功能(基本上,这需要 PostScript Level 3 RIP 和附加 PDF 1.4 扩展)。因此,打印系统(打印机驱动程序)必须通过将对象栅格化为普通 CMYK 对象来“扁平化”透明效果,然后再将其发送到打印机。

栅格化通常按页面进行:将整个页面栅格化为位图,然后发送到打印机。这也会影响页面的其他内容,导致文本出现“粗糙外观”。

(注意:效果可能与声称支持 PostScript Level 3 和 PDF 1.4 的打印机相同,但在打印机内部执行类似的转换。必须真正检查实际的打印机。)

解决方法

解决方法是展平 PDF 图形中的透明效果将它们嵌入到文档中,这样打印机驱动程序就没有必要对整个页面进行栅格化。Adobe 提供了一个白皮书提供一些背景信息以及如何使用他们的产品实现这一点。我的方法是使用 ghostscript 将相应的图像转换为 PDF 1.3:

ps2pdf13 image.pdf image-13.pdf 

不幸的是,ghostscript 也只是将页面栅格化,因此图像中的字体仍然会呈现“粗糙的外观”,并且其文本在生成的图像中不再可选。(这也是在打印之前无法将整个文档转换为 PDF 1.3 的原因。也许 Adob​​e 工具在这方面做得更好。)

您需要将图形分成单独的 PDF,因此必须将 TikZ 图像编译成 PDF 并包含在内\includegraphics。Martin Scharrer 的standalone课程可能对此有所帮助。

TikZ 的无缝集成

通过(误用)TikZ,也可以无缝地与 PDF1.3 进行转换外部化库PGF 手册 2.1,第 343 页)。简而言之,“这个库为 TikZ 图片提供了高级自动或半自动导出功能。其目的是将每张图片转换为单独的 pdf,而无需更改文档本身。”

好消息是,这个转换过程可以很容易地自定义(感谢 Andrew Stacey 提供的提示!),使用密钥将其设置为任意命令序列external/system call。无论最终从该过程中得到的 PDF 是什么,都会被使用。

要找出特定打印机的最佳命令序列,也可以使用默认external/system call设置并手动操作生成的图形 PDF(通常名称类似\jobname-figureXXX.pdf)。然后它将在下一次编译中使用(而不是覆盖)pdflatex

以下 MWE 还演示了如何使用 和 启用和禁用隐式光栅化\tikzexternalizeenable\tikzexternalizedisable它必须使用-shell-escape给出的选项进行编译pdflatex

\documentclass[a4paper, 11pt]{article}

\usepackage[T1]{fontenc}
\usepackage[fulloldstylenums]{kpfonts}
\usepackage{microtype}
\usepackage{lipsum}
\usepackage{tikz}

% setup externalization
\usetikzlibrary{external}
\tikzexternalize
\tikzexternaldisable
\tikzset{external/system call={%
  pdflatex \tikzexternalcheckshellescape -halt-on-error -interaction=batchmode -jobname "\image" "\texsource"; 
  ps2pdf13 "\image".pdf "\image-13".pdf && cp "\image-13".pdf "\image".pdf}}

\begin{document}

% figure uses opacity, enable rasterizing through externalization
% (in the resulting PDF this is observable by the nonselectable node text)
\tikzexternalenable 
\begin{tikzpicture}
  \node [%
    draw, rectangle, fill=black,
    minimum size=5cm, text width=5cm,
    opacity=0.5,
    text=white,
  ] {Nonselectable Text:\\Figure has been rasterized};
  \draw [semithick] (6cm, 0cm) -- (8cm, -2cm);
\end{tikzpicture}
\tikzexternaldisable % back to default

\lipsum[5]

\begin{tikzpicture}
  \node [%
    draw=black!50, rectangle, fill=black!50,
    minimum size=5cm, text width=5cm,
    text=white,
  ] {Selectable Text:\\Figure has not been rasterized};
  \draw [semithick] (6cm, 0cm) -- (8cm, -2cm);
\end{tikzpicture}
\end{document}

我手边没有打印机来测试结果。但是,打印此页应该不是导致文本“外观粗糙”(当然,没有光栅化的图形):

Result

答案2

这只是一个猜测,但如果它是彩色打印机,根据我自己遇到的类似问题(在非 LaTeX 环境中),区别可能是纯黑色与浓黑色. 使用 CYMK 墨水的打印机将使用(“真”)黑色墨水打印大面积黑白区域(例如文本块),但会将使用颜色的区域(例如图表)中的黑色部分混合在一起,从而产生“浓”黑色。有时打印机会逐页进行这种更改,因此,即使是单色页面上的一点点颜色也会导致整页打印成彩色。有时,即使是像您这里的灰色区域(同样可以用较浅的黑色墨水打印)也会触发它。如果您的整个页面(包括文本)都以“浓”黑色打印,它看起来肯定会比用真正的黑色墨水打印的页面更粗糙,因为所有精细的部分都必须用不同的墨水打印几次,而这些墨水不会完美重叠。

如果我的假设正确,这与不透明度无关本身,而使用彩色方块,例如,,则可获得相同的结果fill=red。在这种情况下,您可以通过在打印机设置中明确选择“黑白”来解决问题(即关闭 CYM 墨水的使用)。

这篇文章对于这个网站来说已经变得相当 OT...如果它不能解决你的问题,我可能会删除它!

答案3

我刚刚遇到了同样的问题。如果你的图形不是太复杂,你也可以通过更改显示内容的顺序来解决这个问题(想想“发送到后面”选项),这样你就可以模拟透明度。所以在你的例子中,不要使用不透明度选项,而是用

fill = black!50

即 50% 黑色,并确保将矩形放在您想要出现在其上方的任何东西之前(即后面)。

相关内容