我对辅助文件有疑问。根据 Tex-Exchange 上的一些帖子,辅助文件是在文档开头读取的(是在\begin{document}
还是\documentclass
?我想建立一个测试文档。每次运行它都应该增加打印在纸上的数字。
\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[german]{babel}
\usepackage{graphicx}
\usepackage{environ}
\usepackage{etoolbox}
\begin{document}
%Don't overwrite \counti
\ifdefined\counti
TRUE
\else
FALSE
\newcount\counti
\counti=0
\fi
%make counti raise by 1
\the\counti
\advance\counti by1
%write to aux-file
\makeatletter
\write\@auxout{\noexpand\newcount\counti}
\write\@auxout{\counti= \the\counti}
\makeatother
\end{document}
输出为
TRUE
0
这证明它从辅助文件中读取了新计数。但不幸的是,该值保持为 0。实际上,每次运行时它都应该增加一。
辅助文件说
\newcount \counti
\counti = 1
每次跑步后。
答案1
当 LaTeX 读取.aux
文件时,它会在本地组内读取。\newcount
全局分配计数寄存器,但分配\counti=...
与 LaTeX 的类似,是本地的\setlength
,但与 LaTeX 的分配不同\setcounter
。因此,可以通过全局分配来解决问题:
\write\@auxout{\global\counti= \the\counti\relax}
(我已添加\relax
。然后 TeX 将不会再进行解析以查找数字。)
答案2
这里有一个更“乳胶”的方法,使用 Heiko 的引用计数包。这个想法是将计数器的值作为标签保存到辅助文件中,然后在每次使用编译文件时将其读回\setcounterref
。
下面的 MWE 输出采用以下形式:
计数器的值每次都会增加。
\documentclass{article}
\usepackage{refcount}\setrefcountdefault{0}
\usepackage{etoolbox}
\newcounter{TestCounter}
\AtEndDocument{% save counter value to aux file at end of document
\addtocounter{TestCounter}{-1}%
\refstepcounter{TestCounter}\label{Ref:TestCounter}%
}
\AfterEndPreamble{% set counter using value saved in aux file
\setcounterref{TestCounter}{Ref:TestCounter}%
}
\begin{document}
Counter is \arabic{TestCounter}
\addtocounter{TestCounter}{1}
\end{document}
我已经使用\AtEndDocument
和\AfterEndPreamble
命令自动执行了此操作电子工具箱包。(这只是为了概念验证。有更好的方法可以写入辅助文件,避免减少然后增加计数器。)