Supongamos que tengo dos imágenes generadas con tikz y guardadas como archivos pdf. Ambos tenían nodos internos a los que se podía hacer referencia en ese momento. Mi pregunta es: ¿hay alguna manera de hacer referencia a esos nodos internos si los incluyo en un tercer documento como imágenes PDF?
Por supuesto, este mecanismo no es necesario para el MWE siguiente; sin embargo, el objetivo real es una estructura más compleja.
%% 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
y amigos podrían ser una solución si conservan las referencias de los nodos internos cuando se aplican transformaciones (como rotar o escalar), lo cual no es el caso hasta donde pude probar.
Respuesta1
Actualización 2019-12-16: Este terminó fusionándose con eltikzmark
paquete. El siguiente código funciona casicomo escon un cambio: \usetikzlibrary{tikzmark}
en lugar de \usetikzlibrary{savenodes}
.
(2018-02-18: Actualización para tener en cuenta las transformaciones de nodos)
Mientras intentaba encontrar una solución a esto, encontré un código que había escrito para¿Cómo guardar y restaurar los nodos entre tikzpictures?sobre cómo guardar información de nodos entre imágenes de tikz. Para transferir esta información entre documentos sólo se necesita alguna forma de guardarla y cargarla, y luego pensar un poco en los cuadros delimitadores.
Como este código se usa esencialmente en dos respuestas, lo puse en un archivo separado y lo cargué en github. Puedes descargarlo desdeeste repositorio de github. Por el momento, es solo un archivo.
Aquí hay un ejemplo basado en su código. Yo uso lualatex
por defecto, te he indicado los cambios si usas pdflatex
. Tenga en cuenta que estoy usando el filecontents
paquete para generar todos los archivos a partir de un archivo base; si está generando sus archivos mediante un método diferente, entonces no necesita estas partes ni las \immediate\write18
líneas. Este ejemplo necesita ejecutarse con la --shell-escape
opción debido a esto.
Aquí está el código de ejemplo actual:
\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}
La interfaz ahora es a través de teclas TikZ. Los definidos son:
save nodes to file
en un ámbito, esto dice que cualquier nodo marcado para guardarse en el ámbito debe guardarse en un archivo (llamado\jobname.nodes
). Este es un booleano. Se debe proporcionar una de esta o las siguientes claves (o ambas) para activar el mecanismo de guardado.set node group=<group name>
en un ámbito, si no se guardan en un archivo, los nodos se guardan como un "grupo de nodos", esto establece el nombre.save node
en un nodo, esto marca ese nodo como uno para guardar (ya sea en un archivo o en una lista).restore nodes from file=<file name>
, esto se carga en los nodos guardados desde el archivo dado.restore nodes from list=<group name>
, esto se carga en los nodos guardados del grupo dado.transform saved nodes
, esto significa que los nodos restaurados se transforman con la transformación del último nodo (normalmente, esto debe usarse si serestore nodes from ...
usa en un nodo).name prefix=...
Esta no es una clave nueva, pero es útil. Los nodos restaurados recogen elname prefix
yname suffix
del sistema de nombres de nodos de TikZ, por lo que poner esta clave es una forma útil de agregar automáticamente un prefijo (o sufijo) a cada nombre de nodo restaurado. Tenga en cuenta que si esto se utilizacontransform saved nodes
entonces el orden importa: esto debe llegardespuéstransform saved nodes
.
Resultado:
Los nodos rojos se superponen sobre los nodos originales.