ТикзсоответствоватьФункциональность очень хорошая, но что делать, если (1) я хочу выровнять несколько ячеек по одному и тому же левому краю/ширине, чтобы все ячейки совпадали, а разные ячейки были аккуратно выровнены по вертикали?
И (2) (более продвинутый вариант), могу ли я также динамически управлять расстоянием между фитбоксами? Так что для этого требуется перейти для дочерних элементов из координатного пространства холста в координатное пространство родителя (фитбокс), а затем разместить все фитбоксы в соответствии с определенными свойствами (расстояние между боксами одинаковое).
PS: Для этого простого случая вы, конечно, можете придумать несколько простых решений, например, дополнительный невидимый узел в верхнем/нижнем фитбоксе, чтобы все выровнять, но это, конечно, не сработает, когда фитбоксы получат более сложное содержимое.
Картинка для пояснения:
МВЭ:
\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}
решение1
Следующий код показывает решение вашей первой проблемы. Вам нужны похожие подходящие узлы, тогда если вы построите их с похожими внутренними узлами, они будут иметь одинаковый размер.
В качестве примера
\node[surround, fit = (id1)(id3.east|-id1.center)] {};
построит узел достаточно большого размера для id1
(который фиксирует высоту и западную границу), но он также будет включать координату, id3.east|-id1.center
которая фиксирует восточную границу.
\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}
Обновлять:Фиксированное расстояние между узлами подгонки.
Я не знаю, подойдет ли это решение, но если вы уже знаете, насколько велики ваши подходящие узлы, вы можете нарисовать их там, где хотите, и заполнить 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-я версия:сmatrix of nodes
Если вы obj
следуете более или менее регулярному распределению, вместо fitting
них вы можете нарисовать matrix of nodes
. Если все matrix
содержит одинаковое количество столбцов, все они будут иметь одинаковую ширину, а их высота будет фиксированной с количеством имеющихся строк. И как и matrix
обычные узлы, вы можете зафиксировать расстояние между ними.
Небольшой пример:
\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}