TeXbook 第 116 页中有话说:
... 假设你连续制作七个顶部插入物,尺寸分别为 1、2、3、9、3、2、1 英寸;9 英寸的实际上是
\pageinsert
。
这个表述很奇怪。为什么不说“假设你制作三个顶部插入...,然后是页面插入...,然后是三个顶部插入...”?
那么,当topinsert的高度占据整个页面时\topinsert
可以互换吗?\pageinsert
比较这些时(见下文),出现了三个问题。
以下文件可作为起点:
\hrule height \vsize width300pt
\bye
输出为:
(p.tex [1] )
现在制作一个页面插入:
\pageinsert
\hrule height \vsize width300pt
\endinsert
\bye
输出为:
(p.tex [1] [2] )
问题 1:为什么要创建第二页?
然后制作一个顶部插入:
\topinsert
\hrule height \vsize width300pt
\endinsert
\bye
输出为:
(p.tex [1]
Overfull \vbox (8.0pt too high) has occurred while \output is active [2]
[3] )
问题2:为什么要创建第二页和第三页?
问题 3: 此外,最后一个例子的日志文件包含以下内容:
\vbox(643.20255+0.0)x300.0, glue set - 1.0
.\glue(\splittopskip) 0.0
.\vbox(643.20255+0.0)x300.0
..\rule(643.20255+0.0)x300.0
.\penalty 10000
.\glue 12.0 plus 4.0 minus 4.0
显然,\bigskipamount
在 的末尾使用了粘连\topinsert
。但是如果我们使用\showthe\skip\topins
,0.0pt
则输出 。为什么?
更新我检查过,如果在最后一个例子中我们这样做\bigskipamount=0pt
,那么输出将与示例相同\pageinsert
。
答案1
topinsert 和 pageinsert 大部分共享相同的代码,只有一个布尔开关来区分它们
\def\topinsert{\@midfalse\p@gefalse\@ins}
\def\midinsert{\@midtrue\@ins}
\def\pageinsert{\@midfalse\p@getrue\@ins}
因此,例如,您询问的 bigskip 出现在 topinserts 的末尾,因为\ifp@ge
在这种情况下为假,并且\endinsert
具有
\ifp@ge \dimen@\dp\z@
\vbox to\vsize{\unvbox\z@\kern-\dimen@}% depth is zero
\else
\box\z@\nobreak\bigskip
%%%%%%
\fi
TeXbook p.115 中也对此进行了解释:
Plain TEX 自动在每个顶部插入文字下面添加一个“bigskip”;这将把标题和文本分开。
...
...如果你说'\pageinsert \endinsert',垂直模式材料将被调整为整页的大小(没有下面的bigskip)...