Ссылка на внутренние узлы изображений PDF, созданных tikz, в другом документе tikz

Ссылка на внутренние узлы изображений PDF, созданных tikz, в другом документе tikz

Предположим, у меня есть два изображения, созданных с помощью tikz и сохраненных как файлы PDF. Оба имели внутренние узлы, на которые можно было ссылаться в то время. Мой вопрос: есть ли способ ссылаться на эти внутренние узлы, если я включаю их в третий документ как изображения PDF?

Конечно, этот механизм не нужен для MWE, описанного ниже, однако фактическая цель — более сложная структура.

%% file1.tex
\documentclass[tikz]{standalone};
\begin{document}
\begin{tikzpicture}
    \node[draw](1){1};
\end{tikzpicture}
\end{document}

%% file2.tex
\documentclass[tikz]{standalone};
\begin{document}
\begin{tikzpicture}
    \node[draw](2){2};
\end{tikzpicture}
\end{document}

%% file3.tex
\documentclass[tikz]{standalone};
\begin{document}
\begin{tikzpicture}
    \node[]at(-2,-2){\includegraphics{file1.pdf};
    \node[]at(+2,+2){\includegraphics{file2.pdf};
    %% here is the catch
    % \draw(1)--(2);
\end{tikzpicture}
\end{document}

saveboxи друзья могли бы стать решением, если бы они сохраняли внутренние ссылки на узлы при применении преобразований (таких как поворот или масштабирование), что, насколько мне удалось проверить, не соответствует действительности.

решение1

Обновление 2019-12-16: Это в конечном итоге было объединено вtikzmarkПакет. Код ниже работает почтикак естьс одним изменением: \usetikzlibrary{tikzmark}вместо \usetikzlibrary{savenodes}.


(2018-02-18: Обновление для учета преобразований узлов)

Пытаясь решить эту проблему, я наткнулся на код, который я написал дляКак сохранить и восстановить узлы между tikzpictures?о сохранении информации об узлах между картинками tikz. Для передачи этой информации между документами нужен просто какой-то способ ее сохранения и загрузки, а затем немного размышлений об ограничивающих рамках.

Поскольку этот код по сути используется в двух ответах, я выделил его в отдельный файл и загрузил на github. Вы можете скачать его здесьэтот репозиторий github. На данный момент это всего лишь один файл.

Вот пример на основе вашего кода. Я использую lualatexпо умолчанию, я указал изменения, если вы используете pdflatex. Обратите внимание, что я использую filecontentsпакет для генерации всех файлов из одного базового файла, если вы генерируете свои файлы другим методом, то вам не нужны эти части и вам не нужны строки \immediate\write18. Этот пример необходимо запустить с --shell-escapeопцией из-за этого.

Вот текущий пример кода:

\documentclass{article}
%\url{https://tex.stackexchange.com/q/415831/86}
\usepackage{shellesc}
\usepackage{tikz}
\usetikzlibrary{savenodes}
\usepackage{filecontents}

%% file1.tex
\begin{filecontents}{\jobname-1.tex}
\RequirePackage{luatex85}
\documentclass[tikz,border=10pt]{standalone}
\usetikzlibrary{savenodes,shapes.geometric}
\begin{document}
\begin{tikzpicture}[save nodes to file]
\node[draw,rotate=-30,save node](1) at (-2,0) {1};
\draw[->] (0,0) -- (1);
\node[draw,ellipse,save node] (c) at (current bounding box.center) {};
\end{tikzpicture}
\end{document}
\end{filecontents}

%% file2.tex
\begin{filecontents}{\jobname-2.tex}
\RequirePackage{luatex85}
\documentclass[tikz,border=10pt]{standalone}
\usetikzlibrary{savenodes,shapes.geometric}
\begin{document}
\begin{tikzpicture}[save nodes to file]
\node[draw,rotate=-70,save node] (2) at (2,0) {2};
\draw[->] (0,0) -- (2);
\node[draw,ellipse,save node] (c) at (current bounding box.center) {};
\end{tikzpicture}
\end{document}
\end{filecontents}

%% file3.tex

%\immediate\write18{lualatex \jobname-1.tex}
%\immediate\write18{lualatex \jobname-2.tex}

\begin{document}
\begin{tikzpicture}

\node[draw,
  rotate=30,
  restore nodes from file={[transform saved nodes,name prefix=pic-1-]{\jobname-1}}
] (a-1) at (-2,-3) {\includegraphics{\jobname-1.pdf}};

\node[draw,
  rotate=70,
  restore nodes from file={[transform saved nodes,name prefix=pic-2-]{\jobname-2}}
] (a-2) at (+2,+2) {\includegraphics{\jobname-2.pdf}};

\draw[red] (pic-1-1.north west) --  (pic-1-1.north east) --  (pic-1-1.south east) --  (pic-1-1.south west) -- cycle;
\draw[red] (pic-2-2.north west) --  (pic-2-2.north east) --  (pic-2-2.south east) --  (pic-2-2.south west) -- cycle;

\node[red] at (pic-1-1) {1};
\node[red] at (pic-2-2) {2};

\draw (a-1) circle[radius=5pt];
\draw (a-2) circle[radius=5pt];

\draw (pic-1-1) -- (pic-2-2);
\end{tikzpicture}
\end{document}

Интерфейс теперь через клавиши TikZ. Определены следующие:

  • save nodes to fileв области действия это говорит о том, что любые узлы, отмеченные для сохранения в области действия, должны быть сохранены в файле (называемом \jobname.nodes). Это логическое значение. Для запуска механизма сохранения должен быть указан один из этих или следующих ключей (или оба).
  • set node group=<group name>в области видимости, если не выполняется сохранение в файл, то узлы сохраняются как «группа узлов», это задает имя.
  • save nodeна узле это помечает этот узел как подлежащий сохранению (в файле или списке).
  • restore nodes from file=<file name>, это загрузит узлы, сохраненные из указанного файла.
  • restore nodes from list=<group name>, это загружает узлы, сохраненные из указанной группы.
  • transform saved nodes, это означает, что восстановленные узлы преобразуются с помощью преобразования последнего узла (обычно это следует использовать, если restore nodes from ...на узле применяется ).
  • name prefix=...это не новый ключ, но он полезен. Восстановленные узлы берут name prefixи name suffixиз системы именования узлов TikZ, поэтому указание этого ключа — полезный способ автоматического добавления префикса (или суффикса) к каждому имени восстановленного узла. Обратите внимание, что если это используетсяс transform saved nodesтогда порядок имеет значение: это должно произойтипосле transform saved nodes.

Результат:

Загрузка информации об узле

Красные узлы накладываются поверх исходных узлов.

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