当文档中没有排版内容时,为什么 \write 不起作用?

当文档中没有排版内容时,为什么 \write 不起作用?

我不明白在哪个点\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 节点的垂直列表的页面,则永远不会使用保存的信息。

相关内容