TikZ dibuja una línea de una página a otra

TikZ dibuja una línea de una página a otra

Estoy en un entorno de dos lados y tengo dos imágenes tikz en figuras en la parte superior de cada una de las dos páginas opuestas. ¿Hay alguna manera de dibujar líneas que conecten las dos imágenes tikz en las dos páginas? He logrado dibujar las partes de las líneas que pertenecen a la segunda página. ¿Supongo que no podremos volver atrás y dibujar en la página anterior durante la compilación? ¿Existe tal vez una forma sencilla de almacenar coordenadas entre ejecuciones de compilación, de modo que sepamos en la página izquierda dónde terminará la figura de la derecha?

Esto es lo que tengo ahora mismo:

\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}

Así es como imagino que debería verse: las líneas rojas son donde me gustaría tener las líneas en la página izquierda:

renderizado del mwe

Esto puede verse mal dependiendo del tipo de encuadernación del libro, pero podría quedar bien si las páginas están planas (y directamente una al lado de la otra).

Respuesta1

La tikzmarkbiblioteca ya tiene esta capacidad incorporada. Un tikzmark se refiere a una posición en una página, por lo quenormalmentecuando usamos un tikzmark, se refiere a una posición en la página de uso que corresponde a donde se definió el tikzmark en la página de definición. Pero la biblioteca tikzmark ahora también recuerda en qué página se definió y si es así.diferentea la página actual se puede aplicar un desplazamiento. El propósito de esto es imaginar las páginas dispuestas de alguna manera y hacer que el tikzmark se refiera al punto.en la página de definición.

La clave que invoca este comportamiento es next page(o next page vectorsi quieres control total). Al invocar next page=right, imaginamos que las páginas se colocan una al lado de la otra, de izquierda a derecha, y ahora parece que un tikzmark se refiere a suabsolutoposición en la que se presentan las páginas (en realidad, siempre es relativa a la posición actual, pero lo que importa son las apariencias).

Entonces, para implementar esto en su código, colocamos algunas útiles marcas tikz en las esquinas de sus imágenes (dado que las está incrustando en tikzpictureentornos, esto es muy fácil de hacer). Luego configuramos la next pageclave cuando dibujamos las líneas. El único inconveniente es que tenemos que trazar las líneas.dos veces-- una vez por cada página que cruzan las líneas (esto podría automatizarse con un poco de truco de pie de página/encabezado y el \iftikzmarkoncurrentpagecomando, pero en este caso creo que es excesivo).

\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}

Así es como se ve:

páginas vecinas con líneas dibujadas entre ellas

Respuesta2

Puedes utilizar la tikzmarkbiblioteca:

\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}

Página 1página 2

Respuesta3

tikzSe definen dos nuevos comandos y una nueva opción:

  • \rememberNode{<node name>}lo que hace que un nodo se recuerde para que pueda consultarlo antes de que se defina en la segunda ejecución (siempre que tikzpicuretambién se recuerde el lugar en el que se define este nodo),
  • \IfNodeUndefined{<node name>}{<true>}{<false>},
  • opción save nodeque debe usarse como una de las opciones de nodo y es equivalente a \rememberNode{<current node>}. Esta opción actúa de manera casi idéntica a la opción del mismo nombre proporcionada por tikzmarkpaquete/biblioteca.
\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}

ingrese la descripción de la imagen aquí

  • Actualización: inspirado en tikzmark, se agregó una nueva opción y también save nodese almacenaron macros guardadas ( ).\cs{pgf@sh@ma@<node name>}

información relacionada