如何使 \tl_upper_case:n 应用于部分参数中的变音符号?

如何使 \tl_upper_case:n 应用于部分参数中的变音符号?

接口LaTeX3文档声称,第 224 页:

在包模式下,大小写转换系统还将转换使用 LaTeX 2ε“LICR”方法存储的文本。这将转换字体编码T1T2T5中实现的大写/小写标记LGR(请参阅 LaTeX 2ε 命令 的行为\MakeUppercase)。请注意,这些命令将自动受到扩展保护。

我并不假装我完全理解所有这些(“包装模式”、编码等到底是什么),但我注意到LaTeX3大小写转换系统和 LaTeX 2ε 命令之间存在显著不同的行为\MakeUppercase,如下所示:

\documentclass{article}
\usepackage{ifxetex}
\usepackage{ifluatex}
\ifluatex
\usepackage{fontspec}
\else
\ifxetex
\usepackage{fontspec}
\else
\usepackage[utf8]{inputenc}\usepackage[T1]{fontenc}
\fi
\fi
\usepackage{lmodern}
\usepackage{xparse}
\begin{document}
\ExplSyntaxOn
\begin{enumerate}
\item{\ttfamily\tl_to_str:n {\MakeUppercase{aäa}}}~$\to$~\MakeUppercase{aäa}:
  \begin{description}
  \item[pdflatex:] OK.
  \item[xelatex/lualatex:] OK.
  \end{description}
