Makrotechniken mit e-TeX

Makrotechniken mit e-TeX

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, \detokenizeund \scantokenssehr 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 \numexprAusdrucksbefehle \dimexprusw. erleichtern arithmetische Operationen
  • \unlessals negiertes \if, insbesondere in Verbindung mit \loops, 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 \beginLusw.\beginR
  • Statusanfragen wie \currentgrouptype, \currentiftype, \lastnodetypeusw.
  • die Möglichkeit, verworfene Elemente vom Anfang der Seiten zu speichern, wird eingebaut\pagediscards
  • linienspezifische Strafen mit \interlinepenaltiesund dergleichen

Antwort1

Die „großen“ Dinge in e-TeX:

  • \protectedermöglicht uns die Erstellung von Makros, die nicht innerhalb von „an“ \edefoder ä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: \protectedMakrosniemalsexpandieren Sie innerhalb xder -Typdefinition, während man beim LaTeX2e-Ansatz \protected@edefusw. benötigt.

  • \unexpandedermö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 (siehe expl3 tlDatentyp).

  • \detokenizeist 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

  • \numexprusw. 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 atbegshiPaket zeigt einen netten Trick, wie ein Primitiv, das eine Box als Argument annimmt, neu definiert werden kann ( \shipoutin diesem Fall), wobei berücksichtigt wird, dass, wenn das Argument mit \setboxund abgefangen werden soll, das nach der Zuweisung einzufügende Token je nachdem, ob die Box als oder als \afterassignmentangegeben 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, \currentgrouplevelum zu bestimmen, ob \@testinnerhalb der Box gelandet ist (die eine Gruppe geöffnet hat). In diesem Fall \outputwird die nachfolgende Operation bis nach der Box verschoben.

Eine weitere nützliche Tatsache ist, dass \lastnodetypefür alle nicht verwerfbaren Dinge kleiner als 11 ist und -1, wenn die aktuelle Liste noch leer ist ( setouterhboxAnwendungen hierfür finden Sie beispielsweise unter).

Wie egreg in den Kommentaren anmerkt, \currentgrouptypekann im Mathematikmodus abgefragt werden, um zu entscheiden, ob eine \middleTrennzeichenvariante verwendet werden soll oder nicht, wie \currentgrouptype16 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 bidiPaket eine Schnittstelle zu diesen Funktionen bereitstellt. Auch für einige Standard-LaTeX-Pakete babel-hebrewscheint dies der richtige Weg zu sein. LuaTeX hat jedoch die Primitiven usw. aufgegeben \beginLund \beginRintegriert 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 unravelPaket, 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 \pagediscardsFunktionalität und die zeilenspezifischen \{inter,club,widow}linepenalties.

verwandte Informationen