当单个环境中包含pic
多个实例时,我无法弄清楚应该如何组合(或者不应该组合) s、剪辑和分层。pic
tikzpicture
例如:
\documentclass[tikz, border=5pt]{standalone}
\usetikzlibrary{backgrounds}
\makeatletter
\tikzset{%
my thing/.pic={
\draw [line width=2.5pt, gray] (0,10pt) coordinate (c1) [out=45, in=135] to +(1,2) coordinate (c2);
\begin{scope}[on background layer]
\clip (0,5) rectangle (5,-5);
\draw [orange, line width=2.5pt] (-2,0) -| (c2) -| (2,-2);
\end{scope}
},
}
\makeatother
\begin{document}
\begin{tikzpicture}
\pic {my thing};
\pic at (3,3) {my thing};
\end{tikzpicture}
\end{document}
生产
显然事情不太对劲。我猜想一个实例的剪辑在my thing
某种程度上影响了第二个实例的剪辑。但我不确定是不是因为
- 我做错了什么,如果是的话该怎么办?
- 我误用了
pic
s (或剪辑或图层); - 这与 s 的已知错误有关
pic
; pic
这与s中的另一个错误有关;- 我还没想到的事情。
如果为 1 或 2,则:
- 我是否犯了错误?如果是,是什么错误?我是否误用了某些东西?如果是,是什么错误?如何错误?为什么错误?
如果是 3 或 4,则:
- 哦天哪。有解决方法吗?如果有,是什么?
如果为 5,则:
- 您能解释一下吗?
请注意,上面的剪裁和分层等显然是不必要的。然而,我的真实用例让我制作出了出乎意料地让人想起卡罗尔的柴郡猫品种的猫:
所以你可以看出这个问题是极其严重的问题之一……
答案1
我认为问题在于范围的设置顺序以及图层更改为背景图层的顺序(尽管我不确定低级细节)。
使用键时on background layer
,范围已设置,图层已更改。需要的是相反的操作:图层已更改,然后范围已设置。这可能是一个错误,除非文档中隐藏了一些警告,但在第一种情况下,剪辑似乎在背景层上保持活动状态。
解决方案是使用该选项在另一个范围内添加额外的范围on background layer
,或者明确更改层并在里面添加范围,这就是我下面所做的。
为了清楚起见,我还展示了剪辑区域的边界框。
\documentclass[tikz, border=5pt]{standalone}
\usetikzlibrary{backgrounds}
\makeatletter
\tikzset{%
my thing/.pic={
\draw [line width=2.5pt, gray] (0,10pt) coordinate (c1) [out=45, in=135] to +(1,2) coordinate (c2);
\begin{pgfonlayer}{background}
\begin{scope}
\clip [preaction=draw] (0,5) rectangle (5,-5);
\draw [orange, line width=2.5pt] (-2,0) -| (c2) -| (2,-2);
\end{scope}
\end{pgfonlayer}
},
}
\makeatother
\begin{document}
\begin{tikzpicture}
\pic {my thing};
\pic at (3,3) {my thing};
\end{tikzpicture}
\end{document}