
Die Erweiterbarkeit ist das Herzstück von Makros/Funktionen. Ich würde gerne wissen:
- Ein besseres Verständnis der Erweiterbarkeit
LaTeX3
kann nur durch einen guten Hintergrund zur Erweiterbarkeit in erreicht werdenLaTeX
. Inwieweit können sie als unabhängig betrachtet werden? - Genauer gesagt, wenn die von angebotenen Funktionen
l3expan
ausreichen, um alle Erweiterbarkeitsanforderungen zu erfüllen. Mit anderen Worten, innerhalb von wirdLaTeX3
„LaTeX
Erweiterbarkeit“ unterstützt, kann abertotalersetzt. - 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 expl3
Sie 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 \foo
und sprechen, schreiben Sie \baz
zum Erstellen \foo
einer 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 expl3
würde wie folgt geschrieben werden:
\ExplSyntaxOn
\newcommand\copyacronym[2]{
\cs_set_eq:cc {acronym@#1} {acronym@#2}
}
\ExplSyntaxOff
Das Ziel von expl3
ist 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 unravel
Paket 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 expl3
als neuer Benutzer kann dies nur in bestimmten Situationen nützlich sein.