如何使节参数书签中的 \text_uppercase:n 符合要求?

如何使节参数书签中的 \text_uppercase:n 符合要求?

UTF-8感谢最近对输入pdfTeX和重音的覆盖范围进行了修订expl3(请参阅更新的答案https://tex.stackexchange.com/a/286703/18401),下面的代码可以很好地工作:

\documentclass{article}
\usepackage{lmodern}        % Over-ridden by fontspec for XeTeX/LuaTeX
\usepackage[T1]{fontenc}    % Over-ridden by fontspec for XeTeX/LuaTeX
\usepackage[utf8]{inputenc} % This bails out for XeTeX/LuaTeX
\ifnum 0%
  \ifdefined\XeTeXversion 1\fi
  \ifdefined\directlua    1\fi
  >0 %
  \usepackage{fontspec}
\fi

\usepackage{xparse}

% \usepackage{hyperref}
% \hypersetup{unicode}

\ExplSyntaxOn
\DeclareExpandableDocumentCommand \ExplUpperCase { m } { \text_uppercase:n {#1} }
\ExplSyntaxOff

\begin{document}

\ExplSyntaxOn
\section{\ExplUpperCase{aäa}}

\section{\text_uppercase:n{aäa}}

% \section{\ExplUpperCase{a\"aa}}

% \section{\text_uppercase:n{a\"aa}}
\ExplSyntaxOff

\end{document}

尽管如此,如果hyperref加载:

  1. 无论使用什么引擎,\"a都无法使用,因为“包 hyperref 警告:PDF 字符串(Unicode)中不允许使用令牌:在输入行中删除“\”[...]”,
  2. 如果使用的引擎是:
    1. pdf(La)TeX,无论使用哪种方式,书签都是错误的\hypersetup{unicode}
    2. xe(La)TeX\hypersetup{unicode},无论使用什么,书签都是正确的,
    3. lua(La)TeX,书签为:
      • 如果\hypersetup{unicode}使用,
      • 错误如果\hypersetup{unicode}不是用过的。

您知道如何在所有情况下正确制作书签吗?

答案1

处理带有hyperref和缺少unicode选项的 LuaTeX 将会很棘手,但其他情况都可以通过强制扩展来解决。您必须记住,hyperref否则看到的不是案例变化的结果,而是输入。类似

\usepackage{xparse,letltxmacro}
\LetLtxMacro\oldsection\section
\makeatletter
\DeclareDocumentCommand\section{sO{}m}{%
  \begingroup
    \protected@edef\x{%
      \endgroup
        \noexpand\oldsection
        \IfNoValueT#1{*}%
        \if\relax\detokenize{#2}\relax
        \else
          [\unexpanded{#2}]%
        \fi
        {#3}%
    }%
  \x
}
\makeatother

\section扩展强制参数,但对于 LaTeX2e 强命令来说应该是“安全的”。

相关内容