горизонтальное выравнивание нескольких \pic объектов

горизонтальное выравнивание нескольких \pic объектов

Я хочу сгруппировать несколько рисунков 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}

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

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