Counter in LaTeX vs. Counter in TeX – der Unterschied der Zähler

Heute wieder ein bisschen TeX- bzw. LaTeX-Wissen. Dieses Mal möchte ich etwas zu der unterschiedlichen Behandlung von Zählern in \TeX und in \LaTeX schreiben.

Hier gehts direkt zu der PDF-Version und dem zugehörigen LaTeX-Dokument.

Der Unterschied zwischen TeX und LaTeX

Wer glaubt, dass LaTeX und TeX das selbe sind: mitnichten. In der Regel wird man jedoch die Unterschiede nicht bemerken, bzw. man kann sie ausnutzen (bewusst Befehle benutzen) oder ignorieren (Unwissenheit). Zu dem Unterschied an dieser Stelle nur folgendes:
LaTeX ist prinzipiell nur ein Paket von Makros die TeX nutzen um es einfacher zu gestalten, Texte damit zu setzen.

Was jetzt folgt, ist eine HTML Version des oben angegeben PDF-Dokumentes.

Unterschiede zwischen LaTeX- und TeX-Zählern

Zuerst müssen ein \LaTeX – und ein \TeX-Zähler (mit den Namen „ltxcnt” und „txcnt” für (LaTeX- bzw. TeX-CouNTer) erstellt werden um später damit zu arbeiten.

\newcounter{ltxcnt}
\newcount\txcnt

In LaTeX gibt es noch eine Variante, welche später noch eine Rolle spielen wird. Es kann bei der Erstellung ein weiterer Zähler als zusätzliches Argument angegeben werden, dieser ist dann der sogenannte „Rücksteller”. Die Syntax ist:

\newcounter{ltxcnt}[maincnt]

Mit diesem Konstrukt wird beispielsweise die Nummerierung der Unterabschnitte realisiert. Immer wenn der Rücksteller (maincnt) erhöht wird, wird der Zähler (ltxcnt) automatisch auf 0 gesetzt.

Setzen von Zählern

Die Zählerstände können nun mit dem jeweiligen Befehl auf einen beliebigen Wert gesetzt werden. Um den Unterschied zu verdeutlichen, setzen wir den LaTeX-Zähler auf einen anderen Wert als den TeX-Zähler.

\setcounter{ltxcnt}{2}
\txcnt15\relax
\txcnt=15\relax

Die Syntax des LaTeX-Befehls ist selbsterklärend. Die TeX-Syntax benötigt einen kleinen Hinweis. Damit TeX das Eingabeende korrekt erkennt, wird der Befehl \relax verwendet. Alternativ kann auch ein Leerzeichen oder Zeilenvorschub verwendet werden. Außerdem gibt es zwei Varianten, einem Zähler in TeX einen Wert zuzuweisen. Sie unterscheiden sich in ihrem Resultat jedoch nicht.
Wenn man das selbe versucht mit vertauschten Befehlen – also den LaTeX-counter mit dem TeX-Befehl zu manipulieren und andersherum, erntet man Fehlermeldungen:

\setcounter{txcnt}{15}

bringt LaTeX zu der folgenden Fehlermeldung: „No counter ’txcnt’ defined.” Während sich TeX bei

\ltxcnt2\relax

beschwert, dass es das Kommando nicht kennt: „Undefined control sequence.”

An dieser Stelle noch ein Hinweis zu der Gültigkeit von Zählern in TeX im Gegensatz zu LaTeX. In TeX sind Zähler immer lokal, was im Listing 1 sichtbar wird. Um Zähler in TeX dennoch global zu
definieren, wird der Befehl \global benötigt.

\newcount\cntLocal
\newcount\cntGlobal
{
Innerhalb einer Gruppe wird ein Zähler gesetzt.
\cntLocal1
Anschließend einem anderen der Wert global zugewiesen.
\global\cntGlobal\cntLocal
Und schlussendlich haben sowohl der Lokale als auch der Globale Zähler den Wert \the\cntLocal\ vs. \the\cntGlobal
}
Außerhalb macht sich dies jedoch bemerkbar, indem jetzt der Wert des lokalen Zählers ,,\the\cntLocal’’ ist und der des globalen immer noch ,,\the\cntGlobal’’.

Und die Ausgabe von obenstehendem Code:

Innerhalb einer Gruppe wird ein Zähler gesetzt. Anschließend einem anderen der Wert global zugewiesen. Und schlussendlich haben sowohl der Lokale als auch der Globale Zähler den Wert 1 vs. 1
Außerhalb macht sich dies jedoch bemerkbar, indem jetzt der Wert des lokalen Zählers „0” ist und der des globalen immer noch „1”.

Ausgabe von Zählern

Bei Zählern kommt es zu ein paar Besonderheiten, doch bevor wir diese entdecken schauen wir uns das gängige Vorgehen zur Ausgabe von Zählern an.

TeX-Zähler

In TeX gibt es zwei Befehle zur Anzeige eines Zählers – \the und \number. Mit diesen kann der Wert eines Zählers nun ausgegeben werden, sowohl \the\txcnt führt zum gewünschten Ergebnis „15”, als auch \number\txcnt (15). Will man dagegen mit dem numerischen Wert des Zählers arbeiten wird der Zähler ohne weiteren Befehl verwendet. Dies wird z.B. benötigt um einen neuen Zähler zu erstellen, welcher den Wert eines bereits erstellten Zählers hat.

\newcounter\newTxcnt
\newTxcnt\txcnt\relax

Der in Listing 3 neu erstellte Zähler „newTxcnt” hat jetzt ebenfalls den Wert „15”.

LaTeX-Zähler

Ein Zähler kann mit verschiedenen LaTeX-Befehlen angezeigt werden, wie in der folgenden Tabelle zu sehen.

\begin{table}[htbp]
	\centering
	\begin{tabular}{llp{60mm}}
		\toprule
		\textsc{Befehl}			&\textsc{Ausgabe}	& \textsc{Beschreibung der Ausgabe}\\
		\midrule
		\lstinline|\alph{ltxcnt}|	&\alph{ltxcnt}		& kleiner Buchstabe\\
		\lstinline|\Alph{ltxcnt}|	&\Alph{ltxcnt}		& großer Buchstabe\\
		\lstinline|\arabic{ltxcnt}|	&\arabic{ltxcnt}	& arabische Zahl\\
		\lstinline|\roman{ltxcnt}|	&\roman{ltxcnt}		& kleine römische Zahl\\
		\lstinline|\Roman{ltxcnt}|	&\Roman{ltxcnt}		& große römische Zahl\\
		\midrule
		\lstinline|\fnsymbol{ltxcnt}|&\fnsymbol{ltxcnt}	& Fußnotensymbol\\
		\midrule
		\lstinline|\theltxcnt|		&\theltxcnt			& arabische Zahl\\
		\midrule
		\lstinline|\usecounter{ltxcnt}|&					& Gibt den Wert von ltxcnt aus und erhöht ihn gleichzeitig um 1\newline
													Funktioniert nur als Argument der \texttt{list}-Umgebung\\
		\bottomrule
	\end{tabular}

Um dagegen auf den numerischen Wert eines Zählers zuzugreifen kann der Befehl \value{ltxcnt} genutzt werden. Dies ist z.B. nötig, wenn man einen neuen Zähler mit dem Stand eines alten erstellen will:

\newcounter{newLtxcnt}
\setcounter{newLtxcnt}{\value{ltxcnt}}

Der neue Zähler ,,newLtxcnt” hat jetzt den Wert 2 (\arabic{newLtxcnt}).

Besonderheiten

Kommen wir zu dem interessanteren Teil der Zählergeschichten, dem vermischen der TeX- und LaTeX-Kommandos bei der Ausgabe von Zählern. Da LaTeX auf TeX aufsetzt, muss es selbstverständlich möglich sein, einen LaTeX-Zähler mittels TeX-Kommandos abzufragen. Versucht man mittels dem bereits kennengelernten Befehl „\the” auf ltxcnt zuzugreifen:

\the\ltxcnt

beschwert sich TeX mit einem Fehler: „Undefined control sequence.

Hintergrund ist, LaTeX definiert in TeX nicht den Zähler „ltxcnt”, sondern „c@ltxcnt”. Um darauf zugreifen zu können, genügt der bereits bekannte Befehl \the nicht mehr. Es wird die TeX-Primitive \csname benötigt. Um nicht noch viel weiter in die Tiefe von TeX einzusteigen, sei hier nur erwähnt, dass dieser zwingend ein \endcsname benötigt und aus dem Zwischenstehenden ein neues Makro erstellt.

Mit dieser Information können wir nun mit:

\the\csnamec@ltxcnt\endcsname

den Wert „2” des in LaTeX definierten Zählers ltxcnt mit TeX-Kommandos ausgeben.

Da diese Konstruktion doch etwas sperrig ist, vereinfacht einem LaTeX (einmal wieder) die Arbeit und definiert ein entsprechendes Makro „\theltxcnt” – wie schon in Tabelle 1 beschrieben.

Betrachten wir jetzt den umgekehrten Fall – also einen TeX-Zähler mit LaTeX-Befehlen auszugeben, verwundert nun nicht, dass LaTeX den Zähler nicht kennt.

Manipulation von Zählern

Nachdem im vorigen Kapitel auf die Ausgabe und den Abruf der Zähler sowie die Besonderheiten dabei erklärt wurden, birgt dieser Abschnitt keine bahnbrechenden Informationen mehr.

TeX-Zähler

TeX stellt einige Befehle bereit um mit Zählern zu rechnen. Diese Befehle haben größtenteils kein Pendant in LaTeX gefunden. Die Zuweisung als einfachste Manipulation ist bereits weiter oben beschrieben. Doch mit TeX kann selbstverständlich auch gerechnet werden. Die dafür notwendigen Befehle sind in Tabelle 2 aufgelistet und werden in Listing 17 als Erklärung verwendet. Die Division ist ganzzahlig und es wird abgerundet – wie im Listing 3 zu erkennen ist.

	\newcount\cntA
	\newcount\cntB
	
	\cntA 1 cntA wurde 1 zugewiesen und
	\cntB=2 cntB wurde 2 zugewiesen
	
	\advance\cntA by 1\relax cntA hat jetzt den Wert 
		$cntA = cntA + 1 = \the\cntA$\par
	\multiply\cntB by 2\relax cntB hat jetzt den Wert 
		$cntB = cntB \times 2 = \the\cntB$\par
	\advance\cntB -1 $cntB = cntB - 1 = \the\cntB$, 
		wie man sieht ist ,,by'' optional\par
	\divide\cntA \cntB 
		$cntA = cntA \div cntB = 2 \div 3 = \the\cntA$\par
	\divide\cntB 2
		$cntB \div 2 = \the\cntB$

Das führt zu der Ausgabe von:

cntA wurde 1 zugewiesen und cntB wurde 2 zugewiesen
cntA hat jetzt den Wert cntA = cntA + 1 = 2
cntB hat jetzt den Wert cntB = cntB x 2 = 4
cntB = cntB – 1 = 3, wie man sieht ist „by” optional
cntA = cntA / cntB = 2 / 3 = 0
cntB / 2 = 1

\begin{tabular}{ll}
	\toprule
	\textsc{Befehl}							& \textsc{Beschreibung}\\
	\midrule
	\lstinline|\advance\txcnt by <wert>|	& Addition\\
	\lstinline|\advance\txcnt by -<wert>|	& Subtraktion\\
	\lstinline|\multiply\txcnt by <wert>|	& Multiplikation\\
	\lstinline|\divide\txcnt by <wert>|		& Division\\
	\bottomrule
\end{tabular}

LaTeX-Zähler

In LaTeX kommen einige Vereinfachungen hinzu. Eine Übersicht bietet Tabelle 3 – auf ein Beispiel wird hier verzichtet.

\begin{tabular}{lp{80mm}}
	\toprule
	\textsc{Befehl}							& \textsc{Beschreibung}\\
	\midrule
	\lstinline|\addtocounter{ltxcnt}{wert}|	& Addition\\
	\lstinline|\addtocounter{ltxcnt}{-wert}|& Subtraktion\\
	\lstinline|\stepcounter{ltxcnt}|		& Zähler um 1 inkrementieren und alle Zähler, für die \texttt{ltxcnt} ein Rückzähler ist, auf 0 setzen\\
	\lstinline|\refstepcounter{ltxcnt}|		& wie \texttt{stepcounter}, jedoch für Zähler, auf die\newline
											mittels \lstinline|??| zugegriffen wird (z.\,B. \texttt{table} oder \texttt{figure})\\
	\lstinline|\usecounter{ltxcnt}|			& Gibt den Wert von \texttt{ltxcnt} aus und erhöht ihn gleichzeitig um 1\newline
											Funktioniert nur als Argument der \texttt{list}-Umgebung\\
	\bottomrule
\end{tabular}

Leave a Reply

Your email address will not be published. Required fields are marked *