Wenn der Wert eines TeX-Zählers innerhalb einer enumerate
Umgebung (und zweifellos in vielen anderen Kontexten) geändert wird, verhält er sich anscheinend wie eine lokale Variable, sodass alle Änderungen daran lokal für die Umgebung sind. Beispielsweise dieser Code
\documentclass{article}
\newcount\total
\total = 5
\begin{document}
At first total = \number\total
\begin{enumerate}
\item \advance \total by 10
Now total = \number\total
\item \advance \total by 10
Now total = \number\total
\end{enumerate}
Outside of the enumerate environment, total reverts to its
original value: \number\total\\
Does the same thing happen in embedded environments?
\begin{enumerate}
\item \advance \total by 100
Now total = \number\total
\begin{enumerate}
\item \advance \total by 1000
Now total = \number\total
\end{enumerate}
That didn't do anything to this total = \number\total
\item \advance \total by 100
Now total = \number\total
\end{enumerate}
Yes. Now total = \number\total
\end{document}
erzeugt:
Zwei Fragen:
- Wie soll ich verstehen, was hier vor sich geht?
- Was ist der einfachste Weg, einen Wert innerhalb einer Umgebung so zu ändern,
enumerate
dass der geänderte Wert außerhalb der Umgebung verfügbar ist? Ich bin damit einverstanden, hier LaTeX statt TeX-Funktionen zu verwenden. Ich möchte nur eine einfache Lösung, die funktioniert.
Warum? Ich schreibe einen Test und gebe für jede Frage die Anzahl der Punkte an, die sie wert ist. Wenn ich die Punkte anzeige, möchte ich auch eine Variable aktualisieren, die mir am Ende eine Gesamtsumme liefert. Manchmal weise ich Unterfragen, die ich in einer eingebetteten Umgebung aufliste, Punkte zu. Ich möchte, dass diese Punkte ebenfalls zur Gesamtsumme hinzugefügt werden.
Zur Zeit mache ich es so:
\newcount\totalpts
\totalpts = 0
\newcommand{\pts}[1]{(#1 points) \advance \totalpts by #1}
und ich verwende den \pts
Befehl, um die Anzahl der Punkte für jede Frage anzuzeigen. Das funktioniert, wenn ich nur eine enumerate
Umgebung zum Anzeigen von Fragen verwende, da ich die Gesamtpunktzahl als Teil der letzten Frage anzeigen kann. Das funktioniert nicht, wenn ich Punkte in einer Umgebung zuweise, enumerate
die in die äußere Fragenumgebung eingebettet ist: Die Punkte, die ich für Fragen in der eingebetteten Umgebung aufliste, wirken sich nicht auf die Gesamtpunktzahl in der äußeren Umgebung aus.
Natürlich können Sie mich gerne auf frühere Fragen hinweisen. Ich bin mir sicher, dass diese Art von Frage bereits zuvor in tex.SE diskutiert wurde, aber ich kann mir keine Strategie für die Suche danach ausdenken.
Antwort1
Alle Zuweisungen sind standardmäßig lokal (es gibt einige spezielle TeX-Register, die eine Ausnahme darstellen). Das bedeutet, dass das Register beim Ende einer TeX-Gruppe auf seinen vorherigen Wert zurückgesetzt wird, der beim Start der Gruppe gültig war.
\global
Wenn Sie das Präfix der Zuweisung verwenden , ist die Zuweisung global und ihr Wert bleibt erhalten, wenn die TeX-Gruppe endet.
Verwenden Sie also \global\advance
stattdessen \advance
oder definieren \def\gadvance{\global\advance}
und verwenden Sie \gadvance
stattdessen \advance
, wenn Sie mit dem Register arbeiten \total
. Und verwenden Sie die direkte Zuweisung, \global\total=value
wenn es sich in einer TeX-Gruppe befindet.
Antwort2
AlsWipet erklärt, Zuweisungen an TeX-Zählregister sind lokal für die aktuelle Gruppe. Alle LaTeX-Umgebungen erstellen Gruppen. Dies schließt Listenumgebungen ein, aber Sie würden den gleichen Effekt sehen, wenn Sie die Zählung innerhalb von figure
, center
, quotation
usw. erhöhen würden.
Während direkte Zuweisungen an Zählregister standardmäßig lokal erfolgen, werden LaTeX-Zähler global zugewiesen. Wenn Sie also counter
und verwenden \addtocounter{}{}
, werden die Zuweisungen an das zugrunde liegende Zählregister global vorgenommen und bleiben außerhalb der aktuellen Gruppe bestehen.
\documentclass{article}
\newcounter{total}
\setcounter{total}{5}
\begin{document}
At first total = \thetotal
\begin{enumerate}
\item \addtocounter{total}{10}
Now total = \thetotal
\item \addtocounter{total}{10}
Now total = \thetotal
\end{enumerate}
Outside of the enumerate environment, total reverts to its
original value: \thetotal % never end a paragraph with \\
Does the same thing happen in embedded environments?
\begin{enumerate}
\item \addtocounter{total}{100}
Now total = \thetotal
\begin{enumerate}
\item \addtocounter{total}{1000}
Now total = \thetotal
\end{enumerate}
That didn't do anything to this total = \thetotal
\item \addtocounter{total}{100}
Now total = \thetotal
\end{enumerate}
Yes. Now total = \thetotal
\end{document}
Mit dieser Lösung können Sie auch \thetotal
die Formatierung neu definieren und ändern, genauso wie Sie das Aussehen von Abschnittsnummern, Fußnoten, Gleichungsnummern usw. ändern können. Aus diesem Grund ist die Verwendung besser \thetotal
als die direkte Eingabe \arabic{total}
, obwohl diese derzeit das gleiche Ergebnis erzeugen würden.