Problemas com imagens TikZ aninhadas

Problemas com imagens TikZ aninhadas

Leitor de longa data, postador pela primeira vez. Simplesmente não consigo encontrar uma solução para este problema, por isso recorro ao seu conselho de especialista! Inicialmente tentei criar um TiKzpicture dentro de um nó de um TiKzpicture, mas quando tentei desenhar arestas entre nós dentro do TiKzpicture interno, recebi o seguinte erro:

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

(Na verdade, o erro não exibiu totalmente a linha, não importa o quanto eu tentei persuadir o TexStudio a me dizer qual era o erro completo, então apenas copiei a primeira linha incorreta.)

Eu li este post (não tenho reputação suficiente para postar links com formatação apropriada. Ugh!!Como evitar o aninhamento do tikzpicture?) Uma solução proposta foi criar um lrbox que conteria o TiKzpicture, e então usar o comando declarado no preâmbulo do documento da seguinte forma:

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

Na verdade, isso resolveu o problema acima, e as arestas foram desenhadas com sucesso entre os nós desejados (por exemplo, (w0, v0) e (w1, v1). No entanto, surgiu um novo problema: estou tentando desenhar uma aresta de um nó dentro do TiKzpicture contido no lrbox para um nó no TiKzpicture "externo", no entanto, não tenho certeza de como abordar isso.

Aqui está o que aconteceu antes de adicionar a borda e o que acontece depois de adicionar a borda:

Antes de adicionar a borda ofensiva

Visão completa da borda quebrada

Aqui está meu 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}  

Existem soluções alternativas onde eu possa posicionar bem os mundos dentro de elipses e ter arestas entre essas estruturas? Muito obrigado antecipadamente!

EDIT: Também gostaria de observar que estou usando o \disjUn TiKzpicture em um lrbox como um componente de dois TiKzpictures; Gostei do fato de poder editar o diagrama em apenas um lugar e ter as alterações refletidas em ambos os diagramas! No entanto, o fato de não conseguir desenhar bordas de nem para nós neste ambiente é problemático :(

Um amigo meu recomendou usar \begin{scope}[...] \end{scope} para conter as diferentes estruturas, mas ainda há o problema de reutilização de código e posicionamento dos mundos (os pontos pretos) em relação ao ovais... Obrigado novamente pela leitura! :)

EDIT2: Graças ao AJN, descobri que originalmente usei o

remember picture

Argumento na imagem errada do TiKz; deve estar na imagem interna do TiKz; Suponho que isso ocorre porque queremos que o compilador lembre os nomes dos nós para uso na imagem pai do TiKz.

Responder1

Não vejo por que você precisa de uma caixa separadaouum picaqui. Como você está carregando fitde qualquer maneira, podemos simplesmente usar isso para conter os dois nós F0e F1.

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

Observe que \tikzstyleestá obsoleto assim como a <direction> of=sintaxe. arrowse shapesdevem ser igualmente substituídos por suas contrapartes atualizadas.

O primeiro pode ser substituído 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 o segundo, a positioningsintaxe da biblioteca é preferida e você já a está carregando, então, novamente, podemos simplesmente usá-la. Por exemplo,

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

No lugar de shapes, queremos shapes.geometricque forneça o ellipse. A versão atualizada arrowsé arrows.meta, mas você não a está usando, então também não carreguei aqui.

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

nós ajustados

Responder2

A seguir está o código atualizado; obrigado à AJN pela sua resposta! :)

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

O que produz a seguinte saída:

insira a descrição da imagem aqui

Curiosamente, se você remover o argumento 'lembrar imagem' da imagem externa do TiKz e compilar no TexStudio com PdfLaTeX pressionando F6, a imagem será quebrada de maneiras diferentes com um ciclo de comprimento 2 LOL. Não sei como posso explicar isso... Definitivamente exigirá mais pesquisas! :) Obrigado novamente pela ajuda de todos!

informação relacionada