(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}
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 rotate
opció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 rotate
el nodo adicional, por lo que definí un ground
estilo 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 ground
y rotate
. Una mejor solución sería definir un nuevo estilo que los incluya a ambos, esto es lo que grounded
hace:
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}
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}