TikZ traça uma linha de uma página para outra

TikZ traça uma linha de uma página para outra

Estou em um ambiente bilateral e tenho duas imagens tikz em figuras no topo de cada uma das duas páginas opostas. Existe uma maneira de desenhar linhas que conectem as duas imagens tikz nas duas páginas? Consegui desenhar as partes das linhas que pertencem à segunda página. Suponho que não podemos voltar e desenhar na página anterior durante a compilação. Existe talvez uma maneira simples de armazenar coordenadas entre execuções de compilação, para que possamos saber na página esquerda onde a figura certa terminará?

Aqui está o que tenho agora:

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

É assim que imagino que deveria ser - as linhas vermelhas estão onde eu gostaria de colocar as linhas na página esquerda:

renderização do mwe

Isso pode parecer ruim dependendo do tipo de encadernação do livro, mas pode ser legal se as páginas estiverem planas (e diretamente uma ao lado da outra).

Responder1

A tikzmarkbiblioteca já possui essa capacidade integrada. Um tikzmark se refere a uma posição em uma página, entãonormalmentequando usamos um tikzmark, ele se refere a uma posição na página de uso que corresponde ao local onde o tikzmark foi definido na página de definição. Mas a biblioteca tikzmark agora também lembra em qual página foi definida e se fordiferenteà página atual, ele pode aplicar um deslocamento. O objetivo disso é imaginar as páginas dispostas de alguma forma e fazer com que o tikzmark se refira ao pontona página de definição.

A chave que invoca esse comportamento é next page(ou next page vectorse você quiser controle total). Ao invocar next page=right, imaginamos as páginas sendo dispostas lado a lado da esquerda para a direita e um tikzmark agora parece se referir ao seuabsolutoposição à medida que as páginas são dispostas (na verdade, é sempre relativa à posição atual, mas o que importa são as aparências).

Então, para implementar isso em seu código, colocamos alguns tikzmarks úteis nos cantos de suas imagens (já que você as está incorporando em tikzpictureambientes, isso é muito fácil de fazer). Então definimos a next pagechave quando desenhamos as linhas. O único problema é que temos que traçar os limitesduas vezes- uma vez para cada página que as linhas cruzam (isso pode ser automatizado com alguns truques de rodapé/cabeçalho e o \iftikzmarkoncurrentpagecomando, mas neste caso acho que é um exagero).

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

Aqui está o que parece:

páginas vizinhas com linhas desenhadas entre elas

Responder2

Você pode usar a 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

Responder3

Dois novos comandos e uma nova tikzopção são definidos:

  • \rememberNode{<node name>}que faz com que um nó seja lembrado para que você possa consultá-lo antes de ser definido na segunda execução (desde que o local tikzpicureem que esse nó está definido também seja lembrado),
  • \IfNodeUndefined{<node name>}{<true>}{<false>},
  • opção save nodeque deve ser usada como uma das opções do nó e é equivalente a \rememberNode{<current node>}. Esta opção atua de forma quase idêntica à opção de mesmo nome fornecida por tikzmarkpackage/library.
\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}

insira a descrição da imagem aqui

  • Atualização: inspirado em tikzmark, adicionou nova opção e também save nodearmazenou macros salvas ( ).\cs{pgf@sh@ma@<node name>}

informação relacionada