회전된 TikZ 노드를 하이퍼링크 가능하게 만들기

회전된 TikZ 노드를 하이퍼링크 가능하게 만들기

MWE를 다음에서 수정했습니다.TikZ 노드를 하이퍼링크 가능하게 만들기샘플 노드를 60도 회전했을 때 다음과 같은 결과를 얻었습니다.

여기에 이미지 설명을 입력하세요


내 소망은 하이퍼링크가 상자와 함께 회전하는 것입니다. 표시된 대로여기, 노드 내에서 사용할 수 있지만 \rotatebox{...}이는 좋은 결과를 제공하지 않습니다. 노드 내부의 텍스트를 회전하지만 경계(또는 링크)는 회전하지 않습니다.

완벽하지 않은 결과를 모두 보여주는 수정된 MWE는 다음과 같습니다.

\documentclass{article}
\usepackage{hyperref}
\usepackage{tikz}
\usepackage{graphicx}
\usetikzlibrary{calc}
\begin{document}
\tikzset{
    hyperlink node/.style={
        alias=sourcenode,
        append after command={
            let     \p1 = (sourcenode.north west),
                \p2=(sourcenode.south east),
                \n1={\x2-\x1},
                \n2={\y1-\y2} in
            node [inner sep=0pt, outer sep=0pt,anchor=north west,at=(\p1)] {\hyperlink{#1}{\XeTeXLinkBox{\phantom{\rule{\n1}{\n2}}}}}
                    %xelatex needs \XeTeXLinkBox, won't create a link unless it
                    %finds text --- rules don't work without \XeTeXLinkBox.
                    %Still builds correctly with pdflatex and lualatex
        }
    }
}

\tikz \node [draw, inner sep=2ex,hyperlink node=pagetwo,rotate=60] {Go to Page Two};

\bigskip

\tikz \node [draw, inner sep=2ex,hyperlink node=pagetwo] {\rotatebox{30}{\hyperref[pagetwo]{I said, Page Two}}};

\clearpage
\hypertarget{pagetwo}{Page Two}
\end{document} 

답변1

비스듬한 / 경사진 / 회전된 /기울어진하이퍼링크 가능!

PDF 사양은 주석 사전 /QuadPoints의 항목을 정의합니다 /Link. 이는 일반적인 수평 링크 직사각형 내에 완전히 새겨져야 하는 임의 개수의 사각형의 모서리 좌표를 정의하고 하이퍼링크의 마우스 감지 영역을 추가로 결정합니다.

원칙적으로,임의의 모양문서 페이지의 영역이 다음과 같이 바뀔 수 있습니다.하이퍼링크이 방법을 사용하면 간단히 여러 사각형을 중첩할 수 있습니다. 개별 사각형은 직사각형일 필요도 없고 수평으로 정렬될 필요도 없습니다.

아쉽게도 평소와 같이 이러한 고급 PDF 기능을 사용하려면 Acrobat Reader가 필요합니다.


(주의: Acrobat Reader의 경우):

\documentclass{article}
\usepackage{hyperref}
\usepackage{tikz}
\usepackage{graphicx}
\usetikzlibrary{calc}
    
\makeatletter
  % patch hyperref to also include the /QuadPoints array
  \let\Hy@setpdfborderOrig\Hy@setpdfborder
  \def\Hy@setpdfborder{
    \QuadPoints
    \Hy@setpdfborderOrig
  }
  \def\writeAux{\protected@write\@mainaux}
  \def\QuadPoints{}
\makeatother

\newcounter{srcnd}

\begin{document}
\tikzset{
    hyperlink node/.style={
        alias=sourcenode,
        append after command={
            let \p1 = (sourcenode.south west),
                \p2 = (sourcenode.south east),
                \p3 = (sourcenode.north east),
                \p4 = (sourcenode.north west),
                \p5 = (sourcenode.center)
                in
            node [inner sep=0pt, outer sep=0pt,at=(\p1)] {\pdfsavepos%
              \writeAux{}{%
                \string\expandafter\string\xdef\string\csname\space srcnd\thesrcnd.x1\string\endcsname{%
                  \noexpand\hypercalcbp{\noexpand\number\pdflastxpos sp}}%
                \string\expandafter\string\xdef\string\csname\space srcnd\thesrcnd.y1\string\endcsname{%
                  \noexpand\hypercalcbp{\noexpand\number\pdflastypos sp}}}%
            }
            node [inner sep=0pt, outer sep=0pt,at=(\p2)] {\pdfsavepos%
              \writeAux{}{%
                \string\expandafter\string\xdef\string\csname\space srcnd\thesrcnd.x2\string\endcsname{%
                  \noexpand\hypercalcbp{\noexpand\number\pdflastxpos sp}}%
                \string\expandafter\string\xdef\string\csname\space srcnd\thesrcnd.y2\string\endcsname{%
                  \noexpand\hypercalcbp{\noexpand\number\pdflastypos sp}}}%
            }
            node [inner sep=0pt, outer sep=0pt,at=(\p3)] {\pdfsavepos%
              \writeAux{}{%
                \string\expandafter\string\xdef\string\csname\space srcnd\thesrcnd.x3\string\endcsname{%
                  \noexpand\hypercalcbp{\noexpand\number\pdflastxpos sp}}%
                \string\expandafter\string\xdef\string\csname\space srcnd\thesrcnd.y3\string\endcsname{%
                  \noexpand\hypercalcbp{\noexpand\number\pdflastypos sp}}}%
            }
            node [inner sep=0pt, outer sep=0pt,at=(\p4)] {\pdfsavepos%
              \writeAux{}{%
                \string\expandafter\string\xdef\string\csname\space srcnd\thesrcnd.x4\string\endcsname{%
                  \noexpand\hypercalcbp{\noexpand\number\pdflastxpos sp}}%
                \string\expandafter\string\xdef\string\csname\space srcnd\thesrcnd.y4\string\endcsname{%
                  \noexpand\hypercalcbp{\noexpand\number\pdflastypos sp}}}%
            }
            node [inner sep=0pt, outer sep=0pt,at=(\p5)] {%
              \makebox[0pt][c]{{%
                \edef\QuadPoints{/QuadPoints [
                  \csname srcnd\thesrcnd.x1\endcsname\space\csname srcnd\thesrcnd.y1\endcsname\space
                  \csname srcnd\thesrcnd.x2\endcsname\space\csname srcnd\thesrcnd.y2\endcsname\space
                  \csname srcnd\thesrcnd.x3\endcsname\space\csname srcnd\thesrcnd.y3\endcsname\space
                  \csname srcnd\thesrcnd.x4\endcsname\space\csname srcnd\thesrcnd.y4\endcsname\space
                ]}%
                \hyperlink{#1}{%
                  \raisebox{-\height}{%
                    \tikz \useasboundingbox (\p1) -- (\p2) -- (\p3) -- (\p4) -- cycle;
                  }%
                }%
              }}%
              \stepcounter{srcnd}%
            }
        }
    }
}

\tikz \node [draw, inner sep=2ex,hyperlink node=pagetwo,rotate=0] {Go to Page Two};

\bigskip

\tikz \node [draw, inner sep=2ex,hyperlink node=pagetwo,rotate=60] {Go to Page Two};

\bigskip

\tikz \node [draw, inner sep=2ex,hyperlink node=pagetwo,rotate=40] {Go to Page Two};

\bigskip

\tikz \node [draw, inner sep=2ex,hyperlink node=pagetwo,rotate=135] {I said, Page Two};

\clearpage
\hypertarget{pagetwo}{Page Two}
\end{document}

답변2

percusse에서 언급된 제한 사항을 고려하여(그리고 테스트를 완료하는 동안 게시된 Jasper Habicht의 의견을 인정함) 여기에 회전 각도를 계산하는 "개선된" 버전이 있습니다.

\documentclass{article}
\usepackage{hyperref}
\usepackage{tikz}
\usepackage{graphicx}
\usetikzlibrary{calc}
\begin{document}
\tikzset{
    hyperlink node/.style={
        alias=sourcenode,
        append after command={
            let             \p1 = (sourcenode.north west),
                \p2=(sourcenode.south east),
                \p3 = (sourcenode.south west),
                \n1={\x2-\x1},
                \n2={\y1-\y2},
                \n3={atan2(\y2-\y3,\x2-\x3)},
                \n4={veclen(\y2-\y3,\x2-\x3)},
                \n5={veclen(\y1-\y3,\x1-\x3)}
                 in
            node [inner sep=0pt, outer sep=0pt,anchor=south
            west,at=(\p3),rotate=\n3]
            {\hyperlink{#1}{\XeTeXLinkBox{\phantom{\rule{\n4}{\n5}}}}}
                    %xelatex needs \XeTeXLinkBox, won't create a link unless it
                    %finds text --- rules don't work without \XeTeXLinkBox.
                    %Still builds correctly with pdflatex and lualatex
        }
    }
}

\tikz \node [draw, inner sep=2ex,hyperlink node=pagetwo,rotate=0] {Go to Page Two};


\bigskip


\tikz \node [draw, inner sep=2ex,hyperlink node=pagetwo,rotate=60] {Go to Page Two};


\bigskip


\tikz \node [draw, inner sep=2ex,hyperlink node=pagetwo,rotate=40] {Go to Page Two};


\bigskip

\tikz \node [draw, inner sep=2ex,hyperlink node=pagetwo] {\rotatebox{30}{\hyperref[pagetwo]{I said, Page Two}}};

\clearpage
\hypertarget{pagetwo}{Page Two}
\end{document} 

xelatex와 다른 컴파일러의 출력은 다릅니다. 이 버전은 xelatex에 "최적화"되었습니다.

관련 정보