为什么 hyperref 不喜欢在章节标题中通过 \let 设置的命令?

为什么 hyperref 不喜欢在章节标题中通过 \let 设置的命令?

pdflatex返回以下文件

\documentclass[a4paper]{article}
\usepackage{hyperref}
\let\code\texttt
\begin{document}
\section{\texttt{first}}
\section{\code{second}}
\end{document}

以下错误:

! Argument of \@sect has an extra }.
<inserted text> 
                \par 
l.6     \section{\code{second}}

我喜欢语义命令命名,因此我使用自己的短命令而不是\texttt等,此外,除非我在其中引入一些新的部分,否则我更喜欢使用\let,它比\def/更有效\newcommand(在这种情况下工作正常)。

问题

为什么 hyperref 不喜欢通过\let章节标题设置的命令?

补充问题

如果有什么问题

\let\code\texttt

那么应该如何修复呢?

答案1

Hyperref 必须先删除所有格式命令和特殊字符,然后才能将字符串放入 PDF 大纲(这有特殊要求)。

你可以像这样修复它:

\pdfstringdefDisableCommands{%
    \let\code\relax
}

\code仅对需要“pdf 字符串”的地方(主要是轮廓)进行特殊处理。

答案2

而是使用\def\code{\texttt}。这样效率稍低,但对您的文档不会有任何实际影响。解释一下发生了什么:在分段命令中使用时,宏不仅用于文本(或目录,如果存在),还用于 PDF 书签。但是据我所知,您不能在那里使用不同的字体。内部使用的宏\pdfstringdefhyperref注意\texttt在扩展书签文本时将普通字体宏设置为空,即通过设置\let\texttt\@firstofone。如果您使用,\let那么这个更改不会影响您的\code宏,从而不会造成麻烦。一种常见的替代方法是内部使用\texorpdfstring,使用于书签的 PDF 模式下的格式化宏无效。

相关内容