我正在尝试确定何时因未定义的引用而需要重新运行Xe(La)TeX。我在SCons mailing list上发布了一个相关问题,问题如下:
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来解析未定义的引用是改变以下正则表达式(在版本2.0.1的第71行的SCons.Tools.tex
中) .beta.20100627.r5064):
- 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
。显然,如果没有未定义的引用,则第二次调用是多余的。
因此我的问题是:当有或没有需要重新编译的未定义引用(例如\ arabic {lastpage})时,如何检测 - 大概是通过对job.log
的正则表达式测试 -
感谢您的阅读。
致以最诚挚的问候,
布赖恩
答案 0 :(得分:2)
你能不能只将.aux文件复制到备份中,并比较备份是否与Xetex运行结束时新生成的.aux文件相同?
答案 1 :(得分:1)
您可能想要的解决方案是引用最后一页,以便在未定义计数器“lastpage”时给出警告。然后由原始的重新运行正则表达式拾取。
我使用的另一种方法是继续运行LaTeX,直到aux-file不再发生变化(概念上,aux-file既是LaTeX运行的输入也是输出,你继续运行LaTeX直到你到达aux文件的固定点)。这应该保证重新运行LaTeX不再更改生成的文档。
我不知道你是否可以将这种行为纳入scons。从Makefile中,使用一些shell逻辑非常容易。
答案 2 :(得分:0)
Rubber正是如此。它不是防弹的,但它大部分时间都可以工作,输出很干净,更容易发现错误。例如,我会运行它:
$ rubber --pdf [my-file]
(也就是说,如果4年后这仍然有用: - )