在中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
设置。mid
pageinsert
我是否忽略了这里什么东西?
最佳答案
1
我认为这只是为了保存临时寄存器。
您说“如果 的值发生变化,这无所谓”,\dimen0
这可以说是事实,但从历史上看,许多人通过使用临时寄存器并假设其值在以后仍然有效而引入了错误。不进行不必要的更改可以为那些可能没有想到使用 insert 来重置 的用户提供一些保护\dimen0
。
|
|