
Die e-TeX-Erweiterungen sollten einige der Mängel von Knuths ursprünglichem TeX beheben, und da sie seit einiger Zeit von LaTeX2e benötigt werden, können sich die meisten Paketautoren auf ihre Anwesenheit verlassen. Es gibt zwar einige Ressourcen zum Erlernen reiner TeX-Makroidiome, darunterdiese Diskussionauf dieser Seite und auch auf derVorteile von e-TeXGenerell würde ich gerne einige konkrete Beispiele sehen, wie e-TeX-Erweiterungen das Leben eines Makroautors einfacher machen können.
Insbesondere wären einige praktische Ratschläge/Tricks zur Verwendung der Erweiterungs- und Parsing-bezogenen Befehle \protected
, \unexpanded
, \detokenize
und \scantokens
sehr willkommen. Sie erscheinen mir nützlich, aber ich weiß nie, wann ich sie zur Vereinfachung von Dingen verwenden könnte (diee-TeX-Handbuchist auch sehr knapp dazu).
Der Umfang der Frage ist recht weit gefasst, aber am meisten interessieren mich die oben aufgeführten Erweiterungen. Nachfolgend finden Sie einige weitere Überlegungen zu anderen Erweiterungen, die ich ebenfalls gerne diskutieren würde.
Bei einigen Erweiterungen erschließt sich mir der Nutzen sofort, darunter
- keine Sorge um die Zuweisung neuer Register aufgrund der erhöhten Anzahl von 32767 Steckplätzen pro Typ
- die praktischen
\numexpr
Ausdrucksbefehle\dimexpr
usw. erleichtern arithmetische Operationen \unless
als negiertes\if
, insbesondere in Verbindung mit\loop
s, wo sonst neue Bedingungen definiert werden müssten, wenn eine Schleife ausgeführt werden soll, solange eine Bedingung falsch ist- verschiedene neue Tracing-Befehle und Optionen, die bei der Diagnose helfen
Bei manchen Features frage ich mich jedoch, ob sie von den Paketen tatsächlich genutzt werden oder ob sie durch „modernere“ Ansätze ersetzt wurden, wie z. B.
- Satz mit gemischter Richtung mit
\beginL
usw.\beginR
- Statusanfragen wie
\currentgrouptype
,\currentiftype
,\lastnodetype
usw. - die Möglichkeit, verworfene Elemente vom Anfang der Seiten zu speichern, wird eingebaut
\pagediscards
- linienspezifische Strafen mit
\interlinepenalties
und dergleichen
Antwort1
Die „großen“ Dinge in e-TeX:
\protected
ermöglicht uns die Erstellung von Makros, die nicht innerhalb von „an“\edef
oder ähnlichem erweitert werden:\protected\def\foo{\let\baz\bong} \edef\test{Some text\foo}
würde normalerweise einen Fehler ausgeben (vorausgesetzt, es gibt keine Definition für
\baz
/\bong
), aber hier ist es 'sicher'. Wenn Sie sich den LaTeX2e-Mechanismus ansehen\protect
, ist das Obige einviel einfacher zu bedienen und zuverlässiger:\protected
Makrosniemalsexpandieren Sie innerhalbx
der -Typdefinition, während man beim LaTeX2e-Ansatz\protected@edef
usw. benötigt.\unexpanded
ermöglicht es uns, beliebige Token vor der Erweiterung zu schützen, ohne einen Token verwenden zu müssen\edef\test{Some text\unexpanded{lots of \textbf{stuff}}}
was bei beliebigen Benutzereingaben sehr nützlich ist. Es ermöglicht auch Dinge wie
\edef\demo{\unexpanded{tokens #}}
Das bedeutet, dass es problemlos
#
in einem Makro gespeichert werden kann (sieheexpl3
tl
Datentyp).\detokenize
ist gut, um Dinge "sicher" zu machen, zum Beispiel wenn sie aktive Charaktere haben könnten\csname Tokens\detokenize{&_~^\foo}\endcsname
Dies gilt insbesondere, wenn beispielsweise aktive Zeichen für die UTF-8-Eingabe in LaTeX verwendet werden
\numexpr
usw. eignen sich hervorragend für die einfache Durchführung erweiterbarer Berechnungen
Antwort2
Beim Durchgehen der Quelldateien in TeX Live kann ich einige Erkenntnisse zur Verwendung der zumindest meiner Wahrnehmung nach weniger verbreiteten Funktionen von e-TeX hinzufügen.
Für einige derStatusabfragePrimitive, Heiko Oberdieks Pakete bieten einige Beispiele für ihre Anwendung. Das atbegshi
Paket zeigt einen netten Trick, wie ein Primitiv, das eine Box als Argument annimmt, neu definiert werden kann ( \shipout
in diesem Fall), wobei berücksichtigt wird, dass, wenn das Argument mit \setbox
und abgefangen werden soll, das nach der Zuweisung einzufügende Token je nachdem, ob die Box als oder als \afterassignment
angegeben wird, in der Box landen kann oder nicht . Es sieht mehr oder weniger so aus:box0
\hbox{...}
\def\shipout{%
\edef\saved@grouplevel{\number\currentgrouplevel}
\afterassignment\@test
\setbox\mybox=}
\def\@test{%
\ifnum\saved@grouplevel<\currentgrouplevel
\expandafter\aftergroup
\fi
\output
}
Es verwendet e-TeXs, \currentgrouplevel
um zu bestimmen, ob \@test
innerhalb der Box gelandet ist (die eine Gruppe geöffnet hat). In diesem Fall \output
wird die nachfolgende Operation bis nach der Box verschoben.
Eine weitere nützliche Tatsache ist, dass \lastnodetype
für alle nicht verwerfbaren Dinge kleiner als 11 ist und -1, wenn die aktuelle Liste noch leer ist ( setouterhbox
Anwendungen hierfür finden Sie beispielsweise unter).
Wie egreg in den Kommentaren anmerkt, \currentgrouptype
kann im Mathematikmodus abgefragt werden, um zu entscheiden, ob eine \middle
Trennzeichenvariante verwendet werden soll oder nicht, wie \currentgrouptype
16 in einer Gruppe, die geöffnet wird durch \left
(zum BeispielHier).
e-TeXsbidirektionaler SchriftsatzFähigkeiten in Form von TeX - XeT wird von XeTeX verwendet, für das das bidi
Paket eine Schnittstelle zu diesen Funktionen bereitstellt. Auch für einige Standard-LaTeX-Pakete babel-hebrew
scheint dies der richtige Weg zu sein. LuaTeX hat jedoch die Primitiven usw. aufgegeben \beginL
und \beginR
integriert stattdessen die Omega TeX-Erweiterung.
Andererseits habe ich für einige Funktionen keine wirklichen Anwendungen gefunden. Sie kommen nur dort vor, wo wahrscheinlich alle Grundelemente vorkommen, wie etwa im LaTeX3-Kernel, ConTeXt MkIV und dem unravel
Paket, sowie an einigen anderen Stellen, wo die Autoren versucht haben, die Kompatibilität mit anderen Paketen zu erhöhen, die sie verwenden. Zu diesen Funktionen gehören die \currentif{type,branch,level}
Abfragen, die \pagediscards
Funktionalität und die zeilenspezifischen \{inter,club,widow}linepenalties
.