使用 inputenc 和 fontspec 进行 xstring 测试的不同结果

使用 inputenc 和 fontspec 进行 xstring 测试的不同结果

在以下 MWE 中,两个测试在pdflatex和上均为真,inputenc但第二个测试在fontspecluatex/上失败xelatex。有没有可能让这个引擎不可知论(均为真)?

\documentclass{article}
%\usepackage[T1]{fontenc}\usepackage[utf8]{inputenc}
\usepackage{fontspec}
%\usepackage[logonly]{trace}\traceon
\usepackage{xstring}


\begin{document}

ß in Maß: \IfSubStr{Maß}{ß}{TRUE}{FALSE}%
\newline%
\ss{} in Maß: \IfSubStr{Maß}{\ss}{TRUE}{FALSE}%

\end{document}

答案1

两个测试都pdflatex返回 true 本质上是一个幸运的巧合。

该包xstring执行满的扩展其(部分)参数中的标记(参见包文档);在\IfSubStr第一个和第二个参数完全扩展的情况下。

发生的事情ßpdflatex

  1. ß在UTF-8中实际上是两个字节;
  2. 第一个字节,0xC3让 TeX 检查下一个字节,0x9F并根据内部表将两者转换为\ss(在utf8enc.dfu你找到的\DeclareUnicodeCharacter{00DF}{\ss});
  3. 根据当前的输出编码(此处T1),\ss转换为\T1\ss(一个相当奇怪的标记),其内部定义为\chardef因此不可扩展。

因此,您会看到,当您键入时会发生相同的情况\ss,只需跳过上述一些步骤。

lualatex使用时,ß根本不会进行扩展,因为lualatex直接读取 UTF-8 并在内部将其转换为(抽象)Unicode。另一方面,\ss变为\TU\ss(与上面类似),这本质上等同于类型\char`ß(因此它是不是与输入 相同ß)。

尝试\IfSubStr{Ș}{Ș}{TRUE}{FALSE}一下pdflatex,你会得到一个低级错误

! Illegal parameter number in definition of \@xs@arg@ii.
<to be read again> 
                   \crcr 
l.15 \IfSubStr{Ș}{Ș}
                      {TRUE}{FALSE}

没有错误lualatex

\IfSubStr当用于非 ASCII 字符时,无法保证成功。

相关内容