我正在尝试确定由于未定义的引用,何时需要重新运行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的页码分别为“Page1 of 0”、“Page2 of 0”和“Page3 of 0”。如果您第二次运行xelatex job,您会得到“第1页,共3页”等信息(即正确的页数)。
为了解决这个问题,我在SCons邮件列表上建议,检查是否运行xelatex来解析未定义的引用的方法是更改以下正则表达式(在2.0.1.beta.20100627.r5064版的SCons.Tools.tex中的第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之间的临时构建目标。
这就是问题所在:即使没有未定义的引用(例如,从上面的job.tex中删除\arabic{lastpage} ),Xe(La)TeX也会被调用两次,一次用来产生.aux,一次用来产生.pdf。显然,如果没有未定义的引用,则第二个调用是多余的。
因此,我的问题是:当存在或不存在需要重新编译的未定义引用(例如\阿拉伯语{lastpage})时,如何检测(假设通过对job.log的正则表达式测试)。
感谢您的阅读。
诚挚的问候,
布赖恩
发布于 2010-07-13 16:39:21
您是否可以只将.aux文件复制到备份,然后比较备份是否与在Xetex运行结束时新生成的.aux文件相同?
发布于 2010-07-13 16:44:48
你可能想要的解决方案是引用最后一页,这样当计数器"lastpage“未定义时就会给出一个警告。然后,这将被原始的重新运行正则表达式拾取。
我使用的另一种方法是继续运行LaTeX,直到aux-file不再更改(从概念上讲,aux-file既是LaTeX运行的输入也是输出,并且一直运行LaTeX,直到到达aux-file的固定点)。这应该保证重新运行LaTeX不会再更改结果文档。
我不知道你能不能把这种行为融入到scons中。在Makefile中,使用一些shell逻辑是相当简单的。
发布于 2014-11-15 06:51:16
Rubber就是这样做的。它不是防弹的,但它在大多数情况下都是有效的,并且输出是干净的,使得更容易发现错误。例如,我会像这样运行它:
$ rubber --pdf [my-file](也就是说,如果4年后这仍然有用:-)
https://stackoverflow.com/questions/3232334
复制相似问题