Überarbeitungsverlauf[Zurück]
Klicke auf Einblenden/Ausblenden von Überarbeitungen 5
Antwort ausgearbeitet

03 Sep '13, 23:10

cgnieder's gravatar image

cgnieder
22.1k253463

Wenn sie nicht eines 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 TeXs Primitiven sind, sind Kontrollsequenzen fast immer Makros, d.h. sie TeX direkt bereitgestellte Kontrollsequenzen), Register (z.B. Längen) oder Makros. Letztere wurden mit `\def` (ein TeX-Primitives) oder einem seiner Verwandten (oder mit LaTeXs LaTeXs äquivalent `\newcommand`) `\newcommand` und Verwandten) definiert. Das kann im Kernel des verwendeten Formats (also z.B. LaTeX) geschehen sein, in einer eingebundenen Datei (z.B. ein LaTeX-Paket) oder man hat es selbst gemacht: \def<kontrollsequenz><parameter spez>{<ersetzungstext>} 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 **Dieser Vorgang wird als Expansion bezeichnet. Dann bezeichnet**. Danach schaut der Mund, was als nächstes im Inputstream kommt. \def\bla{einem bla Makro} \def\blub#1{einem Blub Makro mit #1} ein text mit \blub\bla, geht aber weiter eine Expansion => ein text mit einem Blub Makro mit \bla, geht aber weiter weitere Expansion => ein text mit einem Blub Makro mit einem bla Makro, geht aber weiter \def\a{\b} \def\b{\c} \def\c{d} \a =eine Expansion=> \b =eine Expansion=> \c =eine Expansion=> d Viele von TeXs Primitiven Primitiven<sup>1</sup> sind nicht expandierbar, das heißt, sie bleiben so stehen wie sie sind. [Dazu gehört z.B. `\\relax`][1], genauso alle, die irgendwelche Zuweisungen vornehmen (`\def`, `\let`, ...). Sie erledigen ihre Arbeit in TeXs Bauch (aka _stomach_). Konsequenzen D. E. Knuth hat das im Appendix D des TeXbooks folgendermaßen beschrieben: > TeX’s control sequences are divided > into two main categories, “expandable” > and “unexpandable”; the former > category includes all macros and > `\if...\fi` tests, as well as special > operations like `\the` and `\input`, > while the latter category includes the > primitive commands listed in Chapter > 24. The expansion of expandable tokens takes place in TeX’s “mouth,” but > primitive commands (including > assignments) are done in TeX’s > “stomach.” One important consequence > of this structure is that it is > impossible to redefine a control > sequence or to advance a register > while TeX is expanding the token list > of, say, a `\message` or `\write` > command; assignment operations are > done only when TeX is building a > vertical or horizontal or math list. **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: `\def\foo#1{\gdef\@foo{#1}`. Das oben definierte Makro `\a` ist übrigens vollständig expandierbar: \a =vollständige Expansion=> d Nicht vollständig expandierbar wäre z.B. folgendes Makro: \def\A{\def\B{C}} Wenn ein Makro nicht vollständig expandierbar ist, hat das Konsequenzen in Anweisungen, die ihren Inhalt expandieren, vollständig expandieren (wollen/müssen), wie `\edef` oder `\write`, siehe auch [diese Frage und ihre Antworten über zerbrechliche und robuste Befehle][2]. D. E. Knuth hat das Befehle][2]<sup>2</sup>. Dort kann es Probleme bereiten, wenn nicht geeignete Maßnahmen ergriffen werden. \edef\keinproblem{\a} \show\keinproblem % im Appendix D des TeXbooks folgendermaßen beschrieben: > TeX’s Log: > \keinproblem=macro: ->d. \edef\problem{\A} % im Log: ! Undefined control sequences are divided > into two main categories, “expandable” > and “unexpandable”; the former > category includes all macros and > `\if...\fi` tests, as well as special > operations like `\the` and `\input`, > while the latter category includes the > primitive commands listed in Chapter > 24. The expansion of expandable tokens takes place in TeX’s “mouth,” but > primitive commands (including > assignments) are done in TeX’s > “stomach.” One important consequence > of this structure is that it is > impossible to redefine a control > sequence or to advance a register > while TeX is expanding the token list > of, say, a `\message` or `\write` > command; assignment operations are > done only when TeX is building a > vertical or horizontal or math list. **Das heißt also, _alle_ Makros sind expandierbar**. Allerdings wird oft gesagt, das sie sequence. \A ->\def \B {C} Im zweiten Fall gibt es ein Problem: `\edef` versucht `\def` zu expandieren, was nicht _vollständig expandierbar_ sind, wenn ihr Ersetzungstext nicht-expandierbare Kontrollsequenzen enthält (etwa, wenn der Ersetzungstext seinerseits Zuweisungen vornimmt: `\def\foo#1{\gdef\@foo{#1}`). geht, weshalb es stehen bleibt (wie es ein Buchstabe auch tun würde). Dann versucht es `\B` zu expandieren, was zum Fehler führt, da es nicht existiert. (Würde es schon existieren, gäbe es andere ungewünschte Effekte). Mit e-TeX gibt es außerdem übrigens das Primitive `\protected`, das ermöglicht, nicht-expandierbare Kontrollsequenzen Makros zu definieren (`\protected\def\foo#1{\gdef\@foo{#1}`). Solche nicht-expandierbaren Kontrollsequenzen Makros werden zwar im Mund expandiert<sup>1</sup>, expandiert<sup>3</sup>, nicht aber in einem `\edef` o.ä. o.ä., wo sie sich ähnlich einem `\relax` verhalten. ---------- 1. siehe auch Kommentare zu dieser Antwort. 2. Diese Art der Expansion wir in expl3 (LaTeX3s Programmierschicht) als x-Expansion ( _exhaustive_) genannt 3. man korrigiere mich bitte, wenn das nicht stimmt. [1]: http://texwelt.de/wissen/fragen/894/was-macht-relax [2]: http://texwelt.de/wissen/fragen/68/was-sind-zerbrechliche-befehle-und-bewegliche-argumente
Klicke auf Einblenden/Ausblenden von Überarbeitungen 4

