Latex3-Äquivalent csname endcsname

Latex3-Äquivalent csname endcsname

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 \expandafteroder \csnameKonstruktionen 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:wund \cs_endsind die Low-Level-TeX-Befehle, die dies alles ermöglichen (d. h. \csname... \endcnsamein 2e). Zusammen mit \exp_after:wNkö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 cVariante verwenden:

\cs_new_protected:cpn { toto_num_ \Alph{N} } { <whatever> }

verwandte Informationen