![为什么没有 \mudimendef 原语?](https://linux22.com/image/239679/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%B2%A1%E6%9C%89%20%5Cmudimendef%20%E5%8E%9F%E8%AF%AD%EF%BC%9F.png)
TeXbook 在第 24 章(我的版本为第 270 页)中定义了<dimen>
,<skip>
,<mudimen>
和<muskip>
其中,前两个用于水平和垂直模式,后两个用于数学模式。
但是数学模式和其他模式之间的这种相似性被寄存器打破了:只有\dimendef
、\skipdef
和\muskipdef
存在,而不存在\mudimendef
。同样,\dimen 0
、\skip 0
和\muskip 0
存在,但不存在\mudimen 0
。
唯一能够操纵 mudimens 的原始人似乎是\mkern
。为什么<mudimens>
很特别?
编辑:额外的问题。我问这个问题是因为我试图能够获取任何原语的参数。要获取<dimen>
例如,可以使用\newdimen\MyDimen
和\afterassignment\DoSomethingWithMyDimen \MyDimen=
。鉴于 TeX 没有<mudimen>
参数,我不能使用相同的技巧。我也不能使用 muskip,因为它可能会错误地抓住\mkern
会停止的拉伸或收缩部分。在某些情况下我可以使用寄存器,但不是全部:我如何区分像和(自动强制)这样的\count
情况?\mkern 1mu
\mkern \MyMuskip
答案1
嗯,答案是没有\mudimen
寄存器。:) 所以不可能有命令\mudimendef
。我不知道 Knuth 为什么没有提供这种寄存器;但可能是因为\mkern
和 的\mskip
使用并不多,所以需要为它们提供不同的寄存器。
\mkern 3mu plus
我相信,在文档中找到的机会是无穷小的,但您总是可以plus
在规范之后进行测试,以防万一\mkern
。
也没有强制转换:\mkern 3pt
是非法的,就像 一样\mkern 33
。在 e-TeX 中,有\mutoglue
和\gluetomu
进行计算(与\glueexpr
)或比较(与\ifdim
),但它们只是将 1mu 转换为 1pt 或反之亦然。而 这样的代码\ifdim\mutoglue\mymuskip>\mydimen
虽然合法,但却毫无意义。
因为\mkern
您可以使用\afterassignment\DoSomethingForMKern\tempmuskip=
,但正如您所观察到的,这将吞噬可能隐藏在宏中的aplus
或部分,但会停止 的参数,而原始标记列表将丢失。唉,我认为真的不可能做得更多。minus
\mkern