31 Aug '13, 18:23

cgnieder's gravatar image

cgnieder
22.1k253463

Wenn sie nicht eines von TeXs Primitiven sind, sind Kontrollsequenzen fast immer Makros, d.h. sie wurden mit `\def` oder einem seiner Verwandten (oder mit LaTeXs äquivalent `\newcommand`) definiert. Das kann im Kernel des verwendeten Formats geschehen sein, in einer eingebundenen Datei (z.B. ein LaTeX-Paket) oder man hat es selbst gemacht: \def<kontrollsequenz><parameter spez>{<ersetzungstext>} 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. Dann schaut der Mund, was als nächstes im Inputstream kommt. \def\bla{einem bla Makro} \def\blub#1{einem Blub Makro mit #1} ein text mit \blub\bla, geht aber weiter eine Expansion => ein text mit einem Blub Makro mit \bla, geht aber weiter weitere Expansion => ein text mit einem Blub Makro mit einem bla Makro, geht aber weiter Viele von TeXs Primitiven sind nicht expandierbar, das heißt, sie bleiben so stehen wie sie sind. [Dazu gehört z.B. `\relax`][1], `\\relax`][1], genauso alle, die irgendwelche Zuweisungen vornehmen (`\def`, `\let`, ...). Sie erledigen ihre Arbeit in TeXs Bauch (aka _stomach_). Konsequenzen hat das in Anweisungen, die ihren Inhalt expandieren, wie `\edef` oder `\write`, siehe auch [diese Frage und ihre Antworten über zerbrechliche und robuste Befehle][2]. D. E. Knuth hat das im Appendix D des TeXbooks folgendermaßen beschrieben: > TeX’s control sequences are divided > into two main categories, “expandable” > and “unexpandable”; the former > category includes all macros and > `\if...\fi` tests, as well as special > operations like `\the` and `\input`, > while the latter category includes the > primitive commands listed in Chapter > 24. The expansion of expandable tokens takes place in TeX’s “mouth,” but > primitive commands (including > assignments) are done in TeX’s > “stomach.” One important consequence > of this structure is that it is > impossible to redefine a control > sequence or to advance a register > while TeX is expanding the token list > of, say, a `\message` or `\write` > command; assignment operations are > done only when TeX is building a > vertical or horizontal or math list. **Das heißt also, _alle_ Makros sind expandierbar**. 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: `\def\foo#1{\gdef\@foo{#1}`). `\def\foo#1{\gdef\@foo{#1}`). Mit e-TeX gibt es außerdem das Primitive `\protected`, das ermöglicht, nicht-expandierbare Kontrollsequenzen zu definieren (`\protected\def\foo#1{\gdef\@foo{#1}`). Solche nicht-expandierbaren Kontrollsequenzen werden zwar im Mund expandiert<sup>1</sup>, nicht aber in einem `\edef` o.ä. ---------- 1. man korrigiere mich bitte, wenn das nicht stimmt. [1]: http://texwelt.de/wissen/fragen/894/was-macht-relax [2]: http://texwelt.de/wissen/fragen/68/was-sind-zerbrechliche-befehle-und-bewegliche-argumente
Klicke auf Einblenden/Ausblenden von Überarbeitungen 3

10 Aug '13, 14:09

cgnieder's gravatar image

cgnieder
22.1k253463

Klicke auf Einblenden/Ausblenden von Überarbeitungen 2

10 Aug '13, 12:44

cgnieder's gravatar image

cgnieder
22.1k253463

Klicke auf Einblenden/Ausblenden von Überarbeitungen 1

10 Aug '13, 12:32

cgnieder's gravatar image

cgnieder
22.1k253463