tikz を使用して生成され、pdf ファイルとして保存された 2 つの画像があるとします。どちらにも、その時点で参照できる内部ノードがありました。私の質問は、3 番目のドキュメントに 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}
ただし、 の代わりに が1 つ変更されます\usetikzlibrary{savenodes}
。
(2018-02-18: ノード変換を考慮するように更新)
この問題を解決しようとしていたときに、私が書いたコードを見つけました。tikzpictures 間のノードを保存および復元するにはどうすればよいですか?tikz 画像間でノード情報を保存する方法について。この情報をドキュメント間で転送するには、保存して読み込む方法と、境界ボックスについて少し考える必要があります。
このコードは基本的に2つの回答で使用されているため、別のファイルに入れてgithubにアップロードしました。ダウンロードするには、このgithubリポジトリ現時点では、単一のファイルのみです。
コードに基づいた例を次に示します。lualatex
デフォルトでは を使用しますが、 を使用する場合は変更を示しましたpdflatex
。 パッケージを使用して 1 つのベース ファイルからすべてのファイルを生成していることに注意してください。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
。
結果:
赤いノードは元のノードの上に重ねて表示されます。