\topinsert 与 \pageinsert 有何不同?

\topinsert 与 \pageinsert 有何不同?

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\topins0.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)...

相关内容