如何使 \citetitle 在超链接部分书签中发挥作用?

如何使 \citetitle 在超链接部分书签中发挥作用?

我试图hyperref在文档中的大量章节标题上使用艺术品,但我必须使用一种变通方法将艺术品的标题放入该章节的书签中:

\documentclass{article}

\usepackage[backend=biber]{biblatex}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@ARTWORK{gizapyramid,
  title = {Pyramids at Gizeh},
  year = {ca.\@ 2500 BCE}
}
\end{filecontents}
\addbibresource{\jobname.bib}

\usepackage[hidelinks]{hyperref}

\begin{document}

\section{\texorpdfstring%
{\citetitle{gizapyramid} (\citedate{gizapyramid})}%
{Pyramids at Gizeh}}

\end{document}

这样做可以在书签中正确显示“吉萨金字塔”;但是,由于我偶尔会发现自己调整各种艺术品的标题以更准确地匹配通用名称,所以我想做这样的事情:

\documentclass{article}

\usepackage[backend=biber]{biblatex}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@ARTWORK{gizapyramid,
  title = {Pyramids at Gizeh},
  year = {ca.\@ 2500 BCE}
}
\end{filecontents}
\addbibresource{\jobname.bib}

\usepackage[hidelinks]{hyperref}

\begin{document}

\section{\texorpdfstring%
{\citetitle{gizapyramid} (\citedate{gizapyramid})}%
{\citetitle{gizapyramid}}}

\end{document}

问题是它会引发警告:

包 hyperref 警告:PDF 字符串(PDFDocEncoding)中不允许使用标记:(hyperref)在输入行 20 中删除“\citetitle”。

然后,它会在书签中显示标签“gizapyramid”,而不是所需的“Pyramids at Gizeh”。

我怎样才能按照自己的意愿\citetitlehyperref部分书签中工作而不破坏其在文档其他位置的正常行为?

答案1

你可以从我的usebib包裹

\documentclass{article}

\usepackage[backend=biber]{biblatex}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@ARTWORK{gizapyramid,
  title = {Pyramids at Gizeh},
  year = {ca.\@ 2500 BCE}
}
\end{filecontents}
\addbibresource{\jobname.bib}

\usepackage[hidelinks]{hyperref}

\usepackage{usebib}
\bibinput{\jobname}

\begin{document}

\section{\texorpdfstring%
{\citetitle{gizapyramid} (\citedate{gizapyramid})}%
{\usebibentry{gizapyramid}{title}}}


\end{document}

在此处输入图片描述

答案2

书签字符串需要转换为 PDF 字符串。主要步骤是扩展字符串以摆脱 TeX/LaTeX 命令。但是许多命令在可扩展上下文中不起作用。一些被过滤掉的“垃圾”\pdfstringdef或一些不需要的东西留在书签中,或者宏甚至会中断。

命令在可扩展上下文中不起作用,书签中也不支持。它们甚至是受保护的宏(由 e-TeX 保护\cite...)。这样可以轻松过滤掉它们并给出适当的警告。biblatex\protected

作为解决方法,可以从书签之外提取标题并将其存储在书签中使用的宏中:

\documentclass{article}

\usepackage[backend=biber]{biblatex}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@ARTWORK{gizapyramid,
  title = {Pyramids at Gizeh},
  year = {ca.\@ 2500 BCE}
}
\end{filecontents}
\addbibresource{\jobname.bib}

\usepackage{hyperref}
\usepackage{bookmark}

\makeatletter
\newcommand*{\StoreCiteField}[3]{%
  \begingroup
    \global\let\StoreCiteField@Result\relax
    \citefield{#2}[StoreCiteField]{#3}%
  \endgroup
  \let#1\StoreCiteField@Result
}
\DeclareFieldFormat{StoreCiteField}{%
  \gdef\StoreCiteField@Result{#1}%
}
\makeatother

\begin{document}

\StoreCiteField\TitleGizapyramid{gizapyramid}{title}
\section{\texorpdfstring
{\citetitle{gizapyramid} (\citedate{gizapyramid})}%
{\TitleGizapyramid}}

\end{document}

我使用格式化命令绕行来获取数据。\citefield这样做有什么副作用需要注意吗?有更好的方法吗?

相关内容