эквивалент Latex3 csname endcsname

эквивалент Latex3 csname endcsname

Я хотел бы узнать, как создавать динамические именованные макросы (в цикле) в LaTeX3. В LaTeX2e все нормально.

Я ищу что-то эквивалентное этому коду с expl3

\stepcounter{N}
\expandafter\def\csname toto@num\Alph{N}\endcsname{#1}

Я посмотрел в документации expl3, они указывают \cs:w \cs_end, но я не могу понять, как заставить это работать.

заранее спасибо

решение1

Одной из главных целей expl3 является избавление вас от сложных \expandafterили \csnameконструкций. Вместо этого он предлагает вам модификаторы аргументов, которые манипулируют аргументами до того, как они будут переданы базовой функции. Как сказал @egreg, модификатор для конструкции csname — это c. Если вы используете это в своем коде (вместо N) всякий раз, когда хотите, чтобы использовалось ваше сконструированное csname.

Например, в 2e вы бы сделали что-то вроде

% 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

или хуже)

%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

в то время как в expl3 это сводится к

% 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} } 

Таким образом, настройка в 2e, возможно, немного короче, но использование сложное и трудночитаемое, в то время как в expl3 использование ясное и простое.

Команды \cs:wи \cs_endявляются низкоуровневыми командами TeX, которые заставляют все это происходить (т. е. \csname... \endcnsameв 2e), поэтому \exp_after:wNвы можете использовать их для программирования 1-2-1 способом 2e, но смысл expl3 на самом деле в том, что вам больше не нужно этого делать, поэтому они предназначены только для внутренней настройки механизма.

решение2

Вы можете использовать cвариант:

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

Связанный контент