我遇到过一种情况,即 xparse\NewDocumentCommand
与我所知的任何替代方案(包括定义强健命令的替代方案)相比都存在退化。因此,我避免\NewDocumentCommand
这种情况,但我想了解问题所在。
我试图\NewDocumentCommand
从 hyperref 对书签的处理角度来理解健壮命令和 定义的命令之间的区别。请考虑以下 MWE 及其内部的注释。
\documentclass{article}
\usepackage{xparse}
\usepackage[T1]{fontenc}
\usepackage[utf8x]{inputenc}
\usepackage[unicode=true]{hyperref}
\usepackage{bookmark}
% The problem appears also without bookmark, but you need to compile twice to
% see the correct result.
% Allow using \lambda in section headers, in two parts.
% Part one (no problem here):
\PrerenderUnicode{λ}
% Part two:
% Problem: The following command can be robust, but cannot be defined via
% \NewDocumentCommand.
% All these definitions work:
%\def\TitleLambda{\texorpdfstring{$\lambda$}{λ}}
%\newcommand{\TitleLambda}{\texorpdfstring{$\lambda$}{λ}}
%\DeclareRobustCommand{\TitleLambda}{\texorpdfstring{$\lambda$}{λ}}
% This one doesn't:
\NewDocumentCommand{\TitleLambda}{}{\texorpdfstring{$\lambda$}{λ}}
% Done!
\begin{document}
\section{The \TitleLambda{}-calculus}
\end{document}
上述 MWE 给出警告:
Package hyperref Warning: Token not allowed in a PDF string (Unicode):
(hyperref) removing `\TitleLambda' on input line 34.
因此,与预期不同,结果文件中的书签将不包含 lambda 字符。
用任何替代\NewDocumentCommand
方法都可以避免这个问题。因此,问题不会发生,因为\NewDocumentCommand
定义了强大的命令,尽管发生的事情看起来很相似。我甚至使用包中的\def
+进行了测试:\MakeRobustCommand
makerobust
\usepackage{makerobust}
\MakeRobustCommand\TitleLambda
一切仍然正常。
谁的错?我认为有三种可能性:
- 我;
- xparser;
- 超链接。
编辑:我应该更好地表述我的问题。我主要想知道会发生什么,因为我有一个可行的解决方案。
答案1
虽然hyperref
能够应对\DeclareRobustCommand
,但不能应对\NewDocumentCommand
(这可能是一个功能请求)。
但这\newcommand
就是你所需要的。
不过,还有另一种方法。它与 不兼容utf8x
,但你可以判断它的优雅程度。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{newunicodechar}
\usepackage[unicode=true]{hyperref}
\usepackage{bookmark}
\newunicodechar{λ}{\texorpdfstring{\ensuremath{\lambda}}{λ}}
\begin{document}
\section{The λ-calculus}
\end{document}