我又一次(令人沮丧地浪费时间:真正的笑话!)尝试使用更好的 TeX 原语。下一个代码片段在 Knuth 的 Tex 中无法按预期工作。小写版本只是吞掉了该字符。
\catcode"C3=13 % catcode for first bit
\catcode"A7=11 % and second ones for
\catcode"87=11 % unicode ç Ç
\def^^c3#1{%
\begingroup
\def\arg{#1}%
\def\upper{^^87}% work only in original TeX engine
\def\lower{^^A7}% not work in both cases
%
%
\ifx \upper\arg \c C%
\else
\ifx \lower\arg \c c%
\fi\fi
\endgroup
}
caçhaca e Çassi.
ca\c chaca e \c Cassi. %expected macro expansion
\end
使用 LuaTeX 引擎,情况变得更糟:ç
和Ç
被完全忽略。
我想了解每一个意想不到的结果。
答案1
使用 Knuth 的 TeX 或其他 8 位 TeX (例如 pdfTeX) 运行时的问题是将\def\lower{^^A7}
字面上存储^^A7
在 中\lower
:您想要\def\lower{^^a7}
。然后它将工作:您有一个存储的字节,如预期的那样。
在 LuaTeX(或 XeTeX)中,输入不是以字节形式读取,而是以 Unicode 代码点形式读取:这意味着ç
和Ç
是具有自己的 catcode 的单个标记。
答案2
你能在 LuaTeX 中使用\def\lower{^^a7}
(但请注意小写a
):
This is LuaTeX, Version 1.17.0 (TeX Live 2023)
restricted system commands enabled.
**\relax
*\def\lower{^^a7}\show\lower
> \lower=macro:
->§.
<*> \def\lower{^^a7}\show\lower
但主要的问题是 LuaTeX绝不C3A7
当输入为 时,它会看到ç
,因为它不是逐字节读取,而是逐代码点读取。如果文件是 UTF-8 编码的,那么在看到 时C3A7
,LuaTeX 会将其转换为U+00E7
,这就是传递给眼睛进行标记的内容。因此您的活动^^c3
字符永远不会被看到。
那么,你能使用传统方法,但我认为没有理由这么做。
\documentclass{article}
\usepackage[utf8]{luainputenc}
\catcode"C3=13 % catcode for first bit
\catcode"A7=11 % and second ones for
\catcode"87=11 % unicode ç Ç
\def^^c3#1{%
\begingroup
\def\arg{#1}%
\def\upper{^^87}% work only in original TeX engine
\def\lower{^^a7}% not work in both cases
%
%
\ifx \upper\arg \c C%
\else
\ifx \lower\arg \c c%
\fi\fi
\endgroup
}
\begin{document}
ç Ç
^^c3^^a7 ^^c3^^87
\end{document}