Как выборочно сообщить 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 означает, что координата (0pt,100pt) охватывающего tikzpicture добавляется к координате узла (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 х 17 дюймов. Поэтому размещение узлов следует отложить до тех пор, пока не будет набрана вся картинка. И мы даже не коснулись преобразований, таких как масштабирование и переводы.

Таким образом, мое мнение таково, что это не сработает с простыми манипуляциями. Я повторяю общую мантру: не вкладывать картинки TikZ. Всегда есть другой путь.

Ваша реальная проблема (какой бы она ни была), которая мотивировала вас на это направление, вероятно, может быть решена с помощью ответовМожно ли экспортировать координаты tikz в текстовый файл?с двухпроходным решением.

Связанный контент