
Ich möchte wissen, wie man in Latex3 dynamische benannte Makros (in einer Schleife) erstellt. In LaTeX2e ist alles in Ordnung.
Ich suche nach etwas, das diesem Code mit expl3 entspricht
\stepcounter{N}
\expandafter\def\csname toto@num\Alph{N}\endcsname{#1}
Ich habe im expl3-Dokument nachgesehen. Dort wird darauf hingewiesen \cs:w \cs_end
, aber ich kann nicht herausfinden, wie es funktioniert.
Dank im Voraus
Antwort1
Einer der Hauptpunkte von expl3 ist, Sie von komplizierten \expandafter
oder \csname
Konstruktionen zu befreien. Als Ersatz dafür bietet es Ihnen Argumentmodifikatoren, die Argumente manipulieren, bevor sie an die Basisfunktion übergeben werden. Wie @egreg sagte, ist der Modifikator für die csname-Konstruktion c
. Wenn Sie dies in Ihrem Code verwenden (anstelle von N
), wann immer Sie möchten, dass Ihr konstruierter csname verwendet wird.
In 2e würden Sie beispielsweise Folgendes tun:
% setup
\def\foo#1{ <do something with #1> }
\expandafter\def\csname toto@num\Alph{N}\endcsname{ <whatever> }
% usage
\expandafter \foo \csname toto@num\Alph{N}\endcsname
oder schlimmer)
%setup
\def\foobar#1#2{ <do something with #1 and #2> }
\expandafter\def\csname toto@num\Alph{N}\endcsname{ <whatever> }
\expandafter\def\csname toto@num\Roman{N}\endcsname{ <whatever else>}
%usage
\expandafter \foobar \csname toto@num\Alph{N}\expandafter\endcsname
\csname toto@num\Roman{N}\endcsname
während es in expl3 darauf hinausläuft
% base defs
\cs_new_protected:cpn { toto_num_ \Alph{N} } { <whatever> }
\cs_new_protected:cpn { toto_num_ \Roman{N} } { <whatever else> }
\cs_new:Npn \foo:N #1 { <do something with #1> }
\cs_new:Npn \foobar:N #1#2 { <do something with #1 + #2> }
% command variants as needed ..
\cs_generate_variant:Nn \foo:N { c }
\cs_generate_variant:Nn \foobar:NN { cc }
% application ...
\foo:c { toto_num_ \Alph{N} }
\foobar:cc { toto_num_ \Alph{N} } { toto_num_ \Roman{N} }
Daher ist das Setup in 2e möglicherweise etwas kürzer, die Verwendung ist jedoch kompliziert und schwer zu lesen, während die Verwendung in expl3 klar und einfach ist.
Die Befehle \cs:w
und \cs_end
sind die Low-Level-TeX-Befehle, die dies alles ermöglichen (d. h. \csname
... \endcnsame
in 2e). Zusammen mit \exp_after:wN
könnten Sie sie also verwenden, um 1-2-1 auf die 2e-Art zu programmieren. Der Sinn von expl3 besteht jedoch darin, dass Sie dies nicht mehr tun müssen. Sie sind also nur dazu da, den Mechanismus intern einzurichten.
Antwort2
Sie können die c
Variante verwenden:
\cs_new_protected:cpn { toto_num_ \Alph{N} } { <whatever> }