这也许是一个基本问题,但我现在很困惑。
我应该怎样将一个盒子寄存器扩展为一个字符?
例如,
\newbox\foo
假设\number\foo
等于 26,我应该如何将\foo
一个字符与另一个字符进行比较,例如\if\foo b
?
我正在尝试测试命令\foo
后\newbox
与它所代表的字符是否相等,只是想看看我是否知道如何使用它,但如果我输入(假设\number\foo
给出 26),
\newbox\foo
\if\foo\char26 yes\else no\fi
我明白了26 yes
。
因此我尝试进行如下扩展。
\expandafter\expandafter\expandafter%
\if\expandafter\expandafter\foo\char26 yes\else no\fi
然后我仍然得到26 yes
,因为(这花了我一些时间才弄清楚)\char
发生在处理的最后阶段(执行处理器,引用“TeX by Topic”)。
此外,我认为也许使用\uccode
可以解决问题,所以我尝试:
\uccode\lq b=26
\uppercase{\if\foo b yes\else no\fi}
然后我明白了NO æ
。也许我必须以某种方式从中提取字符\foo
?
我突然意识到这\foo
相当于\char26
。
抱歉,这个问题看起来有点乱;我还不太清楚 TeX 的宏结构。任何帮助或参考都将不胜感激,在此先行致谢。
答案1
我不确定你到底想达到什么目的,这看起来很奇怪,但你可以测试一下\ifnum
\ifnum\number\foo=26 yes\else no\fi
答案2
这就像在高级编程语言中定义一个全局变量,并试图在同一个程序中使用该变量的内存寄存器地址。这显然行不通。
考虑这个简单的例子(纯 TeX)
%\input manmac
\newbox\foo
\foo
\bye
这将打印一个无点的 i,因为事实证明分配的盒子寄存器是编号 16 并且cmr10
字体在插槽 16 中有该字符。
现在取消注释第一行,您将得到一个短重音,因为事实证明分配的盒子寄存器是编号 20。为什么呢?很简单:manmac.tex
包含四个\newbox
声明。
您清楚地看到,您无法预见盒子寄存器对应的数字,但这对您的程序无关紧要,只要你不直接提及号码,而仅使用其符号名称\foo
。
程序中不应该利用\newbox\foo
内部实现这一点。这只是\chardef\foo=<number>
执行\chardef
并利用了标记可以在数字上下文中使用的属性。
\foo
在除盒子之外的任何其他环境中使用错误的:您的输出将无法预测,正如前面的例子所示。
让我们换个角度来看。假设你
\chardef\foo=26
这是一个完全合法的指令,并且plain.tex
有很多类似的指令,例如
\chardef\#=`#
(其中`#
指的是字符的 ASCII 码#
)。现在\foo
可用于打印当前字体中占用 26 个位置的字形。如果当前字体是cmr10
,则显示“æ”;如果当前字体是ecrm1000
,则显示“ȷ”(无点 j)。
你看,这\foo
并不是指特点(被视为一个抽象实体),但只是对一个插槽来说:它只是一个指令
打印当前字体中位于 26 号位置的字形
当然,也有一些惯例;例如,在大多数字体中,插槽 98 将包含“b”;但如果当前字体是,tcrm1000
您将得到“⁀”(平局重音符号)。
如果与某些字体一起使用,甚至\#
会产生相当难以预测的结果:wasy10
您会得到“○”(白色圆圈)。
结论:将\chardef
标记与字符进行比较是没有意义的。