简单的 UTF-8 适配在 Knuth 的 TeX 中部分有效,但在 LuaTeX 中不起作用

简单的 UTF-8 适配在 Knuth 的 TeX 中部分有效,但在 LuaTeX 中不起作用

我又一次(令人沮丧地浪费时间:真正的笑话!)尝试使用更好的 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}

在此处输入图片描述

相关内容