horizontale Ausrichtung mehrerer \pic-Objekte

horizontale Ausrichtung mehrerer \pic-Objekte

Ich möchte einige Tikz-Zeichnungen zusammenfassen und verwende picdafür ein . Außerdem möchte ich die Bilder so verwenden, als wären sie normale Knoten, und einige Verbindungspfeile zeichnen. Wie kann ich die Bilder horizontal entlang der Mitte ihrer Begrenzungsrahmen ausrichten? Ich möchte die Angabe numerischer Koordinaten vermeiden. Unten finden Sie eine gekürzte Version meines Codes.

Es scheint, dass die Angabe right = of Xdie Koordinate des Begrenzungsrahmens des Bilds (0,0)an diesen Punkt setzt, aber ich hätte es lieber (0, 0.5 * bounding box height)an diesem Punkt. Ich habe versucht, einige Optionen einzugeben anchor, aber das schien keine Wirkung zu haben – ich vermute, die Größe des Begrenzungsrahmens des Bilds ist zum Zeitpunkt der Positionierung des Bilds nicht bekannt.

\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

Antwort1

Wenn Sie die Größe eines Objekts berechnen müssen, BEVOR Sie es zeichnen, müssen Sie eine Savebox verwenden. Entweder das oder Sie zeichnen es zweimal.

Beachten Sie das Ersetzen [tikz]durch \usepackage{tikz}bei der Verwendung von Saveboxen.

\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}

Antwort2

Es stellt sich heraus, dass man eine Tikz-Zeichnung ( \tikz \pic ...in diesem Fall) in den „Text“-Abschnitt eines einfügen kann \node. Wahrscheinlich speichert Tikz den Textinhalt des Knotens bereits in einer Box (woher sonst würde Tikz wissen, wie Knoten in ihrer Mitte verankert werden?), sodass wir diese einfach wiederverwenden können, um unseren eigenen Tanz zu vermeiden \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}

Bildbeschreibung hier eingeben

verwandte Informationen