Создание гиперссылок на повернутые узлы 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 (и принимая во внимание комментарий Джаспера Хабихта, который был опубликован, когда я завершал тестирование), вот «улучшенная» версия, которая вычисляет угол поворота.

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

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