Ich erstelle einige Kontrolltheorie-Flussblätter, in TikZ
denen ich die Größe der Knotenbox angegeben habe. Da ich viele dieser Flussblätter erstelle, habe ich globale Stile für sie festgelegt, zum Beispiel den box
Stil, den ich derzeit verwende:
box/.style={rectangle, draw, minimum width = 8ex,
minimum height = 4ex, inner sep = 1ex}
Die Textmenge in den Knoten variiert. Das Problem ist, dass, wenn ein Knotentext mehr Platz beansprucht als minimum
, die restlichen Knoten in diesem Bild die gleiche Größe wie der größte Knoten beibehalten sollten. Wie kann ich das tun? Die Lösung indiese Frageist eines, das ich vermeiden möchte, da es meiner Meinung nach viel zu „manuell“ ist, ich brauche Automatisierung.
Ein MWE:
\documentclass[12pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\tikzset{
box/.style={rectangle, draw, minimum width = 8ex,
minimum height = 4ex, inner sep = 0},
split/.style={circle, draw, minimum size = 2.5pt, fill=black,
inner sep = 0},
}
\begin{document}
\begin{tikzpicture}[
every path/.style={>={stealth}, ->, draw, node distance = 1pt, inner sep = 0pt},
]
\node[split] (split) {};
\node[box] (I) at ($(split) + (4,0)$) {Short};
\node[box] (P) at ($(I)+(0,1)$) {This node has long node text};
\node[box] (D) at ($(I)+(0,-1)$) {Short};
\draw (split.north) |-(P);
\draw (split.east) -- (I) ;
\draw (split.south) |-(D);
\end{tikzpicture}
\end{document}
Antwort1
Diese Antwortwurde in eine eigene TikZ-Bibliothek umgewandelt ext.node-families
als Teil meinertikz-ext
ensions-Paket.
Ich denke, das ist fast so automatisch wie es nur geht. Es verwendet die .aux
Datei und funktioniert nicht, wenn das Bild mit demexternal
Bibliothek.
Sie geben eine Familie von Knoten an, die dieselbe Dimension haben sollen, mit den folgenden Schlüsseln, die sich alle im Namensraum befinden /tikz/node family
:
Typ: Textfeld.
Bevor ein Knoten erstellt wird, wird die Dimension des Textfelds, das den Text des Knotens enthält (
\pgfnodeparttextbox
), gemessen und verglichen. Der größte Wert wird verwendet.text height=<name>
: Knoten mit gleichem Wert haben die gleiche Texthöhe.<name>
text depth=<name>
: Knoten mit gleichem Wert haben die gleiche Texttiefe.<name>
text width=<name>
: Knoten mit gleichem Wert haben die gleiche Textbreite.<name>
text width align = left|center|right
:Durch das Festlegen der Breite des Textfelds wird das Feld nur nach rechts erweitert. Der Inhalt des Felds muss neu ausgerichtet werden. Der
text width align
Schlüssel (Standardcenter
) stellt sicher, dass dies korrekt erfolgt.text=<name>
setzt allestext height
,text depth
und zwartext width
auf das gleiche .<name>
Standardmäßig ist dies nur für die Basisformen
rectangle
und eingerichtetcircle
. Nachdem eine andere Form deklariert wurde (normalerweise durch Laden einer dershapes.*
Bibliotheken), kann sie auf die gleiche Weise eingerichtet werden, indem\tikzset{node family/setup shape=<shape name>}
Dies sollte nur einmal pro Form durchgeführt werden.
Da hierdurch nur die Abmessungen des Textfelds geändert werden, kann dies bei verschiedenen Formen in derselben Familie zu unterschiedlichen Breiten oder Höhen der Form führen, da ihre Abmessungen je nach Größe des Textfelds unterschiedlich berechnet werden. Betrachten Sie dieses Beispiel:
\tikz[nodes=draw, node family/text width=test] \node {Foo} node[circle] {Barbarbar};
was zu folgender Ausgabe führt:
Typ: Mindesthöhe und Mindestbreite.
Im Gegensatz zu den Textfeldmaßen werden hier die Höhe und Breite der Form verwendet, die durch die Deklaration der Form selbst berechnet werden. Da diese Berechnung irgendwo tief in der Deklaration der Form erfolgt, sind neue Formdeklarationen erforderlich:
Circle
undRectangle
.width=<name>
: Knoten mit gleichem Wert haben die gleiche Breite.<name>
height=<name>
: Knoten mit gleichem Wert haben die gleiche Höhe.<name>
Wie bei
/pgf/minimum width
und/pgf/minimum height
werden hier alle Werte von/pgf/outer xsep
und/pgf/outer ysep
oder die Linienbreite selbst ignoriert.
Wenn Sie den Wert auf leer setzen , werden die Aktionen dieser Bibliothek deaktiviert.<name>
Intern .aux
erfolgt das Schreiben in die Datei am Ende des Bildes, wofür \tikz@atend@picture
( execute at end picture
) verwendet wird.
Der Schlüssel prefix
gibt die prefix
für alle Knotenfamilien an. Standardmäßig ist dies \pgfpictureid-
, wodurch Knotenfamilien nur für einzelne TikZpictures gelten.
Im folgenden Beispiel sind alle Familien benannt, test
es handelt sich jedoch um unterschiedliche Familien.
Ich habe auch die positioning
Bibliothek verwendet, die den Effekt deutlicher macht.
Der Code kann noch etwas optimiert werden, da für das folgende Beispiel sieben zusätzliche Makros in der .aux
Datei definiert sind. Wäre es nicht besser, alle Werte einer Familie in einem Makro zu speichern?
Code
\documentclass[12pt,tikz]{standalone}
\usetikzlibrary{
positioning, % better positioning (right=of …)
ext.node-families, % node families
arrows.meta % arrow tips
}
\begin{document}
\begin{tikzpicture}[
node distance=.3cm and 1cm,
box/.style={
rectangle, draw, minimum width=+8ex, minimum height=+4ex, inner sep=+0pt,
node family/text width=test},
split/.style={
circle, draw, minimum size=+2.5pt, fill=black, inner sep=+0pt}]
\node[split] (split) {};
\node[box, right=of split] (I) {Short};
\node[box, above=of I] (P) {This node has long node text};
\node[box, below=of I] (D) {Short};
\draw[-Stealth] (split.north) |-(P);
\draw[-Stealth] (split.east) -- (I) ;
\draw[-Stealth] (split.south) |-(D);
\end{tikzpicture}
\tikz % only the same height (text is still centered)
\foreach \cnt[count=\Cnt] in {a,...,h}
\node[draw, Circle, node family/height=test] at (right:\Cnt) {\cnt};
\tikz % height and text height (text depth set to zero)
\foreach \cnt[count=\Cnt] in {a,...,h}
\node[draw, Circle, text depth=+0pt,
node family={height=test, text height=test}]
at (right:\Cnt) {\cnt};
\begin{tikzpicture}[% http://tex.stackexchange.com/q/134983
nodes={circle, draw=black, node family/text=test}]
\node (A) {$n$};
\node[right=0pt of A] (B) {$n+1$};
\end{tikzpicture}
\end{document}
Ausgabe
Erste Zusammenstellung
Zweite Zusammenstellung
Ausgabe (Beispiele)