我已经在本网站和谷歌上搜索过所有教程,但没有看到太多,我觉得这很奇怪。
我找到了这个页面https://en.wikibooks.org/wiki/LaTeX/Boxes但它仍然没有解释 newbox 命令的作用。
答案1
定义如下
% latex.ltx, line 339:
\def\newbox {\e@alloc\box
{\ifnum\allocationnumber<\@cclvi
\expandafter\chardef
\else
\expandafter\e@alloc@chardef
\fi}
{\count14}\insc@unt\float@count}
呃,没什么帮助,是吗?好吧,我们知道后面\newbox
应该跟一个控制序列名称,假设是\foo
。我们需要看看\e@alloc
:
% latex.ltx, line 386:
\def\e@alloc#1#2#3#4#5#6{%
\global\advance#3\@ne
\e@ch@ck{#3}{#4}{#5}#1%
\allocationnumber#3\relax
\global#2#6\allocationnumber
\wlog{\string#6=\string#1\the\allocationnumber}}%
它需要六个参数。让我们看看调用时它们是什么\newbox\foo
。
#1
是\box
#2
是\ifnum\allocationnumber...\fi
#3
是\count14
#4
是\insc@unt
#5
是\float@count
#6
是\foo
寄存器的最后分配编号\box
是\count14
(可以在中看到source2e
);因此第一步是将其加一。然后
\e@ch@ck{\count14}{\ins@count}{\float@count}\box
执行。我不会详细介绍,但这会根据已完成的分配选择一个新数字;必须考虑到插入和浮点会分配盒子寄存器。无论如何,在过程结束时,\allocationnumber
设置为所选的整数值,(除非没有空间容纳新的盒子寄存器,这种情况不太可能发生,因为有 32768 个;在这种情况下会引发错误。
正常情况下,执行下一步,即
\global#2#6\allocationnumber
如果所选数字小于 256,则变为
\global\chardef\foo\allocationnumber
否则就变成
\global\mathchardef\foo\allocationnumber
无论哪种情况,\foo
基本上都等同于分配的数字。
当\box\foo
调用时,这将与指定盒子寄存器号相同(优点是我们永远不需要知道精确的数字)。
如果您使用推荐的 LaTeX 命令,即\newsavebox{\foo}
,则执行初始步骤:LaTeX 检查 是否\foo
尚未定义。在这种情况下\newbox\foo
执行;否则会引发错误并忽略定义。
这与其他寄存器分配完全不同。例如,如果你这样做\newlength\foo
,这最终会变成
\skipdef\foo=<number>
其中数字的确定方式与之前相同。这允许\foo
在 TeX 需要长度或长度寄存器名称的所有情况下使用。
TeX 没有\boxdef
命令,因为盒子寄存器相当特殊,并且可以以多种方式使用它们:
\box\foo
\copy\foo
\unhbox\foo
\unvbox\foo
\unhcopy\foo
\unvcopy\foo
所以\boxdef
令牌就完全没用了。
另一种用法是\setbox\foo<box specification>
填充框寄存器。建议阅读有关此内容的 TeXbook 或 TeX by Topic。