我想知道
aux
文件何时被读取。我知道它发生在前导码之后,但它是在钩子之前还是之后\AtBeginDocument
?我想知道
aux
文件(或任何其他辅助文件)的实际写入时间。我尝试通过在应该将某些内容写入aux
文件之后放置未定义的命令来跟踪写入过程,并以交互模式运行pdflatex
,如下所示:\documentclass{article} \begin{document} \section{S}\label{s}% write something to the aux file \foo% unknown command \end{document}
但令我惊讶的是,
aux
当在错误处停止时,文件仍然是空的pdflatex
。我猜想发生了一些缓冲,但我该如何解决同步问题?比如,什么时候\foo
命令想要从aux
文件中读取?
答案1
该.aux
文件作为宏的一部分被读取\document
(\begin{document}
),但是前钩子被使用了。(您可以通过在文件和钩子\AtBeginDocument
中插入一些“测试代码”来检查这一点。).aux
写入.aux
文件既可以“立即”进行,也可以在发货时进行。后者对于获取例如交叉引用的正确页码非常重要,因此诸如此类的事情\label
会以延迟的方式进行,使用\protected@write
原始数据的“包装器” \write
。因此例如
\documentclass{article}
\begin{document}
\makeatletter
\immediate\write\@auxout{\string\foo}
\protected@write\@auxout{}{\string\baz}
\end{document}
\foo
文件中的only places .aux
:\baz
永远不会写入,因为没有页面 shipout。在您的示例中,shipout 发生在之后\foo
,因此您.aux
在那时看不到文件中的任何内容,尽管稍后确实发生了 shipout。
请注意,TeX 会将.aux
文件保持打开状态直到运行结束,因此您无法确定在运行期间\write
部分.aux
文件中是否会出现任何特定内容。因此,检查写入文件的内容的唯一安全时间是运行完成后。特别是,错误终止的作业可能会使文件.aux
处于不完整状态,即使崩溃发生在“应该”写入之后。