TikZ проведи линию с одной страницы на другую

TikZ проведи линию с одной страницы на другую

Я нахожусь в двухсторонней среде и имею две tikzpictures в фигурах вверху каждой из двух противоположных страниц. Есть ли способ нарисовать линии, которые соединяют две tikzpictures через две страницы? Мне удалось нарисовать части линий, которые принадлежат второй странице. Я не думаю, что мы можем вернуться и нарисовать на предыдущей странице во время компиляции? Может быть, есть простой способ хранить координаты между запусками компиляции, чтобы мы знали на левой странице, где окажется правая фигура?

Вот что у меня есть сейчас:

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

Вот как я себе это представляю — красные линии там, где я хотел бы видеть линии на левой странице:

рендеринг mwe

Это может выглядеть некрасиво в зависимости от типа переплета книги, но может быть красиво, если страницы лежат ровно (и непосредственно рядом друг с другом).

решение1

В tikzmarkбиблиотеке уже встроена эта возможность. Тикмарк относится к позиции на странице, поэтомуобычнокогда мы используем tikzmark, он ссылается на позицию на странице использования, которая соответствует тому, где tikzmark был определен на странице определения. Но библиотека tikzmark теперь также помнит, на какой странице он был определен, и если этодругойк текущей странице он может применить смещение. Цель этого — представить страницы, разложенные определенным образом, и сделать так, чтобы tikzmark ссылался на точкуна странице определения.

Ключ, который вызывает это поведение, — next page(или next page vector, если вы хотите полный контроль). Вызывая next page=right, мы представляем, что страницы располагаются рядом слева направо, и tikzmark теперь, кажется, ссылается на егоабсолютныйположение при компоновке страниц (на самом деле оно всегда относительно текущего положения, но важен именно внешний вид).

Итак, чтобы реализовать это в вашем коде, мы размещаем несколько удобных tikzmarks в углах ваших изображений (поскольку вы встраиваете их в tikzpictureокружения, это очень легко сделать). Затем мы устанавливаем ключ, next pageкогда рисуем линии. Единственная загвоздка в том, что нам нужно рисовать линиидважды-- один раз для каждой страницы, которую пересекают линии (это можно автоматизировать с помощью небольших ухищрений с нижним/верхним колонтитулом и \iftikzmarkoncurrentpageкоманды, но в данном случае я думаю, что это излишне).

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

Вот как это выглядит:

соседние страницы с линиями между ними

решение2

Вы можете воспользоваться 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}

Страница 1страница 2

решение3

tikzОпределены две новые команды и новая опция:

  • \rememberNode{<node name>}что делает узел запоминаемым, так что вы можете ссылаться на него до того, как он будет определен из второго запуска (при условии, что , tikzpicureв котором этот узел определен, также запоминается),
  • \IfNodeUndefined{<node name>}{<true>}{<false>},
  • опция save node, которая должна использоваться как одна из опций узла и эквивалентна \rememberNode{<current node>}. Эта опция действует почти идентично одноименной опции, предоставляемой 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}

введите описание изображения здесь

  • Обновление: вдохновлено tikzmark, добавлена ​​новая опция save nodeи сохранены сохранённые макросы ( \cs{pgf@sh@ma@<node name>}).

Связанный контент