Fangen wir mit den beweglichen Argumenten an. Beweglich bedeutet hier eigentlich etwas anderes: das entsprechende Argument wird vollständig expandiert. Dazu muss man grob verstehen, was es mit Expansion auf sich hat. Ein LaTeX-Makro wird im Laufe des Kompilations-Prozesses mit seinem Ersetzungstext ersetzt. Diesen Schritt nennt man Expansion.
Je nach Makro-Definition kann das ein oder mehrere Schritte beinhalten:
Kommt ein solches Makro nun in einer Definition vor, die mit
Da der Warum kann die Expansion problematisch sein? Nun, nicht alle Befehle lassen sich expandieren.
Zerbrechliche Befehle sind nun alle, die in einem
Dieser Code liefert den Fehler
Der Standardweg, den Fehler zu vermeiden, ist es, dem zerbrechlichen Befehl ein
Hat man e-TeX zur Verfügung, und das ist bei heutigen TeX-Installation eigentlich der Standardfall, dann kann man das betroffene Makro auch engine-protected machen. Das heißt, TeX bekommt mitgeteilt, dass dieses Makro (in
Man sollte dazu sagen, dass es keine eindeutige Definition der Zerbrechlichkeit gibt, wie die Diskussion in den Kommentaren zeigt. Je nachdem, wie man sie definiert, kann Zerbrechlichkeit auch über die oben erwähnten Fälle hinaus gehen. Andere Definitionen wären etwa:
beantwortet 15 Jun '13, 18:17 cgnieder Ein bewegliches Argument muss AFAIK nicht unbedingt vollständig expandiert werden. Auch eine Teilexpansion (beispielsweise mit expandafter) kann bereits ein Problem darstellen. Ein bewegliches Argument ist daher ein Argument, das von dem verarbeitenden Makro (ganz oder teilweise) expandiert wird. Übrigens sind auch Befehle mit einer Sternform wie
(21 Jun '13, 11:10)
saputello
@saputello Stimmt, Befehle mit Sternvarianten sind auch Kandidaten fürs Zerbrechen. Für ein Zerbrechen durch
(21 Jun '13, 11:23)
cgnieder
Alles, was nicht als robust, beziehungsweise nicht expandierbar, definiert ist oder kein TeX-Primitiv ist, macht Probleme. Also fast alles unter LaTeX.
(21 Jun '13, 12:28)
Herbert
@Clemens Als Kommentar ist das schwer darstellbar, aber trotzdem:
(21 Jun '13, 12:35)
saputello
@saputello ich weiß nicht, ob ich das „Zerbrechen” nennen würde, es gibt ja keine Fehlermeldung oder etwas dergleichen. Die TeX FAQ beschreibt einen zerbrechlichen Befehl als „it’s a command that expands into illegal TeX code during the save process.“ und das passiert her ja nicht
(21 Jun '13, 12:46)
cgnieder
@Clemens: Wenn Du als erstes Argument an
(21 Jun '13, 12:59)
saputello
@saputello sicher,
(21 Jun '13, 13:04)
cgnieder
@Clemens: Es muss beim Zerbrechen nicht notwendigerweise einen Fehler geben; entscheidend ist eher, dass der ursprüngliche Effekt des zerbrochenen Makros nicht mehr gegeben ist.
(21 Jun '13, 13:24)
Herbert
@Herbert ok stimmt. Dennoch will ich Zerbrechen nicht gleichsetzen mit „gibt was anderes als erwartet, möglicherweise einen Fehler“ sondern mit „gibt in einem Exansionskontext etwas anderes als erwartet, möglicherweise einen Fehler“ (wobei Expansionskontext
(21 Jun '13, 13:35)
cgnieder
@saputello Sehe ich auch so wie Clemens: Das Beispiel zeigt kein Problem. Eine Folge von Tokens ist nur dann zerbrechlich, wenn die Tokens auch Zuweisungen enthalten und die korrekte Expansion dieser Tokenfolge von der Ausführung dieser Zuweisungen abhängig ist. Gibt es keine Zuweisungen/Seiteneffekte, gibt es erst einmal keine Probleme. Und sowohl expandafter, ifx, else und fi sind rein expandierbar. Genau die Zuweisungen sind ja das Problem von "fragilen" Dingen in "moving arguments": Hier (also in einem write oder einem mark) wird nur expandiert, ohne Zuweisungen.
(28 Jun '13, 21:26)
bernd
Mmmh, auch vollständig expandierbare Dinge können zerbrechen:
Wenn man
(28 Jun '13, 21:29)
bernd
@bernd Letztlich stimmt ich Clemens in soweit zu, dass es am Ende eine Frage davon ist, was man nun als zerbrechen definiert und was nicht. Persönlich wäre ich mit der Behauptung dass nur vollständige Expansion ein Problem darstellt, einfach etwas vorsichtig. Denn am Ende kommt es dann eben doch weniger auf die Definition als vielmehr darauf an, ob es so funktioniert, wie der Anwender erwartet. ;)
(04 Jul '13, 15:41)
saputello
Ergebnis 5 von 12
show 7 more comments
|