In dieser Frage wird in der Lösung von @Clemens ein Counter in die aux-Datei geschrieben, so dass der Wert des Counters bereits am Beginn des Dokuments verfügbar ist.

Ändert man die Punkte, so wird bei der ersten Kompilierung die Punktzahl in der aux-Datei aktualisiert. Es ist aber trotzdem eine zweite Kompilierungen notwendig, damit die Gesamtpunktzahl im Dokument aktualisiert wird.

Ist es möglich, dies zu automatisieren, d.h. dass erkannt wird, wenn sich die Punktezahl in der aux-Datei ändert und dann automatisch eine zweite Kompilierung gestartet wird?

Beispielsweise passiert dies beim Paket lastpage:

Öffne in Overleaf
\documentclass{scrartcl}
\usepackage{lipsum}
\usepackage{scrlayer-scrpage}
\usepackage{lastpage}
\usepackage{refcount}
\renewcommand*{\pagemark}{{\usekomafont{pagenumber}{Seite \thepage\ von 
\pageref{LastPage}}}}

\begin{document}
\lipsum
\end{document}

Beim ersten Mal wird automatisch zweimal kompliliert (Editor TexStudio):

Prozess gestartet: pdflatex.exe -synctex=1 -interaction=nonstopmode -shell-escape "document2".tex

Prozess endete normal

Prozess gestartet: pdflatex.exe -synctex=1 -interaction=nonstopmode -shell-escape "document2".tex

Prozess endete normal

Danach nur noch einmal, solange sich die Anzahl der Seiten nicht ändert. Wenn ich in obigem Beispiel zweimal \lipsum ins Dokument schreibe, wird automatisch erkannt, dass die Seitenzahl sich geändert hat und es werden zwei Komplilierungen durchgeführt.

Eine manuelle Kompilierung zeigt, dass bei geänderter Seitenzahl eine Warnung ausgegeben wird:

LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.

Vermutlich wird, wie @moewe geschrieben hat, diese Warung von TeXStudio dazu benutzt, einen zweiten Durchlauf zu starten.

Wie kann ich eine solche im ursprünglichen Problem eine geänderte Punktezahl abprüfen und eine Warnung ausgeben, die TeXStudio veranlasst, automatisch nochmals zu kompilieren?

gefragt 22 Sep '18, 15:59

tom75's gravatar image

tom75
2.2k187884
Akzeptiert-Rate: 57%

bearbeitet 22 Sep '18, 17:48

Mit shell escape wäre es wohl möglich, TeX noch einmal aufzurufen. Mir ist aber nicht bekannt, dass das häufig passieren würde. Normalerweise geben Pakete nur Warnungen aus, dass ein weiterer LaTeX-Lauf notwendig ist, der muss dann schon manuell ausgeführt werden. Es kann aber sein, dass Dein Editor das automatisch für Dich macht (welchen Editor nutzt Du denn?), indem er die Warnungen nach solchen Meldungen durchsucht. In dem Fall wäre dann die Lösung, auch so eine Warnung auszugeben. Für automatische Kompilation gibt es auch Tools wie latexmk.

