在另一個 tikz 文件中引用 tikz 產生的 pdf 影像的內部節點

在另一個 tikz 文件中引用 tikz 產生的 pdf 影像的內部節點

假設我有兩張使用 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:更新以考慮節點轉換

在嘗試解決此問題時,我遇到了一些我編寫的程式碼如何保存和恢復tikz圖片之間的節點?關於保存 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=...這不是一把新鑰匙,但卻是一把有用的鑰匙。恢復的節點從 TikZ 的節點命名系統中獲取name prefixname suffix,因此放置此鍵是自動為每個恢復的節點名稱添加前綴(或後綴)的有用方法。請注意,如果使用此 transform saved nodes那麼順序很重要:這必須來 transform saved nodes

結果:

載入節點資訊

紅色節點覆蓋在原始節點之上。

相關內容