Ich befinde mich in einer Twoside-Umgebung und habe oben auf jeder der beiden gegenüberliegenden Seiten zwei Tikzpictures in Abbildungen. Gibt es eine Möglichkeit, Linien zu zeichnen, die die beiden Tikzpictures über die beiden Seiten hinweg verbinden? Ich habe es geschafft, die Teile der Linien zu zeichnen, die auf die zweite Seite gehören. Ich nehme an, wir können während der Kompilierung nicht zurückgehen und auf der vorherigen Seite zeichnen? Gibt es vielleicht eine einfache Möglichkeit, Koordinaten zwischen Kompilierungsläufen zu speichern, sodass wir auf der linken Seite wissen, wo die rechte Abbildung landen wird?
Folgendes habe ich gerade:
\documentclass[twoside]{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{graphicx}
\usepackage{blindtext}
\begin{document}
\blindtext
\begin{figure}
\centering
\begin{tikzpicture}[remember picture]
\node[inner sep=0, outer sep=0] (A) {\includegraphics[width=\textwidth,height=5cm]{example-image-a}};
\end{tikzpicture}
\caption{Stuff.}
\end{figure}
\clearpage
\blindtext
\begin{figure}
\centering
\begin{tikzpicture}[remember picture]
\node[inner sep=0, outer sep=0] (B) {\includegraphics[height=3cm]{example-image-b}};
\end{tikzpicture}
\caption{Related stuff.}
\end{figure}
\begin{tikzpicture}[overlay, remember picture]
\draw [ultra thin,dashed] ($ (A.north east)-(\pagewidth,0) $) -- (B.north west);
\draw [ultra thin,dashed] ($ (A.south east)-(\pagewidth,0) $) -- (B.south west);
\end{tikzpicture}
\end{document}
So stelle ich mir das vor – die roten Linien sind dort, wo ich die Linien auf der linken Seite haben möchte:
Dies kann je nach Art der Buchbindung unschön aussehen, kann aber hübsch aussehen, wenn die Seiten flach (und direkt nebeneinander) liegen.
Antwort1
Die tikzmark
Bibliothek hat diese Fähigkeit bereits eingebaut. Ein Tikzmark bezieht sich auf eine Position auf einer Seite, alsonormalerweiseWenn wir ein Tikzmark verwenden, verweist es auf eine Position auf der verwendeten Seite, die der Stelle entspricht, an der das Tikzmark auf der Definitionsseite definiert wurde. Die Tikzmark-Bibliothek merkt sich jetzt aber auch, auf welcher Seite es definiert wurde und ob diesanderszur aktuellen Seite kann ein Offset angewendet werden. Der Zweck besteht darin, sich die Seiten in irgendeiner Weise vorzustellen und das Tikzmark auf den Punkt zu verweisenauf der Seite der Definition.
Der Schlüssel, der dieses Verhalten auslöst, ist next page
(oder next page vector
wenn Sie die volle Kontrolle wünschen). Durch den Aufruf von next page=right
stellen wir uns vor, dass die Seiten nebeneinander von links nach rechts angeordnet werden und ein Tikzmark nun auf seineabsolutPosition, in der die Seiten angeordnet sind (tatsächlich ist es immer relativ zur aktuellen Position, aber es kommt auf das Erscheinungsbild an).
Um dies in Ihren Code zu implementieren, platzieren wir einige praktische Tikzmarks an den Ecken Ihrer Bilder (da Sie sie in tikzpicture
Umgebungen einbetten, ist dies sehr einfach). Dann legen wir den next page
Schlüssel fest, wenn wir die Linien zeichnen. Der einzige Haken ist, dass wir die Linien zeichnen müssenzweimal– einmal für jede Seite, auf der sich die Linien kreuzen (das könnte mit ein paar Tricks in den Fuß-/Kopfzeilen und dem \iftikzmarkoncurrentpage
Befehl automatisiert werden, aber in diesem Fall halte ich das für übertrieben).
\documentclass[twoside]{article}
%\url{https://tex.stackexchange.com/q/562726/86}
\usepackage{tikz}
\usetikzlibrary{tikzmark}
\usepackage{graphicx}
\usepackage{blindtext}
\begin{document}
\blindtext
\begin{figure}
\centering
\begin{tikzpicture}[remember picture,next page=right]
\node[inner sep=0, outer sep=0] (A) {\includegraphics[width=\textwidth,height=5cm]{example-image-a}};
\tikzmark{Ane}{(A.north east)}
\tikzmark{Ase}{(A.south east)}
\draw [ultra thin,dashed,overlay] (pic cs:Ane) -- (pic cs:Bnw);
\draw [ultra thin,dashed,overlay] (pic cs:Ase) -- (pic cs:Bsw);
\end{tikzpicture}
\caption{Stuff.}
\end{figure}
\clearpage
\blindtext
\begin{figure}
\centering
\begin{tikzpicture}[remember picture,next page=right]
\node[inner sep=0, outer sep=0] (B) {\includegraphics[height=3cm]{example-image-b}};
\tikzmark{Bnw}{(B.north west)}
\tikzmark{Bsw}{(B.south west)}
\draw [ultra thin,dashed,overlay] (pic cs:Ane) -- (pic cs:Bnw);
\draw [ultra thin,dashed,overlay] (pic cs:Ase) -- (pic cs:Bsw);
\end{tikzpicture}
\caption{Related stuff.}
\end{figure}
\end{document}
So sieht das aus:
Antwort2
Sie können die Bibliothek verwenden tikzmark
:
\documentclass{article}
\usepackage[a4paper]{geometry}
\usepackage{tikz}
\usetikzlibrary{tikzmark}
\usepackage{lipsum}
\begin{document}
\begin{figure}[t]
\centering
\begin{tikzpicture}[remember picture]
\node[inner sep=0] (a) {\includegraphics[width=5cm]{example-image-a}};
\tikzmark{ane}{(a.north east)}
\tikzmark{ase}{(a.south east)}
\iftikzmark{bnw}{
\begin{scope}[overlay]
\draw[red] ([xshift=\paperwidth]pic cs:bnw) -- (pic cs:ane);
\draw[red] ([xshift=\paperwidth]pic cs:bsw) -- (pic cs:ase);
\end{scope}
}{}
\end{tikzpicture}
\caption{first figure}
\end{figure}
\lipsum[4-10]
\begin{figure}[t]
\centering
\begin{tikzpicture}[remember picture]
\node[inner sep=0] (b) {\includegraphics[width=3cm]{example-image-b}};
\tikzmark{bnw}{(b.north west)}
\tikzmark{bsw}{(b.south west)}
\iftikzmark{ane}{
\begin{scope}[overlay]
\draw[red] (pic cs:bnw) -- ([xshift=-\paperwidth]pic cs:ane);
\draw[red] (pic cs:bsw) -- ([xshift=-\paperwidth]pic cs:ase);
\end{scope}
}{}
\end{tikzpicture}
\caption{seconde figure}
\end{figure}
\end{document}
Antwort3
Es werden zwei neue Befehle und eine neue tikz
Option definiert:
\rememberNode{<node name>}
Dadurch wird ein Knoten gespeichert, sodass Sie sich beim zweiten Durchlauf darauf beziehen können, bevor er definiert wird (vorausgesetzt, dasstikzpicure
auch die Datei, in der dieser Knoten definiert ist, gespeichert wird).\IfNodeUndefined{<node name>}{<true>}{<false>}
,- Option
save node
, die als eine der Knotenoptionen verwendet werden sollte und gleichwertig ist mit\rememberNode{<current node>}
. Diese Option verhält sich fast identisch zur gleichnamigen Option, die vomtikzmark
Paket/der Bibliothek bereitgestellt wird.
\documentclass[twoside]{article}
\usepackage{tikz}
\usepackage{graphicx}
\usepackage{blindtext}
\makeatletter
\newcommand\rememberNode[1]{%
\pgfutil@ifundefined{pgf@sh@ns@#1}{}{%
\@rememberNode{pgf@sh@ns@#1}%
\@rememberNode{pgf@sh@np@#1}%
\@rememberNode{pgf@sh@nt@#1}% transform matrix relative to picture
\@rememberNode{pgf@sh@ma@#1}% saved macro, see commit 169573e1f4de
\@rememberNode{pgf@sh@pi@#1}%
}%
}
\newcommand\@rememberNode[1]{%
\write\@auxout{\gdef\expandafter\noexpand\csname #1\endcsname{\expandafter\expandafter\expandafter\unexpanded\expandafter\expandafter\expandafter{\csname #1\endcsname}}}
}
\newcommand\IfNodeUndefined[1]{%
\pgfutil@ifundefined{pgf@sh@ns@#1}
{\expandafter\@firstoftwo}{\expandafter\@secondoftwo}
}
\pgfkeysifassignable{/tikz/save node}{}{
% similar to "save node" provided by library "tikzmark"
\tikzset{
save node/.style={
append after command={%
\pgfextra{\rememberNode{\tikz@last@fig@name}}%
}
}
}
}
\makeatother
\begin{document}
\blindtext
\begin{figure}
\centering
\begin{tikzpicture}[remember picture]
\node[inner sep=0] (A) {\includegraphics[width=\textwidth,height=5cm]{example-image-a}};
\end{tikzpicture}
\caption{Stuff.}
\end{figure}
% draw lines linking to node B on the next page
\IfNodeUndefined{B}{}{%
\begin{tikzpicture}[overlay, remember picture]
\draw [thick, red]
(A.north east) -- ([xshift=\paperwidth]B.north west)
(A.south east) -- ([xshift=\paperwidth]B.south west);
\end{tikzpicture}%
}
\clearpage
\blindtext
\begin{figure}
\centering
\begin{tikzpicture}[remember picture]
\node[inner sep=0, save node] (B) {\includegraphics[height=3cm]{example-image-b}};
\end{tikzpicture}
\caption{Related stuff.}
\end{figure}
% draw lines linking to node A on the previous page
\begin{tikzpicture}[overlay, remember picture]
\draw [ultra thin,dashed]
([xshift=-\paperwidth]A.north east) -- (B.north west)
([xshift=-\paperwidth]A.south east) -- (B.south west);
\end{tikzpicture}
\end{document}
- Update: inspiriert von
tikzmark
, neue Option hinzugefügt und auchsave node
gespeicherte Makros ( ) gespeichert .\cs{pgf@sh@ma@<node name>}