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.
|
Die übliche Methode wäre, am Ende des Dokuments (z.B. mit Open in writeLaTeX
\write\@auxout{...} Da die Datei, wenn sie vorhanden ist, zu Beginn das Dokuments eingelesen wird, stehen damit die Informationen auch von Open in writeLaTeX
\write\@auxout{\string\gdef\string\@punkte{\arabic{gesamtpunktzahl}}}% Dabei wird mit Open in writeLaTeX
\gdef\@punkte{14} in der Datei stehen hat, also die konkrete Zahl des Zählers. Dann braucht man später 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} 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:
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} beantwortet 05 Aug '14, 11:34 cgnieder Super, funktioniert!
(05 Aug '14, 11:51)
feynman
@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
(05 Aug '14, 13:24)
cgnieder
@Clemens Ich würde auch in dem Fall an Stelle von
(06 Aug '14, 10:34)
gast3
@Ijon dazu habe ich eine Frage: http://texwelt.de/wissen/fragen/8166
(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} beantwortet 05 Aug '14, 13:42 Ulrike Fischer 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
|
Das sieht aus, als würdest Du eine Klausur erstellen. Dafür gibt es Klassen und Pakete, die diese Funktionalität schon eingebaut haben.
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.
@feynman Ein vorgegebenes Design ist nicht notwenigerweise ein Grund, die Pakete nicht zu verwenden. Manche erlauben sehr flexible Kontrolle...
@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.