XeTeX - определяет необходимость повторного запуска - PullRequest
3 голосов
/ 13 июля 2010

Я пытаюсь определить, когда требуется повторный запуск 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.

В этом и заключается проблема: даже если нет неопределенной ссылки (например, удалить * 1022)* с job.tex выше) Xe (La) TeX вызывается дважды, один раз для получения .aux, один раз для получения .pdf.Очевидно, что если нет неопределенных ссылок, этот второй вызов является излишним.

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

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

С уважением,

Брайан

Ответы [ 3 ]

2 голосов
/ 13 июля 2010

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

1 голос
/ 13 июля 2010

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

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

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

0 голосов
/ 15 ноября 2014

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

$ rubber --pdf [my-file]

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

...