XeTeX - определяет необходимость повторного запуска

Я пытаюсь определить, когда требуется повторный запуск Xe(La)TeX из-за неопределенных ссылок. Я разместил соответствующий вопрос в списке рассылки SCons, и проблема в следующем:

Число страниц и другие ссылки, требующие многократного запуска XeLaTeX, иногда в настоящее время не обнаруживаются SCons и другими системами сборки. Вот пример файла (который мы будем называть 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 job во второй раз вы получите "Страница 1 из 3" и т. д. (т. е. правильный счетчик страниц).

Чтобы это исправить, я предложил в списке рассылки SCons проверить, нужно ли запускать xelatex для разрешения неопределенных ссылок, чтобы изменить следующее регулярное выражение (в SCons.Tools.tex в строке 71 версии 2.0.1.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}\.$)'

На практике это проверка "Нет файла 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, Очевидно, что если нет неопределенных ссылок, этот второй вызов является излишним.

Таким образом, мой вопрос: как можно обнаружить - по-видимому, путем проверки регулярного выражения с job.log - когда есть или нет неопределенных ссылок (например, \arabic{lastpage}), которые требуют перекомпиляции.

Спасибо за чтение.

С наилучшими пожеланиями,

Брайан

3 ответа

Можете ли вы не просто скопировать файл.aux в резервную копию и сравнить, совпадает ли резервная копия с недавно созданным файлом.aux в конце работы Xetex?

Решение, которое вы, вероятно, захотите, состоит в том, чтобы ссылаться на последнюю страницу таким образом, чтобы выдавалось предупреждение, когда счетчик "последняя страница" не определен. Затем он будет обработан исходным регулярным выражением.

Альтернативный подход, который я использую, заключается в продолжении запуска LaTeX до тех пор, пока aux-файл больше не изменится (концептуально aux-файл является одновременно входом и выходом запуска LaTeX, и вы продолжаете запускать LaTeX, пока не достигнете точки фиксации aux-файл). Это должно дать гарантию, что повторный запуск LaTeX больше не изменит получившийся документ.

Я не знаю, можете ли вы включить это поведение в scons. Из Makefile это довольно легко с некоторой логикой оболочки.

Резина делает именно это. Это не пуленепробиваемый, но он работает большую часть времени, и результат является чистым, что облегчает обнаружение ошибок. Например, я бы запустил это так:

$ rubber --pdf [my-file]

(То есть, если через 4 года это все еще полезно:-)

Другие вопросы по тегам