代码之家  ›  专栏  ›  技术社区  ›  Brian M. Hunt

XeTeX-检测何时需要重新运行

  •  3
  • Brian M. Hunt  · 技术社区  · 16 年前

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

    目前,SCON和其他构建系统有时无法检测到需要多次运行Xeletex的页面计数和其他引用。下面是一个示例文件(我们称之为 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在三页中有页码“第1页,共0页”、“第2页,共0页”和“第3页,共0页”。如果你跑 xelatex工作 第二次看到“第1页,共3页”,等等(即正确的页数)。

    为了解决这个问题,我在SCons邮件列表中建议,检查是否运行xelatex来解析未定义的引用,需要更改以下正则表达式(在 SCons.Tools.tex 在版本2.0.1的第71行。贝塔。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.pdf .

    这就是问题所在:即使没有未定义的引用(例如,删除 \arabic{lastpage} 从…起 工作特克斯 上图)Xe(La)TeX被调用两次,一次用于生成 .aux ,一次生产 .pdf .显然,如果没有未定义的引用,那么第二次调用是多余的。

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

    谢谢你的阅读。

    顺致敬意,

    布瑞恩

    3 回复  |  直到 16 年前
        1
  •  2
  •   Charles Stewart    16 年前

    你能不能不抄袭这本书。将aux文件复制到备份,并比较备份是否与新生成的备份相同。Xetex运行结束时的aux文件?

        2
  •  1
  •   Bruno De Fraine    16 年前

    您可能希望的解决方案是,引用最后一页时,如果计数器“lastpage”未定义,则会发出警告。然后,原始的重新运行正则表达式将获取该值。

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

    我不知道你是否能把这种行为纳入烤饼中。从Makefile中,使用一些shell逻辑相当容易。

        3
  •  0
  •   gpoo    11 年前

    Rubber 确实如此。它不是防弹的,但在大多数情况下都能工作,而且输出是干净的,更容易发现错误。例如,我会像这样运行它:

    $ rubber --pdf [my-file]
    

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