我正在使用辅助文件来访问一些计算的结果,我需要这些结果才能真正计算出来。由于当结果发生变化时需要运行两次,因此我希望有一种机制来检测此类变化并向用户打印一条消息。
我隐约记得一种模式,安装了一个钩子来将要写入的值与前一个值(非立即写入钩子)进行比较,然后设置一个标志,根据该标志向用户显示警告,通知他需要重新编译。
不幸的是,我找不到这个例子了。有谁知道这个模式,能给我指点一下吗(最好是简单的) 示例代码?
Despearte 通过谷歌搜索找到了这个例子:https://tex.stackexchange.com/a/49035/19326然而我对它理解有问题(AtEndDocument 的目的{\def})。
由于这个问题目前处于一个糟糕的境地(我猜这不再是一个真正的问题了,我想知道继续下去的最好方法是什么,请参阅下面的评论)
答案1
\usepackage[aux]{rerunfilecheck}
如果辅助文件已发生改变,则会发出警告并要求再次运行。
答案2
代码来自https://tex.stackexchange.com/a/49035/19326,粘贴在这里作为参考姿势的示例。
\documentclass{article}
\makeatletter
% The command reference writes \newreference into the aux file
\def\createreference#1#2{\@bsphack
\protected@write\@mainaux{}%
{\string\newreference{#1}{#2}}%
\@esphack}
% The command \newreference defines new command named after the first
% argument that produces the second one
\def\newreference#1#2{%
\expandafter\xdef\csname rfr@#1\endcsname{#2}}
% And using the reference
\def\citereference#1{%
\expandafter\ifx\csname rfr@#1\endcsname\relax??\else
\csname rfr@#1\endcsname\fi}
% LaTeX checks at the end of document whether references have
% been changed. If any reference is changed,
% \tempswa is set to true. Here we add \newreference commands
% to the list to be checked.
\AtEndDocument{\def\newreference#1#2{%
\edef\reserved@a{#2}%
\expandafter\ifx\csname rfr@#1\endcsname\reserved@a\else
\@tempswatrue\fi}}
\makeatother
\begin{document}
\createreference{john}{John Q. Citizen}
\citereference{john} and \citereference{george}
\end{document}
我们注意到以下模式:
- 创建自己的 def 宏
yourDefMacro
来为给定的键分配值 - 每当你想要在辅助文件中存储某些内容时,将字符串写入
\yourDefMacro{key}{value}
辅助文件 - 在文档的末尾将 def 宏重新定义为检查宏,该检查宏将宏的当前值
key
与将分配给它的值进行比较。
以下是相应的代码部分:
1. Def Macro
\def\newreference#1#2{%
\expandafter\xdef\csname rfr@#1\endcsname{#2}}
请注意,此宏实际上将前缀添加rfr@
到正在定义的实际名称中。添加通常不会被识别为文档中的字符,从而避免命名空间混乱(这通过将其包装在中来更改宏的定义\makeatletter
\makeatother
)。
2. 写入 auxfile
\def\createreference#1#2{\@bsphack
\protected@write\@mainaux{}%
{\string\newreference{#1}{#2}}%
\@esphack}
这将导致辅助文件看起来像这样:
\relax
\newreference{john}{John Q. Citizen}
/通过删除多余的空格来解决空格问题。基本上,它会测试宏所在位置前面是否有空格,并查看后面是否有空格。如果两边都有空格,则删除其中一个空格,从而只留下一个空格\@bsphack
。\@esphack
\@bsphack
\@esphack
3. 测试宏
\AtEndDocument{%
\def\newreference#1#2{%
\edef\reserved@a{#2}%
\expandafter\ifx\csname rfr@#1\endcsname\reserved@a%
\else%
\@tempswatrue%
\fi}}
这将覆盖 的定义\newreference
。之前\AtEndDocument
会导致 aux 文件再读一遍。它\reserved@a
在新编写的辅助文件中为新定义定义一个宏,并将其定义与由创建的定义进行比较宏定义在编译开始时首次读取辅助文件时,Latex 会执行此操作。有一个空的 if 分支,但是如果这些值不同,则执行此分支,导致 Latex在运行结束时\@tempswatrue
发出一条消息。Compile again