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 书签。但是据我所知,您不能在那里使用不同的字体。内部使用的宏\pdfstringdef
会hyperref
注意\texttt
在扩展书签文本时将普通字体宏设置为空,即通过设置\let\texttt\@firstofone
。如果您使用,\let
那么这个更改不会影响您的\code
宏,从而不会造成麻烦。一种常见的替代方法是内部使用\texorpdfstring
,使用于书签的 PDF 模式下的格式化宏无效。