Estou tendo problemas para descobrir como devo combinar (ou se não devo combinar) pic
s, recortes e camadas quando mais de uma instância de a pic
está incluída em um único tikzpicture
ambiente.
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
É evidente que as coisas não estão funcionando muito bem. Presumo que o recorte de uma instância my thing
esteja afetando de alguma forma o recorte na segunda instância. Mas não tenho certeza se é porque
- Estou fazendo algo errado e, se sim, o que;
- Estou fazendo mau uso
pic
de s (ou clipes ou camadas); - isso está relacionado aos bugs conhecidos do
pic
s; - isso está relacionado a outro bug no
pic
s; - 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:
Então você pode ver que o problema é da maior gravidade...
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 layer
chave 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 layer
opçã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}