![如何检测可能的字符代码的范围?](https://linux22.com/image/345440/%E5%A6%82%E4%BD%95%E6%A3%80%E6%B5%8B%E5%8F%AF%E8%83%BD%E7%9A%84%E5%AD%97%E7%AC%A6%E4%BB%A3%E7%A0%81%E7%9A%84%E8%8C%83%E5%9B%B4%EF%BC%9F.png)
如果这个问题对于这个论坛来说太基础了,请原谅我。
我三周前开始接触 TeX。
我了解到有不同的 TeX 引擎。
例如,有 TeX、eTeX、pdfTeX、pdfeTeX、LuaTeX、XeTeX。
如果我没记错的话,TeX、eTeX 和 pdfTeX 处理 8 位编码,因此使用这些引擎,可能的字符代码(如、、、、等基元的数值\endlinechar
)范围是\newlinechar
0-255 。\char
\lccode
\uccode
\catcode
如果我没记错的话,LuaTeX 和 XeTeX 处理 utf8 编码。
这些引擎可能的字符代码范围是多少?
是否有一种方法可以(可扩展且)可靠地检测正在使用的引擎以及可用的字符代码范围?
我问这个问题是为了解决以下问题:
我使用 eTeX'\scantokens
来重新标记事物。
根据 eTeX 手册,\scantokens
它与以下内容非常相似:
\toks0={...}
\immediate\openout0=file
\immediate\write0{\the\toks0}
\immediate\closeout0
\input file
这意味着在由 的-part\endlinechar
处理的每个“行”末尾插入 表示的字符。我想避免或解决在“输入”的最后一“行”中插入 endlinechar 的问题。\input
\scantokens
现在我尝试类似的事情:
\scantokens{...\begingroup\ifnum\the\catcode\endlinechar>0 \ifnum\the\catcode\endlinechar>255\else\catcode\endlinechar=14 \fi\fi}\endgroup
对于此代码,假定可能的字符代码范围是 0-255,并且该范围是“硬编码的”。
我想找到一种方法来根据所使用的发动机以及发动机的运行模式来指定该范围。
答案1
luatex 和 xetex 的输入必须是格式正确的 utf-8 编码的 Unicode 字符串,因此字符将在 0 到十六进制 10FFFF(十进制 1114111)的范围内,尽管 luatex 允许从 lua 构建比这更高的代码并用于特殊目的。
luatex 和 xetex 的常规测试是检测引擎特定的命令(例如\directlua
和)是否\XeTeXuseglyphmetrics
分别定义
您可以使用\endlinechar=-1
来抑制 endlinechar 但我不确定这是否总是能达到您想要的效果\scantokens
(这完全取决于您想要什么:-)(请注意,luatex 有一个\scantextokens
不添加最终的原语\endlinechar
)
使用 luatex,即使字符在完整的 Unicode 范围内,也\endlinechar
最多为 127 个
答案2
看来您依赖于\scantokens
在正常的 catcode 制度下对事物进行重新标记。
\scantokens
在这种情况下,我建议插入一些在执行-part/retokenization-part时会被识别为注释字符的内容\input
:
\scantokens{...\begingroup\catcode`\X=14 X}\endgroup
A\scantokens{B\begingroup\catcode`\X=14 X}\endgroup X
\bye