Probleme mit verschachtelten TikZ-Bildern

Probleme mit verschachtelten TikZ-Bildern

Ich lese schon lange mit, schreibe zum ersten Mal. Ich kann einfach keine Lösung für dieses Problem finden, also vertraue ich auf Ihren Expertenrat! Ich habe zunächst versucht, ein TiKzpicture innerhalb eines Knotens eines TiKzpicture zu erstellen, aber als ich dann versuchte, Kanten zwischen Knoten innerhalb des inneren TiKzpicture zu zeichnen, erhielt ich den folgenden Fehler:

Undefined control sequence \path[->] (w0) edge[bend left=10] node[right] {$\R^{0}$} (v0);

(Der Fehler zeigte die Zeile tatsächlich nicht vollständig an, egal wie sehr ich versuchte, TexStudio dazu zu bringen, mir den vollständigen Fehler mitzuteilen, also habe ich einfach die erste fehlerhafte Zeile kopiert.)

Ich habe diesen Beitrag gelesen (mein Ruf ist nicht gut genug, um Links mit der richtigen Formatierung zu posten. Ugh!!Wie vermeidet man die Verschachtelung von Tikzpicture?) Eine vorgeschlagene Lösung bestand darin, eine lrbox zu erstellen, die das TiKz-Bild enthalten würde, und dann den in der Präambel des Dokuments deklarierten Befehl wie folgt zu verwenden:

\newsavebox\helloworld
...
\node [label={below:Hello World}] (hw) {\usebox\helloworld};

Dadurch wurde das obige Problem tatsächlich gelöst und die Kanten zwischen den gewünschten Knoten (z. B. (w0, v0) und (w1, v1)) erfolgreich gezeichnet. Allerdings ist ein neues Problem aufgetreten: Ich versuche, eine Kante von einem Knoten innerhalb des in der lrbox enthaltenen TiKzpicture zu einem Knoten im „äußeren“ TiKzpicture zu zeichnen. Meines Wissens wird der Inhalt der lrbox vor dem Inhalt des äußeren TiKzpicture gerendert; ich bin mir jedoch nicht sicher, wie ich das sonst angehen soll.

Hier ist das Bild, bevor ich die Kante hinzufüge, und was danach passiert:

Vor dem Hinzufügen der störenden Kante

Vollständige Ansicht der gebrochenen Kante

Hier ist mein vollständiger Code:

\documentclass{article}
\usepackage{float, latexsym, tikz, amssymb, amsmath, amsthm, graphicx, caption}

\usetikzlibrary{shapes,arrows,positioning,fit,matrix,calc}

\newsavebox\disjUn

\newcommand{\R}{\mathcal{R}}
\newcommand{\F}{\mathfrak{F}}

\begin{document}
    \tikzstyle{frame}=[draw,ellipse,minimum height=6cm,minimum width=2cm]
    \tikzstyle{world} =[draw,circle,fill=black, inner sep=0pt, minimum size=3pt]

    \begin{lrbox}{\disjUn}
    \begin{tikzpicture}[node distance=3cm]
        \node[frame] (F0){};
        \node at ([xshift=-1em, yshift=-4em]F0.north) [world, label={70:$(w,0)$}] (w0){}; 
        \node at ([yshift=3em]F0.south west) [world, label={-70:$(v,0)$}] (v0){};
        \path[->] (w0) edge[bend left=10] node[right] {$\R^{0}$} (v0);

        \node[frame, right of=F0] (F1){};
        \node at ([xshift=-1em, yshift=-4em]F1.north) [world, label={70:$(w,1)$}] (w1){}; 
        \node at ([yshift=3em]F1.south west) [world, label={-70:$(v,1)$}] (v1){};
        \path[->] (w1) edge[bend left=10] node[right] {$\R^{1}$} (v1);
    \end{tikzpicture}
    \end{lrbox}

    \begin{figure}[H]
    \centering
    \begin{tikzpicture}[remember picture, node distance=3cm, transform canvas={scale=0.9}]
    \node[draw=white, label={below:$\F \oplus \F$}] (FF) {\usebox\disjUn};

    \node[frame,right of=FF, xshift=3cm,label={below:$\F^{\prime}$}] (Fp){};
    \node at ([yshift=-4em]Fp.north) [world, label={70:$\hat{w}$}] (w){}; 
    \node at ([yshift=3em]Fp.south west) [world, label={-70:$\hat{v}$}] (v){};
    \node at ([yshift=3em]Fp.north east) [world, label={70:$w^{\prime}$}] (wp){};

    \path[->] (w) edge[bend left=10] node[right] {$\R^{\prime}$}(v);

    \path[-] (wp.west) edge[bend right,draw=gray, dashed] node [below]{} (Fp.north);
    \path[-] (wp.south east) edge[bend left,draw=gray, dashed] node [below]{} (Fp.north east);

    \path[->] (w0) edge[bend right, dashed] node[above] {$g$}(w);
    %\path[->] (w1) edge[bend right,dashed] node[above] {$g$}(wp);
    \end{tikzpicture}
    \end{figure}
