O Tikzajustara funcionalidade é muito boa, mas e (1) se eu quiser alinhar várias caixas de ajuste no mesmo local esquerdo/largura para que todas as caixas de ajuste correspondam, para que diferentes caixas de ajuste fiquem bem alinhadas verticalmente?
E (2) (mais avançado), posso também controlar dinamicamente o espaçamento entre os fitboxes? Portanto, isso requer a mudança para os filhos do espaço de coordenadas da tela para o espaço de coordenadas pai (fitbox) e, em seguida, o layout de todas as fitboxes de acordo com certas propriedades (o espaçamento entre as caixas é o mesmo).
PS: Para este caso simples, é claro que você pode encontrar algumas soluções simples, como um nó invisível extra no fitbox superior/inferior para alinhar tudo, mas é claro que isso não funciona quando os fitboxes obtêm conteúdo mais complexo.
Uma imagem para esclarecer:
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}
Responder1
O próximo código mostra uma solução para seu primeiro problema. Você deseja nós de ajuste semelhantes, então, se construí-los com nós internos semelhantes, eles terão o mesmo tamanho.
Como um exemplo
\node[surround, fit = (id1)(id3.east|-id1.center)] {};
construirá um nó grande o suficiente para id1
(que fixa a altura e a fronteira oeste), mas também abrangerá as coordenadas id3.east|-id1.center
que fixarão a fronteira leste.
\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}
Atualizar:Distância fixa entre nós de ajuste.
Não sei se esta solução servirá, mas caso você já saiba o tamanho dos seus nós de encaixe, você pode desenhá-los onde quiser e preencher objects
depois:
\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ª versão:commatrix of nodes
Se você obj
segue uma distribuição mais ou menos regular, em vez fitting
delas, você pode desenhar matrix of nodes
. Se todas matrix
contiverem o mesmo número de colunas, todas terão a mesma largura e sua altura será fixada com o número de linhas presentes. E como matrix
são os nós regulares, você pode fixar a distância entre eles.
Um pequeno exemplo:
\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}