这个问题是关于显式字符标记的类别。
如果您申请\string
明确的字符标记,您将获得该明确字符标记的第 12 类吊坠。
(例外:如果字符标记的字符代码为 32,表示空格字符,那么您将获得该明确字符标记的第 10 类挂件。)
因此\string
也可以看作是一种可扩展地获取任意显式字符标记(其字符代码不是 32)的 12 类挂件的手段。
是否有办法可以扩展获取任意明确字符标记的其他类别的吊坠?
这样,例如,您可以轻松地将类别 12 的显式左花括号转换{
为类别 1 中的花括号?
这样,例如,您可以轻松地将类别 12 的显式右花括号转换}
为类别 2 中的花括号?
这样,例如,您可以轻松地将#
类别 6 的显式哈希转换为类别 3 中的花括号?
如果不是:不提供这种方法的原因是什么?
这种方法是否会导致歧义/问题/麻烦,甚至扭曲 TeX 的基本概念?
(如果实施了这样的方法,是否可能会进行测试来查明一个标记是否是一个明确的字符标记?)
答案1
在令牌处理器级别解释的类别存在歧义行为。当您想通过可扩展宏创建类别 0、5 或 14 时会发生什么?
但是你可以通过 LuaTeX 扩展来做到这一点(对于其他“正常”类别):
\def\tokencatcode#1#2{%
\immediateassignment\edef\tmp{\the\catcode`#1}%
\immediateassignment\catcode`#1=#2
\scantextokens\expandafter{\csstring#1}%
\immediateassignment\catcode`#1=\tmp\space
}
$a\tokencatcode !{7}2 + b^2 = c^2$
\message{.......\tokencatcode !{7}} % yes, it is expandable
\bye
或者更简单的方法是\directlua
:
\def\tokencatcode#1#2{\directlua{tex.cprint(#2,"\csstring#1")}}