接口LaTeX3
文档声称,第 224 页:
在包模式下,大小写转换系统还将转换使用 LaTeX 2ε“LICR”方法存储的文本。这将转换字体编码
T1
、T2
和T5
中实现的大写/小写标记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}
中工作:可能吗?\section
pdflatex
答案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 格式,字体编码覆盖的输入将正确进行大小写转换。这可能需要几天时间。