#===========================================================
# FILE:         latexmkrc
# PART OF:      PYST-PUB v2.3
# AUTHOR:       F. Javier Payán Somet, Agosto 2026
# VERSION:      v2.3 — 2026/09/19
# ROLE:         Configuración de latexmk para documentos PYST-PUB:
#               motor LuaLaTeX, biber, y xindy con pyst.xdy.
#===========================================================
#
# PARA QUÉ
#
# Un documento PYST-PUB necesita una secuencia que no es la habitual:
# lualatex, luego biber si hay bibliografía, luego xindy si hay
# índices, y lualatex otra vez —dos, si el índice cambia de longitud y
# mueve la paginación—. Escribirla a mano en cada proyecto es la causa
# de las dos preguntas frecuentes del Manual de Usuario, «los índices
# no se generan» y «la bibliografía no aparece o las citas salen como
# [?]», que son el mismo síntoma: haber ejecutado el motor una vez.
#
# Con este fichero junto al documento basta con:
#
#     latexmk documento
#
# Y es además la pieza MULTIPLATAFORMA del sistema: latexmk es Perl, y
# tanto TeX Live como MiKTeX lo traen con su propio intérprete en
# Windows, de modo que esto funciona igual en los tres sistemas sin
# cambios. El objetivo 'examples' del Makefile también lo usa, con
# 'latexmk -r <ruta>/latexmkrc'.
#===========================================================

#-----------------------------------------------------------
# MOTOR
#
# PYST-PUB aborta bajo cualquier motor que no sea LuaLaTeX: depende de
# \directlua para el escaneo de directorios, de lua-widow-control y de
# luaotfload. La comprobación está en core/pre/pyst-core.ltx §1 y emite
# el mensaje luatex-required.
#
# $pdf_mode = 4 es 'lualatex' en latexmk.
#-----------------------------------------------------------
$pdf_mode = 4;

$lualatex = 'lualatex -interaction=nonstopmode -file-line-error '
          . '-synctex=1 %O %S';

# Si compilas con órdenes de shell habilitadas —imakeidx las necesita
# para ejecutar xindy durante la propia pasada de LaTeX, y splitindex
# también— descomenta la línea siguiente y comenta la anterior.
#
# Sin shell-escape el documento compila igualmente: imakeidx se limita
# a escribir los .idx y es latexmk quien llama a xindy, con la
# dependencia declarada más abajo. Con shell-escape los índices se
# generan antes y hacen falta menos pasadas.
#
# No se activa por defecto porque -shell-escape permite a un documento
# ejecutar órdenes arbitrarias, y eso debe ser una decisión consciente
# y no una que herede quien copie este fichero.
#
# $lualatex = 'lualatex -shell-escape -interaction=nonstopmode '
#           . '-file-line-error -synctex=1 %O %S';

#-----------------------------------------------------------
# BIBLIOGRAFÍA
#
# biblatex con motor biber, que es lo que carga
# modules/pyst-book-common.ltx. $bibtex_use = 2 significa «ejecuta la
# herramienta de bibliografía cuando haga falta, y borra el .bbl al
# limpiar».
#-----------------------------------------------------------
$bibtex_use = 2;
$biber = 'biber --validate-datamodel %O %S';

#-----------------------------------------------------------
# ÍNDICES
#
# core/post/pyst-refs.ltx carga imakeidx con [xindy, splitindex], y los
# documentos invocan \makeindex así:
#
#     \makeindex[
#       columns = 2, columnsep = 8pt,
#       program = xindy,
#       options = -M pyst -C utf8 -L spanish-modern,
#       title   = ...]
#
# Las opciones de abajo son EXACTAMENTE ésas, y no otras. Importa:
#
#   -M pyst          carga pyst.xdy, que define el atributo "df" con el
#                    que \indd y \indexd marcan en negrita cursiva la
#                    página donde algo se define, frente a las páginas
#                    donde sólo se menciona.
#   -C utf8          los .idx que produce LuaLaTeX son UTF-8.
#   -L spanish-modern  ordenación española MODERNA, en la que ch y ll
#                    no son letras independientes. Con -L spanish se
#                    obtiene la tradicional, y el índice queda ordenado
#                    de otra manera: 'chico' iría después de 'cuna'.
#
# 'xindy' y no 'texindy': es lo que documenta pyst.xdy y lo que usan
# los ejemplos. pyst.xdy hace (require "makeindex.xdy") por su cuenta,
# de modo que no necesita los módulos que texindy añadiría.
#-----------------------------------------------------------
$makeindex = 'xindy -M pyst -C utf8 -L spanish-modern -o %D %S';

# imakeidx en modo splitindex escribe VARIOS .idx —uno por cada
# \makeindex con name=, como el índice de autores de examples/libro— y
# latexmk sólo conoce el principal. Esta dependencia personalizada le
# enseña a ver los demás.
add_cus_dep('idx', 'ind', 0, 'run_xindy');
sub run_xindy {
    my ($base) = @_;
    return system("xindy -M pyst -C utf8 -L spanish-modern "
                . "-o \"$base.ind\" \"$base.idx\"");
}

#-----------------------------------------------------------
# LIMPIEZA
#
# Extensiones que latexmk -c no borra por defecto y que estos
# documentos sí generan. Nótese que NO se incluye 'prf': en este árbol
# es una extensión de FUENTE —examples/libro/listings-python.prf son
# las preferencias de listados, escritas a mano— aunque en otros
# proyectos sea la lista de demostraciones de ntheorem. Borrarla sería
# perder un fichero del que no hay copia.
#-----------------------------------------------------------
$clean_ext = "bbl bcf run.xml idx ind ilg glo gls glg "
           . "synctex.gz xdv nav snm vrb thm typo slnc";

#-----------------------------------------------------------
# AVISO SI FALTA xindy
#
# xindy no está en todas las instalaciones, y su ausencia se manifiesta
# a mitad de compilación como un error de shell poco descriptivo. Más
# vale decirlo al principio.
#-----------------------------------------------------------
if (system("which xindy > /dev/null 2>&1") != 0) {
    warn "latexmkrc: no se encuentra xindy. Los documentos con indices "
       . "fallaran. Ver el Manual de Usuario, 'El fichero pyst.xdy'.\n";
}

1;