\end{document}  

Gibt es alternative Lösungen, mit denen ich die Welten gut innerhalb von Ellipsen positionieren und Kanten zwischen diesen Strukturen haben kann? Vielen Dank im Voraus!

EDIT: Ich möchte auch darauf hinweisen, dass ich das \disjUn TiKzpicture in einer lrbox als Komponente von zwei TiKzpictures verwende. Mir gefiel die Tatsache, dass ich das Diagramm nur an einer Stelle bearbeiten konnte und die Änderungen in beiden Diagrammen widergespiegelt wurden! Die Tatsache, dass ich in dieser Umgebung scheinbar keine Kanten zu oder von Knoten zeichnen kann, ist jedoch problematisch :(

Ein Freund von mir hat empfohlen, \begin{scope}[...] \end{scope} zu verwenden, um die verschiedenen Strukturen einzuschließen, aber es besteht immer noch das Problem der Code-Wiederverwendung und der Positionierung der Welten (der schwarzen Punkte) relativ zu den Ovalen... Nochmals vielen Dank fürs Lesen! :)

EDIT2: Dank AJN habe ich herausgefunden, dass ich ursprünglich das

remember picture

Argument im falschen TiKz-Bild; es sollte sich im inneren TiKz-Bild befinden; ich nehme an, das liegt daran, dass wir möchten, dass sich der Compiler die Knotennamen zur Verwendung im übergeordneten TiKz-Bild merkt.

Antwort1

Ich verstehe nicht, warum Sie eine separate Box benötigenodera pichier. Da Sie sowieso laden fit, können wir das einfach verwenden, um die beiden Knoten F0und aufzunehmen F1.

  \node (FF) [fit=(F0) (F1), draw=white, label={below:$\F \oplus \F$}] {};

Beachten Sie, dass \tikzstylees ebenso wie die <direction> of=Syntax veraltet ist arrowsund shapesdurch die aktualisierten Entsprechungen ersetzt werden sollte.

Das erste kann ersetzt werden durch \tikzset:

\tikzset{% \tikzstyle is deprecated
  frame/.style={draw,ellipse,minimum height=6cm,minimum width=2cm},
  world/.style ={draw,circle,fill=black, inner sep=0pt, minimum size=3pt},
}

Für die zweite Option positioningist die Syntax der Bibliothek vorzuziehen und Sie laden sie bereits, also können wir sie auch hier einfach verwenden. Zum Beispiel:

  \node[frame,right=1cm of FF, xshift=3cm, label={below:$\F^{\prime}$}] (Fp){};

Anstelle von shapesmöchten wir, shapes.geometricdas das bereitstellt ellipse. Die aktualisierte Version von arrowsist arrows.meta, aber Sie verwenden sie nicht, deshalb habe ich auch keines von beiden hier geladen.

\usetikzlibrary{shapes.geometric,positioning,fit}

\documentclass{article}
\usepackage{tikz,amssymb}
\usetikzlibrary{shapes.geometric,positioning,fit}
\newcommand{\R}{\mathcal{R}}
\newcommand{\F}{\mathfrak{F}}
\begin{document}
\tikzset{% \tikzstyle is deprecated
  frame/.style={draw,ellipse,minimum height=6cm,minimum width=2cm},
  world/.style ={draw,circle,fill=black, inner sep=0pt, minimum size=3pt},
}
\begin{tikzpicture}[node distance=3cm, transform canvas={scale=0.9}]
  \node[frame] (F0){};
  \node at ([xshift=-1em, yshift=-4em]F0.north) [world, label={70:$(w,0)$}] (w0){};
  \node at ([yshift=3em]F0.south west) [world, label={-70:$(v,0)$}] (v0){};
  \path[->] (w0) edge[bend left=10] node[right] {$\R^{0}$} (v0);

  \node[frame, right=1cm of F0] (F1){};
  \node at ([xshift=-1em, yshift=-4em]F1.north) [world, label={70:$(w,1)$}] (w1){};
  \node at ([yshift=3em]F1.south west) [world, label={-70:$(v,1)$}] (v1){};
  \path[->] (w1) edge[bend left=10] node[right] {$\R^{1}$} (v1);

  \node (FF) [fit=(F0) (F1), draw=white, label={below:$\F \oplus \F$}] {};

  \node[frame,right=1cm of FF, xshift=3cm, label={below:$\F^{\prime}$}] (Fp){};
  \node at ([yshift=-4em]Fp.north) [world, label={70:$\hat{w}$}] (w){};
  \node at ([yshift=3em]Fp.south west) [world, label={-70:$\hat{v}$}] (v){};
  \node at ([yshift=3em]Fp.north east) [world, label={70:$w^{\prime}$}] (wp){};

  \path[->] (w) edge[bend left=10] node[right] {$\R^{\prime}$}(v);

  \path[-] (wp.west) edge[bend right,draw=gray, dashed] node [below]{} (Fp.north);
  \path[-] (wp.south east) edge[bend left,draw=gray, dashed] node [below]{} (Fp.north east);

  \path[->] (w0) edge[bend left=80, dashed] node[above] {$g$}(w);
  \path[->] (w1) edge[bend left=60,dashed] node[above] {$g$}(wp);
  \path[->] (v0) edge[bend left=8,dashed] node[pos=.6,above] {$g$}(v);
  \path[->] (v1) edge[bend right=100,dashed] node[above] {$g$}(v);
