我不明白在哪个点\openout
打开文件、\write
写入文件并\closeout
关闭文件。我发现,如果文档环境中没有排版任何内容,则只有直接写入才会写入任何内容,并且只有当 、\openout
和\write
全部\closeout
以 开头时才会写入任何内容\immediate
。如果\openout
、\write
、中只有部分\closeout
前面没有\immediate
,事情会变得更加复杂,有时文件已创建但保留为空(因此缓冲区未刷新,文件可能未关闭)。以下是我发现的 MWE:
\documentclass{article}
\newwrite\wpreim
\immediate\openout\wpreim=test_pre_immed.txt\relax
\immediate\write\wpreim{FOO}
\immediate\closeout\wpreim
\newwrite\wpredel
\openout\wpredel=test_pre_delayed.txt\relax
\write\wpredel{FOO}
\closeout\wpredel
\immediate\write18{echo FOO >> test18_pre_immed.txt}
\write18{echo FOO >> test18_pre_delayed.txt}
\begin{document}
% case 1: having nothing typeset in the document: only the immediate write's write
% case 2: having some content (e.g. ~) in the document: all of the write's until the last \eject write
% case 3: having nothing typeset after the last \eject: only the write's until the last \eject write
~
\vfil\eject
\newwrite\wdocim
\immediate\openout\wdocim=test_doc_immed.txt\relax
\immediate\write\wdocim{FOO}
\immediate\closeout\wdocim
\newwrite\wdocdel
\openout\wdocdel=test_doc_delayed.txt\relax
\write\wdocdel{FOO}
\closeout\wdocdel
\immediate\write18{echo FOO >> test18_doc_immed.txt}
\write18{echo FOO >> test18_doc_delayed.txt}
\end{document}
将其命名为 foo.tex,检查
rm test*.txt ; pdflatex -shell-escape foo.tex ; for i in test*.txt ; do ls -l $i ; cat $i ; done
答案1
\immediate\write
立即写入输出流,但\write
它本身并不写入任何内容,它将标记放入保存在当前垂直列表中的 whatsit 节点中,以及来自文档文本的框和粘合,并且实际写入发生在\shipout
将页面写入 dvi 或 pdf 文件时(因此页码是正确的),因此如果您不发送包含该 whatsit 节点的垂直列表的页面,则永远不会使用保存的信息。