在中plain.tex,插入命令定义为

\newinsert\topins
\newif\ifp@ge \newif\if@mid
\def\topinsert{\@midfalse\p@gefalse\@ins}
\def\midinsert{\@midtrue\@ins}
\def\pageinsert{\@midfalse\p@getrue\@ins}
\skip\topins=\z@skip % no space added when a topinsert is present
\count\topins=1000 % magnification factor (1 to 1)
\dimen\topins=\maxdimen % no limit per page
\def\@ins{\par\begingroup\setbox\z@\vbox\bgroup} % start a \vbox
\def\endinsert{\egroup % finish the \vbox
  \if@mid \dimen@\ht\z@ \advance\dimen@\dp\z@ \advance\dimen@12\p@
    \advance\dimen@\pagetotal \advance\dimen@-\pageshrink
    \ifdim\dimen@>\pagegoal\@midfalse\p@gefalse\fi\fi
  \if@mid \bigskip\box\z@\bigbreak
  \else\insert\topins{\penalty100 % floating insertion
    \splittopskip\z@skip
    \splitmaxdepth\maxdimen \floatingpenalty\z@
    \ifp@ge \dimen@\dp\z@
    \vbox to\vsize{\unvbox\z@\kern-\dimen@}% depth is zero
    \else \box\z@\nobreak\bigskip\fi}\fi\endgroup}

为什么需要以 开始一个结束的\@ins?据我所知,在和之间的最顶层发生的所有更改都可以安全地泄漏到外面:\begingroup\endinsert\endgroup\begingroup\endgroup

  • \box0被设置为\vbox要插入的材料,然后在拆箱时清空;但这并不重要,因为\box0它只是一个临时寄存器。
  • \dimen0被设置为要与之比较的高度\pagegoal,但是这同样没有关系,因为\dimen0它只是一个临时寄存器。
  • \if@mid并且\ifp@ge可能被设置为false,但是这也无所谓,因为它们总是被 //\@ins重新\top设置midpageinsert

我是否忽略了这里什么东西?


最佳答案
1

我认为这只是为了保存临时寄存器。

您说“如果 的值发生变化,这无所谓”,\dimen0这可以说是事实,但从历史上看,许多人通过使用临时寄存器并假设其值在以后仍然有效而引入了错误。不进行不必要的更改可以为那些可能没有想到使用 insert 来重置 的用户提供一些保护\dimen0