使用 Hyperref 内部链接进行鼠标悬停

使用 Hyperref 内部链接进行鼠标悬停

我有一个内部链接密集的 PDF。(我使用术语并将它们链接到附录定义\term{termname}{displaytext},它使用\hyperlink来自 hyperref 包。)我正在尝试创建鼠标悬停文本作为该命令的一部分。

(1)hyperref 内部有没有办法将鼠标悬停在 上\hyperlink

我尝试过 cooltooltips,但是它创建的是 URL 超链接,而不是内部引用链接,所以它无法完成我想要做的事情。

(2)有没有办法让 cooltooltips 创建内部链接而不是 URL 链接?

我还检查了用户在多个答案(但不是作为包)上发布的工具提示代码,他在其中创建了一个\tooltip命令。不幸的是,他的命令使我的链接无效。(我试过了\tooltop{\term{name}{display}}\term{name}{\tooltip{display}}。内部链接不起作用。)

(3)有没有办法修改该代码,使其接受内部引用参数?

TLDR 版本:我想创建一个命令\term{internal link}{display}{mouseover},但现有的包似乎都不允许这样做。


添加的代码示例:

\documentclass[12pt,oneside]{book}

\usepackage[usenames,dvipsnames,svgnames,table]{xcolor}
\usepackage[log-declarations=false]{xparse}%To enable better command creation
\usepackage[%ALWAYS LOAD THIS LAST
        colorlinks=false,
        pdfborder={0 0 0},
%        pdftitle=\booktitle,
%        pdfauthor=\theauthor,
        pdfpagemode=UseNone,
        bookmarksopen=true,
        bookmarks=true
     ]{hyperref}


\colorlet{Conds}{Black}
\colorlet{Terms}{Green}

\newenvironment{terms}{\small\bfseries\color{Terms}}{}
\newenvironment{conds}{\ttfamily\color{Conds}}{}

\newcommand\envtype{}
\DeclareDocumentCommand \Link {o m O{}}{%
    \begin{\envtype}%
    \IfNoValueTF{#1}{\lowercase{\hyperlink{\envtype:#2}}{#2#3}}{\lowercase{\hyperlink{\envtype:#1}}{#2#3}}%
    \end{\envtype}%
    }


%%%%Specific Links:
\newcommand{\term}{\renewcommand{\envtype}{terms}\Link}
\newcommand{\cond}{\renewcommand{\envtype}{conds}\Link}
%%(Many other link types cut)

\begin{document}
Lots of text. \term{Test} this if you can. Trying it with cooltooltips \cond{foo}[bars] everything up.

\newpage
\hypertarget{terms:test}{Here's my link: Test is a term.}

\hypertarget{conds:foo}{Here's another link: Foo is a condition.}
\end{document}

\Link 命令之所以复杂,有两个原因:首先,它可以正确处理 \lowercase 问题,让我始终引用小写版本的链接。其次,我有 5 种类型的关键字,每种都有自己的格式,它们都使用 \Link,只需编码一次即可使文档始终如一地工作。

答案1

这是一个通用的解决方案,实现命令

\hyperlinkWithTip{<destination>}[<linkcolour>]{<linktext>}[<tipboxcolour>]{<tiptext>}

hyperref它类似于

\hyperlink{<destination>}{<linktext>}

命令,不同之处在于新命令有一个额外的第 3 个强制参数{<tiptext>},它提供当鼠标悬停在链接上时显示的提示文本。

可选参数[<linkcolour>][<tipboxcolour>]执行其应做的事情。

该示例包含两个带有提示文本的超链接。其中一个用于\parbox生成多行提示文本。


\documentclass[twoside,a5paper]{book}

\usepackage{hyperref}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% usage:
%
% \hyperlinkWithTip{<destination>}[<linkcolour>]{<linktext>}[<tipboxcolour>]{<tiptext>}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{pdfbase,ocgbase,xparse}
\usepackage{xcolor}
\usepackage{calc}
\usepackage{tikz}
\usetikzlibrary{calc}

\ExplSyntaxOn
\let\tpPdfLink\pbs_pdflink:nn
\let\tpPdfAnnot\pbs_pdfannot:nnnn\let\tpPdfLastAnn\pbs_pdflastann:
\def\tpPdfXform{\pbs_pdfxform:nnnnn{1}{1}{}{}}\let\tpPdfLastXform\pbs_pdflastxform:
\let\tpPdfObj\pbs_pdfobj:nnn\let\tpPdfLastObj\pbs_pdflastobj:
\let\tpPdfAppendToFields\pbs_appendtofields:n
\ExplSyntaxOff

\makeatletter
\NewDocumentCommand{\hyperlinkWithTip}{mO{blue}mO{yellow!20}m}{{%
  \leavevmode%
  \ocgbase@new@ocg{tipOCG.\thetcnt}{/Print<</PrintState/OFF>>/Export<</ExportState/OFF>>}{off}%
  \tpPdfLink{%
    /Subtype/Screen%
    /AA<<%
      /E<</S/SetOCGState/State [/ON \ocgbase@last@ocg]>>%
      /X<</S/SetOCGState/State [/OFF \ocgbase@last@ocg]>>%
      /U<</S/SetOCGState/State [/OFF \ocgbase@last@ocg]/Next<</S/GoTo/D (#1)>>>>%
    >>%
  }{{\color{#2}#3}}%
  \sbox\tiptext{\fcolorbox{black}{#4}{#5}}%
  \edef\twd{\the\wd\tiptext}%
  \edef\tht{\the\ht\tiptext}%
  \edef\tdp{\the\dp\tiptext}%
  \measureremainder{\whatsleft}\tipshift=0pt%
  \ifdim\whatsleft<\twd\setlength\tipshift{\whatsleft-\twd}\fi%
  \tpPdfXform{\tiptext}%
  \raisebox{\heightof{#3}+\tdp}[0pt][0pt]{\makebox[0pt][l]{\hspace{\tipshift}%
    \tpPdfAnnot{\twd}{\tht}{\tdp}{%
      /Subtype/Widget/FT/Btn/Ff 65537/T (tip:\thetcnt)%
      /AP<</N \tpPdfLastXform>>%
      /MK<</TP 1/I \tpPdfLastXform/IF<</S/A/FB true/A [0.0 0.0]>>>>%
      /OC \ocgbase@last@ocg
    }%
    \tpPdfAppendToFields{\tpPdfLastAnn}%
  }}%
  \stepcounter{tcnt}%
}}
\makeatother
\newsavebox\tiptext\newcounter{tcnt}
\newlength{\whatsleft}\newlength{\tipshift}
\newcommand{\measureremainder}[1]{%
  \begin{tikzpicture}[overlay,remember picture]
    \path let \p0 = (0,0), \p1 = (current page.east) in
      [/utils/exec={\pgfmathsetlength#1{\x1-\x0}\global#1=#1}];
  \end{tikzpicture}%
} 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{document}

Lots of text. \hyperlinkWithTip{test}{Test}{To be explained on the next page} this if you can.

Lots of text. Another \hyperlinkWithTip{testB}{test}{\parbox[b]{0.5\linewidth}{This is a longer text. Don't miss the explanation given on the next page.}} if you wish.
\newpage

\hypertarget{test}{Here's my link destination.}

\hypertarget{testB}{Yet another link destination.}

\end{document}

相关内容