Hyperref 没有扩展章节标题中的宏?

Hyperref 没有扩展章节标题中的宏?

在我的示例中,我定义了一个使用数学符号排版技术名称的宏$\alpha$-thingy。当在中使用时\section\hyperref会抱怨它无法使用符号来组成 pdf 索引中的字符串。因此,我定义了宏,以便它用于为索引\texorpdfstring提供替代的纯文本形式alpha-thingy。除非宏具有可选参数,否则这种方法非常有效。此 MWE 显示了问题:

\documentclass{memoir}

\usepackage{hyperref}

\newcommand{\working}{\texorpdfstring{$\alpha$-thingy}{alpha-thingy}}
\newcommand{\nonworking}[1][thing]{\texorpdfstring{$\alpha$-#1}{alpha-#1}}

\begin{document}
  \section{Example \working}
  Hello \working.
  \section{Example \nonworking}
  Hello \nonworking.
  \section{Example \nonworking[thingy]}
  Hello \nonworking[thingy].
\end{document}

在日志中我收到两个警告:

W: mwe.tex:11 Token not allowed in a PDF string (PDFDocEncoding):(hyperref) removing `\nonworking'
W: mwe.tex:13 Token not allowed in a PDF string (PDFDocEncoding):(hyperref) removing `\nonworking'

我怎样才能让自己开心而不必每次都直接在's 参数中hyperref使用?\texorpdfstring\section

答案1

您不能为书签使用可选参数,因为 LaTeX 的实现使用了\futurelet,它是不可扩展的。书签字符串不是由 TeX 排版的,只能转换为字符串。

由于具有可选参数的宏没有后续的强制参数,因此无法使用基于宏的方法检测可选参数。

以下示例定义了\test一个可选参数和一个强制参数。强制参数未使用,因此这更像是一个人工示例,用于说明方法:

\documentclass{memoir}

\usepackage[pdfencoding=auto]{hyperref}
\usepackage{bookmark}
\bookmarksetup{numbered, open}

\newcommand{\working}{\texorpdfstring{$\alpha$-thingy}{\textalpha-thingy}}

\makeatletter
\newcommand{\test}{}
\def\test#1#{%
  \ifx\\#1\\%
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
  {\testA{thing}}%
  {\expandafter\testA\expandafter{\stripbrackets#1}}%
}
\newcommand*{\testA}[2]{%
  \texorpdfstring{$\alpha$-#1}{\textalpha-#1}%
}
\newcommand*{\stripbrackets}{}
\long\def\stripbrackets[#1]{#1}
\makeatother

\begin{document}
  \section{Example \working}
  Hello \working.
  \section{Example \test{}}
  Hello \test{}.
  \section{Example \test[thingy]{}}
  Hello \test[thingy]{}.
\end{document}

结果

书签:

书签

评论:

  • 此包bookmark改进了书签处理并添加了一些功能。
  • pdfencoding=auto如果书签字符串不需要 Unicode,则选项使用 Unicode 作为书签和 PDFDocEncoding。
  • 基本技巧是\def\test#1#。如果给出了可选参数(包括方括号),则将其放在 内#1。如果强制参数直接跟在 之后\test#1则为空,这将由 进行测试\ifx\\#1\\

相关内容