Verwenden Sie lokale {
... }
Gruppen mit Bedacht
Wie in dieser Antwort hervorgehoben , können aktive Zeichen wie ~
als Makroname verwendet werden. Leider ~
ist dies standardmäßig das einzige aktive Zeichen, und das Ändern des Catcodes für ein anderes Zeichen ist teuer: \catcode`!13
dauert 12 Byte. Wenn die neue Makrodefinition nur in einer kleinen Region Ihres Codes benötigt wird, können lokale Gruppen eine Lösung sein.
Wenn TeX eine neue lokale Gruppe betritt, die von geöffnet wurde {
, erstellt es eine neue Gruppierungsebene auf dem internen Speicherstapel. Dies bedeutet, dass alle aktuellen Makros und Register gespeichert werden. Änderungen an ihnen (sofern nicht ausdrücklich als markiert \global
) sind nur noch aktiv, bis die Gruppe durch geschlossen wird }
. Dies bedeutet, dass ~
innerhalb einer Gruppe neu definiert und dort mit der neuen Definition verwendet werden kann. Die alte Definition wird nach Beendigung der Gruppe automatisch wiederhergestellt.
Hier ist ein Beispiel:
\def~{abc}
~ -- {\def~{123}~} -- ~
Dies gibt aus
abc - 123 - abc
Ein interessanter Nebeneffekt dieses Gruppierungsmechanismus ist, dass die alten Werte in der Gruppe noch verfügbar sind, bis sie dort geändert werden. Stellen Sie sich zur Veranschaulichung vor, wir möchten eine Anzahl von Zeichen basierend auf dem Wert eines Zählers drucken, sie mit Leerzeichen bis zu einer festen Länge auffüllen und mit dem ursprünglichen Zählerwert fortfahren. Dies könnte folgendermaßen erreicht werden:
\newcount\x
\x=3
Print a char \the\x\ times,
{\x=-\x \advance\x 10 pad with \the\x\ spaces,}
and go on with x=\the\x.
welche Ausgänge
Drucken Sie ein Zeichen dreimal, füllen Sie es mit 7 Leerzeichen auf und fahren Sie mit x = 3 fort.
Dieses Gruppierungsverhalten ist besonders wichtig, wenn Sie die Standardmakros von TeX für das \loop ... \repeat
Verschachteln von Schleifen verwenden möchten . Diese Makros definieren interne Befehle und verwenden diese, um die weitere Vorgehensweise zu bestimmen. Wenn Sie sie verschachteln, ohne die innere Schleife in geschweifte Klammern zu setzen, werden die internen Befehle durcheinander gebracht und es kommt zu unerwartetem Verhalten.