Como compartilhar opções selecionadas entre diferentes nós no TikZ?

Como compartilhar opções selecionadas entre diferentes nós no TikZ?

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

nós empilhados

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 rotateopçã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 rotateo nó adicional, então defini um groundestilo 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 grounde rotate. Uma solução melhor seria definir um novo estilo que incluísse ambos, isto é o que groundedfaz:

    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}

insira a descrição da imagem aqui

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}

informação relacionada