关于写入和读取辅助文件(.aux、.toc 等)的基础知识

关于写入和读取辅助文件(.aux、.toc 等)的基础知识

某些操作(例如生成目录)需要 TeX 编译器进行两次传递:在第一次传递期间,一些数据被写入辅助文件,而第二次传递期间只能检索这些数据。以下是一些需要两次传递解决方案的 TeX.SE 问题:

两次通过的东西引起了我的兴趣;我有几个问题:

  1. 我可以将自定义数据写入(附加)到现有辅助文件(例如 .aux)吗?这是个好主意吗?如果不行,我可以生成自己的辅助文件(带有自定义扩展名)来存储/检索某些数据吗?
  2. 有哪些好的资源可以学习写入和读取辅助文件的基础知识?

答案1

您可以使用以下方式写入 aux 文件

\write\@auxout{\gdef\string\testa{hello}}

或者

\immediate\write\@auxout{\gdef\string\testb{hello2}}

或者

\protected@write\@auxout{}{\gdef\string\testc{hello3}}

取决于要求。

\immediate\write此时写入指定的文件,扩展提供的标记(如\edef),因此脆弱的命令会做错误的事情。

\write不写在这一点上它把一个写节点写入当前垂直或水平列表,如果该列表被发送出去以形成页面,则写入会发生。这是使页码正确所必需的。(如果写入是在框内,并且该框从未在主页上使用过,则不会向文件写入任何内容。)

\protected@write是 LaTeX 定义的宏,它使用\write但安排了在 LaTeX 中按要求工作以保护脆弱的命令。上面的额外参数 unused 允许您在本地插入额外定义,以使更多命令安全或在写入中有特殊定义,例如参见或\protect的定义。\index\addtocontents

写入 aux 文件是安全的,但是您必须知道该文件至少会在文档的开始和结束时被读回,因此您需要在该上下文中写入安全的行。

如果你想写入自己的文件,那么你只需要做

\newwrite\myfile
\immediate\openout\myfile=\jobname.foo

在序言中,然后在写作时替换\@auxout为。\myfile

看看source2e中记录的工作方式\tableofcontents。它们基本上都使用\listoftables\listoffigureslatex.ltx

\def\@starttoc#1{%
  \begingroup
    \makeatletter
    \@input{\jobname.#1}%
    \if@filesw
      \expandafter\newwrite\csname tf@#1\endcsname
      \immediate\openout \csname tf@#1\endcsname \jobname.#1\relax
    \fi
    \@nobreakfalse
  \endgroup}

相关内容