aux文件什么时候被读写?

aux文件什么时候被读写?
  1. 我想知道aux文件何时被读取。我知道它发生在前导码之后,但它是在钩子之前还是之后\AtBeginDocument

  2. 我想知道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处于不完整状态,即使崩溃发生在“应该”写入之后。

相关内容