由于未定义的引用,我正在尝试确定何时需要重新运行 Xe(La)TeX。我在SCons 邮件列表上发布了一个相关的问题,问题如下:
SCons 和其他构建系统目前有时无法检测到需要多次运行 XeLaTeX 的页数和其他引用。这是一个示例文件(我们称之为job.tex
):
\documentclass[oneside,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 来解析未定义的引用是更改以下正则表达式(在SCons.Tools.tex
版本 2.0.1.beta.20100627.r5064 的第 71 行):
- 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
这就是问题所在:即使没有未定义的引用(例如\arabic{lastpage}
从job.tex
上面删除) Xe(La)TeX 被调用两次,一次生成.aux
,一次生成.pdf
。显然,如果没有未定义的引用,那么第二次调用是多余的。
job.log
因此我的问题是:当存在或不存在需要重新编译的未定义引用(例如 \arabic{lastpage})时,如何检测 - 大概是通过正则表达式测试的方式。
感谢您的阅读。
此致,
布赖恩