假設我有兩張使用 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 prefix
和name suffix
,因此放置此鍵是自動為每個恢復的節點名稱添加前綴(或後綴)的有用方法。請注意,如果使用此和transform saved nodes
那麼順序很重要:這必須來後transform saved nodes
。
結果:
紅色節點覆蓋在原始節點之上。