Angenommen, ich habe zwei Bilder, die mit Tikz erstellt und als PDF-Dateien gespeichert wurden. Beide hatten interne Knoten, auf die zu diesem Zeitpunkt verwiesen werden konnte. Meine Frage ist: Gibt es eine Möglichkeit, auf diese internen Knoten zu verweisen, wenn ich sie als PDF-Bilder in ein drittes Dokument einfüge?
Natürlich wird dieser Mechanismus für das unten stehende MWE nicht benötigt, das eigentliche Ziel ist jedoch eine komplexere Struktur.
%% 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
und Freunde könnten eine Lösung sein, wenn sie die internen Knotenreferenzen beim Anwenden von Transformationen (wie Drehen oder Skalieren) beibehalten, was, soweit ich es testen konnte, nicht der Fall ist.
Antwort1
Aktualisierung 2019-12-16: Dies wurde schließlich in dastikzmark
Paket. Der folgende Code funktioniert fastwie es istmit einer Änderung: \usetikzlibrary{tikzmark}
statt \usetikzlibrary{savenodes}
.
(18.02.2018: Update zur Berücksichtigung von Knotentransformationen)
Beim Versuch, eine Lösung für dieses Problem zu finden, stieß ich auf Code, den ich fürWie speichere und stelle ich die Knoten zwischen Tikz-Bildern wieder her?über das Speichern von Knoteninformationen zwischen Tikz-Bildern. Um diese Informationen zwischen Dokumenten zu übertragen, muss man sie nur irgendwie speichern und laden und dann ein bisschen über Begrenzungsrahmen nachdenken.
Da dieser Code im Wesentlichen in zwei Antworten verwendet wird, habe ich ihn in eine separate Datei gepackt und auf github hochgeladen. Sie können ihn hier herunterladen:dieses GitHub-Repository. Im Moment ist es nur eine einzelne Datei.
Hier ist ein Beispiel basierend auf Ihrem Code. Ich verwende lualatex
standardmäßig und habe die Änderungen angegeben, wenn Sie verwenden pdflatex
. Beachten Sie, dass ich das Paket verwende, filecontents
um alle Dateien aus einer Basisdatei zu generieren. Wenn Sie Ihre Dateien mit einer anderen Methode generieren, benötigen Sie diese Teile und die Zeilen nicht . Aus diesem Grund \immediate\write18
muss dieses Beispiel mit der Option ausgeführt werden .--shell-escape
Hier der aktuelle Beispielcode:
\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}
Die Schnittstelle erfolgt nun über TikZ-Tasten. Die definierten sind:
save nodes to file
In einem Bereich bedeutet dies, dass alle zum Speichern markierten Knoten in einer Datei (mit dem Namen\jobname.nodes
) gespeichert werden sollen. Dies ist ein Boolescher Wert. Einer dieser oder der nächste Schlüssel (oder beide) muss angegeben werden, um den Speichermechanismus auszulösen.set node group=<group name>
Wenn in einem Bereich nicht in einer Datei gespeichert wird, werden die Knoten als „Knotengruppe“ gespeichert. Dadurch wird der Name festgelegt.save node
Auf einem Knoten wird dieser Knoten dadurch als zu speichernder Knoten markiert (entweder in einer Datei oder einer Liste).restore nodes from file=<file name>
, dadurch werden die aus der angegebenen Datei gespeicherten Knoten geladen.restore nodes from list=<group name>
, dadurch werden die aus der angegebenen Gruppe gespeicherten Knoten geladen.transform saved nodes
, bedeutet dies, dass die wiederhergestellten Knoten mit der Transformation des letzten Knotens transformiert werden (normalerweise sollte dies verwendet werden, wennrestore nodes from ...
auf einem Knoten verwendet wird).name prefix=...
Dies ist kein neuer Schlüssel, aber ein nützlicher. Die wiederhergestellten Knoten übernehmen dasname prefix
undname suffix
aus dem Knotenbenennungssystem von TikZ, daher ist die Eingabe dieses Schlüssels eine nützliche Möglichkeit, jedem wiederhergestellten Knotennamen automatisch ein Präfix (oder Suffix) hinzuzufügen. Beachten Sie, dass, wenn dies verwendet wirdmittransform saved nodes
dann kommt es auf die Reihenfolge an: das muss kommennachtransform saved nodes
.
Ergebnis:
Die roten Knoten werden über die ursprünglichen Knoten gelegt.