Suponha que eu tenha duas imagens geradas usando tikz e salvas como arquivos PDF. Ambos tinham nós internos que podiam ser referenciados naquele momento. Minha pergunta é: existe uma maneira de fazer referência a esses nós internos se eu os incluir em um terceiro documento como imagens PDF?
É claro que este mecanismo não é necessário para o MWE abaixo, porém o alvo real é uma estrutura mais complexa.
%% 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
e amigos poderiam ser uma solução se preservassem as referências dos nós internos quando as transformações são aplicadas (como girar ou dimensionar), o que não é o caso até onde pude testar.
Responder1
Atualização 16/12/2019: Isso acabou sendo incorporado aotikzmark
pacote. O código abaixo funciona quasecomo écom uma mudança: \usetikzlibrary{tikzmark}
em vez de \usetikzlibrary{savenodes}
.
(18/02/2018: Atualização para levar em conta as transformações dos nós)
Ao tentar uma solução para isso, me deparei com um código que escrevi paraComo salvar e restaurar os nós entre tikzpictures?sobre como salvar informações do nó entre imagens tikz. Para transferir essas informações entre documentos, basta salvá-las e carregá-las e, em seguida, pensar um pouco sobre as caixas delimitadoras.
Como esse código é essencialmente usado em duas respostas, coloquei-o em um arquivo separado e carreguei-o no github. Você pode baixá-lo emeste repositório github. No momento, é apenas um único arquivo.
Aqui está um exemplo baseado em seu código. Eu uso lualatex
por padrão, já indiquei as alterações caso você use pdflatex
. Observe que estou usando o filecontents
pacote para gerar todos os arquivos a partir de um arquivo base. Se você estiver gerando seus arquivos por um método diferente, não precisará dessas partes e não precisará das \immediate\write18
linhas. Este exemplo precisa ser executado com a --shell-escape
opção por causa disso.
Aqui está o código de exemplo atual:
\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}
A interface agora é via chaves TikZ. Os definidos são:
save nodes to file
em um escopo, isso indica que quaisquer nós marcados para serem salvos no escopo devem ser salvos em um arquivo (chamado\jobname.nodes
). Isso é um booleano. Uma destas ou as próximas chaves devem ser fornecidas (ou ambas) para acionar o mecanismo de salvamento.set node group=<group name>
em um escopo, se não for salvo em um arquivo, os nós serão salvos como um "grupo de nós", isso define o nome.save node
em um nó, marca esse nó como um nó a ser salvo (em um arquivo ou em uma lista).restore nodes from file=<file name>
, isso carrega nos nós salvos do arquivo fornecido.restore nodes from list=<group name>
, isso carrega nos nós salvos de determinado grupo.transform saved nodes
, isso significa que os nós restaurados são transformados com a transformação do último nó (normalmente, isso deve ser usado serestore nodes from ...
for usado em um nó).name prefix=...
esta não é uma chave nova, mas é útil. Os nós restaurados selecionamname prefix
ename suffix
do sistema de nomenclatura de nós do TikZ, portanto, colocar essa chave é uma maneira útil de adicionar automaticamente um prefixo (ou sufixo) a cada nome de nó restaurado. Observe que se isso for usadocomtransform saved nodes
então a ordem importa: isso deve acontecerdepoistransform saved nodes
.
Resultado:
Os nós vermelhos são sobrepostos aos nós originais.