Skip to content

Come dire ad Arara di saltare i passaggi superflui?

Non cercare oltre su Internet perché sei arrivato nel posto perfetto, abbiamo la soluzione che desideri e senza essere coinvolto.

Soluzione:

Ecco la mia proposta:

% arara: lualatex: { draft: yes, shell: yes }
% arara: biber if changed (toFile('TestBibliography.bib'))
% arara: --> || found ('log', 'Please \(re\)run Biber')
% arara: makeglossaries if changed ('glo') || missing ('gls')
% arara: makeindex if changed ('idx') || missing ('ind')
% arara: lualatex until !found('log', '\(?(R|r)e\)?run (to get|LaTeX)')

Procediamo uno per uno.

% arara: lualatex: { draft: yes, shell: yes }

Questo eseguirà LuaLaTeX in modalità bozza con -shell-escape abilitato. La modalità bozza rende LuaLaTeX non generare il file .pdf e quindi non includerà la grafica. Questa esecuzione di LuaLaTeX genera solo i file ausiliari necessari per gli altri programmi. In questo modo si risparmiano un paio di secondi di tempo di compilazione. Il file -shell-escape è facoltativo; a me serviva, ma se non si utilizza alcun pacchetto che lo richieda è possibile rimuoverlo (io lo utilizzavo per l'esternalizzazione di Ti k Z).

% arara: biber if changed (toFile('TestBibliography.bib'))
% arara: --> || found ('log', 'Please \(re\)run Biber')

Questa direttiva esegue Biber solo se l'opzione .log lo dice. BibLaTeX indica quando è necessario (ri)eseguire Biber, quindi si può fare affidamento su di esso per sapere quando. Quello che BibLaTeX non può dire è quando si cambia il file .bib quindi ho aggiunto una condizione alternativa: se ho cambiato il file .bib (dato che il nome non è lo stesso del file master .tex avevo bisogno di trasformarlo in un riferimento a un file con toFile('TestBibliography.bib')).

Un paio di osservazioni: Il file % arara: --> è una linea di continuazione. Significa che ciò che segue la linea --> appartiene alla riga precedente. È usata solo per chiarezza del codice. È documentata a pagina 20 del manuale. Quindi, la direttiva precedente potrebbe essere scritta

% arara: biber if changed (toFile('TestBibliography.bib')) || found ('log', 'Please \(re\)run Biber')

senza cambiare il significato.

La sintassi per found (e altri comandi simili) è:

found(,)

Il in questo caso è 'log'e il è 'Please \(re\)run Biber'. Nelle espressioni regolari, una coppia di parentesi forma un gruppo, quindi (re)run non corrisponde alla stringa letterale (re)run nella stringa .log per cui è necessario sfuggire alle parentesi con dei backslash ((re)) in modo che significhino parentesi letterali. Tuttavia, in Java (il linguaggio in cui è scritto Arara) un file \ si traduce in un singolo 1, quindi è necessario fare l'escape anche del backslash. Quindi, in una direttiva \(re\)run sarà letto da Arara come (re)run (primo livello di escape), e poi verrà passato al motore di espressione regolare che capirà (re)run come stringa letterale (re)run nell'elemento log nel file log . Uff 🙂

[1]: La stringa letterale "" è un singolo backslash. Nelle espressioni regolari, il backslash è anche un carattere di escape. L'espressione regolare "" corrisponde a una singola barra rovesciata. Questa espressione regolare come stringa Java diventa "".

% arara: makeglossaries if changed ('glo') || missing ('gls')
% arara: makeindex if changed ('idx') || missing ('ind')

Questa direttiva eseguirà makeglossaries e makeindex solo se i file di input .glo e .idxrispettivamente, sono cambiati (il che vale già come vero se il file non esisteva prima, come nel caso della prima esecuzione), oppure se il file di output per questi strumenti, .gls e .ind, non esisteva prima, il che copre le situazioni in cui è necessario eseguire questi strumenti.

% arara: lualatex until !found('log', '\(?(R|r)e\)?run (to get|LaTeX)')

Infine, questa direttiva esegue LuaLaTeX tutte le volte che è necessario, finché non ci sono messaggi nel file .log che riportino una di queste stringhe:

Rerun LaTeX
rerun LaTeX
(Re)run LaTeX
(re)run LaTeX
Rerun to get
rerun to get
(Re)run to get
(re)run to get

che coprono la maggior parte dei messaggi che ho trovato nel mio file .log che ho trovato nel mio file .log. Se si aggiunge un altro pacchetto che richiede esecuzioni multiple e utilizza un messaggio diverso, è necessario adattarlo. Per esempio, se il pacchetto dice (nel file .log) "Esegui di nuovo LaTeX" (che non corrisponde a nessuno degli schemi precedenti), si potrebbe cambiare la direttiva in:

% arara: lualatex until !found('log', '\(?(R|r)e\)?run (to get|LaTeX)')
% arara: --> && !found('log','Execute LaTeX again')

o qualcosa di simile. È praticamente impossibile considerare tutti i casi di tutti i pacchetti LaTeX, quindi è necessario adattare la direttiva in base al proprio documento, ma la direttiva rerun LaTeX è piuttosto generica.

Osservazioni su questo: Di nuovo, '\(?(R|r)e\)?run (to get|LaTeX)' è un'espressione regolare (se la conoscete, potete saltare questa parte). Ricordate che Arara mangia un livello di escape, quindi quanto sopra si traduce in '(?(R|r)e)?run (to get|LaTeX)'. Questa espressione regolare corrisponde a:

(?                            | A (optional) literal '('
   (R|r)                       | One of 'R' or 'r'
        e                      | The letter 'e'
         )?                   | A (optional) literal ')'
            run                | The string 'run ' (note the trailing space)
                (to get|LaTeX) | Either 'to get' or 'LaTeX'

che si traduce nei casi sopra elencati.


Nel documento di esempio, la prima esecuzione di arara test.tex produce:

[email protected] ~/testing> arara test.tex
  __ _ _ __ __ _ _ __ __ _ 
 / _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
 __,_|_|  __,_|_|  __,_|

Processing 'test.tex' (size: 30 KB, last modified: 05/07/2019
12:05:44), please wait.

(LuaLaTeX) LuaLaTeX engine .............................. SUCCESS
(Biber) The Biber reference management software ......... SUCCESS
(MakeGlossaries) The MakeGlossaries software ............ SUCCESS
(MakeIndex) The MakeIndex software ...................... SUCCESS
(LuaLaTeX) LuaLaTeX engine .............................. SUCCESS
(LuaLaTeX) LuaLaTeX engine .............................. SUCCESS

Total: 6.75 seconds

e le esecuzioni successive (senza modifiche alle fonti) producono:

[email protected] ~/testing> arara test.tex
  __ _ _ __ __ _ _ __ __ _ 
 / _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
 __,_|_|  __,_|_|  __,_|

Processing 'test.tex' (size: 30 KB, last modified: 05/07/2019
12:05:44), please wait.

(LuaLaTeX) LuaLaTeX engine .............................. SUCCESS
(LuaLaTeX) LuaLaTeX engine .............................. SUCCESS

Total: 2.69 seconds

Dalla seconda esecuzione in poi, si ottiene la prima esecuzione di LuaLaTeX in modalità draft per leggere l'input .tex e generare i file per Biber, Makeglossaries e Makeindex (che sono gli stessi, quindi questi strumenti non vengono eseguiti), e una seconda esecuzione per produrre il file .pdf file.

In arara le regole possono essere eseguite in modo condizionato utilizzando controlli sui vari file. Questi controlli sono descritti nel manuale attuale (versione 4.0), sezione 6.1 - File.

Alcuni metodi utili sono missing e changedche controllano se i file sono mancanti o modificati (come è ovvio). I metodi possono essere usati in due modi: fornendo un'estensione di file, nel qual caso il nome del file principale viene anteposto all'estensione, oppure fornendo un nome di file completo usando la sintassi toFile('yourfile.ext'). Un altro metodo utile è foundche esegue una ricerca di stringhe nel file fornito e restituisce true se la stringa viene trovata. Questo può essere usato per cercare nel file di log principale, o in qualsiasi altro file se necessario, messaggi che indichino la necessità di una riesecuzione.

Per il documento in questione si possono utilizzare, ad esempio, le seguenti regole:

% arara: lualatex
% arara: biber if missing('bbl') || found('log', 'Citation')
% arara: makeglossaries if missing('gls') || changed('glo') || changed(toFile('TestGlossary.tex'))
% arara: makeindex if changed('idx')
% arara: lualatex if found('log', 'No file ') || found('log', 'undefined references') || found('log', 'Rerun required') || found('log', 'Rerun to get cross-references')
% arara: lualatex

Il biber significa ora eseguire Biber se non c'è bbl file (che è il file che contiene la bibliografia compilata) o se ci sono messaggi sulle citazioni nel log (che indica nuovi riferimenti non ancora inclusi nella bibliografia compilata). Si noti che qui viene utilizzata la prima variante di sintassi, quindi per Test.tex il comando missing('bbl') viene espanso in controlla se Test.bbl è mancante e analogamente logè espanso a Test.log.

Il makeglossaries controlla se la regola gls esiste (l'output della regola makeglossaries o se il file glo è stato modificato (scritto da lualatex quando un comando glsadd o se il file di input con i glossari viene modificato. Quest'ultimo controllo in realtà non è molto utile, perché il file può cambiare senza che nuove voci del glossario vengano aggiunte al testo principale e nuove voci possono essere aggiunte senza cambiare il file, ma serve come dimostrazione del comando toFile() del costrutto toFile().

Il makeindex controlla i cambiamenti nel costrutto idx che contiene voci di indice.

La seconda regola lualatex controlla la presenza di varie frasi nel file di registro che indicano la necessità di una riesecuzione. Si noti che la corrispondenza delle stringhe sul file di registro è un metodo indiretto per verificare la necessità di ripetizioni, il che può far sì che non vengano eseguite le ripetizioni necessarie o che vengano eseguite ripetizioni ridondanti. I pacchetti e gli strumenti possono scrivere informazioni diverse nel log in situazioni diverse, o dopo gli aggiornamenti, ecc. e le stringhe possono essere presenti nel file di log per motivi completamente estranei, ad esempio in typeout comandi. Arara stessa non sembra fornire funzionalità per un robusto controllo delle ripetizioni; nel manuale sono presenti alcuni esempi, ma tutti utilizzano la corrispondenza dei log.

Le regole di cui sopra danno come risultato le seguenti tre esecuzioni:

esecuzione 1

  __ _ _ __ __ _ _ __ __ _ 
 / _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
 __,_|_|  __,_|_|  __,_|

Processing 'archange.tex' (size: 1 KB, last modified: 05/07/2019
13:29:24), please wait.

(LuaLaTeX) LuaLaTeX engine .............................. SUCCESS
(Biber) The Biber reference management software ......... SUCCESS
(MakeGlossaries) The MakeGlossaries software ............ SUCCESS
(MakeIndex) The MakeIndex software ...................... SUCCESS
(LuaLaTeX) LuaLaTeX engine .............................. SUCCESS
(LuaLaTeX) LuaLaTeX engine .............................. SUCCESS

Total: 4.53 seconds

corsa 2

(LuaLaTeX) LuaLaTeX engine .............................. SUCCESS
(MakeGlossaries) The MakeGlossaries software ............ SUCCESS
(LuaLaTeX) LuaLaTeX engine .............................. SUCCESS

Total: 2.73 seconds

corsa 3

(LuaLaTeX) LuaLaTeX engine .............................. SUCCESS
(LuaLaTeX) LuaLaTeX engine .............................. SUCCESS

Total: 2.62 seconds

Recensioni e valutazioni

Ricorda che hai la possibilità di commentare se fosse necessario.


Tags : /

Utilizzate il nostro motore di ricerca

Ricerca
Generic filters

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.