эффективность взаимодействия latexmk / imakeidx

эффективность взаимодействия latexmk / imakeidx

imakeidxи latexmkявляются двумя из моих любимых утилит всех времен TeX, особенно в условиях компиляций размером с книгу (суперспасибо @egreg и @John Collins!). Помимо простоты создания множественных индексов, одним из самых полезных свойств является imakeidxподкомпиляция индекса компиляции в документе (как бы я хотел glossariesи biblatexмог бы быть расширен, чтобы вести себя так же!)

Учитывая ММЭ:

\documentclass{article}
\usepackage{imakeidx}
\makeindex

\begin{document}

This.\index{this}

\printindex

\end{document}

makeindexвызывается один раз в середине прямой latexкомпиляции. Однако при использовании latexmk -recorder (etc.)игнорирует latexmkновый .indфайл, который imakeidxсоздается на полпути, и вызывает makeindexфайл .idxснова и снова.

Конечно, эта неэффективность едва заметна с этим игрушечным MWE. Но, учитывая многофайловые документы размером с книгу с несколькими большими индексами, biblatex/ biber, несколькими glossariesи несколькими tocs, требующими нескольких проходов для достижения завершения, дополнительная работа, которая latexmkсоздает (а не устраняет) сильно проверяет мое чувство элегантности (а иногда и мое терпение).

Как же тогда мне улучшить latexmkчрезмерную охоту вызываться makeindexв документах с помощью imakeidx? Я надеюсь, что некоторые простые правила можно будет добавить в мой .latexmkrc. Я особенно заинтересован в том, чтобы свести количество makeindexвызовов к минимуму в нескольких проходах (не показано в этом MWE) — скажем, максимум к двум вызовам на любой индексный файл.

[[ Бонусные баллы за расширение glossariesи/или biblatexвозможность компиляции в документе в imakeidxдухе \write18волшебства. ; ) ]]

решение1

Я не вижу способа настроить текущую версию так, latexmkчтобы она не делала дополнительных запусков. Не только запускается makeindexвторой раз latexmk, но и latex, поэтому время выполнения удваивается, что является плохим штрафом для большого документа.

Для исправления этого требуются изменения в latexmkсамом файле. В файле достаточно информации .log, чтобы latexmkопределить, что .indфайл был создан во время выполнения latexдо того, как он был прочитан, и, следовательно, показать, что дополнительные запуски не нужны. Я добавил это в свой список улучшений для будущей версии latexmk.

решение2

Не умаляя значения ответа Джона, добавление $makeindex = "touch -m %D";к локальному .latexmkrcпроизводит автоматизированный рабочий процесс с почти минимальными накладными расходами. В этом случае на моей системе с этим примером latexвыполняется только один раз. То есть, это (почти) так эффективно, как только может быть. Конечно, при условии, что всегда используется imakeidxwith \write18enabled — в моем случае это не проблема.

(*) Пользователи Windows могут получить копию touch.exeв любом современном gnuдистрибутиве.

Связанный контент