imakeidx
e latexmk
são dois dos meus utilitários favoritos de toda a época do TeX, especialmente em relação às compilações do tamanho de livros (muito obrigado @egreg e @John Collins!). Além da facilidade de produzir vários índices, uma das propriedades mais úteis imakeidx
é a subcompilação do índice de compilação no documento (como desejo glossaries
e biblatex
poderia ser estendida para se comportar da mesma maneira!)
Dado MWE:
\documentclass{article}
\usepackage{imakeidx}
\makeindex
\begin{document}
This.\index{this}
\printindex
\end{document}
makeindex
é invocado uma vez no meio da compilação direta latex
. No entanto, ao usar latexmk -recorder (etc.)
, latexmk
ignora o novo .ind
arquivo imakeidx
produzido no meio e invoca makeindex
o .idx
arquivo novamente.
Claro, esta ineficiência é dificilmente perceptível com este brinquedo MWE. Mas, dados os documentos do tamanho de um livro, muitos arquivados, com vários índices grandes, biblatex
/ biber
, vários glossaries
e vários tocs que necessitam de várias passagens antes de serem concluídos, o trabalho extra que latexmk
cria (em vez de eliminar) testa meu senso de elegância (e às vezes minha paciência) muito.
Como, então, posso melhorar latexmk
a ânsia excessiva de invocar makeindex
em documentos usando imakeidx
? Espero que algumas regras simples sejam adicionadas ao meu arquivo .latexmkrc
. Estou particularmente interessado em manter o número de makeindex
invocações no mínimo em várias passagens (não mostrado neste MWE) - digamos, no máximo duas invocações por qualquer arquivo de índice.
[[ Pontos de bônus para extensão glossaries
e/ou biblatex
capacidade de compilação em documentos à la imakeidx
marca de \write18
mágica. ; ) ]]
Responder1
Não vejo nenhuma maneira de configurar a versão atual latexmk
para evitar que ela faça execuções extras. Não apenas é makeindex
executado uma segunda vez latexmk
, mas também o é latex
, portanto o tempo de execução é duplicado, o que é uma penalidade ruim em um documento grande.
Para corrigir isso, são necessárias mudanças em latexmk
si. Há informações suficientes no .log
arquivo para latexmk
determinar que o .ind
arquivo foi criado durante a execução latex
antes de ser lido e, portanto, para mostrar que execuções extras não são necessárias. Adicionei isso à minha lista de melhorias para uma versão futura do latexmk
.
Responder2
Para não tirar nada da resposta de John, adicionar $makeindex = "touch -m %D";
ao local .latexmkrc
produz um fluxo de trabalho automatizado com sobrecarga quase mínima. Nesse caso, no meu sistema com este exemplo, latex
é executado apenas uma vez. Ou seja, isso é (quase) tão eficiente quanto as coisas podem ser. A ressalva, claro, é que imakeidx
with \write18
enabled seja sempre usado – o que não é um problema no meu caso.
(*) Os usuários do Windows podem adquirir uma cópia em qualquer distribuição touch.exe
moderna .gnu