(Não encontrei um título melhor para a pergunta. Sugestões são bem-vindas.)
Criei algumas novas formas no TikZ e gostaria de colocar uma delas abaixo da outra quando uma determinada chave for passada para este último nó. Mostrarei melhor o que quero dizer com um exemplo usando dois retângulos:
\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}
Como você pode ver, criei um estilo que anexa ao primeiro nó a criação do segundo referente a ele corretamente. Tudo funciona bem, mas, se eu precisar, por exemplo, girar as duas formas juntas, não consigo encontrar uma solução porque apenas o primeiro retângulo é girado (esquerda). A única forma de obter o resultado desejado foi aquela mostrada no código, onde tive que desenhar manualmente o segundo nó e passar para ele a rotate
opção.
Então, existe uma maneira de alcançar o resultado desejado (à direita) mas usando a sintaxe do primeiro exemplo (à esquerda)? Observe que ambas as formas reais envolvidas foram desenhadas por mim, então se precisarem ser customizadas está tudo bem.
Responder1
Se você souber quais parâmetros afetarão o nó adicional, poderá incluí-los no arquivo .style
. Aqui você tem um exemplo baseado em seu código. Não sei se servirá para o seu real problema.
No seu exemplo, você deseja rotate
o nó adicional, então defini um ground
estilo que inclui esse parâmetro com 0 como valor padrão.
ground/.style={%
append after command={;%
\node[draw=red,rectangle,
anchor=north,rotate=#1] (B)
at (\tikzlastnode.south){a}}},
ground/.default=0,
Agora é possível escrever \node[draw,rectangle,ground=10,rotate=10] (A) at (0,0){a};
, mas desta forma você deve ter certeza de escrever o mesmo valor em ground
e rotate
. Uma solução melhor seria definir um novo estilo que incluísse ambos, isto é o que grounded
faz:
grounded/.style={ground=#1,rotate=#1},
grounded/.default=0}
E o código completo é:
\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}
E, por favor, dê uma olhada em:Deve \tikzset ou \tikzstyle ser usado para definir estilos TikZ?
Responder2
tente isso, com escopo e forma de transformação
\begin{scope}[shift={(2,0)},rotate=10,transform shape]
\node[draw,rectangle,ground,] (A) at (0,0){a};% not good
\end{scope}