\item{\ttfamily\tl_to_str:n {\MakeUppercase{a\"aa}}}~$\to$~\MakeUppercase{a\"aa}:
  \begin{description}
  \item[pdflatex:] OK.
  \item[xelatex/lualatex:] OK.
  \end{description}
\item{\ttfamily\tl_to_str:n
    {\tl_upper_case:n{aäa}}}~$\to$~%\tl_upper_case:n{aäa}:
  \begin{description}
  \item[pdflatex:] Fails~("AäA")~with~a~not~critical~error:
\ExplSyntaxOff
\begin{verbatim}
! Missing \endcsname inserted.
<to be read again>
                   \protect
l.29 ...ase:n{aäa}}}~$\to$~\tl_upper_case:n{aäa}
                                                  :
?
\end{verbatim}
\ExplSyntaxOn
  \item[xelatex/lualatex:] OK.
  \end{description}
\item{\ttfamily\tl_to_str:n {\tl_upper_case:n {a\"aa}}}~$\to$~\tl_upper_case:n{a\"aa}:
  \begin{description}
  \item[pdflatex:] Fails~("AäA")~without~any~error.
  \item[xelatex/lualatex:] Fails~("AäA")~without~any~error.
  \end{description}
\end{enumerate}

\section{
  {\ttfamily\tl_to_str:n {\MakeUppercase{aäa}}}~$\to$~\MakeUppercase{aäa}%
}
\begin{description}
\item[pdflatex:] OK.
\item[xelatex/lualatex:] OK.
\end{description}
\section{
  {\ttfamily\tl_to_str:n {\MakeUppercase{a\"aa}}}~$\to$~\MakeUppercase{a\"aa}
}
\begin{description}
\item[pdflatex:] OK.
\item[xelatex/lualatex:] OK.
\end{description}
\section{
  {\ttfamily\tl_to_str:n {\tl_upper_case:n {aäa}}}~$\to$~
  % \tl_upper_case:n{aäa}
}
  \begin{description}
  \item[pdflatex:] Fails~("AäA")~with~a~not~critical~error:
\ExplSyntaxOff
\begin{verbatim}
! Missing \endcsname inserted.
<to be read again>
                   \protect
l.71 }

?
\end{verbatim}
\ExplSyntaxOn
  \item[xelatex/lualatex:] OK.
  \end{description}
\section{
  {\ttfamily\tl_to_str:n {\tl_upper_case:n {a\"aa}}}~$\to$~
  % \tl_upper_case:n{a\"aa}
}
  \begin{description}
  \item[pdflatex:] Fails~with~lots~of~critical~errors:
\ExplSyntaxOff
\begin{verbatim}
! Interruption.
\__tl_change_case_N_type:Nnnn ...q_recursion_stop
                                                  {#3}{#4}
l.89 }

?
[...]
\end{verbatim}
\ExplSyntaxOn
  \item[xelatex:] Fails~with~lots~of~critical~errors:
\ExplSyntaxOff
\begin{verbatim}
! Interruption.
<to be read again>
                   \q_nil
l.87 }

?
^C! Interruption.
\tl_if_head_is_N_type:nTF ...\token_to_str:N #1?}}
                                                  **\prg_return_true: \else:...
l.87 }

?
[...]
\end{verbatim}
\ExplSyntaxOn
\item[lualatex:] Fails~with~lots~of~critical~errors:
\ExplSyntaxOff
\begin{verbatim}
! Interruption.
<to be read again>
\q_nil
l.87 }

?
^C! Interruption.
\__str_escape_x:n ...er:wN {\luatex_expanded:D {#1
                                                  }}}
l.87 }

?
[...]
\end{verbatim}
\ExplSyntaxOn
  \end{description}
\ExplSyntaxOff
\end{document}

你能解释一下这些不同的行为吗?

特别是,我想要得到\tl_upper_case:n{aäa},或者更好的是(因为将在一个类文件中)在参数\tl_upper_case:n{a\"aa}中工作:可能吗?\sectionpdflatex

答案1

更新答案(2020)

可扩展的大小写转换代码现在有一个最终的“家” expl3\text_uppercase:n

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

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

\NewDocumentCommand\demo{m}{\texttt{\detokenize{#1}} $\to$ #1}
\begin{document}

\section{\demo{\MakeUppercase{aäa}}}

\section{\demo{\MakeUppercase{a\"aa}}}

\section{\demo{\ExplUpperCase{aäa}}}

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

\end{document}

更新答案(2016)

此处的代码非常具有实验性,可能会发生变化/改进。特别是,我现在已经修改了 pdfTeX 和重音符号的 UTF-8 输入范围。使用最新版本,expl3以下内容将正常运行。

\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}
\ExplSyntaxOn
\DeclareExpandableDocumentCommand \ExplUpperCase { m } { \tl_upper_case:n {#1} }
\ExplSyntaxOff

\NewDocumentCommand\demo{m}{\texttt{\detokenize{#1}} $\to$ #1}
\begin{document}

\section{\demo{\MakeUppercase{aäa}}}

\section{\demo{\MakeUppercase{a\"aa}}}

\section{\demo{\ExplUpperCase{aäa}}}

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

\end{document}

该代码很可能在本周(2016-01-14左右)发布到CTAN。


原始答案

需要注意的是,这里的代码是实验性的,还有一些想法需要测试、开发和讨论。同样需要注意的是,它expl3旨在作为 LaTeX2e 后续格式的编程层:因此,有些函数可能适用于“某种未来格式”,但在 LaTeX2e 环境中受到更多限制。这导致了“格式模式”(面向未来)和“包模式”(与 LaTeX2e 一起使用时)之间的分裂。

“设计简介”\tl_upper_case:n大致如下:

  • 允许在 Unicode 范围内更改大小写,包括处理非一对一映射
  • 在适当的情况下无缝处理上下文相关的转换
  • 处理语言相关转换的机制
  • 允许退出机制,包括跳过数学模式材料
  • 理想情况下可扩展工作

这些都是可行的,但在处理基于宏的输入时,尤其是在查看 pdfTeX 支持时,还存在其他问题。对于具有 Unicode 字母输入的 Unicode 引擎,设置相对简单,但在涵盖其他情况时会变得更加复杂。现在,所采用的方法是将 LICR 输入范围(例如\aa)特殊化,但不使用重音命令。它也不会尝试使用 pdfTeX 覆盖 7 位范围之外的 UTF-8 输入。因此,上述方法失败并不奇怪(对我来说)。

请注意,这\MakeUppercase是不可扩展的,并且像pdfTeX\protected@edef\temp{<input>}\tl_lower_case:V \temp这样的输入将可以使用,ä因为它会通过 LaTeX2e 机制输入(本质上)进行转换\"a


LaTeX2e 即将对 pdfTeX 处理 UTF-8 输入覆盖的方式进行更改,这让我觉得稍微不同的方案可能比当前的方案更好。我计划修改代码,这样T1如果输入文件是 UTF-8 格式,字体编码覆盖的输入将正确进行大小写转换。这可能需要几天时间。

相关内容