¿Cómo compartir opciones seleccionadas entre diferentes nodos en TikZ?

¿Cómo compartir opciones seleccionadas entre diferentes nodos en TikZ?

(No encontré un título mejor para la pregunta. Se aceptan sugerencias).

He creado algunas formas nuevas en TikZ y me gustaría poner una de ellas debajo de otra cuando se pasa una determinada clave a este último nodo. Mostraré mejor lo que quiero decir con un ejemplo usando dos rectá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}

nodos apilados

Como puede ver, he creado un estilo que agrega al primer nodo la creación del segundo que se refiere a él correctamente. Todo funciona bien, pero si necesito, por ejemplo, rotar ambas formas juntas, no puedo encontrar una solución porque solo se rota el primer rectángulo (izquierda). La única forma en que logré el resultado deseado ha sido la que se muestra en el código, donde tuve que dibujar manualmente el segundo nodo y pasarle la rotateopción.

Entonces, ¿hay alguna manera de lograr el resultado deseado (a la derecha) pero usando la sintaxis del primer ejemplo (a la izquierda)? Tenga en cuenta que las dos formas reales involucradas las dibujé yo, por lo que si es necesario personalizarlas, está bien.

Respuesta1

Si sabe qué parámetros afectarán al nodo adicional, puede incluirlos en el archivo .style. Aquí tienes un ejemplo basado en tu código. No sé si te servirá para tu problema real.

En su ejemplo desea rotateel nodo adicional, por lo que definí un groundestilo que incluye este parámetro con 0 como valor predeterminado.

    ground/.style={%
       append after command={;%
          \node[draw=red,rectangle,
             anchor=north,rotate=#1] (B) 
             at (\tikzlastnode.south){a}}},
    ground/.default=0,

Ahora es posible escribir \node[draw,rectangle,ground=10,rotate=10] (A) at (0,0){a};pero de esta manera debes asegurarte de escribir el mismo valor en groundy rotate. Una mejor solución sería definir un nuevo estilo que los incluya a ambos, esto es lo que groundedhace:

    grounded/.style={ground=#1,rotate=#1},
    grounded/.default=0}

Y el código completo es:

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

ingrese la descripción de la imagen aquí

Y, por favor, echa un vistazo a:¿Debería usarse \tikzset o \tikzstyle para definir los estilos de TikZ?

Respuesta2

prueba esto, con alcance y transforma la forma.

  \begin{scope}[shift={(2,0)},rotate=10,transform shape]
  \node[draw,rectangle,ground,] (A) at (0,0){a};% not good
  \end{scope}

información relacionada