Die TikzfitDie Funktionalität ist sehr schön, aber was (1) ist, wenn ich mehrere Fit-Boxen an der gleichen linken/breiten Position ausrichten möchte, sodass alle Fit-Boxen übereinstimmen und die verschiedenen Fit-Boxen vertikal sauber ausgerichtet sind?
Und (2) (fortgeschrittener): Kann ich auch den Abstand zwischen den Fitboxen dynamisch steuern? Dazu muss ich für die untergeordneten Elemente den Koordinatenraum der Leinwand in den Koordinatenraum der übergeordneten Elemente (Fitbox) ändern und dann alle Fitboxen entsprechend bestimmter Eigenschaften anordnen (Abstand zwischen den Boxen gleich).
PS: Für diesen einfachen Fall können Sie sich natürlich einige einfache Lösungen einfallen lassen, wie etwa einen zusätzlichen unsichtbaren Knoten in der oberen/unteren Fitbox, um alles auszurichten, aber das funktioniert natürlich nicht, wenn die Fitboxen komplexere Inhalte erhalten.
Ein Bild zur Verdeutlichung:
MWE:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{backgrounds}
\usetikzlibrary{shapes}
\usetikzlibrary{arrows}
\usetikzlibrary{fit}
\begin{document}
\begin{tikzpicture}[>=stealth',semithick,auto]
\tikzstyle{surround} = [fill=blue!10,thick,draw=black,rounded corners=2mm]
\tikzstyle{obj} = [circle, minimum width=10pt, draw, inner sep=0pt]
\node[obj] (id1) at (2,2) {};
\node[obj] (id2) at (2,3) {};
\node[obj] (id3) at (2.5,3) {};
\node[obj] (id4) at (2.5,4) {};
\begin{pgfonlayer}{background}
\node[surround] (background) [fit = (id1)] {};
\node[surround] (background) [fit = (id2)(id3)] {};
\node[surround] (background) [fit = (id4)] {};
\end{pgfonlayer}
\end{tikzpicture}
\end{document}
Antwort1
Der nächste Code zeigt eine Lösung für Ihr erstes Problem. Sie möchten ähnliche passende Knoten. Wenn Sie diese dann mit ähnlichen inneren Knoten erstellen, haben sie dieselbe Größe.
Als Beispiel
\node[surround, fit = (id1)(id3.east|-id1.center)] {};
wird einen Knoten erstellen, der groß genug ist id1
(der die Höhe und die westliche Grenze festlegt), der aber auch die Koordinate umfasst id3.east|-id1.center
, die die östliche Grenze festlegt.
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{backgrounds}
\usetikzlibrary{shapes}
\usetikzlibrary{arrows}
\usetikzlibrary{fit}
\begin{document}
\begin{tikzpicture}[>=stealth',semithick,auto,
surround/.style={fill=blue!10,thick,draw=black,rounded corners=2mm},
obj/.style={circle, minimum width=10pt, draw, inner sep=0pt}]
\node[obj] (id1) at (2,2) {};
\node[obj] (id2) at (2,3) {};
\node[obj] (id3) at (2.5,3) {};
\node[obj] (id4) at (2.5,4) {};
\begin{scope}[on background layer]
\node[surround, fit = (id2)(id3)] {};
\node[surround, fit = (id1)(id3.east|-id1.center)] {};
\node[surround, fit = (id4)(id2.west|-id4.center)] {};
\end{scope}
\end{tikzpicture}
\end{document}
Aktualisieren:Fester Abstand zwischen den passenden Knoten.
Ich weiß nicht, ob diese Lösung funktioniert, aber falls Sie bereits wissen, wie groß Ihre passenden Knoten sind, können Sie sie an der gewünschten Stelle zeichnen und später ausfüllen objects
:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{backgrounds,positioning}
\usetikzlibrary{shapes}
\usetikzlibrary{arrows}
\usetikzlibrary{fit}
\begin{document}
\begin{tikzpicture}[>=stealth',semithick,auto,
surround/.style={fill=blue!10,thick,draw=black,rounded corners=2mm},
obj/.style={circle, minimum width=10pt, draw, inner sep=0pt}]
\node[obj] (id2) at (2,3) {};
\node[obj] (id3) at (2.5,3) {};
\begin{scope}[on background layer]
\node[surround, fit = (id2)(id3)] (fit1) {};
\node[surround, fit = (id2)(id3), above=5mm of fit1] (fit2) {};
\node[surround, fit = (id2)(id3), below=15mm of fit1] (fit3) {};
\end{scope}
\node[obj] (id1) at (fit2-|id2) {};
\node[obj] (id1) at (fit3-|id3) {};
\end{tikzpicture}
\end{document}
3. Version:mitmatrix of nodes
Wenn Sie einer mehr oder weniger regelmäßigen Verteilung folgen, können Sie obj
stattdessen zeichnen . Wenn alle die gleiche Anzahl von Spalten enthalten, haben alle die gleiche Breite und ihre Höhe wird mit der Anzahl der vorhandenen Zeilen festgelegt. Und wie bei regulären Knoten können Sie den Abstand zwischen ihnen festlegen.fitting
matrix of nodes
matrix
matrix
Ein kleines Beispiel:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix,positioning,arrows}
\begin{document}
\begin{tikzpicture}[>=stealth',semithick,auto,
surround/.style={fill=blue!10, thick, draw=black,
rounded corners=2mm, matrix of nodes, nodes in empty cells, nodes={obj}, column sep=3pt, row sep=3pt},
obj/.style={circle, minimum width=10pt, draw, inner sep=0pt}]
\matrix[surround] (A) {& |[draw=none]| &\\
|[draw=none]| & &|[draw=none]|\\};
\matrix[surround, below=.5 of A] (B) { & &|[draw=none]|\\};
\matrix[surround, below=.5 of B] (C) {& \\& |[draw=none]| &\\};
\end{tikzpicture}
\end{document}