(Mir ist kein besserer Titel für die Frage eingefallen. Vorschläge sind willkommen.)
Ich habe in TikZ einige neue Formen erstellt und möchte eine davon unter einer anderen platzieren, wenn diesem letzten Knoten ein bestimmter Schlüssel übergeben wird. Ich zeige anhand eines Beispiels mit zwei Rechtecken besser, was ich meine:
\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}
Wie Sie sehen, habe ich einen Stil erstellt, der die Erstellung des zweiten Knotens an den ersten Knoten anfügt und sich korrekt darauf bezieht. Alles funktioniert einwandfrei, aber wenn ich beispielsweise beide Formen zusammen drehen muss, kann ich keine Lösung finden, da nur das erste Rechteck gedreht wird (nach links). Ich habe das gewünschte Ergebnis nur auf die im Code gezeigte Weise erreicht, bei der ich den zweiten Knoten manuell zeichnen und ihm die rotate
Option übergeben musste.
Es gibt also eine Möglichkeit, das gewünschte Ergebnis (rechts) zu erzielen, aber mit der Syntax des ersten Beispiels (links)? Beachten Sie, dass beide beteiligten realen Formen von mir gezeichnet wurden. Wenn sie also angepasst werden müssen, ist das in Ordnung.
Antwort1
Wenn Sie wissen, welche Parameter den zusätzlichen Knoten beeinflussen, können Sie sie in das einfügen .style
. Hier haben Sie ein Beispiel basierend auf Ihrem Code. Ich weiß nicht, ob es für Ihr eigentliches Problem hilfreich ist.
In Ihrem Beispiel möchten Sie rotate
den zusätzlichen Knoten, daher habe ich einen ground
Stil definiert, der diesen Parameter mit 0 als Standardwert enthält.
ground/.style={%
append after command={;%
\node[draw=red,rectangle,
anchor=north,rotate=#1] (B)
at (\tikzlastnode.south){a}}},
ground/.default=0,
Jetzt ist es möglich, zu schreiben \node[draw,rectangle,ground=10,rotate=10] (A) at (0,0){a};
, aber auf diese Weise müssen Sie sicherstellen, dass Sie in ground
und denselben Wert schreiben rotate
. Eine bessere Lösung wäre, einen neuen Stil zu definieren, der beide einschließt. Dies ist, was grounded
passiert:
grounded/.style={ground=#1,rotate=#1},
grounded/.default=0}
Und der vollständige Code lautet:
\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}
Und schauen Sie sich bitte an:Sollten \tikzset oder \tikzstyle zum Definieren von TikZ-Stilen verwendet werden?
Antwort2
Versuchen Sie dies mit Umfang und Form transformieren
\begin{scope}[shift={(2,0)},rotate=10,transform shape]
\node[draw,rectangle,ground,] (A) at (0,0){a};% not good
\end{scope}