Öfters lese ich in Erklärungen, dass ein Makro nicht "expandierbar" ist. Was ist darunter zu verstehen? Generell muss ich feststellen, dass sich bei der TeX-Programmierung eines Vokabulars bedient wird, was in anderen Programmiersprache nicht üblich ist, z.B. eben "expandierbar" oder eben "Makro". Ich kenne den Begriff "Makro" nur aus der VBA-Programmierung. Dort hat er jedoch eine ganz andere Bedeutung. |
Um die Frage zu beantworten, sollte zunächst geklärt werden, was ein Makro und was Expansion ist. TeXs und damit LaTeXs Kontrollsequenzen sind entweder Primitive (= von TeX direkt bereitgestellte Kontrollsequenzen), Register (z.B. Längen) oder Makros. Letztere wurden mit
Wenn TeXs Mund (aka mouth) ein Makro sieht, schaut es nach, wie die Definition lautet, ob und welche Parameter gelesen werden müssen und tauscht schließlich das Makro samt Parameter mit dem Ersetzungstext aus. Dieser Vorgang wird als Expansion bezeichnet. Danach schaut der Mund, was als nächstes im Inputstream kommt.
Viele von TeXs Primitiven1 sind nicht expandierbar, das heißt, sie bleiben so stehen wie sie sind. Dazu gehört z.B.
Das heißt also, alle Makros sind expandierbar. Jedenfalls grundsätzlich. Allerdings wird oft gesagt, das sie nicht vollständig expandierbar sind, wenn ihr Ersetzungstext nicht-expandierbare Kontrollsequenzen enthält, etwa, wenn der Ersetzungstext seinerseits Zuweisungen vornimmt:
Nicht vollständig expandierbar wäre z.B. folgendes Makro:
Wenn ein Makro nicht vollständig expandierbar ist, hat das Konsequenzen in Anweisungen, die ihren Inhalt vollständig expandieren (wollen/müssen), wie
Im zweiten Fall gibt es ein Problem: Mit e-TeX gibt es übrigens das Primitive
beantwortet 10 Aug '13, 12:32 cgnieder Du schreibst: "Viele von TeXs Primitiven sind nicht expandierbar, ..." Welches Primitiv soll denn expandierbar sein?
(10 Aug '13, 15:02)
Herbert
@Herbert z.B.
(10 Aug '13, 15:09)
cgnieder
Dem Anfänger hilft das nicht wirklich. Streng genommen wird ja auch nicht
(11 Aug '13, 07:34)
Herbert
2
Hätte ich geschrieben »TeXs Primitive sind nicht expandierbar«, also ohne die Einschränkung, hätte sich bestimmt jemand beschwert, dass das so aber nicht stimmt...
(11 Aug '13, 09:35)
cgnieder
|
Makroprogrammierung kennt übrigens jeder C-Programmierer vom Makro-Präprozessor, also den berühmt berüchtigten
#define
-Konstrukten. Hauptsächlich vonautoconf
bekannt ist auch m4. Wer vor 30 Jahren und mehr programmieren gelernt hat, kennt das auch noch von Makro-Assemblern. Viele Editoren haben ebenfalls einen Makroprozessor eingebaut. Makro-Sprachen arbeiten generell nach dem Suchen/Ersetzen-Prinzip. Auch wenn TeX eine etwas eigenwillige Makrosprache ist.