如何将 chardef 标记扩展为字符?

如何将 chardef 标记扩展为字符?

这也许是一个基本问题,但我现在很困惑。

我应该怎样将一个盒子寄存器扩展为一个字符?

例如,\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标记与字符进行比较是没有意义的。

相关内容