TikZ 剪辑是否会删除不可见元素以减小输出 PDF 的大小?

TikZ 剪辑是否会删除不可见元素以减小输出 PDF 的大小?

考虑以下代码

\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

如果你的问题是关于 TiZ 本身,那么这是一个简单的测试

\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 行的日志文件。然后我比较了这两部分,发现唯一的区别在于剪切路径本身,而不是后面的内容。所以我们可以得出结论 TiZ 不做任何削波减少。其他底部驱动器进行优化。(他们可能会也可能不会,您可以在评论中看到不同的结果)

为了更清楚地解释,\clip内部 TiZ 首先等同于\path[clip],然后转换为编码路径,后跟操作员(例如\pgfusepath{clip}W)。Ti然后 Z 把这些东西运出去,忘掉它。一般来说,我们不能指望 TiZ 利用其较差的算法进行优化。

相关内容