某些操作(例如生成目录)需要 TeX 编译器进行两次传递:在第一次传递期间,一些数据被写入辅助文件,而第二次传递期间只能检索这些数据。以下是一些需要两次传递解决方案的 TeX.SE 问题:
- 突出显示引用的方程式编号
- 方程式的反向引用
- (未完待续……如遇到此类问题欢迎修改)
两次通过的东西引起了我的兴趣;我有几个问题:
- 我可以将自定义数据写入(附加)到现有辅助文件(例如 .aux)吗?这是个好主意吗?如果不行,我可以生成自己的辅助文件(带有自定义扩展名)来存储/检索某些数据吗?
- 有哪些好的资源可以学习写入和读取辅助文件的基础知识?
答案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
\listoffigures
latex.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}