
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:
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 pic
hier. Da Sie sowieso laden fit
, können wir das einfach verwenden, um die beiden Knoten F0
und aufzunehmen F1
.
\node (FF) [fit=(F0) (F1), draw=white, label={below:$\F \oplus \F$}] {};
Beachten Sie, dass \tikzstyle
es ebenso wie die <direction> of=
Syntax veraltet ist arrows
und shapes
durch 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 positioning
ist 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 shapes
möchten wir, shapes.geometric
das das bereitstellt ellipse
. Die aktualisierte Version von arrows
ist 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}
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:
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!