我正在尝试在里面biblatex
使用,以便引用的标题作为 PDF 中的工具提示弹出。\citetitle
\pdfmark
代码如下:
%% A tooltip macro using pdfmark
\newcounter{tooltip}
% Creates a tooltip text.
% arg #1 : the text to display
% arg #2 : the text to show in the tooltip
\newcommand\tooltip[2]{%
\pdfmark[#1]{%
pdfmark=/ANN,%
Subtype=/Widget,%
Raw={%
/TU (#2)/T (tooltip \thetooltip)%
/FT/Btn/Ff 65536/H/N%
}%
}\protect\addtocounter{tooltip}{1}%
}
现在我可以将工具提示宏与常规文本和我创建的命令一起使用,例如:
% will show "some text" with "tooltip text" as tooltip on mouseover
\tooltip{some text}{tooltip text}
% will show "Tooltip tooltip" as tooltip
\newcommand{\test}[1]{Tooltip #1}
\tooltip{some text}{\test{tooltip}}
但是,如果我使用\citetitle
,它不会扩展:
% will show "\citetitle{key}" as tooltip
\tooltip{some text}{\citetitle{key}}
我尝试在某些地方添加一些,\expandafter
但没有成功。
此外,我的工具提示宏在内部\citetitle
得到扩展(例如,如果我使用#2
outside \pdfmark
)。似乎只有在 RAW 参数内部它才不会得到扩展。另一方面,我的简单命令也在 RAW 中得到扩展。
由于我对 TeX 了解不多,因此无法进一步调试该问题,但似乎 RAW 和biblatex
定义其宏的方式之间存在一些不兼容性。有什么帮助吗?
答案1
/TU
的参数需要Raw
未格式化的文本。任何引用命令都旨在格式化书目数据,因此该问题实际上不是 biblatex 的问题。您可以使用 biblatex 命令\thefield
、\thename
和访问未格式化的数据\thelist
。后两个命令分别返回名称和文字列表字段。不幸的是,它们没有提供适合打印的输出。
下面我们定义引用命令\tooltipcitefield
和\tooltipcitename
,它们使用\thefield
和\thename
。这些宏有三个参数来指定显示文本、字段名称和输入键。如果指定的字段不是labelnumber
,则字段以括号中的标签编号作为前缀。
\documentclass{article}
\usepackage[american]{babel}
\usepackage{csquotes}
\usepackage[maxcitenames=2]{biblatex}
\usepackage[dvips]{hyperref}
\newcounter{tooltip}
\newcommand*{\tooltip}[2]{%
\pdfmark[#1]{
pdfmark=/ANN,Subtype=/Widget,
Raw={/TU (#2 ) % annotation text
/T (tooltip \thetooltip) % annotation title
/FT /Btn % button field
/Ff 65536 % push button field flag
/H /N % no highlighting
}
}%
\stepcounter{tooltip}}
\makeatletter
\newrobustcmd*{\cbx@displaytext}{}
\newrobustcmd*{\mkbibtooltip}[1]{%
#1\cbx@displaytext%
\settowidth{\@tempdima}{\cbx@displaytext}%
\nobreak\hskip-\@tempdima%
\tooltip{\hskip\@tempdima}{\csuse{cbx@tooltiptext}}%
\csgdef{cbx@tooltiptext}{}}
\DeclareCiteCommand{\cbx@tooltipcitefield}[\mkbibtooltip]
{\iffieldundef{prenote}{}{\BibliographyWarning{Ignoring prenote argument}}}
{\ifcsstring{cbx@field}{labelnumber}
{}
{\csxappto{cbx@tooltiptext}{[\thefield{labelnumber}] }}%
\csxappto{cbx@tooltiptext}{\thefield{\csuse{cbx@field}}}}
{\csgappto{cbx@tooltiptext}{; }}
{\iffieldundef{postnote}{}{\BibliographyWarning{Ignoring postnote argument}}}
\newrobustcmd*{\tooltipcitefield}[2]{%
\renewrobustcmd*{\cbx@displaytext}{#1}%
\csgdef{cbx@field}{#2}%
\cbx@tooltipcitefield}
\DeclareIndexNameFormat{thename}{%
\ifnumgreater{\value{listcount}}{\value{liststart}}
{\ifboolexpr{ test {\ifnumless{\value{listcount}}{\value{liststop}}}
or test \ifmorenames }
{\csgappto{cbx@tooltiptext}{, }}
{\ifnumgreater{\value{liststop}}{2}{\csgappto{cbx@tooltiptext}{,}}{}%
\csgappto{cbx@tooltiptext}{ and }}}
{}%
\ifuseprefix{\ifblank{#5}{}{\csgappto{cbx@tooltiptext}{#5 }}}{}%
\csgappto{cbx@tooltiptext}{#1}%
\ifboolexpr{ test {\ifnumequal{\value{listcount}}{\value{liststop}}}
and test \ifmorenames }
{\ifnumgreater{\value{liststop}}{1}{\csgappto{cbx@tooltiptext}{,}}{}%
\csgappto{cbx@tooltiptext}{ et al.}}
{}}
\DeclareCiteCommand{\cbx@tooltipcitename}[\mkbibtooltip]
{\iffieldundef{prenote}{}{\BibliographyWarning{Ignoring prenote argument}}}
{\csxappto{cbx@tooltiptext}{[\thefield{labelnumber}] }%
\indexnames[thename]{\csuse{cbx@name}}}
{\csgappto{cbx@tooltiptext}{; }}
{\iffieldundef{postnote}{}{\BibliographyWarning{Ignoring postnote argument}}}
\newrobustcmd*{\tooltipcitename}[2]{%
\renewrobustcmd*{\cbx@displaytext}{#1}%
\csgdef{cbx@name}{#2}%
\cbx@tooltipcitename}
\makeatother
\addbibresource{biblatex-examples.bib}
\begin{document}
Filler text \tooltipcitefield{\cite[e.g.][]{bertram,cicero}}{labeltitle}{bertram,cicero}.
Filler text \tooltipcitename{\cites[10--15]{bertram}[10]{cicero}}{labelname}{bertram,cicero}.
\tooltipcitefield{Tooltip titles}{labeltitle}{bertram,companion,cicero}.
\tooltipcitename{Tooltip names}{labelname}{companion,bertram,vangennep}.
\tooltipcitefield{\emph{Tooltip numbers}}{}{cicero,companion}.
\printbibliography
\end{document}
latex
这是使用、bibtex
和dvips
编译后从 Adobe Reader 中获取的文档图像ps2pdf
。
该解决方案还有一些未解决的问题。
换行。当显示文本跨行时,工具提示仅应用于换行后的文本。请参阅上述文档中的示例。
超链接和工具提示。这些不能很好地结合起来。作为一种解决方法,引用命令将工具提示应用于显示文本的基线。此区域大约 3pt 高。它可以变得更高,并在鼠标悬停时显示。有关选项的一些详细信息,
\pdfmark
请参阅DP Story 的页面。引文作为显示文本。使用现有命令,您必须指定两次输入键。此外,工具提示区域包括前注和后注,并且只有一个工具提示分配给引文列表。所有这些问题可能无法通过上述解决方法解决。