![TeX 中 `^^` 后面是什么?十六进制、十进制还是符号?](https://linux22.com/image/471492/TeX%20%E4%B8%AD%20%60%5E%5E%60%20%E5%90%8E%E9%9D%A2%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F%E5%8D%81%E5%85%AD%E8%BF%9B%E5%88%B6%E3%80%81%E5%8D%81%E8%BF%9B%E5%88%B6%E8%BF%98%E6%98%AF%E7%AC%A6%E5%8F%B7%EF%BC%9F.png)
^^6\bye
会产生v
。我能理解这一点。6
是ASCII表的符号,6
符号的DEC是54。由于54小于64,所以54+64=128。ASCII表的第128个符号是v
。
^^61
结果是a
。但是从ASCII表中,没有 这样的符号61
。其实61
是一个Hex代码。它的Dec代码是97,ASCII的第97个符号是a
。很奇怪。1. 61不需要加64。2.61是Hex代码,不是ASCII表的符号。
ASCII 表的第 90 个符号是Z
。要得到Z
,90-64=26,而 ASCII 表的第 26 个符号是SUB
。因此,^^SUB
应该得到Z
,但实际上没有得到 。为什么?
如何理解 TeX 中后面的部分^^
?
答案1
有两种相互竞争的^^
约定。原始约定适用于 TeX 版本 2,即 TeX 查找下一个字符代码并添加或减去 64:
如果下一个字符代码大于或等于 64,TeX 将减去;
如果下一个字符代码小于 64,TeX 将添加。
无论哪种情况,都会获得 0-127 范围内的字符代码。
然而,在 TeX 版本 3 中还引入了另一个约定,在某些情况下它可能与之前的约定相冲突,但是优先超过它。
当下一个字符,比如说x
在 之中时0123456789abcdef
,TeX 还会查看下一个字符,比如说y
和 ,如果再次位于同一集合之中,则该字符对将被视为十六进制数,并以十六进制^^xy
表示法表示具有字符代码的字符。xy
让我们举几个例子:
^^1q
将使用原始约定;由于的字符代码为1
49,我们最终得到字符编号 113,并且您得到的结果与输入
qq
相反,输入
^^11
将遵循版本 3 的约定,您将获得十六进制代码的字符"11
,即十进制的 17,您也可以输入为
^^Q
在您的情况下^^61
,符合版本 3 约定,它优先于原始约定,因此您会得到十进制代码为 97 的字符,正如您所发现的。
不要被第 367 页的表格误导,其中非打印 ASCII 字符以其传统名称提及,但这些名称不能像您认为的那样使用。因此,^^SUB
仅生成十六进制 ASCII 码字符"13
,即十进制的 19,后跟字符UB
。
答案2
TeXBook 对此进行了解释
\danger \TeX\ has a standard way to refer to the invisible characters of ASCII:
Code~0 can be typed as the sequence of three characters |^^@|, code~1 can
be typed |^^A|, and so on up to code~31, which is |^^_| (see Appendix~C\null).
If the character following |^^| has an internal code between 64 and 127, \TeX\
subtracts 64 from the code; if the code is between 0 and 63, \TeX\
adds~64. Hence code 127 can be typed |^^?|, and
the dangerous bend sign can be obtained by saying
|{\manual^^?}|. However, you must change the category code of character
127 before using it, since this character ordinarily has category~15
(^{invalid}); say, e.g., |\catcode`\^^?=12|.
^^{double hat} ^^{hat hat}
The |^^| notation is different from |\char|, because |^^| combinations are
like single characters; for example, it would not be permissible to say
|\catcode`\char127|, but |^^| symbols can even be used as letters within
control words.
...
\danger There's also a special convention in which |^^| is
followed by {\sl two\/} ``lowercase hexadecimal digits,'' |0|--|9| or |a|--|f|.
With this convention, all 256 characters are obtainable in a uniform
way, from |^^00| to |^^ff|. Character 127 is |^^7f|.
所以
^^6
相当于输入字符 54+64 = 118 v
^^61
是两个十六进制数字,因此就像输入字符十六进制 61 一样a
^^S
相当于输入字符 83-64=19,相当于键盘上的 ctrl-s。cmr 字体编码中的字符 19(在 latex 中称为 OT1)是重音符号。
1 ^^6
2 ^^61
3 ^^S
\bye