同じ tikzpicture に複数のインスタンスが含まれている場合、クリップ、レイヤー、および画像を結合するときに問題が発生する

同じ tikzpicture に複数のインスタンスが含まれている場合、クリップ、レイヤー、および画像を結合するときに問題が発生する

単一の環境にpicのインスタンスが複数含まれている場合に、 、クリッピング、およびレイヤーをどのように組み合わせればよいのか (または組み合わせてはいけないのか) がわかりません。pictikzpicture

例えば:

\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 thing2番目のインスタンスのクリッピングに何らかの影響を与えているのではないかと思います。しかし、それが

  1. 私は何か間違ったことをしているのですが、もしそうなら、それは何なのでしょうか。
  2. pics (またはクリップやレイヤー) を誤って使用しています。
  3. picこれはsの既知のバグに関連しています。
  4. picこれはsの別のバグに関連しています。
  5. まだ考えていないこと。

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}

ここに画像の説明を入力してください

関連情報