为什么 \openout 在纯 tex 中产生输出而在 latex 中却没有?

为什么 \openout 在纯 tex 中产生输出而在 latex 中却没有?

这是一个后续问题这个问题。为什么这个简单的代码(来自什里瓦察回答

\newwrite\outfile
\openout\outfile\jobname.out
\end

生成一个页面,但是这个(等效的)乳胶代码却没有?

\documentclass{article}
\newwrite\outfile
\openout\outfile\jobname.out
\begin{document}
\end{document}

答案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 那样“手动”处理浮点数)所以每当调用输出例程时它总是会输出一些东西。

相关内容