我有一个内部链接密集的 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}