
Читаю давно, публикую впервые. Я просто не могу найти решение этой проблемы, поэтому прислушиваюсь к вашим экспертным советам! Сначала я пытался создать 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. Не уверен, как это объяснить... Определенно потребуются дополнительные исследования! :) Еще раз спасибо всем за помощь!