
Lector desde hace mucho tiempo, cartel por primera vez. Parece que no puedo encontrar una solución a este problema, ¡así que recurro a su consejo experto! Inicialmente intenté crear una imagen TiKz dentro de un nodo de una imagen TiKz, pero luego, cuando intenté dibujar bordes entre los nodos dentro de la imagen TiKz interna, recibí el siguiente error:
Undefined control sequence \path[->] (w0) edge[bend left=10] node[right] {$\R^{0}$} (v0);
(El error en realidad no mostraba completamente la línea, no importa cuánto intenté convencer a TexStudio para que me dijera cuál era el error completo, así que simplemente copié la primera línea ofensiva).
Leí esta publicación (no tengo suficiente reputación para publicar enlaces con el formato adecuado. ¡¡Uf!!¿Cómo evitar el anidamiento de tikzpicture?) Una solución propuesta fue crear un lrbox que contendría la imagen TiKz y luego usar el comando declarado en el preámbulo del documento de la siguiente manera:
\newsavebox\helloworld
...
\node [label={below:Hello World}] (hw) {\usebox\helloworld};
En realidad, esto resolvió el problema anterior y los bordes se dibujaron exitosamente entre los nodos deseados (por ejemplo, (w0, v0) y (w1, v1). Sin embargo, ha surgido un nuevo problema: estoy tratando de dibujar un borde de un nodo. dentro de la imagen TiKz contenida en lrbox a un nodo en la imagen TiKz "externa", según tengo entendido, el contenido de la imagen lrbox se representa antes que el contenido de la imagen TiKz externa, sin embargo, no estoy seguro de cómo abordar esto.
Esto es antes de agregar el borde y luego lo que sucede después de agregar el borde:
Aquí está mi código completo:
\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}
¿Existen soluciones alternativas en las que pueda colocar bien los mundos dentro de elipses y tener bordes entre estas estructuras? Muchas gracias de antemano!
EDITAR: También me gustaría señalar que estoy usando \disjUn TiKzpicture en un lrbox como componente de dos TiKzpictures; ¡Me gustó el hecho de poder editar el diagrama en un solo lugar y reflejar los cambios en ambos diagramas! Sin embargo, el hecho de que parece que no puedo dibujar bordes hacia ni desde los nodos dentro de este entorno es problemático :(
Un amigo mío recomendó usar \begin{scope}[...] \end{scope} para contener las diferentes estructuras, pero todavía existe el problema de la reutilización del código y el posicionamiento de los mundos (los puntos negros) en relación con el óvalos... ¡Gracias de nuevo por leer! :)
EDIT2: Gracias a AJN, descubrí que originalmente había usado el
remember picture
Argumento en la imagen TiKz equivocada; está destinado a estar en la imagen interior de TiKz; Supongo que esto se debe a que queremos que el compilador recuerde los nombres de los nodos para usarlos en la imagen principal de TiKz.
Respuesta1
No veo por qué necesitas una caja separada.oun pic
aquí. Como está cargando fit
de todos modos, simplemente podemos usarlo para contener los dos nodos F0
y F1
.
\node (FF) [fit=(F0) (F1), draw=white, label={below:$\F \oplus \F$}] {};
Tenga en cuenta que \tikzstyle
está en desuso al igual que la <direction> of=
sintaxis. arrows
y shapes
deberían ser reemplazados de manera similar con sus contrapartes actualizadas.
El primero se puede sustituir por \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},
}
Para el segundo, positioning
se prefiere la sintaxis de la biblioteca y ya la está cargando, por lo que, nuevamente, podemos simplemente usarla. Por ejemplo,
\node[frame,right=1cm of FF, xshift=3cm, label={below:$\F^{\prime}$}] (Fp){};
En lugar de shapes
, queremos shapes.geometric
cuál proporciona el ellipse
. La versión actualizada arrows
es arrows.meta
pero no la estás usando, por lo que tampoco la he cargado aquí.
\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}
Respuesta2
El siguiente es el código actualizado; gracias a AJN por su respuesta! :)
\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}
Lo que produce el siguiente resultado:
Curiosamente, si eliminas el argumento 'recordar imagen' de la imagen exterior de TiKz y compilas en TexStudio con PdfLaTeX presionando F6, la imagen se divide de diferentes maneras con un ciclo de longitud 2 LOL. No estoy seguro de cómo puedo explicar esto... ¡Definitivamente requerirá más investigación! :) ¡Gracias de nuevo por la ayuda de todos!