XeTeX - 需要重新运行时检测

我正在尝试确定何时因未定义的引用而需要重新运行Xe(La)TeX。我在SCons邮件列表上发布了一个相关问题,问题如下: SCons和其他构建系统有时不会检测到需要多次运行XeLaTeX的页面计数和其他引用。这是一个示例文件(我们称之为
job.tex
):
documentclass[ones​ide,12pt]{memoir}
usepackage{xltxtra}
usepackage[T1]{fontenc}
makepagestyle{plain}
makeoddfoot{plain}{}{}{Page thepage of arabic{lastpage}}
makeevenfoot{plain}{}{}{Page thepage of arabic{lastpage}}
begin{document}
pagestyle{plain}
Page 1
newpage
Page 2
newpage
Page 3
newpage
end{document}
如果运行
xelatex job
,则生成的.pdf的页面编号为“Page 1 of 0”,“Page 2 of 0”和“Page 3 of 0”三页。如果你第二次运行
xelatex job
,你会得到“第1页,共3页”等(即正确的页数)。 为了解决这个问题,我在SCons邮件列表上建议检查是否运行xelatex来解析未定义的引用是改变以下正则表达式(在版本2.0.1.beta.20100627.r5064的第71行的
SCons.Tools.tex
) :
- warning_rerun_str = '(^LaTeX Warning:.*Rerun)|(^Package w+ Warning:.*Rerun)'
+ warning_rerun_str = '(^LaTeX Warning:.*Rerun)|(^Package w+ Warning:.*Rerun)'
+                     '|(^No file w+.w{3}.$)'
实际上,这是对“No file job.aux”的检查。事实证明这适用于所有情况,因为Xe(La)TeX将在第一次运行时始终打印“No file job.aux”,因此Xe(La)TeX始终运行两次。实际上,这与
job.aux
成为
job.tex
job.pdf
之间的临时构建目标是一样的。 其中存在的问题是:即使没有未定义的引用(例如从上面的
job.tex
中删除
arabic{lastpage}
),Xe(La)TeX被调用两次,一次产生
.aux
,一次产生
.pdf
。显然,如果没有未定义的引用,则第二次调用是多余的。 因此,我的问题是:当有或没有需要重新编译的未定义引用(例如 arabic {lastpage})时,如何检测 - 大概是通过对
job.log
的正则表达式测试。 谢谢你的阅读。 最好的祝福, 布赖恩     
已邀请:
你能不能只将.aux文件复制到备份中,并比较备份是否与Xetex运行结束时新生成的.aux文件相同?     
您可能想要的解决方案是引用最后一页,以便在未定义计数器“lastpage”时给出警告。然后由原始重新运行正则表达式拾取。 我使用的另一种方法是继续运行LaTeX,直到aux-file不再发生变化(概念上,aux-file既是LaTeX运行的输入也是输出,你继续运行LaTeX,直到你到达一个固定点为止aux-file)。这应该保证重新运行LaTeX不再更改生成的文档。 我不知道你是否可以将这种行为纳入scons。从Makefile中,使用一些shell逻辑非常容易。     
橡胶确实如此。它不是防弹的,但它大部分时间都可以工作,输出很干净,更容易发现错误。例如,我会运行它:
$ rubber --pdf [my-file]
(也就是说,如果4年后这仍然有用:-)     

要回复问题请先登录注册