¿Cómo obtener múltiples índices con arara?

¿Cómo obtener múltiples índices con arara?

¿Cómo tengo que cambiar los araracomandos a continuación para que también se imprima el índice de nombres? Tal como está, solo obtengo el índice principal.

% arara: pdflatex
% arara: bibtex
% arara: pdflatex
% arara: pdflatex
% arara: nomencl
% arara: makeindex
% arara: pdflatex
% arara: pdflatex
% !arara: indent: { overwrite: false, output: outputfile.tex, trace: true }

\documentclass{memoir}
\usepackage[backend=bibtex,style=numeric]{biblatex}
\addbibresource{mybib.bib}
\usepackage{nomencl}
\makenomenclature
\makeindex
\makeindex[names]

\begin{document}

\chapter{Area} \label{chap:area}
\section{Area of a circle} \label{sec:circle-area}

Consult \textcite{Archimedes200} and \textcite{EulerE1776}.
\index[names]{Archimedes}
\index[names]{Euler, Leonhard}

The area $A$ 
\nomenclature{$A$}{area}%
of a circle with radius $r$
\nomenclature{$r$}{radius of circle}%
is defined as
\begin{equation}
    A = \pi r^{2}.
\end{equation}
\index{area!of circle}
\index{area}
\index{circle!area of}

\printbibliography

\printnomenclature

\renewcommand{\indexname}{Index of Names}
\printindex[names]

\renewcommand{\indexname}{Index}
\printindex

\end{document}

Aquí está el archivo mybib.bib:

