囲んでいるすべての tikzpictures の座標をすべて追加してノードがその座標を取得するように tikz に選択的に指示するにはどうすればよいでしょうか?

囲んでいるすべての tikzpictures の座標をすべて追加してノードがその座標を取得するように tikz に選択的に指示するにはどうすればよいでしょうか?

次のようなことを実行するための推奨/標準/通常の方法があるはずです (提案されていること)。

\begin{tikzpicture}
  \node (tikzpicture0) at (0pt,100pt) []{
     \begin{tikzpicture}
                \ABSOLUTE-AND-CONTEXT-AWARE-node (node00) at (0pt,0pt) []{(0pt,0pt)};
                \node (node01) at (0pt,10pt)[]{(0pt,10pt)};
     \end{tikzpicture}               
  };
  \node (tikzpicture1) at (100pt,200pt) []{
     \begin{tikzpicture}    
                \node (node10) at (0pt,0pt) []{(0pt,0pt)};
                \node (node11) at (0pt,10pt)[]{(0pt,10pt)};
     \end{tikzpicture}                              
  };
  \node (tikzpicture2) at (200pt,300pt) []{
     \begin{tikzpicture}        
                \node (node20) at (0pt,0pt) []{(0pt,0pt)};
                \node (node21) at (0pt,10pt)[]{(0pt,10pt)};
     \end{tikzpicture}                                             
  };
  \draw[->] (node00)--($(node10)+(100pt,200pt)$);
\end{tikzpicture}

ここで、ABSOLUTE は、(node00) が定義されている tikzpicture の外部から参照できることを意味し、AND-CONTEXT-AWARE は、囲んでいる tikzpicture の座標 (0pt,100pt) がノードの座標 (0pt,0pt) に追加されることを意味します。

もちろん、コードは

\begin{tikzpicture}
  \node (tikzpicture0) at (0pt,100pt) []{
     \begin{tikzpicture}
                \node (node00) at (0pt,0pt) []{(0pt,0pt)};
                \node (node01) at (0pt,10pt)[]{(0pt,10pt)};
     \end{tikzpicture}               
  };
  \node (tikzpicture1) at (100pt,200pt) []{
     \begin{tikzpicture}    
                \node (node10) at (0pt,0pt) []{(0pt,0pt)};
                \node (node11) at (0pt,10pt)[]{(0pt,10pt)};
     \end{tikzpicture}                              
  };
  \node (tikzpicture2) at (200pt,300pt) []{
     \begin{tikzpicture}        
                \node (node20) at (0pt,0pt) []{(0pt,0pt)};
                \node (node21) at (0pt,10pt)[]{(0pt,10pt)};
     \end{tikzpicture}                                             
  };
  \draw[->] (node00)--($(node10)+(100pt,200pt)$);
\end{tikzpicture}

収穫

ここに画像の説明を入力してください

意図した図は(ハードコードされた座標で取得された)図のようになるはずである

ここに画像の説明を入力してください

おすすめは何ですか?

答え1

一般的なアドバイスとしては、ネストtikzpictureされた を使用しないことです。代わりに を使用して同じことを行うことができますscope。以下のコードでは、ノードを区別するためだけにいくつかの名前をノードに追加しました。コードの末尾の矢印は、そのエンドポイントが ではnode10なくから派生しているため、ハードコードされた図の矢印と同じではありません。代わりにnode01を使用して、赤で矢印を追加しましたnode01

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
  \node (node00) at (0pt,0pt) []{N00:(0pt,0pt)};
  \node (node01) at (0pt,10pt)[]{N01:(0pt,10pt)};
  \begin{scope}[shift={(100pt,200pt)}]
    \node (node10) at (0pt,0pt) []{N10:(0pt,0pt)};
    \node (node11) at (0pt,10pt)[]{N11:(0pt,10pt)};  
  \end{scope}
  \begin{scope}[shift={(200pt,300pt)}]
    \node (node20) at (0pt,0pt) []{N20:(0pt,0pt)};
    \node (node21) at (0pt,10pt)[]{N21:(0pt,10pt)};
  \end{scope}
  \draw[->] (node00)--($(node10)+(100pt,200pt)$) node[anchor=west]{(N10)+(100pt,200pt)};
  \draw[red,->] (node00)--($(node01)+(100pt,200pt)$);
\end{tikzpicture}
\end{document}

ここに画像の説明を入力してください

答え2

私が正しく理解しているなら、あなたの概念には問題があります。次のケースを見てみましょう。

\begin{tikzpicture}
\node at (10,10) {This was 10, 10};
\node at (15,15) {This was 15, 15};
\draw (current bounding box.south west) rectangle (current bounding box.north east);
\end{tikzpicture}

これにより、

ここに画像の説明を入力してください

注目すべき点がいくつかあります。結果として得られるボックスは、原点から最も遠い距離にあるにもかかわらず、サイズが 15x15 ではありません。また、テキストの長さのため、5x5 でもありません。

したがって、境界ボックスを事前に修正しない限り、最終的なキャンバスに対してノードが絶対的にどこにあるかを見つけることはできません。残りの解決策は、ノードの配置をハッキ​​ングし、現在の境界ボックスの値と自己サイズを含めて、それに応じてすべてを更新することです。それでも、今何かを配置すると、(-2,-2)境界ボックスが突然 17 x 17 になるので、すべてのノード値を更新する必要があります。したがって、ノードの配置は、画像全体がタイプセットされるまで延期する必要があります。そして、スケーリングや変換などの変換にはまだ触れていません。

したがって、私の意見では、これは単純な操作ではうまくいかないでしょう。私は一般的なマントラを繰り返します。TikZ 画像をネストしないでください。常に別の方法があります。

この方向へ向かう動機となった実際の問題(それが何であれ)は、おそらく次の答えで解決できるでしょう。tikz 座標をテキスト ファイルにエクスポートできますか?2 パス ソリューションを使用します。

関連情報