\newbox 命令有什么作用?

\newbox 命令有什么作用?

我已经在本网站和谷歌上搜索过所有教程,但没有看到太多,我觉得这很奇怪。

我找到了这个页面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。

相关内容