\end{tikzpicture}
\end{document}

Angepasste Knoten

Antwort2

Nachfolgend der aktualisierte Code; Danke an AJN für die Antwort! :)

\documentclass{article}
\usepackage{float, latexsym, tikz, amssymb, amsmath, amsthm, graphicx, caption}

\usetikzlibrary{shapes,arrows,positioning,fit,matrix,calc}

\newsavebox\disjUn

\newcommand{\R}{\mathcal{R}}
\newcommand{\F}{\mathfrak{F}}

\begin{document}
    \tikzstyle{frame}=[draw,ellipse,minimum height=6cm,minimum width=2cm]
    \tikzstyle{world} =[draw,circle,fill=black, inner sep=0pt, minimum size=3pt]

    \begin{lrbox}{\disjUn}
    \begin{tikzpicture}[remember picture, node distance=3cm]
        \node[frame] (F0){};
        \node at ([xshift=-1em, yshift=-4em]F0.north) [world, label={70:$(w,0)$}] (w0){}; 
        \node at ([yshift=3em]F0.south west) [world, label={-70:$(v,0)$}] (v0){};
        \path[->] (w0) edge[bend left=10] node[right] {$\R^{0}$} (v0);

        \node[frame, right of=F0] (F1){};
        \node at ([xshift=-1em, yshift=-4em]F1.north) [world, label={70:$(w,1)$}] (w1){}; 
        \node at ([yshift=3em]F1.south west) [world, label={-70:$(v,1)$}] (v1){};
        \path[->] (w1) edge[bend left=10] node[right] {$\R^{1}$} (v1);
    \end{tikzpicture}
    \end{lrbox}

    \begin{figure}[H]
    \centering
    \begin{tikzpicture}[remember picture, node distance=3cm]
        \node[draw=white, label={below:$\F \oplus \F$}] (FF) {\usebox\disjUn};

        \node[frame,right of=FF, xshift=3cm,label={below:$\F^{\prime}$}] (Fp){};
        \node at ([yshift=-4em]Fp.north) [world, label={70:$\hat{w}$}] (w){}; 
        \node at ([yshift=3em]Fp.south west) [world, label={-70:$\hat{v}$}] (v){};
        \node at ([yshift=3em]Fp.north east) [world, label={70:$w^{\prime}$}] (wp){};

        \path[->] (w) edge[bend left=10] node[right] {$\R^{\prime}$}(v);

        \path[-] (wp.west) edge[bend right,draw=gray, dashed] node [below]{} (Fp.north);
        \path[-] (wp.south east) edge[bend left,draw=gray, dashed] node [below]{} (Fp.north east);

        \path[->] (w0) edge[bend left=80, dashed] node[above] {$g$}(w);
        \path[->] (w1) edge[bend left=60,dashed] node[above] {$g$}(wp);
        \path[->] (v0) edge[bend left=8,dashed] node[above] {$g$}(v);
        \path[->] (v1) edge[bend right=100,dashed] node[above] {$g$}(v);
    \end{tikzpicture}
    \end{figure}
\end{document}

Das Ergebnis ist folgendes:

Bildbeschreibung hier eingeben

Lustigerweise wird das Bild auf unterschiedliche Weise mit einem Zyklus der Länge 2 umgebrochen, wenn Sie das Argument „Bild merken“ aus dem äußeren TiKz-Bild entfernen und es in TexStudio mit PdfLaTeX durch Drücken von F6 kompilieren, LOL. Ich weiß nicht genau, wie ich das erklären soll … Das erfordert definitiv weitere Recherche! :) Nochmals vielen Dank für die Hilfe aller!

verwandte Informationen