hyperref 选项 pdfusetitle 致谢

hyperref 选项 pdfusetitle 致谢

在文档和 PDF 元数据中设置标题的最干净的方法是什么(虽然不是重复我自己) 时也使用\thanks

此解决方案会产生不正确的标题元数据,其中包括的内容\thanks(或不使用时出现警告hyperref:“PDF 字符串中不允许使用令牌” \maketitle)。

\documentclass{article}
\usepackage[pdfusetitle]{hyperref}

\begin{document}
\title{The title\thanks{Thanks}}
\maketitle
Hello.
\end{document}

因此我考虑了以下“解决方案”(我想,这是一种解决方法)。

\documentclass{article}
\usepackage{hyperref}

\begin{document}
\newcommand{\mytitle}{The title}
\title{\mytitle\thanks{Thanks}}
\hypersetup{pdftitle=\mytitle}
\maketitle
Hello.
\end{document}

但这会使我的文档变得杂乱,而且不太优雅,尤其是因为我无法将其隐藏在序言中。是否有可能,并且会更干净,修补pdfusetitle工作方式?或者也许还有其他解决方法?

答案1

hyperref定义\pdfstringdefDisableCommands可用于重新定义某些有问题的命令以用于 pdfstring 的命令。使用

\pdfstringdefDisableCommands{%
  \let\thanks\@gobble
}

你可以完全删除/忽略\thankspdfstrings。使用

\pdfstringdefDisableCommands{%
  \def\thanks#1{ (#1)}%
}

\thanks您需要在括号中添加参数。

也可以看看\texorpdfstring 为整本书使用 relsize 的强大命令出现脆弱错误

\documentclass{article}
\usepackage[pdfusetitle]{hyperref}

\pdfstringdefDisableCommands{%
  \let\thanks\@gobble
}

\begin{document}
\title{The title\thanks{Thanks}}
\maketitle
Hello.
\end{document}

元数据显示“标题”为标题,标题为“标题*”,带有“感谢”脚注

\makeatletter...\makeatother请注意,使用@名称中带有 的宏时,不需要像通常要求的那样将代码括起来(参见\makeatletter 和 \makeatother 起什么作用?)。应用了一些技巧来避免显式的 catcode 更改,但是当用作另一个命令的参数时,\pdfstringdefDisableCommands该技巧不起作用,在这种情况下,您必须将所有内容包装到中,例如\pdfstringdefDisableCommands\makeatletter...\makeatother

\newtoggle{LCpres}
\togglefalse{LCpres}
\makeatletter
\iftoggle{LCpres}
  {\usepackage{hyperref}}
  {\usepackage[hypertexnames=false, pdfusetitle]{hyperref}
   \pdfstringdefDisableCommands{\let\thanks\@gobble}}
\makeatother

对于更复杂的结构,有\texorpdfstring,可以\texorpdfstring{The title\thanks{Thanks}}{The title}与重复一起使用。

对于不同的用例重新定义 \title,以便在预定义的位置强制换行也可能是可能的。

相关内容