Проблемы с вложенными TikZpictures

Проблемы с вложенными TikZpictures

Читаю давно, публикую впервые. Я просто не могу найти решение этой проблемы, поэтому прислушиваюсь к вашим экспертным советам! Сначала я пытался создать TiKzpicture внутри узла TiKzpicture, но затем, когда я попытался нарисовать ребра между узлами внутри внутреннего TiKzpicture, я получил следующую ошибку:

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

(Ошибка на самом деле не отображала строку полностью, как бы я ни пытался уговорить TexStudio сообщить мне полный текст ошибки, поэтому я просто скопировал первую содержащую ошибку строку.)

Я прочитал этот пост (у меня недостаточно репутации, чтобы размещать ссылки с соответствующим форматированием. Уф!!Как избежать вложенности tikzpicture?) Одним из предложенных решений было создание lrbox, который содержал бы TiKzpicture, а затем использование команды, объявленной в преамбуле документа, следующим образом:

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

Это фактически решило проблему выше, и ребра были успешно нарисованы между желаемыми узлами (например, (w0, v0) и (w1, v1). Однако возникла новая проблема: я пытаюсь нарисовать ребро из узла внутри TiKzpicture, содержащегося в lrbox, к узлу во «внешнем» TiKzpicture. Насколько я понимаю, содержимое lrbox визуализируется до содержимого внешнего TiKzpicture; однако я не уверен, как еще к этому подойти.

Вот что было до добавления края, и что произошло после добавления края:

Перед добавлением вызывающего раздражение края

Полный вид сломанного края

Вот мой полный код:

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

Есть ли альтернативные решения, где я могу красиво расположить миры внутри эллипсов и иметь ребра между этими структурами? Заранее большое спасибо!

EDIT: Я также хотел бы отметить, что я использую \disjUn TiKzpicture в lrbox как компонент двух TiKzpictures; мне понравилось, что я мог редактировать диаграмму только в одном месте и отображать изменения в обеих диаграммах! Однако тот факт, что я не могу рисовать ребра к узлам или от них в этой среде, является проблематичным :(

Мой друг рекомендовал использовать \begin{scope}[...] \end{scope} для хранения различных структур, но все еще остается проблема повторного использования кода и позиционирования миров (черных точек) относительно овалов... Еще раз спасибо за чтение! :)

EDIT2: Благодаря AJN я узнал, что изначально я использовал

remember picture

Аргумент в неправильном изображении TiKz; он должен быть на внутреннем изображении TiKz; я полагаю, это потому, что мы хотим, чтобы компилятор запомнил имена узлов для использования в родительском изображении TiKz.

решение1

Я не понимаю, зачем вам отдельная коробка.илиздесь pic. Поскольку вы в любом случае загружаете fit, мы можем просто использовать это для хранения двух узлов F0и F1.

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

Обратите внимание, что этот \tikzstyleпараметр устарел, как и его <direction> of=синтаксис, arrowsи его shapesследует заменить на обновленные аналоги.

Первое можно заменить на \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},
}

Для второго positioningсинтаксис библиотеки предпочтителен, и вы уже загружаете его, поэтому, опять же, мы можем просто использовать его. Например,

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

Вместо shapes, мы хотим shapes.geometric, который предоставляет ellipse. Обновленная версия arrowsесть arrows.meta, но вы ее не используете, поэтому я не загрузил ни одну из них здесь.

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

подогнанные узлы

решение2

Ниже представлен обновленный код; спасибо AJN за ответ! :)

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

Что дает следующий результат:

введите описание изображения здесь

Забавно, что если убрать аргумент «запомнить картинку» из внешней картинки TiKz и скомпилировать в TexStudio с PdfLaTeX, нажав F6, картинка будет прерываться разными способами с циклом длиной 2 LOL. Не уверен, как это объяснить... Определенно потребуются дополнительные исследования! :) Еще раз спасибо всем за помощь!

Связанный контент