在文档和 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
}
你可以完全删除/忽略\thanks
pdfstrings。使用
\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,以便在预定义的位置强制换行也可能是可能的。