如何有选择地告诉 tikz 一个节点应该通过添加所有封闭的 tikzpictures 的所有坐标来获取其坐标?

如何有选择地告诉 tikz 一个节点应该通过添加所有封闭的 tikzpictures 的所有坐标来获取其坐标?

应该有一个推荐/标准/通常的方法来做以下事情(建议的):

\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

一般建议不要使用嵌套的tikzpictures。您可以改用 执行相同操作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 坐标可以导出到文本文件吗?采用两遍解决方案。

相关内容