Предположим, у меня есть два изображения, созданных с помощью 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
.
Результат:
Красные узлы накладываются поверх исходных узлов.