alineación horizontal de varios objetos \ pic
Quiero agrupar algunos dibujos de tikz y estoy usando un picpara esto. Además, deseo usar las imágenes como si fueran nodos ordinarios y dibujar algunas flechas de conexión. ¿Cómo puedo alinear horizontalmente las fotografías a lo largo del centro de sus cuadros delimitadores? Me gustaría evitar especificar coordenadas numéricas. A continuación se muestra una versión reducida de mi código.
Parece que especificar right = of Xpone la (0,0)coordenada del cuadro delimitador de la imagen en ese punto, pero preferiría tenerlo (0, 0.5 * bounding box height)en ese punto. Intenté poner algunas anchoropciones, pero esto no pareció tener ningún efecto --- supongo que el tamaño del cuadro delimitador de la imagen no se conoce en el momento en que se coloca la imagen.
\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}
Respuestas
Si necesita calcular el tamaño de algo ANTES de dibujarlo, debe usar un cuadro de guardado. O eso o dibujarlo dos veces.
Tenga en cuenta la sustitución [tikz]por \usepackage{tikz}cuando utilice cajas de guardado.
\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}
Resulta que se puede colocar un dibujo tikz ( \tikz \pic ...en este caso) dentro de la sección "texto" de un \node. Probablemente tikz ya guarda el contenido de texto del nodo en un cuadro (¿de qué otra manera sabría tikz cómo anclar los nodos en su centro?), Por lo que podemos reutilizarlo para evitar hacer nuestro propio \saveboxbaile.
\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}