Läuft pdflatex
EINMAL 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:
Wie Sie sehen, sind die Beschriftungen beider Autoren 1, und der hochgestellte Stern nach Herrn Beethoven fehlt. Sie benötigen den zweiten Durchlauf, pdflatex
um dieses Problem zu beheben.
Allerdings pdflatex
ist es nicht das Richtige, den Vorgang IMMER mindestens zweimal auszuführen: Dies kostet Zeit, insbesondere bei großen Dokumenten, während ein pdflatex
einmaliger 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 latexmk
oder \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 .log
Dateianalyse ausreicht, um notwendige Wiederholungen zu erkennen. Die Wiederholungswarnungen .log
werden nur angezeigt, weil LaTeX eine Heuristik eingerichtet hat, die Sie warnt, wenn \labels
Zitate (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.
\Newlabel
Der Code in der Frage ist ein Paradebeispiel für einen solchen Code. Die entsprechenden Beschriftungen werden mit dem benutzerdefinierten Befehl (anstelle von ) ausgeschrieben \newlabel
und es gibt keinen Code, um Änderungen daran zu erkennen.
Tatsächlich sind die einzigen relevanten Unterschiede zwischen den .log
Dateien des ersten und zweiten Laufs
No file <jobname>.aux.
Gegen
(<jobname>.aux)
<jobname>.spl
und ob eine aufgerufene Datei geladen wird oder nicht .
Es ist jetzt einfach, ein Beispiel zu konstruieren, bei dem die .log
Dateien gleich bleiben (mit Ausnahme der Zeit- und Speicherinformationen), die Ausgabe aber dennoch einen weiteren LaTeX-Lauf erfordert.
- Nimm das Beispiel aus der Frage und kompiliere es zweimal.
- Dritten Autor hinzufügen:
\author[3]{Antonín Dvořák}
mit Adresse\address[3]{Vyšehrader Friedhof}
- Kompiliereneinmalum die Fußnote „1“ für Dvořák zu sehen.
- Kompilieren Sie erneut, um " zu erhalten.C".
Zwischen Schritt 3 und 4 .log
bleibt 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 .log
Datei allein nicht aus, um zu entscheiden, ob LaTeX erneut ausgeführt werden soll.
Dies ist einer der Gründe, warum latexmk
auch 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 .aux
Datei hinzugefügt. Daher .aux
ist dies vor und nach dem Durchlauf in Schritt 3 unterschiedlich, aber der Durchlauf in Schritt 4 ändert die .aux
Datei nicht. (Natürlich gibt es Situationen, in denen ein erneuter Durchlauf nicht erforderlich ist, selbst wenn sich die .aux
Dateien ändern, beispielsweise weil \label
keine 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 .aux
Datei 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 .aux
Datei zwischen LaTeX-Läufen zu überwachen. Insbesondere .aux
wird 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 .aux
stabil ist, meldet er
Package rerunfilecheck Info: File `<jobname>.aux' has not changed.
(rerunfilecheck) Checksum: ED9C2E0E40AE4680FD0E58AB745EA3BF;80.
Ihre Aufgabe reduziert sich also rerunfilecheck
lediglich auf das Parsen der Wiederholungswarnungen dieses Pakets.
Möglicherweise ist es möglich, die rerunfilecheck
externen Vorgänge in Ihrem Makefile zu wiederholen.
- Hashen Sie den aktuellen Wert
.aux
und merken Sie sich den Hash. - Führen Sie LaTeX aus.
- Hashen Sie das Neue
.aux
und 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).