在 TeXbook 第 44 页中,Knuth 写道:
例如,
\char`b
和\char`\b
也等同于\char98
。
我知道对于像 这样的特殊字符\
,我们必须对其进行转义,即\char`\\
。但是既然b
只是一个字母,为什么我们仍然可以“转义”它?\b
这里是一个宏吗?
答案1
这\<char>
有每一个字符,因为人们永远无法确定一个字符具有什么类别代码。
对于类别代码 0、5、9、14 或 15 的每个字符来说,转义当然是必要的,但是当您不想影响括号级别计数器时,对于类别 1、2 也需要转义,如果在定义中使用,则需要类别 6 转义。
后面的控制序列`
应该有一个由单个字符组成的名称,并且不需要定义。在这种情况下,反斜杠被简单地删除,名称被用作字符。
仅举一个例子,`\^^M
完全遵循语法,因为^^M
代表标记化后的单个字符。
好奇的是:TeX 还会在字母常量(带扩展)后寻找空格。因此是之间的区别
\number`b \foo
和
\number`\b \foo
因为在第一种情况下,只有在执行完其操作\foo
后才会展开,而在第二种情况下,则会在完成之前展开。这里我假设其正常类别为 11。\number
\foo
\number
b
答案2
“为什么?”这个问题很难回答,因为它是允许的,所以才允许。请注意,tex 没有任何内置的特殊字符集,只有当字符的 catcode 不是 11 或 12 时,它们才是特殊的,并且始终允许单字符 csname 可能比进行 catcode 检查并在某些情况下不允许它更容易。
它可能很有用,因为包可以在\char`\b
不知道当时的 catcode 的情况下使用该表单b
,尽管您需要知道它不是 catcode 15,并且为了有用,您需要知道 cha 和 r 具有 catcode 11 才能\char
工作,所以在实践中它不是那么有用。