书签中的 NewDocumentCommand 定义命令

书签中的 NewDocumentCommand 定义命令

我遇到过一种情况,即 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+进行了测试:\MakeRobustCommandmakerobust

\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}

在此处输入图片描述

相关内容