![Hyperref 没有扩展章节标题中的宏?](https://linux22.com/image/305228/Hyperref%20%E6%B2%A1%E6%9C%89%E6%89%A9%E5%B1%95%E7%AB%A0%E8%8A%82%E6%A0%87%E9%A2%98%E4%B8%AD%E7%9A%84%E5%AE%8F%EF%BC%9F.png)
在我的示例中,我定义了一个使用数学符号排版技术名称的宏$\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\\
。