Abhängige Knotengröße in TikZ

Abhängige Knotengröße in TikZ

Ich erstelle einige Kontrolltheorie-Flussblätter, in TikZdenen 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 boxStil, 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-familiesals Teil meinertikz-extensions-Paket.


Ich denke, das ist fast so automatisch wie es nur geht. Es verwendet die .auxDatei und funktioniert nicht, wenn das Bild mit demexternalBibliothek.

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:

  1. 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 alignSchlüssel (Standard center) stellt sicher, dass dies korrekt erfolgt.

    • text=<name>setzt alles text height, text depthund zwar text widthauf das gleiche .<name>

    Standardmäßig ist dies nur für die Basisformen rectangleund eingerichtet circle. Nachdem eine andere Form deklariert wurde (normalerweise durch Laden einer der shapes.*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:

    Bildbeschreibung hier eingeben

  2. 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: Circleund Rectangle.

    • 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 widthund /pgf/minimum heightwerden hier alle Werte von /pgf/outer xsepund /pgf/outer ysepoder die Linienbreite selbst ignoriert.

Wenn Sie den Wert auf leer setzen , werden die Aktionen dieser Bibliothek deaktiviert.<name>


Intern .auxerfolgt das Schreiben in die Datei am Ende des Bildes, wofür \tikz@atend@picture( execute at end picture) verwendet wird.

Der Schlüssel prefixgibt die prefixfür alle Knotenfamilien an. Standardmäßig ist dies \pgfpictureid-, wodurch Knotenfamilien nur für einzelne TikZpictures gelten.

Im folgenden Beispiel sind alle Familien benannt, testes handelt sich jedoch um unterschiedliche Familien.


Ich habe auch die positioningBibliothek 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 .auxDatei 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

Bildbeschreibung hier eingeben

Zweite Zusammenstellung

Bildbeschreibung hier eingeben

Ausgabe (Beispiele)

Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben

verwandte Informationen