如何選擇性地告訴 tikz 節點應該透過添加所有封閉 tikz 圖片的所有座標來獲取其座標?

如何選擇性地告訴 tikz 節點應該透過添加所有封閉 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) 加到節點的座標(0 點,0 點)。

當然,程式碼

\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來執行相同的操作。在下面的程式碼中,我為您的節點添加了一些名稱,只是為了區分它們。程式碼末端的箭頭與硬編碼圖片中的箭頭不同,因為它的端點衍生於node10and not 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)現在放置一些東西,所有節點值都需要更新,因為邊界框現在突然變成 17ish x 17ish。所以節點的放置應該要延到整張圖排版完畢之後。我們甚至還沒有觸及諸如縮放和平移之類的轉換。

因此,我的觀點是,透過簡單的操作,這不會成功。我重申一般原則:不要嵌套 TikZ 圖片。總有另一種方式。

激發這個方向的實際問題(無論是什麼)可能可以透過以下答案來解決tikz 座標可以匯出到文字檔案嗎?使用兩遍解決方案。

相關內容