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
выполняется только один раз. То есть, это (почти) так эффективно, как только может быть. Конечно, при условии, что всегда используется imakeidx
with \write18
enabled — в моем случае это не проблема.
(*) Пользователи Windows могут получить копию touch.exe
в любом современном gnu
дистрибутиве.