应该有一个推荐/标准/通常的方法来做以下事情(建议的):
\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
s。您可以改用 执行相同操作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 坐标可以导出到文本文件吗?采用两遍解决方案。