単一の環境にpic
のインスタンスが複数含まれている場合に、 、クリッピング、およびレイヤーをどのように組み合わせればよいのか (または組み合わせてはいけないのか) がわかりません。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}
生産する
明らかに、物事はうまくいっていないようです。1つのインスタンスのクリッピングが、my thing
2番目のインスタンスのクリッピングに何らかの影響を与えているのではないかと思います。しかし、それが
- 私は何か間違ったことをしているのですが、もしそうなら、それは何なのでしょうか。
pic
s (またはクリップやレイヤー) を誤って使用しています。pic
これはsの既知のバグに関連しています。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}