Erweiterbarkeit: LaTeX3 VS LaTeX

Erweiterbarkeit: LaTeX3 VS LaTeX

Die Erweiterbarkeit ist das Herzstück von Makros/Funktionen. Ich würde gerne wissen:

  1. Ein besseres Verständnis der Erweiterbarkeit LaTeX3kann nur durch einen guten Hintergrund zur Erweiterbarkeit in erreicht werden LaTeX. Inwieweit können sie als unabhängig betrachtet werden?
  2. Genauer gesagt, wenn die von angebotenen Funktionen l3expanausreichen, um alle Erweiterbarkeitsanforderungen zu erfüllen. Mit anderen Worten, innerhalb von wird LaTeX3LaTeXErweiterbarkeit“ unterstützt, kann abertotalersetzt.
  3. Gibt es eine Möglichkeit, die Zwischenschritte zu überprüfen, während der Erweiterbarkeitsprozess ausgeführt wird (z. B. einige Ausgabedateien, Profilierungsoptionen usw.)

Antwort1

Da ich es selbst nicht gemacht habe, glaube ich, dass es für einen neuen LaTeX-Programmierer einfacher ist, mit den durch Laden definierten Funktionen expl3(auch bekannt als LaTeX3-Kernel oder l3kernel) zu beginnen, als zuerst die Grundlagen der TeX-Programmierung zu erlernen und sich dann weiterzuentwickeln.

Der Grund dafür ist, dass expl3Sie dadurch eine sehr schöne Abstraktionsebene erhalten, die leistungsstark und intern konsistent ist. Bei der TeX-Programmierung müssen Sie sehr schnell dazu übergehen, „Tricks“ zu lernen, um relativ einfache Dinge zu erledigen.

Wenn Sie beispielsweise über zwei Befehle \foound sprechen, schreiben Sie \bazzum Erstellen \fooeiner Kopie\baz

\let\foo\baz

Aber was, wenn Sie sie mit Namen statt mit Steuersequenzen referenzieren müssen? Sie könnten beispielsweise Folgendes definieren:

\defineacronym{baz}{BAZ}
\useacronym{baz} % => \textsc{\MakeLowercase{BAZ}}

Dies kann definiert werden mit

\makeatletter
\newcommand\defineacronym[2]{%
  \@namedef{acronym@#1}{\textsc{\MakeLowercase{BAZ}}}%
}
\newcommand\useacronym[1]{%
  \@nameuse{acronym@#1}%
}
\makeatother

So weit, so gut. Aber um einen Befehl wie zu definieren \copyacronym{foo}{baz}, müssen Sie schreiben:

\newcommand\copyacronym[2]{%
  \expandafter\let\csname acronym@#1\expandafter\endcsname\csname acronym@#2\endcsname
}

Für einen erfahrenen TeX-Programmierer ist das leicht nachvollziehbar, für einen Anfänger jedoch nicht besonders angenehm.

Dies expl3würde wie folgt geschrieben werden:

\ExplSyntaxOn
\newcommand\copyacronym[2]{
  \cs_set_eq:cc {acronym@#1} {acronym@#2}
}
\ExplSyntaxOff

Das Ziel von expl3ist es, die TeX-Programmierung strukturierter und damit einfacher zu machen. WirHoffnungdass dies bei neuen TeX-Programmierern noch stärker der Fall ist als bei alten.


Auf Ihre letzte Frage lautet die Antwort: so ungefähr. Bruno Le Floch hat das unravelPaket geschrieben, das Ihnen sicherlich zeigen kann, was mit der Erweiterung passiert. Nach dem Schreiben

\usepackage{unravel}
\def\baz{BAZ}
\unravel{\expandafter\let\csname foo\expandafter\endcsname\csname baz\endcsname}

Es gibt Folgendes zurück:

======== Welcome to the unravel package ========
    "<|" denotes the output to TeX's stomach.
    "||" denotes tokens waiting to be used.
    "|>" denotes tokens that we will act on.
    Press <enter> to continue; 'h' <enter> for help.

|| 
|> \expandafter \let \csname foo\expandafter \endcsname \csname baz\endcsname 

[===== Step 1 =====] \expandafter \let 

[===== Step 2 =====] \csname = \csname
|| \expandafter \let 
|| \csname 
|> foo\expandafter \endcsname \csname baz\endcsname 

[===== Step 3 =====] \expandafter \endcsname 
|| \expandafter \let 
|| \csname foo
|| \expandafter \endcsname 
|> \csname baz\endcsname 

[===== Step 4 =====] \csname = \csname
|| \expandafter \let 
|| \csname foo
|| \expandafter \endcsname 
|| \csname 
|> baz\endcsname 

[===== Step 5 =====] \endcsname 
|| \expandafter \let 
|| \csname foo
|| \expandafter \endcsname 
|| \csname baz\endcsname 
|> 

[===== Step 6 =====] \csname baz\endcsname =\baz 
|| \expandafter \let 
|| \csname foo
|| \expandafter \endcsname 
|> \baz 

[===== Step 7 =====] back_input: \expandafter \endcsname 
|| \expandafter \let 
|| \csname foo
|> \endcsname \baz 

[===== Step 8 =====] \endcsname 
|| \expandafter \let 
|| \csname foo\endcsname 
|> \baz 

[===== Step 9 =====] \csname foo\endcsname =\foo 
|| \expandafter \let 
|> \foo \baz 

[===== Step 10 =====] back_input: \expandafter \let 
|| 
|> \let \foo \baz 

[===== Step 11 =====] \let \foo 
|| \let \foo 
|> \baz 

[===== Step 12 =====] Set \foo=macro:->BAZ
|| 
|> 

[===== End =====]

Wie Sie sehen, ist das sogar bei einfachen Fällen eine ganz schöne Geschichte. (Eine leicht verdauliche, aber trotzdem.) Besonders beim Debuggen expl3als neuer Benutzer kann dies nur in bestimmten Situationen nützlich sein.

verwandte Informationen