У меня возникли проблемы с пониманием того, как мне следует объединять (или не объединять) s, обрезку и наложение, когда в одну среду включено pic
более одного экземпляра a .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 (или клипы, или слои); - это связано с известными ошибками
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}