Werden TeX-Variablen innerhalb von Listenumgebungen lokal?

Werden TeX-Variablen innerhalb von Listenumgebungen lokal?

Wenn der Wert eines TeX-Zählers innerhalb einer enumerateUmgebung (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: Vom vorhergehenden Quellcode generiertes LaTeX-Bild, das zeigt, dass der Gesamtzähler für jede Aufzählungsumgebung lokal wird, wenn sein Wert durch \advance geändert wird.

Zwei Fragen:

  • Wie soll ich verstehen, was hier vor sich geht?
  • Was ist der einfachste Weg, einen Wert innerhalb einer Umgebung so zu ändern, enumeratedass 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 \ptsBefehl, um die Anzahl der Punkte für jede Frage anzuzeigen. Das funktioniert, wenn ich nur eine enumerateUmgebung 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, enumeratedie 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.

1

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.

\globalWenn 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\advancestattdessen \advanceoder definieren \def\gadvance{\global\advance}und verwenden Sie \gadvancestattdessen \advance, wenn Sie mit dem Register arbeiten \total. Und verwenden Sie die direkte Zuweisung, \global\total=valuewenn 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, quotationusw. erhöhen würden.

Während direkte Zuweisungen an Zählregister standardmäßig lokal erfolgen, werden LaTeX-Zähler global zugewiesen. Wenn Sie also counterund 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 \thetotaldie 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 \thetotalals die direkte Eingabe \arabic{total}, obwohl diese derzeit das gleiche Ergebnis erzeugen würden.

Bildbeschreibung hier eingeben

verwandte Informationen