TikZ는 한 페이지에서 다른 페이지로 선을 그립니다.

TikZ는 한 페이지에서 다른 페이지로 선을 그립니다.

나는 양면 환경에 있고 두 개의 반대 페이지 각각의 상단에 그림으로 두 개의 tikz사진이 있습니다. 두 페이지에 걸쳐 두 개의 tikz그림을 연결하는 선을 그리는 방법이 있습니까? 두 번째 페이지에 속하는 선의 일부를 그렸습니다. 편집하는 동안 이전 페이지로 돌아가서 그릴 수는 없을 것 같은데요? 컴파일 실행 사이에 좌표를 저장하여 왼쪽 페이지에서 오른쪽 그림이 끝나는 위치를 알 수 있는 간단한 방법이 있을까요?

내가 지금 가지고 있는 것은 다음과 같습니다.

\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 라이브러리는 이제 그것이 정의된 페이지와 그것이 정의되었는지도 기억합니다.다른현재 페이지에 오프셋을 적용할 수 있습니다. 이것의 목적은 페이지가 어떤 방식으로 배치되어 있는지 상상하고 tikzmark가 요점을 참조하도록 만드는 것입니다.정의 페이지에서.

이 동작을 호출하는 키는 next page(또는 next page vector전체 제어를 원하는 경우)입니다. 를 호출함으로써 next page=right우리는 페이지가 왼쪽에서 오른쪽으로 나란히 배치되는 것을 상상하고 이제 tikzmark가 해당 페이지를 참조하는 것으로 나타납니다.순수한페이지 레이아웃에 따른 위치입니다(실제로 항상 현재 위치를 기준으로 하지만 중요한 것은 모양입니다).

따라서 이를 코드에 구현하기 위해 이미지 모서리에 몇 가지 편리한 tikzmark를 배치합니다( 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}

페이지 12 쪽

답변3

두 개의 새로운 명령과 새로운 tikz옵션이 정의되었습니다.

  • \rememberNode{<node name>}두 번째 실행에서 정의되기 전에 참조할 수 있도록 노드를 기억합니다( tikzpicure이 노드가 정의된 도 기억되는 경우).
  • \IfNodeUndefined{<node name>}{<true>}{<false>},
  • 옵션 save node은 노드 옵션 중 하나로 사용해야 하며 와 동일합니다 \rememberNode{<current node>}. 이 옵션은 tikzmark패키지/라이브러리 에서 제공하는 동일한 이름의 옵션과 거의 동일하게 작동합니다 .
\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>})도 저장했습니다.

관련 정보