我写了一篇包含几张 TikZ 图片的论文,并将其提交给 Springer 期刊。当我收到他们根据我的源文件生成的 pdf 文件时,我感到非常震惊,因为它超过了 8 MiB - 而我自己的 pdf 只有 170 KiB。
首先,我将 pdf 剪切为单页,发现尺寸来自 TikZ 图片。
然后我意识到该期刊很可能使用 tex -> dvi -> ps -> pdf 工作流程,而我使用的是 pdflatex。因此,我以另一种方式编译了这篇论文,结果如下:dvi 文件为 655 KiB,ps(通过 dvips)为 625 KiB,但 pdf(通过 ps2pdf 或 ghostview)为 7.8 MiB。(细微的差异是由于期刊添加了标题页。)
有没有办法使用基于 dvips 的路线生成更合理大小的 pdf 文件?
我尝试\newcommand{\pgfsysdriver}{pgfsys-dvips.def}
在包含 tikz 之前添加,但没有任何反应。
我还尝试使用“外部”包创建 poscript 图形来生成图形的 eps 版本,但结果是相同的:对于其中一个图形,保存为 pdf 时为 12 KiB,保存为 ps 时为 183 KiB - 使用 epstopdf 可得到 183 KiB eps,然后得到 3.1 MiB(!) pdf。(如果我在 ghostview 中将 12 KiB pdf 转换为 eps,我会得到 1.5 MiB eps,然后使用 epstopdf 可得到 361 KiB pdf - 稍微好一点,但仍然很大。)
编辑:一个工作示例:
\documentclass{article}
\usepackage{tikz}
\tikzstyle{strat}=[text=white, circle, ball color=red, inner sep=3pt]
\tikzstyle{oper}=[text=white, rectangle, ball color=blue, inner sep=1.75pt, level distance=\lvlDist]
\newlength\lvlDist\setlength\lvlDist{12pt} % distance between levels
\begin{document}
\begin{figure}[tbp]
\centering
\begin{tikzpicture}[level distance=\lvlDist, grow=down, every node/.style={oper}]
\path[
level 1/.style={sibling distance=40mm},
level 6/.style={sibling distance=20mm},
level 7/.style={sibling distance=10mm},
level 12/.style={sibling distance=5mm},
level 13/.style={sibling distance=2mm}
]
node[strat](root){} child foreach \oPI in {1,...,2} {
node{} child { node{} child { node{} child {node{} child {
node{} child foreach \perI in {1,...,2} {
node[strat]{} child foreach \oPII in {1,...,2} {
node{} child { node{} child { node{} child { node{} child {
node{} child foreach \perII in {1,...,2} {
node[strat]{} child foreach \oPIII in {1,...,2} {
node{} child { node{} child { node{} child { node{} child {
node{}
}}}}}
}}}}}}
}}}}}
}
;
\end{tikzpicture}
\end{figure}
\end{document}
Pdflatex 生成 19 KiB pdf,而 latex + dvips + ps2pdf 生成 209 KiB dvi -> 197 KiB ps -> 2954 KiB pdf。
谢谢
答案1
图片中的阴影元素确实是问题所在。此外,我的第一个假设是将pgf
对象存储在 PDF Form XObjects 中并重复使用它们。事实并非如此。PDF 直接支持可以通过函数对象自定义的不同阴影类型。因此,pgf
通过定义函数来设置阴影操作,当放置阴影元素时,阴影操作仅会占用一些字节。
PostScript 也具有此功能,但它需要语言级别 3。pgf
不支持此功能,并且编写的代码没有该功能。这意味着,它必须使用更原始的绘图运算符手动编程着色,并且必须对每个着色元素一次又一次地重复此操作,因为 Form XObjects 也不可用。
为重复的对象定义一个过程可以节省空间。但这会占用打印机内存,并且对于不重复的对象效率低下。
如果您愿意冒险通过 PostScript 级别 3,那么请使用pgf
支持 PDF 着色功能的驱动程序将图片生成为 PDF,例如 pdfTeX。
然后你需要一个能够生成 PostScript 3 级的转换器和支持此语言级别的阴影功能。
pdftops
3.00(来自xpdf
)知道选项-level3
,但后者的要求失败并生成一个非常大的 PostScript 文件。AR7/Linux、AR8/Linux:
acroread -toPostScript -level 3 -pairs test.pdf test.ps
生成 PostScript 文件,其中阴影元素丢失。gs -sDEVICE=epswrite -dLanguageLevel=3 -dBATCH -dNOPAUSE -sOutputFile=test.eps test.pdf
由于同样的原因,9.05 版本也失败了。
如果您找到转换器,下一步就是检查图片是否打印在整张纸上,以及图片是否在边界框内。还需要测试重新转换。GhosScript 的某些版本是否支持该转换器?期刊使用哪种转换器?等等。
测试并找到支持 PostScript 阴影功能的程序会很有趣。但我认为这对于期刊和类似工作的工作流程来说有点冒险,因为您无法控制程序和使用的版本。