在以下 MWE 中,两个测试在pdflatex
和上均为真,inputenc
但第二个测试在fontspec
和luatex
/上失败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
:
ß
在UTF-8中实际上是两个字节;- 第一个字节,
0xC3
让 TeX 检查下一个字节,0x9F
并根据内部表将两者转换为\ss
(在utf8enc.dfu
你找到的\DeclareUnicodeCharacter{00DF}{\ss}
); - 根据当前的输出编码(此处
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 字符时,无法保证成功。