私はMWEをTikZ ノードをハイパーリンク可能にするサンプル ノードを 60 度回転させると、次の結果が得られました。
私の希望は、ハイパーリンクがボックスと一緒に回転することです。ここノード内で使用することは可能です\rotatebox{...}
が、これでは良い結果は得られません。ノード内のテキストは回転しますが、境界 (またはリンク) は回転しません。
これら 2 つの完璧とは言えない結果を示す修正 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 用に「最適化」されています。