(22 Sep '18, 16:26) moewe

Wenn Du zweimal pdflatex (oder ähnlich) automatisch laufen lassen willst, kannst Du einfach arara verwenden. Auch kannst Du Hilfsdateien wie *.aux mit dem arara-Skript remove.yaml automatisch löschen. Ich verstehe sowieso nicht wieso das so selten verwendet wird und im Fall der Fälle auf komplizierte Methoden gesetzt wird. Hinweis: arara ist editorunabhängig. Ein optionaler arara-Button kann in die gängigen Editoren integriert werden (Handbuch).

(22 Sep '18, 16:36) cis

@moewe Ich nutze TeXStudio. Ich hab oben ein Beispiel eingefügt, bei dem automatisch zweimal kompiliert wird, wenn sich die Seitenzahl ändert. Wie kann ich sehen, ob nach dem ersten kompilieren eine Warunung ausgegeben wird? Im Logfile ist nichts derartiges zu finden.

(22 Sep '18, 16:56) tom75

@cis Ich will pdflatex nicht grundsätzlich zweimal laufen lassen. Ich dachte, dass es eine Möglichkeit gibt, im Dokument selbst prüfen zu können, ob sich die Punktezahl geändert hat und dann etwas anzustoßen, was im Bedarfsfall eine zweite Kompilierung anstößt. Vielleicht in Richtung der Idee von @moewe. Analog zum Paket lastpage o.ä.

(22 Sep '18, 16:58) tom75

Ach so.... PS: Könnte mit der neusten Version 4.0 evtl. trotzdem gehen, ob das dann einfacher ist, vermag ich nicht zu sagen.

(22 Sep '18, 17:06) cis

@moewe Deine Vermutung mit der Warnmeldung scheint zuzutreffen.

(22 Sep '18, 17:49) tom75

@moewe Vielen Dank!

(22 Sep '18, 19:11) tom75
Ergebnis 5 von 7 show 2 more comments

Hier sind einige Dinge am Werk. Wenn Du das gezeigte Codebeispiel einmal nicht mit Deinem Editor (TeXstudio) sondern über die Kommandozeile kompilierst, wirst Du feststellen, dass TeX nur genau ein mal läuft. In der dazugehörigen PDF-Ausgabe findest Du dann auch nur zwei Fragezeichen anstatt der Seitenanzahl. Erst nach einem zweiten Durchlauf steht dort dann das erwartete Ergebnis. TeX läuft von sich heraus nicht mehrmals über ein Dokument.

Tatsächlich ist es aber so, dass TeXstudio die Datei (bei den richtigen Einstellungen) von sich heraus zwei mal kompiliert. Das hat dann aber nichts mit dem normalen Verhalten von TeX zu tun, sondern ist einzig und allein ein Feature des Editors. Wie erkennt TeXstudio, dass noch ein zweiter Lauf notwendig ist? Wenn Du TeX zum ersten Mal auf Deine Datei loslässt, findest Du in der Logdatei folgende Zeilen

Öffne in Overleaf
LaTeX Warning: There were undefined references.
LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.

TeX läuft zwar nicht automatisch ein zweites Mal los, aber es sagt Dir, dass das eine ganz gute Idee wäre, wenn Du eine vollständig korrekte Ausgabe erwartest. Diese Ausgabe fängt TeXstudio anscheinen ab und nimmt sie zum Anlass, TeX noch ein zweites Mal laufen zu lassen. (Ich weiß nicht genau, was TeXstudio genau macht, aber so in etwa muss das funktionieren, dazu später mehr.)

Clemens' Code aus Wie kann ich eine Referenz auf einen selbstdefinierten Counter setzen? erzeugt beim ersten Durchlauf keine Warnung (wohl aber die Fragezeichen), also kommt TeXtsudio auch nicht auf die Idee, ein zweites Mal TeX aufzurufen.

Du kannst den Code wie folgt abwandeln (Kommentare für die Lesbarkeit entfernt)

Öffne in Overleaf
\documentclass{article}

 \newcounter{gesamtpunktzahl}
\setcounter{gesamtpunktzahl}{0}

\newcommand{\punkte}[1]{%
  \punktname{#1}%
  \addtocounter{gesamtpunktzahl}{#1}%
}

\newcommand*\punktname[1]{\textsf{#1\,Punkt\ifnum#1=1\else e\fi}}

\makeatletter
\AtEndDocument{%
  \@ifundefined{@punkte}
    {\PackageWarningNoLine{gesamtpunktzahl}{%
       @punkte unknown.
       Rerun to get cross-references right}}
    {\ifnum\@punkte=\value{gesamtpunktzahl}
     \else
       \PackageWarningNoLine{gesamtpunktzahl}{%
         @punkte != gesamtpunktzahl.
         Rerun to get cross-references right}%
     \fi}%
  \write\@auxout{\string\gdef\string\@punkte{\arabic{gesamtpunktzahl}}}%
}

\newcommand*\gesamtpunkte{%
  \@ifundefined{@punkte}{??}{\punktname{\@punkte}}%
}
\makeatother

\begin{document}
\gesamtpunkte

\punkte{3}
\punkte{4}
\punkte{5}
\end{document}

Dieser Code prüft am Ende des Dokuments, ob die Definition in der .aux-Datei überhaupt vorhanden ist und ob sie mit dem aktuellen Wert übereinstimmt. Wenn das nicht der Fall ist, wird eine Warnung ausgegeben. Diese Warnung habe ich genau so aufgebaut, dass sie zumindest in meinen Tests TeXstudio dazu gebracht hat, TeX noch einmal laufen zu lassen. Es scheint als war TeXStudio besonders das Rerun to get cross-references right wichtig. (Der Text ist also eine kleine Notlüge, aber sie funktioniert.)

Es gibt übrigens noch weitere Tools, die es Dir erlauben mit nur einem Aufruf, ein Dokument vollständig zu kompilieren. Mir fallen da besonders latexmk und arara ein. Bei arara musst Du selbst bestimmen, welche Programme in welcher Reihenfolge aufzurufen sind, Du kannst dazu mit recht komplexen dynamischne Regeln arbeiten. latexmk geht noch ein Stück weiter als TeXstudio und liest nicht nur die .log-Datei sondern überwacht auch noch die .aux-Datei und andere temporäre Dateien, um zu erkennen, wann ein Dokument in der Ausgabe stabil (also fertig) ist. latexmk braucht dann auch die oben eingebauten Warnungen im Code nicht und gibt schon bei Clemen's Originalcode immer das gewünschte Ergebnis, da TeX häufig genug aufgerufen wird.


Wenn man möchte, kann man auch gleich den \label-Mechanismus missbrauchen und es sich damit sparen, die Warnungen selbst faken zu müssen.

Öffne in Overleaf
\documentclass{article}

\newcounter{gesamtpunktzahl}
\setcounter{gesamtpunktzahl}{0}

\newcommand{\punkte}[1]{%
  \punktname{#1}%
  \addtocounter{gesamtpunktzahl}{#1}%
}

\newcommand*\punktname[1]{\textsf{#1\,Punkt\ifnum#1=1\else e\fi}}

\makeatletter
\AtEndDocument{%
  {\protected@edef\@currentlabel{\punktname{\thegesamtpunktzahl}}%
   \label{@punkte}}%
}

\@ifpackageloaded{hyperref}
  {\newcommand*\punkte@ref{\ref*}}
  {\newcommand*\punkte@ref{\ref}}

\newcommand*\gesamtpunkte{%
  \punkte@ref{@punkte}%
}
\makeatother

\begin{document}
\gesamtpunkte

\punkte{1}
\punkte{2}
\punkte{3}
\end{document}

Hübscher ist das meiner Meinung nach aber nicht.

Permanenter link

beantwortet 22 Sep '18, 18:35

moewe's gravatar image

moewe
3.7k36
Akzeptiert-Rate: 42%

bearbeitet 22 Sep '18, 19:17

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×20
×2

gestellte Frage: 22 Sep '18, 15:59

Frage wurde gesehen: 5,915 Mal

zuletzt geändert: 22 Sep '18, 19:17