![TikZ 剪辑是否会删除不可见元素以减小输出 PDF 的大小?](https://linux22.com/image/316533/TikZ%20%E5%89%AA%E8%BE%91%E6%98%AF%E5%90%A6%E4%BC%9A%E5%88%A0%E9%99%A4%E4%B8%8D%E5%8F%AF%E8%A7%81%E5%85%83%E7%B4%A0%E4%BB%A5%E5%87%8F%E5%B0%8F%E8%BE%93%E5%87%BA%20PDF%20%E7%9A%84%E5%A4%A7%E5%B0%8F%EF%BC%9F.png)
考虑以下代码
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\clip (1,1) rectangle (9,9);
\foreach \x in {0,...,10}
\foreach \y in {0,...,10}
{ \draw (\x,\y) circle (1mm); }
\end{tikzpicture}
\end{document}
使用 pdfLaTeX 编译后,PDF 文件大小为 15 KB。现在让我们更改圆圈的数量(新圆圈位于剪辑区域之外):
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\clip (1,1) rectangle (9,9);
\foreach \x in {0,...,50}
\foreach \y in {0,...,50}
{ \draw (\x,\y) circle (1mm); }
\end{tikzpicture}
\end{document}
这将生成一个占用 139 KB 的 PDF。所以问题是
问:该命令对剪辑区域外的内容做了什么clip
?上面的实验表明,所有的圆圈实际上都在那里,但其中一些是不可见的。剪辑是在 PDF 查看器端还是在编译器端进行的?有没有办法通过 TikZ 优化结果?如果没有,应该怎么做?
答案1
如果你的问题是关于 Ti钾Z 本身,那么这是一个简单的测试
\documentclass{article}
\usepackage{tikz}
\begin{document}
\message{^^J^^J break point A ^^J^^J}
\tracingmacros1
\begin{tikzpicture}
\path(0,0)(10,10);
\clip(1,1)rectangle(9,9);
\foreach\x in{0,...,10}
\foreach\y in{0,...,10}
\path(\x,\y);
\end{tikzpicture}
\tracingmacros0
\message{^^J^^J break point B ^^J^^J}
\tracingmacros1
\begin{tikzpicture}
\path(0,0)(10,10);
\clip(4,4)rectangle(6,6);
\foreach\x in{0,...,10}
\foreach\y in{0,...,10}
\path(\x,\y);
\end{tikzpicture}
\tracingmacros0
\message{^^J^^J break point C ^^J^^J}
\end{document}
我最终得到了一个 347858 行的日志文件。然后我比较了这两部分,发现唯一的区别在于剪切路径本身,而不是后面的内容。所以我们可以得出结论 Ti钾Z 不做任何削波减少。其他底部驱动器能进行优化。(他们可能会也可能不会,您可以在评论中看到不同的结果)
为了更清楚地解释,\clip
内部 Ti钾Z 首先等同于\path[clip]
,然后转换为编码路径,后跟操作员(例如\pgfusepath{clip}
或W
)。Ti钾然后 Z 把这些东西运出去,忘掉它。一般来说,我们不能指望 Ti钾Z 利用其较差的算法进行优化。