
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:
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 pic
aqui. Como você está carregando fit
de qualquer maneira, podemos simplesmente usar isso para conter os dois nós F0
e F1
.
\node (FF) [fit=(F0) (F1), draw=white, label={below:$\F \oplus \F$}] {};
Observe que \tikzstyle
está obsoleto assim como a <direction> of=
sintaxe. arrows
e shapes
devem 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 positioning
sintaxe 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.geometric
que 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}
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:
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!