Zum Zählen von Punkten habe ich mir das Folgende definiert:

Open in writeLaTeX
% Definitionen fuer Punkte 
% Counter, der zum Aufsummieren der Gesamtpunktzahl genutzt wird
\newcounter{gesamtpunktzahl}
\setcounter{gesamtpunktzahl}{0}

% Befehl für Punkte
\newcommand{\punkte}[1]{\textsf{\ifnum #1 = 1  #1 Punkt\else #1 Punkte\fi}\addtocounter{gesamtpunktzahl}{#1}}

Wie kann ich nun eine Referenz setzen, mit der ich am Anfang des Dokuments die Gesamtpunktzahl ausgeben kann.

\thegesamtpunktzahl funktioniert logischerweise nur am Ende des Dokuments.

gefragt 05 Aug '14, 11:10

feynman's gravatar image

feynman
1.0k122937
Akzeptiert-Rate: 23%

bearbeitet 05 Aug '14, 12:30

cgnieder's gravatar image

cgnieder
22.1k243463

Das sieht aus, als würdest Du eine Klausur erstellen. Dafür gibt es Klassen und Pakete, die diese Funktionalität schon eingebaut haben.

(05 Aug '14, 11:12) cgnieder

Das ist mir bekannt, aber da ich noch ein Corporate Design und andere Dinge realisieren muss, möchte ich nach und nach meinen eigenen Style, bzw. irgendwann meine eigene Klasse erstellen. Deswegen bin ich an der grundsätzlichen Realisierung interessiert. Ich kann jetzt natürlich auch in den Code der entsprechenden Klassen reinschauen, aber vielleicht kann es ja hier auch jemand schnell erklären.

(05 Aug '14, 11:20) feynman

@feynman Ein vorgegebenes Design ist nicht notwenigerweise ein Grund, die Pakete nicht zu verwenden. Manche erlauben sehr flexible Kontrolle...

(05 Aug '14, 11:55) cgnieder

@Clemens Der Gedanke ist, dass zusätzliche Pakete ja auch weitere Funktionen mitladen, die ich nicht brauche und ggf. irgendwann Konflikte erzeugen wenn ich zu viele Pakete lade. Meine Traumklasse beinhaltet nur das, was ich wirklich brauche. Ob das jetzt unnötige Bedenken sind (wovon ich selbst eigentlich auch ausgehe) ist eine andere Frage. Ich schaue mir die vorgeschlagenen Klassen und Pakete auf jeden Fall mal näher an.

(05 Aug '14, 12:01) feynman

Die übliche Methode wäre, am Ende des Dokuments (z.B. mit \AtEndDocument{}) die Punkte in die aux-Datei zu schreiben.

Open in writeLaTeX
\write\@auxout{...}

Da die Datei, wenn sie vorhanden ist, zu Beginn das Dokuments eingelesen wird, stehen damit die Informationen auch von \begin{document} an zur Verfügung. In \write\@auxout{...} ist ... das, was vollständig expandiert in die aux-Datei geschrieben wird. Man kann dort etwa einen Befehl \@punkte definieren, der den Wert des Zählers gesamtpunktzahl enthält:

Open in writeLaTeX
\write\@auxout{\string\gdef\string\@punkte{\arabic{gesamtpunktzahl}}}%

Dabei wird mit \string dafür gesorgt, das \gdef und \@punkte genau so in die Datei geschrieben werden und nicht etwa expandiert werden. Gleichzeitig sorgt die Expansion dafür, dass man später etwas wie

Open in writeLaTeX
\gdef\@punkte{14}

in der Datei stehen hat, also die konkrete Zahl des Zählers. Dann braucht man später \@punkte nur noch zu verwenden, eventuell mit einem Test, ob es überhaupt definiert ist.

Open in writeLaTeX
\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
}
% Befehl zum Schreiben der Punkte:
\newcommand*\punktname[1]{\textsf{#1\,Punkt\ifnum#1=1\else e\fi}}

\makeatletter
% am Ende des Dokuments:
\AtEndDocument{%
  % 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{7}

\end{document}

alt text


Allerdings sieht das danach aus, als ob eine Klausur oder etwas derartiges erstellt werden soll. Dafür gibt es bereits eine ganze Reihe von Paketen und Klassen, die sich damit beschäftigen: answers, probsoln, exam, exsheets und einige mehr.

exsheets zum Beispiel erlaubt eine sehr weitgehende Kontrolle über Aussehen und Design. Ein Beispiel, das nicht mal an der Oberfläche dessen kratzt, was sich einstellen lässt. Ein möglicher Vorteil ist, dass auch halbe Punkte möglich sind:

Open in writeLaTeX
\documentclass{article}
\usepackage[ngerman]{babel}% für automatische Übersetzung
\usepackage{exsheets}

\SetupExSheets{
  points/format = \textsf ,
  points/name   = Punkt/e
}

\begin{document}

\totalpoints

\begin{question}
  \addpoints{3.5}
  \addpoints{4.25}
  \addpoints{7}
\end{question}

\end{document}
Permanenter link

beantwortet 05 Aug '14, 11:34

cgnieder's gravatar image

cgnieder
22.1k243463
Akzeptiert-Rate: 60%

bearbeitet 05 Aug '14, 13:57

Super, funktioniert!

(05 Aug '14, 11:51) feynman

@feynman ich hab noch ein bisschen Info zum Code hinzugefügt

(05 Aug '14, 12:24) cgnieder

@Clemens Ich habe deinen Code nun mit einigen meiner Arbeitsblätter getestet. In machen Fällen scheint AtEndDocument nicht das richtige Dokumentenende zu erkennen. Für die Gesamtpunktzahl bekomme ich dann nur Fragezeichen. Zu Testzwecken habe ich noch ein Label für die Seitenzahl

AtEndDocument{%

% dein Code

\label{page:ende} }

hinzugefügt, wobei ich nach Verwendung von pageref{page:ende} dann "undefined references" bekomme. In den "funktionierenden" Fällen wird so auch die Seitenzahl neben den Gesamtpunkten richtig ausgegeben. Ergibt sich hieraus eine neue Frage?

(05 Aug '14, 13:13) feynman

In meinem Code bedeuten Fragezeichen, dass \@punkte nicht definiert ist (\@ifundefined{@punkte}{??}{...}). Mehr kann ich Aufgrund der Info nicht sagen. Im Zweifelsfall erstelle ein Minimalbeispiel und poste eine neue Frage.

(05 Aug '14, 13:24) cgnieder

@Clemens Ich würde auch in dem Fall an Stelle von \AtEndDocument eher \BeforeClosingMainAux und \immediate\write oder eigentlich sogar \protected@write empfehlen. Eine einfache Alternative wäre, bei jedem \Punkte auch die Gesamtpunkte in die aux-Datei zu schreiben. Da Du \gdef verwendest, überschreiben spätere Werte Definitionen dann ja einfach frühere. Zwar stehen dann in der aux-Datei ggf. eine ganze Reihe überflüssiger Definitionen, aber solange man nicht ein paar tausend davon hat, dürfte das keine große Rolle spielen.

(06 Aug '14, 10:34) gast3
(06 Aug '14, 11:00) cgnieder
Ergebnis 5 von 6 show 1 more comments

Um auch die Frage in der Überschrift zu beantworten: Referenzen auf Counter erhält man, wenn man den Zähler mit refstepcounter erhöht:

Open in writeLaTeX
\documentclass{article}
\newcounter{gesamtpunktzahl}
\setcounter{gesamtpunktzahl}{0}

% Befehl für Punkte
\newcommand{\punkte}[1]{\textsf{\ifnum #1 = 1  #1 Punkt\else #1 Punkte\fi}%
 \addtocounter{gesamtpunktzahl}{#1}\addtocounter{gesamtpunktzahl}{-1}\refstepcounter{gesamtpunktzahl}}

\begin{document}
Die Punktzahl nach der ersten Aufgabe auf Seite \pageref{a} ist \ref{a},

Die Punktzahl nach der zweiten Aufgabe auf Seite \pageref{b} ist \ref{b},

Die Gesamtpunktzahl ist \ref{gesamt}.

Aufgabe 1: \punkte{4} \label{a}

\newpage
\punkte{5} \label{b}

\newpage
\punkte{10} \label{gesamt}

\end{document}
Permanenter link

beantwortet 05 Aug '14, 13:42

Ulrike%20Fischer's gravatar image

Ulrike Fischer
3.6k23
Akzeptiert-Rate: 52%

Ok danke, ich teste das auch mal und vergleiche beide Lösungsvorschläge.

(05 Aug '14, 13:44) feynman

@Ulrike Wenn ich das jetzt richtig verstehe, muss ich nach der letzten Anwendung von \punkte manuell ein Label für die Gesamtpunktzahl setzen!? Schön wäre es natürlich, wenn das automatisiert passieren würde.

(05 Aug '14, 13:52) feynman

@feynman: Man kann den Label mit zref automatisch setzen lassen (so wie es lastpage für die Seiten macht), aber da habe ich jetzt keine Zeit für.

(05 Aug '14, 14:08) Ulrike Fischer
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
×7

gestellte Frage: 05 Aug '14, 11:10

Frage wurde gesehen: 10,450 Mal

zuletzt geändert: 06 Aug '14, 11:00