Xe(La)Tex 中的 catcode 11 / 字母代码点是什么?

Xe(La)Tex 中的 catcode 11 / 字母代码点是什么?

我正在尝试编写一个(JavaScript)RegEx 将任意字符序列转换为(希望)唯一的命令名称。

解决方案的一部分是用/[a-zA-Z]/其他内容替换不匹配的所有内容,例如空字符串''或数字'1'等等'one'

实验中我发现,虽然像'辛亥革命'和甚至这样的字符串'一二三'(即 CJK 数字)在 XeLaTeX 中,既不能作为合法名称,'¥ÄÖå'也不能'、。',大概是因为这些字符串的相应第一个字符没有被 XeLaTeX 归类为字母(catcode 11)。

所以问题是:XeTeX 的 catcode 在哪里定义或记录?如果我将所有不属于字母的 Unicode 代码点(即不匹配的代码点/[\p{Letter}]/gu)替换为其他内容,所有字符串都会变成合法的 XeTeX 名称吗?

编辑:我完全清楚,生成的名称可能不是唯一的,并且像 和 这样的不同文件名foo-bar.txt都会foobar.txt变成 ,foobartxt只需简单地省略一些令人反感的字符即可;但是,消除歧义不是这个问题的一部分。也就是说,将任意序列转换为唯一名称(从而允许往返转换)的解决方案也很有趣。

更新:我想出了下面的代码;通过检查一些被归类为\p{Letter}或 的Unicode 代码点,\p{Mark}我发现 IPA 长度标记ː具有令人愉悦的外观是 TeX 中的合法名称字符;在我的编辑器中它也不会被视为单词分隔符。我现在使用以下代码将文件名转换为有效的 TeX 名称:

@TEX_partitioner      = 'ː'
@TEX_latindigitnames  =
  0:    'zero'
  1:    'one'
  2:    'two'
  3:    'three'
  4:    'four'
  5:    'five'
  6:    'six'
  7:    'seven'
  8:    'eight'
  9:    'nine'

@TEX_text_as_legal_name = ( text ) ->
  ### See https://github.com/latex3/unicode-data; thx to https://tex.stackexchange.com/a/514731/128255 ###
  validate.nonempty_text text
  R = text
  ### replace Latin digits by partitioner plus name: ###
  R = R.replace ///[0-9]///gu,                  ( $0        ) => @TEX_partitioner + @TEX_latindigitnames[ $0 ]
  ### insert partitioner between sequences of lower and upper case (aB -> aːB) ###
  R = R.replace ///(\p{Ll})(\p{Lu})///gu,       ( _, $1, $2 ) => $1 + @TEX_partitioner + $2
  ### replace each code point that is not a Unicode 'Letter' or 'Mark' with partitioner: ###
  R = R.replace ///[^\p{Letter}\p{Mark}]///gu,  @TEX_partitioner
  ### turn the result into lower case: ###
  return R.toLowerCase()

这里有一些例子;左边是原始文件名;右边是 TeX 文档中可用的符号名称:

'Roboto-Regular.ttf'                  'robotoːregularːttf'
'Roboto-Thin.ttf'                     'robotoːthinːttf'
'sarasa-gothic-0.6.0'                 'sarasaːgothicːːzeroːːsixːːzero'
'ebas927.ttf'                         'ebasːnineːtwoːsevenːttf'
'Source_Sans_Pro'                     'sourceːsansːpro'
'OFL.txt'                             'oflːtxt'
'SourceHanSerifSC-Heavy.otf'          'sourceːhanːserifːscːheavyːotf'
'TH-Khaai-TP0.ttf'                    'thːkhaaiːtpːzeroːttf'
'UnifrakturMaguntia16.ttf'            'unifrakturːmaguntiaːoneːsixːttf'
'书法家超明体.ttf'                      '书法家超明体ːttf'

考虑到在 TeX 中想出一个命名约定是多么困难,并且不会导致难以阅读的带有罗马数字的意大利面条式名称,我对此感到非常满意。

答案1

Xe(La)TeX 和 Lua(La)TeX 中的类别代码均由脚本设置load-unicode-data.tex,它从 Unicode 联盟中获取代码点。脚本本身设置

  • \catcode所有字母均为 11(Unicode 类“L”)
  • \catcode所有组合标记均为 11(Unicode 类“M”)

UnicodeData.txt因此,这里最好的说法是“读”。

相关内容