3

由于未定义的引用,我正在尝试确定何时需要重新运行 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 来解析未定义的引用是更改以下正则表达式(在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.texjob.pdf

这就是问题所在:即使没有未定义的引用(例如\arabic{lastpage}job.tex上面删除) Xe(La)TeX 被调用两次,一次生成.aux,一次生成.pdf。显然,如果没有未定义的引用,那么第二次调用是多余的。

job.log因此我的问题是:当存在或不存在需要重新编译的未定义引用(例如 \arabic{lastpage})时,如何检测 - 大概是通过正则表达式测试的方式。

感谢您的阅读。

此致,

布赖恩

4

3 回答 3

2

能不能不直接把.aux文件复制到备份中,比较一下Xetex运行结束时备份和新生成的.aux文件是否一样?

于 2010-07-13T08:39:20.953 回答
1

您可能想要的解决方案是引用最后一页,以便在未定义计数器“lastpage”时发出警告。这将被原始的重新运行正则表达式拾取。

我使用的另一种方法是继续运行 LaTeX 直到辅助文件不再更改(从概念上讲,辅助文件既是 LaTeX 运行的输入又是输出,并且您继续运行 LaTeX 直到达到辅助文件)。这应该保证重新运行 LaTeX 不会再更改生成的文档。

我不知道您是否可以将此行为纳入 scons。从 Makefile 中,使用一些 shell 逻辑相当容易。

于 2010-07-13T08:44:47.710 回答
0

橡胶正是这样做的。它不是万无一失的,但它在大多数情况下都能正常工作,而且输出很干净,更容易发现错误。例如,我会像这样运行它:

$ rubber --pdf [my-file]

(也就是说,如果 4 年后这仍然有用:-)

于 2014-11-14T22:51:16.410 回答