<\body> Makros können zur Definition von neuen Befehlen, Konstrukten, Tags benutzt werden und zur Konstruktion von abstrakten Prozeduren in Stil-Definitionen. Ältere Versionen von machten einen Unterschied zwischen Makros, bei denen alle Kinder erreichbar waren und Funktionen, die Kinder nicht erreichen konnten. Das jetzige kennt nur Makros: die Erreichbarkeit von Kindern wird heuristisch ermittelt und kann durch \ gesteuert werden. <\explain> >|var-n|body> <|explain> Dieses Konstrukt erzeugt ein Makro (das -Analogon eines >-Ausdrucks) mit Argumenten mit den Namen der Zeichenkette bis . Neue Tags werden definiert, indem die Makros im Kontext gespeichert werden. Meistens werden Makros global gespeichert mit , aber manchmal ist es besser, einem Tag lokal zu definieren mit . Beispielsweise definieren nummerierte Kontexte die Variable lokal. <\example> Definition einer <\tm-fragment> >>>> Wenn man ein Makro im Kontext speichert, wird ein Tag mit einer vorgegebenen Anzahl von Argumenten definiert. <\explain> >|index-n> <|explain> Dieses Konstrukt dient dazu, Werte von Variablen innerhalb eines Makro-Rumpfes zu ermitteln. Z.B. evaluiert zu dem aktuellen Wert von (Zeichenkette). Natürlich muss dieses Argument davor in dem Makro, , definiert sein, das den -Konstrukt enthält. Dieses Konstrukt ähnelt , verhält sich aber in einigen wichtigen Punkten anders: <\itemize> Der Argument-Namensraum unterscheidet sich vom Kontext, daher liefern und in der Regel unterschiedliche Werte. (Darauf sollte man sich aber nicht verlassen.) Der Wert von verbleibt an der Stelle des Makro-Arguments in dem Dokument-Baum. Deshalb können die Argumente eines Makro-Konstrukts im aktiven Zustand geändert werden. Wenn mehr als Argument vorhanden ist, dann expandiert >|index-n> zu einem Unterbaus des Arguments . Der Wert von muss ein , compound, sein, also keine Zeichenkette. Alle Argumente, bis , müssen zu positiven Ganzzahlen evaluieren und den Pfad zu einem Unterbaus des Makro-Arguments zeigen.\ <\explain> <|explain> Dieses Konstrukt definiert ein Makro (das -Analogon eines >-Ausdrucks), welches eine beliebige Anzahl von Argumenten annehmen kann. Die Argumente werden in der Makro-Variablen mit Namen (einer Zeichenkette) während der Evaluierung des Rumpfes, , gespeichert. Der Wert des -ten Arguments kann dann mit erhalten werden. <\explain> <|explain> Dieses Konstrukt evaluiert ein Baum, dessen Wurzel ist und dessen Kinder durch Anwendung eines Makros auf die Kinder des Makro-Arguments mit Namen entstehen. Entsprechend der Vorgabe wird auf auf alle Kinder angewandt. Wenn spezifiziert wurde, dann wird mit dem -ten Kind begonnen, wenn das Resultat der Evaluierung von ist. Mit wird die Berechnung beim -ten Kind von , wobei das j-te Kind nicht einbezogen wird, wenn das Ergebnis der Evaluierung von ist. Die Dimension des Baumes ist also . Anders ausgedrückt: wendet auf alle Unter-Bäume oder auf ein Intervall von Unter-Bäumen an (falls und angegeben wurde) und sammelt das Ergebnis in einem Baum mit Namen . ist das Analogon zur -Funktion . Weil aber Bäume mit Labeln verwendet, muss das Label für das Ergebnis mit übergeben werden. <\example> Komma-separierte Listen. Das -Makro hat eine Dimension, auch wenn dies keinen Sinn macht bei der Dimension 0. Der Schriftsatz erfolgt so, dass seine Argumente durch Kommata getrennt werden. <\tm-fragment> >>> >>>> <\explain> <|explain> Dieses Konstrukt evaluiert zu einem Baum mit dem dem gleichen Label wie die Expansion des Arguments , dessen Unter-Bäume das Resultat der Evaluierung der Unter-Bäume von sind. <\explain> >|arg-n> <|explain> Dieses Konstrukt ist besonders nützlich, wenn es darum geht, Makros zu expandieren, die selbst das Ergebnis einer Berechnung sind: Er wendet das Makro, welches das Resultat der Evaluierung von ist, auf die Argumente bis an. wird vor allem verwendet, wenn einem Makro ein anderes Makro als Argument übergeben wird, welches es dann beim Vorliegen bestimmter Bedingungen verwendet. Allerdings kann in der derzeitigen Implementierung entweder zu einem Makro evaluieren oder zu einer Zeichenkette, die dann dem Makro ihren Namen gibt. Wir empfehlen Vorsicht bei der zweiten Variante. <\example> Lambda-Programmierung mit Makros. Im unten stehenden Code erwartet ein Makro und ein Tupel als Argumente und liefert ein Tupel zurück, das aus denjenigen Elemente von besteht, für die den Wert ergibt. <\tm-fragment> >|0>||||0>>||0>>|>>|||1|>>>>>>>>>> Das lässt sich z.B. in einem Makro verwenden, das aus ein Tupel von Ganzzahlen die geraden Zahlen extrahiert. <\tm-fragment> |2>|0>>|>>>> <\explain> >|prop-n|val-n>-Eigenschaften> <|explain> Die Dimension und die Erreichbarkeit von Kindern wird normalerweise heuristisch ermittelt. Das -Konstrukt ändert die Voreinstellung für die Kontextvariable (normalerweise ein Makro) mit dem Namen . Zur Zeit werden die folgenden Paarungen unterstützt: <\description-dash> )>(Dimension, n) setzt die Dimension auf einen festen Wert (Ganzzahl). (erreichbar, alle) Das Konstrukt kann dann im Editor nicht deaktiviert werden. Kinder, die nicht erreichbar sind, können nicht editiert werden. Verhindert, dass der Cursor innerhalb eines Konstrukts positioniert wird, solange das Konstrukt aktiv ist. Kinder können also nur editiert werden, wenn das Konstrukt deaktiviert wird. <\explain> <|explain> Gibt den Label des Baumes zurück, wenn der Ausdruck, , evaluiert wird. <\explain> <|explain> Gibt die Dimension des Baumes zurück, wenn der Ausdruck, , evaluiert wird. <\initial> <\collection>