【问题标题】:XeTeX - Detect when re-run is neededXeTeX - 检测何时需要重新运行
【发布时间】:2010-07-12 21:15:44
【问题描述】:

由于未定义的引用,我正在尝试确定何时需要重新运行 Xe(La)TeX。我在SCons mailing list上发过相关问题,问题如下:

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 版第 71 行的 SCons.Tools.tex .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.texjob.pdf 之间的临时构建目标相同。

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

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

感谢您的阅读。

最好的问候,

布赖恩

【问题讨论】:

    标签: latex scons tex xetex xelatex


    【解决方案1】:

    能否不只是将.aux文件复制到备份中,在Xetex运行结束时比较备份是否与新生成的.aux文件相同?

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

        $ rubber --pdf [my-file]
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-26
          • 2011-08-05
          • 2013-06-20
          • 1970-01-01
          相关资源
          最近更新 更多