TikZ zeichnet eine Linie von einer Seite zur anderen

TikZ zeichnet eine Linie von einer Seite zur anderen

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:

Darstellung des MWE

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 tikzmarkBibliothek 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 vectorwenn Sie die volle Kontrolle wünschen). Durch den Aufruf von next page=rightstellen 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 tikzpictureUmgebungen einbetten, ist dies sehr einfach). Dann legen wir den next pageSchlü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 \iftikzmarkoncurrentpageBefehl 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:

benachbarte Seiten mit dazwischen gezogenen Linien

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}

Seite 1Seite 2

Antwort3

Es werden zwei neue Befehle und eine neue tikzOption definiert:

  • \rememberNode{<node name>}Dadurch wird ein Knoten gespeichert, sodass Sie sich beim zweiten Durchlauf darauf beziehen können, bevor er definiert wird (vorausgesetzt, dass tikzpicureauch 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 vom tikzmarkPaket/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}

Bildbeschreibung hier eingeben

  • Update: inspiriert von tikzmark, neue Option hinzugefügt und auch save nodegespeicherte Makros ( ) gespeichert .\cs{pgf@sh@ma@<node name>}

verwandte Informationen