複数の \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}

ABC

答え1

何かを描画する前にそのサイズを計算する必要がある場合は、セーブボックスを使用する必要があります。そうするか、2 回描画します。

セーブボックスを使用する場合は を置き換える[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 \pic ...の「テキスト」セクション内にtikz 描画 (この場合は) を配置できることがわかりました\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}

ここに画像の説明を入力してください

関連情報