Hier sind einige Dinge am Werk. Wenn Du das gezeigte Codebeispiel einmal nicht mit Deinem Editor (TeXstudio) sondern [über die Kommandozeile](https://texwelt.de/wissen/fragen/3461/wie-kompiliere-ich-in-der-eingabeaufforderung-im-terminal) 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
> 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?](https://texwelt.de/wissen/fragen/8072/wie-kann-ich-eine-referenz-auf-einen-selbstdefinierten-counter-setzen/8078) 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
abwandeln (Kommentare für die Lesbarkeit entfernt)
\documentclass{article}
% Definitionen fuer Punkte
% Counter, der zum Aufsummieren der Gesamtpunktzahl genutzt wird
\newcounter{gesamtpunktzahl}
\setcounter{gesamtpunktzahl}{0}
% Befehl für Punkte
\newcommand{\punkte}[1]{%
\punktname{#1}% schreibe Punkte
\addtocounter{gesamtpunktzahl}{#1}% addiere zur Gesamtzahl
\punktname{#1}%
\addtocounter{gesamtpunktzahl}{#1}%
}
% Befehl zum Schreiben der Punkte:
\newcommand*\punktname[1]{\textsf{#1\,Punkt\ifnum#1=1\else e\fi}}
\makeatletter
% am Ende des Dokuments:
\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}%
% Gesamtpunkte in der aux-Datei als `\@punkte' speichern. Dabei beachten,
% dass Definitionen global sein müssen und alles, was mit \write geschrieben wird,
% expandiert würde. Daher müssen \gdef und \@punkte vor der Expansion geschützt werden
\write\@auxout{\string\gdef\string\@punkte{\arabic{gesamtpunktzahl}}}%
}
% wenn `\@punkte' definiert ist, es als Gesamtpunktzahl ausgeben:
\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`](https://ctan.org/pkg/latexmk) und [`arara`](https://ctan.org/pkg/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.
\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.