我正在尝试编写一个(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
因此,这里最好的说法是“读”。