Ausführen von pdflatex mit der minimal erforderlichen Anzahl von Malen für elsarticle

Ausführen von pdflatex mit der minimal erforderlichen Anzahl von Malen für elsarticle

Läuft pdflatexEINMAL auf

\documentclass{elsarticle}%%% version 3.1 from CTAN
\begin{document}
\begin{frontmatter}
\author[1]{Johann Sebastian Bach}
\author[2]{Ludwig van Beethoven\corref{cor2}}
\cortext[cor2]{Corresponding author}%
\address[1]{Thomaskirche, Leipzig}
\address[2]{Zentralfriedhof Wien}
\end{frontmatter}
\end{document}

erzeugt die folgende Ausgabe:

Ausgabe des ersten Durchlaufs

Wie Sie sehen, sind die Beschriftungen beider Autoren 1, und der hochgestellte Stern nach Herrn Beethoven fehlt. Sie benötigen den zweiten Durchlauf, pdflatexum dieses Problem zu beheben.

Allerdings pdflatexist es nicht das Richtige, den Vorgang IMMER mindestens zweimal auszuführen: Dies kostet Zeit, insbesondere bei großen Dokumenten, während ein pdflatexeinmaliger Vorgang manchmal ausreicht, wenn die richtigen .aux-Dateien von einem früheren Vorgang verfügbar sind. Ich habe mir die .log-Datei und die Konsolenausgabe angesehen, um Hinweise darauf zu finden, ob ein zweiter erneuter Vorgang erforderlich ist, konnte jedoch nichts Brauchbares finden. Mein bisheriger Ansatz zur Überprüfung, ob ein erneuter Vorgang erforderlich ist, besteht darin, etwas wie Folgendes zu sagen:

MESSAGE_FOR_RERUN := '(LaTeX Warning: Label\(s\) may have changed\. Rerun to get cross\-references right\.)|(LaTeX Warning: There were undefined references\.)|(LaTeX Warning: Citation [^[:cntrl:]]* on page [0-9]* undefined on)|(Package natbib Warning: There were undefined citations\.)|(\(mparhack\) *Rerun to get them right\.)'

am Anfang eines Makefiles und

for i in $(SOURCES); do \
  $(PDFLATEX) $$i ; \
done
if (egrep $(MESSAGE_FOR_RERUN) $(OBJECTS)); then \
  for i in $(SOURCES); do $(PDFLATEX) $$i ; done; \
fi

(wo die Variablen entsprechend definiert sind) in einer Regel des Makefiles. (Natürlich müssen Sie in einem Nicht-MWE möglicherweise zusätzlich eine Auswahl von sed, awk, rm, bibtex, bibtex8, biber, makeglossaries, makeindex, xindy, dvi2ps, zip, chmod oder Gott weiß was ausführen, aber solche Details zu anderen Programmen sind hier alle nicht thematisch relevant.)

Natürlich kann man die Aufgabe haben latexmkoder \usepackage[mainaux]{rerunfilecheck}erledigen, aber ich frage mich: Kann man sie weiterhin auf die bisherige Art über Makefiles erledigen und wenn ja, nach welcher Zeichenfolge soll in den Protokolldateien gesucht werden?

Antwort1

Ich sammle lediglich meine Kommentare zu einer Antwort.

Es kann nicht garantiert werden, dass eine einfache .logDateianalyse ausreicht, um notwendige Wiederholungen zu erkennen. Die Wiederholungswarnungen .logwerden nur angezeigt, weil LaTeX eine Heuristik eingerichtet hat, die Sie warnt, wenn \labelsZitate (und vielleicht ein paar andere Dinge) so aussehen, als ob sie einen weiteren LaTeX-Lauf erfordern. Pakete sind jedoch nicht verpflichtet, diese überwachten Mechanismen zu verwenden, und können durchaus ihr eigenes Ding machen.

\NewlabelDer Code in der Frage ist ein Paradebeispiel für einen solchen Code. Die entsprechenden Beschriftungen werden mit dem benutzerdefinierten Befehl (anstelle von ) ausgeschrieben \newlabelund es gibt keinen Code, um Änderungen daran zu erkennen.

Tatsächlich sind die einzigen relevanten Unterschiede zwischen den .logDateien des ersten und zweiten Laufs

No file <jobname>.aux.

Gegen

(<jobname>.aux)

<jobname>.splund ob eine aufgerufene Datei geladen wird oder nicht .

