Tikz: Выровняйте левый/ширинный край разных посадочных мест, чтобы несколько посадочных мест были аккуратно выровнены по вертикали

Tikz: Выровняйте левый/ширинный край разных посадочных мест, чтобы несколько посадочных мест были аккуратно выровнены по вертикали

ТикзсоответствоватьФункциональность очень хорошая, но что делать, если (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}

введите описание изображения здесь

Связанный контент