LaTeX kennt zwei Arten von Registern, also Orte, an denen ein Wert gespeichert wird. Ein Zähler hält eine ganze Zahl; eine Länge hält eine Dimension. Kapitel-, Abbildungs- und Gleichungsnummern werden mit Zählern gezählt; Ränder und Boxbreiten werden mit Längen gemessen. Diese Seite behandelt die Programmiergrundlagen zum Definieren und Manipulieren eigener Zähler und Längen. Die Einheiten selbst und Abstandsbefehle wie \hspace/\vspace stehen auf einer separaten Seite (unten verlinkt); hier geht es um die Mechanik des Zählens, Messens und Speicherns.
Zähler — Register für ganze Zahlen
Ein Zähler ist ein Behälter, der eine ganze Zahl speichert. Während LaTeX Ihr Dokument liest, erhöht es chapter, wenn ein Kapitel beginnt, figure, wenn Sie eine Abbildung setzen, und druckt diese Nummern in Überschrift oder Beschriftung. Das sind vordefinierte Standardzähler; eigene Zähler können Sie ebenfalls anlegen.
Einen neuen Zähler legen Sie mit \newcounter{foo} an. Direkt danach ist sein Wert 0. Der Name besteht nur aus Buchstaben (ohne Backslash) und darf noch nicht existieren. Entscheidend ist das optionale Elternargument: \newcounter{foo}[⟨parent⟩] macht foo zu einem untergeordneten Zähler von parent, sodass jedes Mal, wenn parent erhöht wird, foo automatisch auf 0 zurückgesetzt wird. Genau deshalb beginnt die Unterabschnittsnummer neu, wenn der Abschnitt wechselt.
Drei Befehle ändern den Wert. \setcounter{foo}{3} weist foo den Wert 3 zu; \addtocounter{foo}{2} addiert 2 zum aktuellen Wert (mit einer negativen Zahl subtrahieren Sie); und \stepcounter{foo} erhöht nur um 1. \stepcounter hat eine wichtige Nebenwirkung: Er setzt jeden Zähler auf 0 zurück, der als Kind dieses Zählers registriert ist. Beachten Sie, dass Zuweisungen durch \setcounter und \addtocounter global sind; sie werden beim Verlassen einer Gruppe ({ } oder einer Umgebung) nicht rückgängig gemacht.
Der nahe Verwandte \refstepcounter{foo} erledigt dasselbe Erhöhen und Zurücksetzen, macht aber zusätzlich foo zum aktuellen Referenzziel. Ein direkt danach gesetztes \label{…} verweist daher auf den ausgegebenen Wert von foo (sein \thefoo, siehe unten), und \ref ruft diese Nummer ab. Genau diesen Befehl verwendet LaTeX intern, wenn es section, equation oder figure erhöht; deshalb verweist ein \label an einer Überschrift oder Gleichung auf die richtige Nummer. Verwenden Sie \stepcounter, wenn nur intern eine Zahl weiterlaufen soll, und \refstepcounter, wenn ein referenzierbares „nummeriertes Ding“ entstehen soll.
\newcounter{trial} % trial を作成(初期値 0)
\setcounter{trial}{5} % trial = 5
\addtocounter{trial}{-2} % trial = 3
\stepcounter{trial} % trial = 4(子カウンタがあれば 0 に)Die Zahl herausholen — \value
\value{foo} holt den Inhalt eines Zählers als Zahl heraus, mit der TeX rechnen kann. Sie können es überall verwenden, wo LaTeX eine ganze Zahl erwartet: im Wertargument von \setcounter/\addtocounter, in einem \ifnum-Test, sogar in einer Dimensionsrechnung (wie \value{foo}\parindent). Um etwa bar auf denselben Wert wie foo zu bringen:
\setcounter{bar}{\value{foo}} % bar に foo の現在値を代入
\addtocounter{bar}{\value{foo}} % bar に foo の値をさらに加えるHier stolpern viele am Anfang: \value ist nicht für die Ausgabe gedacht. Um eine Zahl wirklich in den Text zu *drucken*, verwenden Sie einen Ausgabebefehl wie \arabic (nächster Abschnitt) oder \thefoo. Merken Sie sich die Trennung so: \value liefert die rohe Zahl für Rechnungen, die Ausgabebefehle liefern eine Zeichenkette für Menschen.
Zähler ausgeben — \the und Formatbefehle
Jeder Zähler bringt eine Familie von Ausgabebefehlen mit, die seinen Wert in eine gedruckte Zeichenkette verwandeln. Sie wählen die Schreibweise:
| Befehl | Ausgabe | Bereich / Hinweise |
|---|---|---|
\arabic | Arabische Zahlen (1, 2, 3 …) | Übliche Wahl; negative Werte erlaubt |
\roman | Kleine römische Zahlen (i, ii, iii …) | Unter 1 wird nichts ausgegeben |
\Roman | Große römische Zahlen (I, II, III …) | Unter 1 wird nichts ausgegeben |
\alph | Kleinbuchstaben (a, b, c …) | 1–26; außerhalb des Bereichs Fehler |
\Alph | Großbuchstaben (A, B, C …) | 1–26; außerhalb des Bereichs Fehler |
\fnsymbol | Fußnotensymbole (∗ † ‡ § ¶ ‖ …) | 1–9; für den Mathematikmodus |
\alph/\Alph bilden auf die 26 Buchstaben ab; ein Wert unter 1 oder über 26 löst daher den Fehler „Counter too large“ aus. \fnsymbol gibt neun Fußnotensymbole der Reihe nach aus: Stern, Dagger, Double Dagger, Paragraphenzeichen, Absatzzeichen, Parallelstriche, Doppelstern, Double Dagger und doppelter Double Dagger; der gültige Bereich ist 1–9. Da der Befehl im Mathematikmodus läuft, setzen Sie ihn im Text als $\fnsymbol{footnote}$ oder verwenden ihn über \thefootnote.
Diese Befehle nehmen den Namen eines Zählers als Argument (etwa \arabic{page}). Die Zahl, die Sie im Satz tatsächlich sehen, kommt jedoch aus einem eigenen Makro, das jeder Zähler automatisch erhält: \thefoo. section hat \thesection, figure hat \thefigure und so weiter. Wenn Sie dieses \the… mit \renewcommand neu definieren, ändern Sie das gesamte Zahlenformat. Um Abschnittsnummern etwa in römischen Zahlen zu setzen, genügt eine Zeile:
\renewcommand{\thesection}{\Roman{section}} % 1, 2, 3 → I, II, III
% 図番号を「節.通し番号」に:図 2.3 のように
\renewcommand{\thefigure}{\thesection.\arabic{figure}}Wie im zweiten Beispiel erzeugt das Einweben der Ausgabe eines anderen Zählers in eine \the…-Definition zusammengesetzte Nummern wie „2.3“. Das funktioniert, weil der Abbildungszähler so eingerichtet ist, dass der Abschnittszähler sein Elternzähler ist (sein Auslöser für das Zurücksetzen). Daran sieht man: Das Aussehen einer Nummer und die Kopplung, wann sie auf 0 zurückspringt, werden getrennt festgelegt.
Standardzähler und Nummerierungstiefe
LaTeX definiert eine Reihe von Zählern vor und steuert sie im Dokument automatisch. Auch diese können Sie frei mit \setcounter und ähnlichen Befehlen manipulieren, etwa Kapitel unterwegs neu nummerieren oder Abbildungen im Anhang als A.1 ausgeben:
- Gliederung:
part,chapter,section,subsection,subsubsection,paragraph,subparagraph(Verfügbarkeit hängt von der Klasse ab) - Gleitobjekte und Gleichungen:
figure,table,equation - Fußnoten:
footnote,mpfootnote(Fußnoten innerhalb einer minipage) - Listen:
enumi,enumii,enumiii,enumiv(die vier Verschachtelungsebenen vonenumerate) - Seite:
page - Steuerung:
secnumdepth(wie tief Überschriften nummeriert werden) undtocdepth(wie tief Einträge ins Inhaltsverzeichnis gelangen)
Die letzten beiden sind etwas anders: ganzzahlige Schalter, die steuern, wie „tief“ Nummerierung und Auflistung reichen. Jeder Gliederungsbefehl hat eine Ebenennummer (section ist 1, subsection ist 2, …), und eine Ebene wird nummeriert, wenn sie kleiner oder gleich secnumdepth ist. Der Standard liegt ungefähr bei 2; \setcounter{secnumdepth}{1} entfernt daher Nummern unterhalb der Abschnittsebene, und \setcounter{tocdepth}{1} beschränkt das Inhaltsverzeichnis auf Abschnitte. Ein gutes Beispiel dafür, dass Zähler nicht nur zählen, sondern auch als Konfigurationswerte das Satzverhalten steuern.
Längen — Dimensionsregister
Die andere Art, eine Länge, ist ein Register, das eine Dimension wie 12pt oder 2cm speichert. Während ein Zähler eine ganze Zahl ist, hält eine Länge eine Dimension mit Einheit und kann Dehnung und Schrumpfung (plus/minus) enthalten. Wenn dieselbe Dimension an mehreren Stellen im Dokument vorkommt, ist ein benannter Längenwert deutlich wartbarer als eine fest eingetragene Zahl.
Eine neue Länge deklarieren Sie mit \newlength{\mylen}. Anders als bei einem Zähler ist das Argument ein Befehlsname mit Backslash (\mylen), und der Anfangswert ist 0pt. Zwei Befehle erledigen die Grundarbeit: \setlength{\mylen}{2em} (Zuweisung) und \addtolength{\mylen}{-3pt} (Addition; ein negativer Wert subtrahiert). Danach kann die Länge überall stehen, wo eine Dimension erwartet wird, etwa in \hspace{\mylen}.
Auch mit vorhandenen Längen wie \textwidth (Textbreite) und \baselineskip (Zeilenabstand) können Sie rechnen. Stellen Sie einen Faktor davor, um sie zu skalieren: 0.8\textwidth sind 80 % der Textbreite; Längen lassen sich auch direkt addieren oder subtrahieren. Für reichere Arithmetik, besonders für Division, laden Sie das Paket calc. Dann funktioniert ein Ausdruck wie \setlength{\x}{\textwidth/3} (ein Drittel der Textbreite), der eine Dimension durch eine ganze Zahl teilt, genau so.
Eine Einschränkung bei calc: Wenn Sie eine Dimension mit einem reellen Faktor skalieren möchten, schreiben Sie das anders als eine ganzzahlige Division und fügen \real{} ein (z. B. \widthof{Wort} * \real{0.68}). Außerdem müssen Ausdrücke typkonsistent sein: 2cm + 4 (eine nackte ganze Zahl zu einer Dimension addiert) ist unzulässig, 2cm + 4pt dagegen ist in Ordnung, weil beide Seiten Dimensionen sind.
\usepackage{calc}
\newlength{\thirdcol}
\setlength{\thirdcol}{\textwidth/3} % 本文幅の 1/3
\addtolength{\thirdcol}{-1em} % そこから 1em 引くGesetztes Material messen — \settowidth und Verwandte
Besonders mächtig sind Längenoperationen, die das Ergebnis tatsächlichen Satzes messen und in einer Länge speichern. \settowidth{\mylen}{Text} setzt den angegebenen Text intern und schreibt seine Breite nach \mylen. Entsprechend misst \settoheight die Höhe oberhalb der Grundlinie und \settodepth die Tiefe darunter (jeweils für eine Länge, die Sie zuvor mit \newlength deklariert haben).
Das ist nützlich, wenn Sie eine Dimension brauchen, die zum Inhalt passt: „eine Linie genau so breit wie dieses Überschriftenwort“ oder „eine Beschriftungsbreite passend zum längsten Eintrag“. Das folgende Beispiel misst die Breite eines Wortes und setzt darunter eine Linie gleicher Länge:
\newlength{\wd}
\settowidth{\wd}{重要} % 「重要」の組版幅を測る
\noindent 重要\par
\rule{\wd}{0.4pt} % 同じ幅の罫線Dieselbe Idee „setzen und messen“ findet sich auch in den zuvor erwähnten Befehlen des Pakets calc: \widthof{Text}/\heightof/\depthof. Der Unterschied: \settowidth ist ein Befehl, der das Ergebnis einer Länge zuweist, während \widthof direkt als Wert in einem Ausdruck stehen kann.
Zusammengesetzt — eigener Zähler und gemessene Länge
Zum Schluss ein kleines Beispiel mit beidem. Wir erstellen einen eigenen Zähler question, formatieren seine Ausgabe als „Q1.“, „Q2.“, … und definieren einen einfachen Befehl \question, der bei jedem Aufruf den Zähler erhöht und die Nummer ausgibt. Weil er \refstepcounter verwendet, können Sie jede Frage mit \label versehen und später mit \ref darauf verweisen:
\newcounter{question}
\renewcommand{\thequestion}{Q\arabic{question}}
\newcommand{\question}{\refstepcounter{question}\par\noindent\textbf{\thequestion.}\ }
\begin{document}
\question 最初の問い。\label{q:first}
\question 次の問い。
問い~\ref{q:first} を参照。 % → 問い Q1 を参照
\end{document}Durch die Definition von \thequestion mit \renewcommand liegt das Zahlenformat (Q + arabische Zahl) an einer einzigen Stelle und lässt sich später leicht ändern. Derselbe Gedanke hilft bei Längen: Bauen Sie Dimensionen relativ zur Textbreite (\textwidth) auf oder bestimmen Sie sie, indem Sie Inhalte mit \settowidth messen. Dann behält Ihr Dokument seine Proportionen, auch wenn sich Papierformat oder Ränder ändern. Statt feste Werte hart zu kodieren, geben Sie ihnen Namen und verwalten Sie sie zentral; genau darin liegt der Nutzen von Zählern und Längen als Programmierwerkzeuge.