Wie kann man Tikz selektiv mitteilen, dass ein Knoten seine Koordinate durch Addition aller Koordinaten aller umschließenden Tikz-Bilder erhalten soll?

Wie kann man Tikz selektiv mitteilen, dass ein Knoten seine Koordinate durch Addition aller Koordinaten aller umschließenden Tikz-Bilder erhalten soll?

Es sollte eine empfohlene/standardmäßige/übliche Vorgehensweise (was vorgeschlagen wird) für Folgendes geben:

\begin{tikzpicture}
  \node (tikzpicture0) at (0pt,100pt) []{
     \begin{tikzpicture}
                \ABSOLUTE-AND-CONTEXT-AWARE-node (node00) at (0pt,0pt) []{(0pt,0pt)};
                \node (node01) at (0pt,10pt)[]{(0pt,10pt)};
     \end{tikzpicture}               
  };
  \node (tikzpicture1) at (100pt,200pt) []{
     \begin{tikzpicture}    
                \node (node10) at (0pt,0pt) []{(0pt,0pt)};
                \node (node11) at (0pt,10pt)[]{(0pt,10pt)};
     \end{tikzpicture}                              
  };
  \node (tikzpicture2) at (200pt,300pt) []{
     \begin{tikzpicture}        
                \node (node20) at (0pt,0pt) []{(0pt,0pt)};
                \node (node21) at (0pt,10pt)[]{(0pt,10pt)};
     \end{tikzpicture}                                             
  };
  \draw[->] (node00)--($(node10)+(100pt,200pt)$);
\end{tikzpicture}

wobei ABSOLUTE bedeuten soll, dass auf (node00) außerhalb des Tikzpicture verwiesen werden kann, in dem es definiert wurde, und AND-CONTEXT-AWARE bedeuten soll, dass die Koordinate (0pt,100pt) des umschließenden Tikzpicture zur Koordinate (0pt,0pt) des Knotens addiert wird.

Natürlich der Code

\begin{tikzpicture}
  \node (tikzpicture0) at (0pt,100pt) []{
     \begin{tikzpicture}
                \node (node00) at (0pt,0pt) []{(0pt,0pt)};
                \node (node01) at (0pt,10pt)[]{(0pt,10pt)};
     \end{tikzpicture}               
  };
  \node (tikzpicture1) at (100pt,200pt) []{
     \begin{tikzpicture}    
                \node (node10) at (0pt,0pt) []{(0pt,0pt)};
                \node (node11) at (0pt,10pt)[]{(0pt,10pt)};
     \end{tikzpicture}                              
  };
  \node (tikzpicture2) at (200pt,300pt) []{
     \begin{tikzpicture}        
                \node (node20) at (0pt,0pt) []{(0pt,0pt)};
                \node (node21) at (0pt,10pt)[]{(0pt,10pt)};
     \end{tikzpicture}                                             
  };
  \draw[->] (node00)--($(node10)+(100pt,200pt)$);
\end{tikzpicture}

Erträge

Bildbeschreibung hier eingeben

während die beabsichtigte Abbildung wie die (fest codierte, erhaltene Koordinate-)Abbildung aussehen sollte

Bildbeschreibung hier eingeben

Was empfehlen Sie?

Antwort1

Generell wird empfohlen, keine verschachtelten tikzpictures zu verwenden. Sie können dasselbe tun, indem Sie scopestattdessen verwenden. Im folgenden Code habe ich Ihren Knoten einige Namen hinzugefügt, um sie zu unterscheiden. Der Pfeil am Ende Ihres Codes gibt den Pfeil in Ihrem fest codierten Bild nicht an, da sein Endpunkt von node10und nicht abgeleitet ist node01. Ich habe stattdessen einen in Rot hinzugefügt, indem ich verwendet habe node01.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
  \node (node00) at (0pt,0pt) []{N00:(0pt,0pt)};
  \node (node01) at (0pt,10pt)[]{N01:(0pt,10pt)};
  \begin{scope}[shift={(100pt,200pt)}]
    \node (node10) at (0pt,0pt) []{N10:(0pt,0pt)};
    \node (node11) at (0pt,10pt)[]{N11:(0pt,10pt)};  
  \end{scope}
  \begin{scope}[shift={(200pt,300pt)}]
    \node (node20) at (0pt,0pt) []{N20:(0pt,0pt)};
    \node (node21) at (0pt,10pt)[]{N21:(0pt,10pt)};
  \end{scope}
  \draw[->] (node00)--($(node10)+(100pt,200pt)$) node[anchor=west]{(N10)+(100pt,200pt)};
  \draw[red,->] (node00)--($(node01)+(100pt,200pt)$);
\end{tikzpicture}
\end{document}

Bildbeschreibung hier eingeben

Antwort2

Wenn ich das richtig verstehe, gibt es ein Problem mit Ihrem Konzept. Schauen wir uns den folgenden Fall an:

\begin{tikzpicture}
\node at (10,10) {This was 10, 10};
\node at (15,15) {This was 15, 15};
\draw (current bounding box.south west) rectangle (current bounding box.north east);
\end{tikzpicture}

Dies gibt uns

Bildbeschreibung hier eingeben

Dabei sind ein paar Dinge zu beachten: Die resultierende Box hat nicht die Größe 15x15, obwohl sie den größten Abstand zum Ursprung hat. Und sie hat aufgrund der Textlänge auch nicht die Größe 5x5.

Es wird also nicht möglich sein, die absolute Position der Knoten relativ zur endgültigen Leinwand zu ermitteln, es sei denn, Sie korrigieren den Begrenzungsrahmen vorher. Die verbleibende Lösung wäre, die Knotenplatzierung zu hacken, die aktuellen Begrenzungsrahmenwerte und die Eigengröße einzubeziehen und alles entsprechend zu aktualisieren. Selbst dann, wenn ich jetzt etwas platziere, (-2,-2)müssen alle Knotenwerte aktualisiert werden, da der Begrenzungsrahmen jetzt plötzlich ungefähr 17 x 17 groß wird. Die Knotenplatzierung sollte also verschoben werden, bis das gesamte Bild gesetzt ist. Und wir haben die Transformationen wie Skalierung und Übersetzungen noch nicht einmal berührt.

Daher bin ich der Meinung, dass dies mit einfachen Manipulationen nicht funktioniert. Ich wiederhole das allgemeine Mantra: Verschachteln Sie keine TikZ-Bilder. Es gibt immer einen anderen Weg.

Ihr eigentliches Problem (was auch immer das sein mag), das diese Richtung motiviert hat, könnte wahrscheinlich durch die Antworten von gelöst werdenKönnen Tikz-Koordinaten in eine Textdatei exportiert werden?mit einer Zwei-Durchgangs-Lösung.

verwandte Informationen