答案1
\showlists
如果你在结尾前插入
\makeatletter
\showoutput
\def\enddocument{%
\let\AtEndDocument\@firstofone
\@enddocumenthook
\@checkend{document}%
\clearpage
\begingroup
\if@filesw
\immediate\closeout\@mainaux
\let\@setckpt\@gobbletwo
\let\@newl@bel\@testdef
\@tempswafalse
\makeatletter \@@input\jobname.aux
\fi
\@dofilelist
\ifdim \font@submax >\fontsubfuzz\relax
\@font@warning{Size substitutions with differences\MessageBreak
up to \font@submax\space have occurred.\@gobbletwo}%
\fi
\@defaultsubs
\@refundefined
\if@filesw
\ifx \@multiplelabels \relax
\if@tempswa
\@latex@warning@no@line{Label(s) may have changed.
Rerun to get cross-references right}%
\fi
\else
\@multiplelabels
\fi
\fi
\endgroup
\deadcycles\z@\showlists\@@end}
\documentclass{article}
\newwrite\outfile
\openout\outfile\jobname.out
\begin{document}
\end{document}
你看
### vertical mode entered at line 0
### current page:
\write-{}
\openout3=file.out
\write-{}
prevdepth 0.0
! OK.
\enddocument ...dgroup \deadcycles \z@ \showlists
\@@end
l.47 \end{document}
?
也就是说,写入节点是独自保留的。
\clearpage
本质上,文档末尾的隐式循环已经循环了一圈,并且知道当前页面没有高度并且没有可添加的浮点数,因此它会停止。
相反,普通输出例程是
\def\plainoutput{\shipout\vbox{\makeheadline\pagebody\makefootline}%
它没有进行任何测试来重新插入浮点数(Plain TeX 使用该\insert
机制,因此不像 LaTeX 那样“手动”处理浮点数)所以每当调用输出例程时它总是会输出一些东西。