
Я хочу сгруппировать несколько рисунков tikz вместе и использую pic
для этого. Я также хочу использовать картинки, как будто они являются обычными узлами, и нарисовать несколько соединительных стрелок. Как мне выровнять картинки по горизонтали по центру их ограничивающих рамок? Я хотел бы избежать указания числовых координат. Ниже приведена сокращенная версия моего кода.
Похоже, что указание right = of X
помещает координаты ограничивающего прямоугольника картинки (0,0)
в эту точку, но я бы предпочел, чтобы это было (0, 0.5 * bounding box height)
в этой точке. Я пробовал вводить некоторые anchor
параметры, но это, похоже, не дало никакого эффекта --- Я думаю, что размер ограничивающего прямоугольника картинки неизвестен в момент позиционирования картинки.
\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}
решение1
Если вам нужно вычислить размер чего-либо ДО того, как вы это нарисуете, вам нужно использовать savebox. Либо это, либо нарисовать это дважды.
Обратите внимание на замену [tikz]
на \usepackage{tikz}
при использовании ящиков сохранения.
\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}
решение2
Оказывается, можно поместить рисунок tikz ( \tikz \pic ...
в данном случае) внутрь раздела «текст» a \node
. Вероятно, tikz уже сохраняет текстовое содержимое узла в поле (как еще tikz узнает, как прикрепить узлы к их центру?), так что мы можем просто повторно использовать его, чтобы не танцевать свой собственный \savebox
танец.
\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}