ネストされたTikZpicturesの問題

ネストされたTikZpicturesの問題

長年の読者ですが、初めて投稿します。この問題の解決策が見つからないので、専門家のアドバイスに従います。最初は TiKzpicture のノード内に TiKzpicture を作成しようとしましたが、その後、内側の TiKzpicture 内のノード間にエッジを描画しようとしたときに、次のエラーが発生しました。

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

(TexStudio にエラーの全文を教えてもらいながら、実際にはエラーの行が完全には表示されなかったため、問題のある最初の行をコピーしました。)

私はこの投稿を読みました (適切な書式でリンクを投稿するには評判が足りません。うーん!!)tikzpicture のネスト化を回避するにはどうすればいいですか?) 提案された解決策の 1 つは、TiKzpicture を含む lrbox を作成し、ドキュメントの序文で宣言されているコマンドを次のように使用するというものでした。

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

これは実際に上記の問題を解決し、目的のノード (例: (w0, v0) と (w1, v1)) 間のエッジが正常に描画されました。ただし、新しい問題が発生しました。lrbox に含まれる TiKzpicture 内のノードから「外側」の 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}  

楕円内に世界をうまく配置し、これらの構造の間にエッジを持たせることができる代替ソリューションはありますか? よろしくお願いします!

編集: また、lrbox 内の \disjUn TiKzpicture を 2 つの TiKzpicture のコンポーネントとして使用していることにも注意してください。ダイアグラムを 1 か所で編集するだけで、変更が両方のダイアグラムに反映される点が気に入りました。ただし、この環境内ではノードへのエッジもノードからのエッジも描画できないように見えるのは問題です :(

私の友人は、さまざまな構造を含めるために \begin{scope}[...] \end{scope} を使用することを勧めましたが、コードの再利用の問題と、楕円に対するワールド (黒い点) の配置の問題が残っています... 読んでいただきありがとうございました! :)

編集2: AJNのおかげで、私はもともと

remember picture

間違った TiKz ピクチャ内の引数。これは内部の TiKz ピクチャ上にあるはずです。これは、親 TiKz ピクチャで使用するノード名をコンパイラに記憶させたいためだと思います。

答え1

なぜ別のボックスが必要なのか分かりませんまたはここではa ですpic。いずれにせよロードするのでfit、これを使用して 2 つのノードF0と を含めることができますF1

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

\tikzstyleは構文と同様に非推奨であることに注意してください<direction> of=。同様にarrowsshapes更新された対応するものに置き換える必要があります。

最初のものは次のように置き換えることができます\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},
}

2番目については、positioningライブラリの構文が優先され、すでにロードされているので、これも単純にそれを使用できます。たとえば、

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

の代わりに、を提供する がshapes必要です。 の更新バージョンはですが、使用していないため、ここではどちらもロードしていません。shapes.geometricellipsearrowsarrows.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 画像から「画像を記憶する」引数を削除し、F6 キーを押して TexStudio で PdfLaTeX でコンパイルすると、画像が長さ 2 のサイクルでさまざまな方法で分割されます (笑)。これをどう説明すればよいかわかりません... 間違いなく、さらに調査する必要があります! :) 皆さんのご協力に改めて感謝します!

関連情報