Problemas ao combinar clipe, camada e foto quando múltiplas instâncias são incluídas no mesmo tikzpicture

Problemas ao combinar clipe, camada e foto quando múltiplas instâncias são incluídas no mesmo tikzpicture

Estou tendo problemas para descobrir como devo combinar (ou se não devo combinar) pics, recortes e camadas quando mais de uma instância de a picestá incluída em um único tikzpictureambiente.

Por exemplo:

\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}

produz

recortes problemáticos

É evidente que as coisas não estão funcionando muito bem. Presumo que o recorte de uma instância my thingesteja afetando de alguma forma o recorte na segunda instância. Mas não tenho certeza se é porque

  1. Estou fazendo algo errado e, se sim, o que;
  2. Estou fazendo mau uso picde s (ou clipes ou camadas);
  3. isso está relacionado aos bugs conhecidos do pics;
  4. isso está relacionado a outro bug no pics;
  5. algo que ainda não pensei.

Se for 1 ou 2, então:

  • Estou cometendo um erro e, em caso afirmativo, qual? Estou fazendo mau uso de alguma coisa e, em caso afirmativo, o quê, como e por quê?

Se for 3 ou 4, então:

  • Oh céus. Existe uma solução alternativa e, se houver, o que é?

Se 5, então:

  • Por favor, você poderia explicar isso?

Observe que obviamente o recorte e as camadas e assim por diante são gratuitos. No entanto, meu caso de uso real me levou a produzir gatos que lembram inesperadamente a variedade Cheshire de Carroll:

gatos parciais

Então você pode ver que o problema é da maior gravidade...

sorriso de gato?

Responder1

Acho que o problema é a ordem em que o escopo é configurado e a camada muda para a camada de fundo (embora não tenha certeza dos detalhes de baixo nível).

Ao usar a on background layerchave o escopo é configurado e a camada alterada. O que é necessário é o inverso: a camada mudou e depois o escopo foi configurado. Isso pode ser um bug, a menos que haja alguma advertência escondida em algum lugar na documentação, mas no primeiro caso, o recorte parece permanecer ativo na camada de fundo.

A solução é adicionar um escopo extra dentro do outro escopo com a on background layeropção ou alterar explicitamente a camada e adicionar o escopo dentro, que é o que fiz abaixo.

Para maior clareza, também mostro as caixas delimitadoras da região de recorte.

\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}

insira a descrição da imagem aqui

informação relacionada