biblatex 和 hyperref 的 pdfmark 之间可能不兼容?

biblatex 和 hyperref 的 pdfmark 之间可能不兼容?

我正在尝试在里面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得到扩展(例如,如果我使用#2outside \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这是使用、bibtexdvips编译后从 Adob​​e Reader 中获取的文档图像ps2pdf

在此处输入图片描述

该解决方案还有一些未解决的问题。

  • 换行。当显示文本跨行时,工具提示仅应用于换行后的文本。请参阅上述文档中的示例。

  • 超链接和工具提示。这些不能很好地结合起来。作为一种解决方法,引用命令将工具提示应用于显示文本的基线。此区域大约 3pt 高。它可以变得更高,并在鼠标悬停时显示。有关选项的一些详细信息,\pdfmark请参阅DP Story 的页面

  • 引文作为显示文本。使用现有命令,您必须指定两次输入键。此外,工具提示区域包括前注和后注,并且只有一个工具提示分配给引文列表。所有这些问题可能无法通过上述解决方法解决。

相关内容