(Я не нашел лучшего названия для вопроса. Предложения приветствуются.)
Я создал несколько новых фигур в TikZ и хотел бы поместить одну из них под другую, когда определенный ключ передается в этот последний узел. Я лучше покажу, что я имею в виду, на примере с использованием двух прямоугольников:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{patterns,calc}
\tikzstyle{ground}=[append after command={;\node[draw=red,rectangle,anchor=north] (B) at (\tikzlastnode.south){a}}]
\begin{document}
\begin{tikzpicture}
\node[draw,rectangle,ground,rotate=10] (A) at (0,0){a};% not good
\begin{scope}[shift={(1,0)}]
\node[draw,rectangle,rotate=10] (B) at (0,0){a};
\node[draw=red,rectangle,anchor=north,rotate=10] (C) at (B.south){a};% OK
\end{scope}
\end{tikzpicture}
\end{document}
Как видите, я создал стиль, который добавляет к первому узлу создание второго, ссылаясь на него правильно. Все работает отлично, но если мне нужно, например, повернуть обе фигуры вместе, я не могу найти решение, потому что поворачивается только первый прямоугольник (влево). Единственный способ, которым я добился желаемого результата, был тот, который показан в коде, где мне пришлось вручную нарисовать второй узел и передать ему опцию rotate
.
Итак, есть способ достичь желаемого результата (справа), но используя синтаксис первого примера (слева)? Обратите внимание, что обе реальные задействованные формы были нарисованы мной, поэтому, если их нужно настроить, это нормально.
решение1
Если вы знаете, какие параметры повлияют на дополнительный узел, вы можете включить их в .style
. Вот вам пример на основе вашего кода. Я не знаю, подойдет ли он для вашей реальной проблемы.
В вашем примере вам нужен rotate
дополнительный узел, поэтому я определил ground
стиль, который включает этот параметр со значением по умолчанию 0.
ground/.style={%
append after command={;%
\node[draw=red,rectangle,
anchor=north,rotate=#1] (B)
at (\tikzlastnode.south){a}}},
ground/.default=0,
Теперь можно писать \node[draw,rectangle,ground=10,rotate=10] (A) at (0,0){a};
, но таким образом вы должны быть уверены, что пишете одно и то же значение в ground
и rotate
. Лучшим решением было бы определить новый стиль, который включает их оба, вот что grounded
делает:
grounded/.style={ground=#1,rotate=#1},
grounded/.default=0}
А полный код такой:
\documentclass[tikz,border=1mm]{standalone}
\tikzset{%
ground/.style={%
append after command={;%
\node[draw=red,rectangle,
anchor=north,rotate=#1] (B)
at (\tikzlastnode.south){a}}},
ground/.default=0,
grounded/.style={ground=#1,rotate=#1},
grounded/.default=0}
\begin{document}
\begin{tikzpicture}
\node[draw,rectangle,ground=10,rotate=10] (A) at (0,0){a};
\node[draw,rectangle,grounded] (A) at (0.5,0){a};
\node[draw,rectangle,grounded=25] (A) at (1,0){a};
\node[draw,rectangle,grounded=-25] (A) at (1.5,0){a};
\end{tikzpicture}
\end{document}
И, пожалуйста, взгляните на:Следует ли использовать \tikzset или \tikzstyle для определения стилей TikZ?
решение2
попробуйте это, с областью действия и трансформацией формы
\begin{scope}[shift={(2,0)},rotate=10,transform shape]
\node[draw,rectangle,ground,] (A) at (0,0){a};% not good
\end{scope}