imakeidx
y latexmk
son dos de mis utilidades favoritas de todo el tiempo TeX, especialmente de cara a las compilaciones del tamaño de un libro (¡muchas gracias @egreg y @John Collins!). Además de la facilidad de producir múltiples índices, una de las propiedades más útiles imakeidx
es la subcompilación del índice de compilación en el documento (¡cómo desearía glossaries
y biblatex
podría extenderse para que se comporte de la misma manera!)
Dado MWE:
\documentclass{article}
\usepackage{imakeidx}
\makeindex
\begin{document}
This.\index{this}
\printindex
\end{document}
makeindex
se invoca una vez a mitad de camino durante latex
la compilación directa. Sin embargo, cuando se utiliza latexmk -recorder (etc.)
, latexmk
ignora el nuevo .ind
archivo que imakeidx
se produce a la mitad y makeindex
lo invoca .idx
de nuevo.
Por supuesto, esta ineficiencia apenas se nota con este juguete MWE. Pero dados los documentos del tamaño de un libro archivados con múltiples índices grandes, biblatex
/ biber
, múltiples glossaries
y varios tocs que requieren varias pasadas antes de completarse, el trabajo adicional que latexmk
crea (en lugar de eliminar) pone a prueba mi sentido de la elegancia (y a veces mi paciencia) en gran medida.
Entonces, ¿cómo puedo mejorar latexmk
el exceso de entusiasmo de invocar makeindex
en documentos usando imakeidx
? Espero agregar algunas reglas simples a mi .latexmkrc
. Estoy particularmente interesado en mantener el número de makeindex
invocaciones al mínimo en múltiples pasadas (no se muestra en este MWE), digamos, a un máximo de dos invocaciones por cualquier archivo de índice.
[[ Puntos de bonificación por ampliar glossaries
y/o biblatex
capacidad de compilación en documentos como si imakeidx
fuera \write18
magia. ; ) ]]
Respuesta1
No veo ninguna forma de configurar la versión actual latexmk
para evitar que realice ejecuciones adicionales. No sólo makeindex
lo ejecuta una segunda vez latexmk
, sino que también lo hace latex
, por lo que el tiempo de ejecución se duplica, lo cual es una mala penalización en un documento grande.
Para corregir esto se necesitan cambios en latexmk
sí mismo. Hay suficiente información en el .log
archivo para latexmk
determinar que el .ind
archivo se creó durante la ejecución o latex
antes de ser leído y, por lo tanto, para mostrar que no se necesitan ejecuciones adicionales. Agregué esto a mi lista de mejoras para una versión futura de latexmk
.
Respuesta2
Para no quitarle nada a la respuesta de John, agregarlo $makeindex = "touch -m %D";
al local .latexmkrc
produce un flujo de trabajo automatizado con una sobrecarga casi mínima. En cuyo caso, en mi sistema con este ejemplo, latex
solo se ejecuta una vez. Es decir, esto es (casi) lo más eficiente que las cosas puedan llegar a ser. La condición, por supuesto, es que siempre se use imakeidx
with enable, lo que no es un problema en mi caso.\write18
(*) Los usuarios de Windows pueden obtener una copia en cualquier distribución touch.exe
moderna .gnu