Нарисуйте стрелку TikZ на нескольких страницах

Нарисуйте стрелку TikZ на нескольких страницах

Я хочу, чтобы между моими заметками на полях были стрелки, и я добился этого с помощью \tikzmarknode(рисунок 1). Но это не работает, если одна отметка находится на другой странице (рисунок 2).

Мне бы хотелось, чтобы непрерывная линия шла до конца страницы, а затем появлялась в верхней части следующей страницы (рисунок 3).

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

МВЭ:

\documentclass[10pt,oneside]{scrbook}
\usepackage{lipsum}
\usepackage[left=32.5mm, right=22.5mm, top=25mm, bottom=20mm, marginparsep=3mm]{geometry}
\usepackage{tikz}
    \usetikzlibrary{tikzmark}
\usepackage{marginnote}
\renewcommand*{\marginfont}{\footnotesize\itshape}

\begin{document}

\marginnote{\tikzmarknode{a}{Thermoplast}}
\lipsum[1]
\marginnote{\tikzmarknode{b}{teilkristallin}}
\lipsum[1]
\marginnote{\tikzmarknode{c}{aliphatisch}} 
\begin{tikzpicture}[remember picture, overlay, shorten >=1.5mm, shorten <=1.5mm,->]
    \draw ([xshift=10pt]a.south west) to ([xshift=10pt]b.north west);
    \draw ([xshift=10pt]b.south west) to ([xshift=10pt]c.north west);
\end{tikzpicture}
% \lipsum[1-6]    % Works fine
\lipsum[1-7]    % Doesn't work
\marginnote{\tikzmarknode{d}{aliphatisch}} 
\begin{tikzpicture}[remember picture, overlay, shorten >=1.5mm, shorten <=1.5mm,->]
    \draw ([xshift=10pt]c.south west) to ([xshift=10pt]d.north west);
\end{tikzpicture}

\end{document}

решение1

Библиотека tikzmarkпоставляется с проверкой \iftikzmarkoncurrentpage. Это позволяет нам различать случаи

  1. ни один из узлов на текущей странице (с возможностью того, что текущая страница находится между двумя страницами, содержащими последующие метки, которые должны быть соединены),
  2. первый узел на текущей странице,
  3. второй узел на текущей странице,
  4. оба узла на одной странице.

Эти случаи различаются в макросе \ConnectTikZmarknodes, который также соединяет узлы через разрывы страниц. Он используется, eso-picчтобы избежать необходимости добавлять макрос на нескольких страницах. Благодаря хорошим проверкам, которые идут с tikzmarkним, возможно (и, если соединение проходит через более чем одну страницу, также необходимо) добавлять \ConnectTikZmarknodesдо того, как узлы будут фактически определены.

\documentclass[10pt,oneside]{scrbook}
\usepackage{lipsum}
\usepackage[left=32.5mm, right=22.5mm, top=25mm, bottom=20mm, marginparsep=3mm]{geometry}
\usepackage{tikzpagenodes}
\usepackage{eso-pic}
\usetikzlibrary{tikzmark}
\usepackage{marginnote}
\renewcommand*{\marginfont}{\footnotesize\itshape}
\makeatletter
\newcommand\PageOfTikzmark[1]{%
\csname save@pg@\csname save@pt@\tikzmark@pp@name{#1}\endcsname\endcsname}
\makeatother
\newcommand{\ConnectTikZmarknodes}[3][]{\AddToShipoutPictureFG{%
\begin{tikzpicture}[remember picture, overlay, shorten >=1.5mm, 
    shorten <=1.5mm,#1]
\iftikzmark{#2}{\edef\pageA{\PageOfTikzmark{#2}}}{\edef\pageA{-1}}% 
\iftikzmark{#3}{\edef\pageB{\PageOfTikzmark{#3}}}{\edef\pageB{-1}}% 
\iftikzmarkoncurrentpage{#2}
\edef\myflag{1}%
\else
\edef\myflag{0}%
\fi 
\iftikzmarkoncurrentpage{#3}
\edef\myflag{\the\numexpr\myflag+2}%
\fi 
\ifcase\myflag
\or
 \draw[-] ([xshift=10pt]#2.south west)
     to ([xshift=10pt]#2.south west|-current page text area.south);
\or
 \draw[->] ([xshift=10pt]#3.north west|-current page text area.north) 
    to ([xshift=10pt]#3.north west);  
\or
 \draw[->] ([xshift=10pt]#2.south west)
     to ([xshift=10pt]#3.north west);
\fi
\ifnum\value{page}>\pageA
\ifnum\value{page}<\pageB
 \draw ([xshift=20pt]current page text area.north east) to
 ([xshift=20pt]current page text area.south east);
\fi
\fi
\end{tikzpicture}}}
\begin{document}

\marginnote{\tikzmarknode{a}{Thermoplast}}
\lipsum[1]
\marginnote{\tikzmarknode{b}{teilkristallin}}
\ConnectTikZmarknodes{a}{b}
\lipsum[1]
\marginnote{\tikzmarknode{c}{aliphatisch}} 
\ConnectTikZmarknodes{b}{c}
\lipsum[1-7]    % works fine
\marginnote{\tikzmarknode{d}{aliphatisch}} 
\ConnectTikZmarknodes{c}{d}
\ConnectTikZmarknodes{d}{e}
\lipsum[1-23]    
\marginnote{\tikzmarknode{e}{unproblematisch}} 
\end{document}

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

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