alinhamento horizontal de vários objetos \ pic
Quero agrupar alguns desenhos de tikz e estou usando um picpara isso. Além disso, desejo usar as fotos como se fossem nós comuns e desenhar algumas setas de conexão. Como posso alinhar horizontalmente as fotos ao longo do centro de suas caixas delimitadoras? Eu gostaria de evitar a especificação de coordenadas numéricas. Uma versão reduzida do meu código está abaixo.
Parece que a especificação right = of Xcoloca a (0,0)coordenada da caixa delimitadora da imagem nesse ponto, mas eu preferiria (0, 0.5 * bounding box height)nesse ponto. Tentei colocar algumas anchoropções, mas não pareceu surtir efeito - acho que o tamanho da caixa delimitadora da foto não é conhecido no momento em que a foto é posicionada.
\documentclass[tikz,border=5mm]{standalone}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}[
inner sep=0mm,
stack/.pic={
\foreach \i in {#1}
\draw [pic actions] (0+\i,0+\i) rectangle (1+\i,1+\i);
},
squares/.style={
black,
fill=orange!75,
},
edge/.style={
->,
black,
ultra thick,
shorten <=1mm,
shorten >=1mm,
},
]
\pic [
squares,
local bounding box=A,
] {stack={0,0.2,...,1}};
\pic [
squares,
local bounding box=B,
scale=0.5,
right= of A,
] {stack={0,0.2,...,1}};
\pic [
squares,
local bounding box=C,
scale=0.25,
right= of B,
] {stack={0,0.2,...,1}};
\draw [edge] (A) -- (B);
\draw [edge] (B) -- (C);
\end{tikzpicture}
\end{document}
Respostas
Se você precisa calcular o tamanho de algo ANTES de desenhá-lo, você precisa usar uma caixa de salvamento. Ou isso ou desenhe duas vezes.
Substituir notas [tikz]por \usepackage{tikz}ao usar caixas de salvamento.
\documentclass[border=5mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning}
\newsavebox{\boxa}
\newsavebox{\boxb}
\newsavebox{\boxc}
\begin{document}
\savebox{\boxa}{\begin{tikzpicture}[
inner sep=0mm,
stack/.pic={
\foreach \i in {#1}
\draw [pic actions] (0+\i,0+\i) rectangle (1+\i,1+\i);
},
squares/.style={
black,
fill=orange!75,
},
]
\pic [
squares,
] {stack={0,0.2,...,1}};
\end{tikzpicture}}%
\savebox{\boxb}{\begin{tikzpicture}[
inner sep=0mm,
stack/.pic={
\foreach \i in {#1}
\draw [pic actions] (0+\i,0+\i) rectangle (1+\i,1+\i);
},
squares/.style={
black,
fill=orange!75,
},
]
\pic [
squares,
scale=0.5,
] {stack={0,0.2,...,1}};
\end{tikzpicture}}%
\savebox{\boxc}{\begin{tikzpicture}[
inner sep=0mm,
stack/.pic={
\foreach \i in {#1}
\draw [pic actions] (0+\i,0+\i) rectangle (1+\i,1+\i);
},
squares/.style={
black,
fill=orange!75,
},
]
\pic [
squares,
scale=0.25,
] {stack={0,0.2,...,1}};
\end{tikzpicture}}%
\begin{tikzpicture}[
inner sep=0mm,
edge/.style={
->,
black,
ultra thick,
shorten <=1mm,
shorten >=1mm,
},
]
\node (A) {\usebox\boxa};
\node[right=of A] (B) {\usebox\boxb};
\node[right=of B] (C) {\usebox\boxc};
\draw [edge] (A) -- (B);
\draw [edge] (B) -- (C);
\end{tikzpicture}
\end{document}
Acontece que é possível colocar um desenho tikz ( \tikz \pic ...neste caso) dentro da seção "texto" de a \node. Provavelmente o tikz já salva o conteúdo do texto do nó em uma caixa (de que outra forma tikz saberia como ancorar os nós em seu centro?), Então podemos apenas reutilizar isso para evitar nossa própria \saveboxdança.
\documentclass[tikz,border=1mm]{standalone}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}[
inner sep=0mm,
stack/.pic={
\foreach \i in {#1}
\draw [pic actions] (0+\i,0+\i) rectangle (1+\i,1+\i);
},
squares/.style={
fill=orange!75,
},
edge/.style={
->,
ultra thick,
shorten <=1mm,
shorten >=1mm,
},
]
\node (A) { \tikz \pic[squares] {stack={0,0.2,...,1}}; };
\node [right=of A] (B) { \tikz \pic[squares, scale=0.5] {stack={0,0.2,...,1}}; };
\node [right=of B] (C) { \tikz \pic[squares, scale=0.25] {stack={0,0.2,...,1}}; };
\draw [edge] (A) -- (B);
\draw [edge] (B) -- (C);
\end{tikzpicture}
\end{document}