Es ist jetzt einfach, ein Beispiel zu konstruieren, bei dem die .logDateien gleich bleiben (mit Ausnahme der Zeit- und Speicherinformationen), die Ausgabe aber dennoch einen weiteren LaTeX-Lauf erfordert.

  1. Nimm das Beispiel aus der Frage und kompiliere es zweimal.
  2. Dritten Autor hinzufügen: \author[3]{Antonín Dvořák}mit Adresse\address[3]{Vyšehrader Friedhof}
  3. Kompiliereneinmalum die Fußnote „1“ für Dvořák zu sehen.
  4. Kompilieren Sie erneut, um " zu erhalten.C".

Zwischen Schritt 3 und 4 .logbleibt die Datei bis auf Datums-/Zeitinformationen, Speichernutzung und Zeilennummern für die Schriftinformationen unverändert. Keine dieser Änderungen weist jedoch darauf hin, dass ein weiterer LaTeX-Lauf erforderlich ist.

Sofern die von Ihnen verwendeten Pakete nicht über eine Art integrierte Heuristik auf der LaTeX-Seite verfügen, die doppelt prüft, ob eine erneute Ausführung erforderlich ist und im warnt .log, reicht die .logDatei allein nicht aus, um zu entscheiden, ob LaTeX erneut ausgeführt werden soll.

Dies ist einer der Gründe, warum latexmkauch die Hilfsdateien auf Änderungen überwacht werden. Wenn die Hilfsdateien zwischen den Durchläufen stabil sind, liegt es auf der Hand, dass auch die Ausgabe stabil sein sollte. Tatsächlich \Newlabel{3}{c}wird im obigen Beispiel im LaTeX-Durchlauf von Schritt 3 der .auxDatei hinzugefügt. Daher .auxist dies vor und nach dem Durchlauf in Schritt 3 unterschiedlich, aber der Durchlauf in Schritt 4 ändert die .auxDatei nicht. (Natürlich gibt es Situationen, in denen ein erneuter Durchlauf nicht erforderlich ist, selbst wenn sich die .auxDateien ändern, beispielsweise weil \labelkeine neuen s verwendet werden. Daher ist nicht garantiert, dass der resultierende Build-Zyklus für ein bestimmtes Dokument der kürzeste ist. Darüber hinaus gibt es Situationen, in denen sich die .auxDatei nie stabilisiert:Unendliche Compilerdurchläufe mit den Zitierstilen von Biblatex ibid vermeiden?.)

Das Paket rerunfilecheck, das Sie in der Frage erwähnen, ermöglicht es, die .auxDatei zwischen LaTeX-Läufen zu überwachen. Insbesondere .auxwird der Hash der Datei vor und nach dem aktuellen LaTeX-Lauf verglichen. Wenn sich der Hash geändert hat, deutet dies darauf hin, dass ein erneuter Lauf sinnvoll sein könnte, und Sie erhalten eine Warnung in der folgenden Form

Package rerunfilecheck Warning: File `<jobname>.aux' has changed. Rerun.

Package rerunfilecheck Info: Checksums for `<jobname>.aux':
(rerunfilecheck)             Before: AE406B0DDBF18055292F1343793AC8CB;63
(rerunfilecheck)             After:  ED9C2E0E40AE4680FD0E58AB745EA3BF;80.

Wenn dagegen der .auxstabil ist, meldet er

Package rerunfilecheck Info: File `<jobname>.aux' has not changed.
(rerunfilecheck)             Checksum: ED9C2E0E40AE4680FD0E58AB745EA3BF;80.

Ihre Aufgabe reduziert sich also rerunfilechecklediglich auf das Parsen der Wiederholungswarnungen dieses Pakets.

Möglicherweise ist es möglich, die rerunfilecheckexternen Vorgänge in Ihrem Makefile zu wiederholen.

  • Hashen Sie den aktuellen Wert .auxund merken Sie sich den Hash.
  • Führen Sie LaTeX aus.
  • Hashen Sie das Neue .auxund vergleichen Sie es mit dem alten Hash.
  • Wenn die Hashes unterschiedlich sind, führen Sie den Vorgang erneut aus.

Ich bezweifle, dass sich der Aufwand lohnt, aber es könnte eine nette akademische Übung im Bash-Scripting sein (nicht, dass ich auch nur die geringste Ahnung hätte, wie ich diese Aufgabe tatsächlich bewältigen könnte).

verwandte Informationen