Referencie nós internos de imagens PDF geradas pelo tikz em outro documento tikz

Referencie nós internos de imagens PDF geradas pelo tikz em outro documento tikz

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}

saveboxe 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 aotikzmarkpacote. 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 lualatexpor padrão, já indiquei as alterações caso você use pdflatex. Observe que estou usando o filecontentspacote 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\write18linhas. Este exemplo precisa ser executado com a --shell-escapeopçã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 fileem 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 nodeem 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 se restore nodes from ...for usado em um nó).
  • name prefix=...esta não é uma chave nova, mas é útil. Os nós restaurados selecionam name prefixe name suffixdo 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 usadocom transform saved nodesentão a ordem importa: isso deve acontecerdepois transform saved nodes.

Resultado:

Carregando informações do nó

Os nós vermelhos são sobrepostos aos nós originais.

informação relacionada