@article{Archimedes200,
  author = {Archimedes},
  title = {Pi's the limit},
  journal = {Syracuse J. Gastronom.\ Math.}, 
  year = {200BCE},
  volume = {10},
  pages={\textsc{CCCXV}--\textsc{CCCXIV}}
}
@article{EulerE1776,
  author = {Euler, Leonhard},
  title = {All about E},
  journal = {Math.\ Psychol.},
  year = {1776},
  volume = {4},
  pages={1--2718}
}

Respuesta1

Gracias a Paulo por mostrarme esto: todas araralas reglas tienen un parámetro implícito llamado files, que toma una lista (separada por comas) de nombres de archivos. araraLuego iterará en esta lista y aplicará esa directiva a cada elemento de la lista.

Otro punto es que no necesita las dos ejecuciones de pdfLaTeX entre BibTeX y MakeIndex: la primera ejecución de pdfLaTeX es suficiente para generar los archivos auxiliares para las herramientas externas. Las dos últimas ejecuciones de pdfLaTeX son necesarias para incluir las bibliografías/índices generados y ordenar las referencias cruzadas.

Su lista de directivas podría cambiarse a:

% arara: pdflatex
% arara: bibtex
% arara: makeindex
% arara: makeindex: { files: [ names ] }
% arara: pdflatex
% arara: pdflatex

y quizás reemplace las dos makeindexlíneas por una sola (suponiendo que su .texarchivo principal sea main.tex): % arara: makeindex: { files: [ main, names ] }.

O, si quieres araraser inteligente y saltarte pasos innecesarios (explicaciónaquí):

% arara: pdflatex: { draft: yes }
% arara: bibtex if changed (toFile('mybib.bib'))
% arara: --> || found ('log', 'Warning: Citation')
% arara: makeindex: { files: [ main, names ] } if changed ('idx')
% arara: pdflatex until !found('log', '\\(?(R|r)e\\)?run (to get|LaTeX)')

Otra opción, como mencionó barbarabeeton en el comentario, es el imakeidxpaquete, que se ejecuta makeindexdesde pdfLaTeX. Dado que makeindexes un programa confiable, se le permite ejecutarse en un modo de escape de shell restringido, que generalmente está habilitado. El imakeidxpaquete ya se encarga de múltiples índices y todo.

Para usarlo, sólo necesitarás cargarlo con \usepackage{makeindex}, y reemplazarlo \makeindex[names]con \makeindex[name=names].

Sin embargo, el repeatindexpaquete que utiliza parece ser incompatible con imakeidx... Intentaré averiguar por qué.


O, si prefieres parecer el chico genial (como yo, que hice todo esto antes de que te dijeran el filesparámetro :-) y hacerlo de la manera más difícil, puedes hacer una pequeña modificación al makeindex.yamlarchivo y agregar una basenameopción que toma el nombre base del archivo de índice ( names, en su caso) y funciona en él en lugar del nombre del archivo actual.

Primero, debajo de la arguments:línea makeindex.yamlagrega la opción en sí:

- identifier: basename
  flag: >
    @{
      parameters.basename
    }

(aparentemente a Java no le gusta si usas solo base, por alguna razón, así que usé el más detallado basename.) Configuramos esta opción sin un valor predeterminado, de modo que cuando esté vacía usemos getBasename(file).

Ahora modificamos el command:apartado para usar esa opción:

  command: >
    @{
        if (isEmpty(basename))
          { basename = getBasename(file); }
        infile = basename.concat('.').concat(input);
        outfile = [ '-o', basename.concat('.').concat(output) ];
        logfile = [ '-t', basename.concat('.').concat(log) ];
        return getCommand('makeindex', german, style, order, options,
                          logfile, infile, outfile);
    }

primero comprobamos si basenameestá vacío; si es así, utilice el nombre del archivo actual de getBasename(file). Luego proceda normalmente agregando las extensiones de los archivos de entrada, salida y registro, y luego llame al makeindexejecutable.

(versión completa modificada del makeindex.yamlarchivo al final de esta respuesta, para su comodidad)

Después de eso, puedes cambiar tus directivas a:

% arara: pdflatex
% arara: bibtex
% arara: makeindex
% arara: makeindex: { basename: names }
% arara: pdflatex
% arara: pdflatex

(tenga en cuenta que eliminé las dos pdflatexreglas antes makeindex: no las necesita).

Y ahora deberías tener el índice compilado correctamente.


Si no realizó el cambio en la copia original makeindex.yaml(que realmente deberíano), luego debe guardar el nuevo makeindex.yamlarchivo en alguna carpeta y luego crear un .araraconfig.yamlarchivo que contenga:

paths:
- '/path/to/the/folder/'

y colóquelo .araraconfig.yamlen el directorio de trabajo actual o en su USER_HOMEcarpeta (consulte el manual de Arara, capítulo 4 para obtener más información al respecto). Si el makeindex.yamlarchivo también está en el directorio de trabajo actual, puede usarlo - './'en la segunda línea del archivo de configuración.


Archivo completo makeindex.yaml:

!config
# Arara, the cool TeX automation tool
# Copyright (c) 2018, Paulo Roberto Massa Cereda 
# All rights reserved.
#
# This rule is part of arara.
identifier: nmakeindex
name: MakeIndex
authors:
- Marco Daniel
- Paulo Cereda
commands:
- name: The MakeIndex software
  command: >
    @{
        if (isEmpty(basename))
          { basename = getBasename(file); }
        infile = basename.concat('.').concat(input);
        outfile = [ '-o', basename.concat('.').concat(output) ];
        logfile = [ '-t', basename.concat('.').concat(log) ];
        return getCommand('makeindex', german, style, order, options,
                          logfile, infile, outfile);
    }
arguments:
- identifier: basename
  flag: >
    @{
      parameters.basename
    }
- identifier: input
  flag: >
    @{
      parameters.input
    }
  default: idx
- identifier: output
  flag: >
    @{
      parameters.output
    }
  default: ind
- identifier: log
  flag: >
    @{
      parameters.log
    }
  default: ilg
- identifier: german
  flag: >
    @{
        isTrue(parameters.german, '-g')
    }
- identifier: order
  flag: >
    @{
        if ([ 'letter', 'word' ].contains(parameters.order)) {
            return isTrue(parameters.order == 'letter', '-l', '');
        }
        else {
            throwError('The provided order is invalid.');
        }
    }
- identifier: style
  flag: "@{ [ '-s', parameters.style ] }"
- identifier: options
  flag: >
    @{
        if (isList(parameters.options)) {
            return parameters.options;
        }
        else {
            throwError('I was expecting a list of options.');
        }
    }

información relacionada