Expl3: Erweiterung von Mappings über Listen

Expl3: Erweiterung von Mappings über Listen

Das Paket xcolorkann Farbdefinitionen so „vorbereiten“, dass sie nur geladen werden, wenn sie tatsächlich benötigt werden, was beispielsweise durch einen späteren Aufruf von angezeigt werden kann \providecolors{<id-list>}.

Das Paket verfügt außerdem über praktische Befehle zum Definieren eines großen Satzes von Farben mit einem gemeinsamen Präfix/Suffix: \preparecolorset{HTML}{<prefix>}{<suffix>}{red,ff0000;blue,0000ff}bereitet Farben vor <prefix>red<suffix>und <prefix>blue<suffix>.

Diese Farben könnten dann durch einen Aufruf geladen werden \providecolors{<prefix>red<suffix>,<prefix>blue<suffix>}.

Ich versuche, einen praktischen Befehl zu implementieren, um zu vermeiden, dass ich das gemeinsame Präfix und Suffix der Farben immer wieder ausschreiben muss. Die Syntax wäre \ProvideColorsFromSet{<prefix>}{<suffix>}{<list>}:

Der folgende Code, den ich für ziemlich einfach hielt, verursacht jedoch Fehler Undefined color 'my-red'und Undefined color 'my-blue'.

Ich vermute, das Problem liegt an der Erweiterung, also habe ich verschiedene Kombinationen von \exp_args:...und ausprobiert \exp_not:...(ohneWirklichIch weiß, was ich tue), aber ohne Erfolg. Ich habe auch versucht, clistin ein umzuwandeln und anstelle von seqzu verwenden , aber ohne Erfolg.\..._map_function\..._map_inline

Ich wäre für jede Hilfe sehr dankbar. Vielen Dank!

\documentclass{article}
\usepackage{xparse}
\usepackage{xcolor}
\definecolorsfalse
\preparecolorset{HTML}{my-}{}{red,ff0000;blue,0000ff}

\ExplSyntaxOn
\NewDocumentCommand { \ProvideColorsFromSet } { m m m } {
    \clist_set:Nn \l_tmpa_clist { #3 }
    % \exp_args:NNx \clist_set:Nn \l_tmpa_clist { #3 }
    % \clist_set:Nn \l_tmpa_clist { \exp_not:n #3 }
    \clist_map_inline:Nn \l_tmpa_clist { #1##1#2 }
    \tl_set:Nn \l_tmpa_tl { \clist_use:Nn \l_tmpa_clist {,} }
    \providecolors{ \tl_use:N \l_tmpa_tl }
    % \exp_args:NV \providecolors{ \l_tmpa_tl }
    % \providecolors{ \l_tmpa_tl }
    % \providecolors{ \exp_not:N \l_tmpa_tl }
    % \providecolors{ \exp_args:NV \exp_not:N \l_tmpa_tl } % hmm...
    % \exp_args:Nx \providecolors{ \l_tmpa_tl }
    % \exp_args:Nx \providecolors{ \tl_use:N \l_tmpa_tl }
}
\ExplSyntaxOff

\ProvideColorsFromSet{my-}{}{red,blue}

\begin{document}

\textcolor{my-red}{red}
\textcolor{my-blue}{blue}
    
\end{document}

Nachtrag:

Definition von\providecolorsIn xcolor:

\def\XC@preparec@lor[#1]#2[#3]#4#5%
 {\XC@sdef\@@cls{#1}\XC@edef\@@nam{#2}%
  \XC@getmodclr01{#4}{#5}{}%
   {\xdef\XC@@stack
     {\ifx\XC@@stack\@empty\else\XC@@stack,\fi{#1}{\@@nam}{#3}%
      {\ifx\@@Mod\XC@mod@ignore\@@mod\else\@@Mod\fi}{\@@clr}}}}

\let\XC@@stack\@empty

\def\XC@definecolors#1,%
 {\@ifxempty{#1}{}{\expandafter\XC@definec@lors#1=#1=:\XC@definecolors}}

\def\XC@definec@lors#1=#2=#3:%
 {\XC@edef\@@nam{#1}\XC@edef\@@arg{#2}%
  \let\next\XC@definec@l@rs\expandafter\next\XC@@stack,,\@nnil}

\def\XC@definec@l@rs#1,%
 {\ifx,#1,\let\next\remove@to@nnil\else\XC@defin@c@l@rs#1\fi\next}

\def\XC@defin@c@l@rs#1#2#3#4#5%
 {\def\@@tmp{#2}%
  \ifx\@@tmp\@@arg
    \let\xglobal@\XC@@glb\XC@@cmd[#1]{\@@nam}[#3]{#4}{#5}%
    \let\next\remove@to@nnil
  \fi}

\def\providecolors#1%
 {\let\XC@@cmd\providecolor\let\XC@@glb\xglobal@
  \expandafter\XC@definecolors#1,,}

Antwort1

clistSie möchten aus dem angegebenen dritten Argument ein erstellen, in dem jedes Element mit dem durch das erste und zweite Argument angegebenen Präfix und Suffix versehen ist, und dann die Liste an übergeben \providecolors.

\documentclass{article}
%\usepackage{xparse}% no longer needed
\usepackage{xcolor}
\definecolorsfalse
\preparecolorset{HTML}{my-}{}{red,ff0000;blue,0000ff}

\ExplSyntaxOn
\NewDocumentCommand { \ProvideColorsFromSet } { m m m }
  {
    \clist_clear:N \l_tmpa_clist
    \clist_map_inline:nn { #3 }
      {
        \clist_put_right:Nn \l_tmpa_clist { #1##1#2 }
      }
    \exp_args:NV \providecolors \l_tmpa_clist
  }
\ExplSyntaxOff

\ProvideColorsFromSet{my-}{}{red,blue}

\begin{document}

\textcolor{my-red}{red}
\textcolor{my-blue}{blue}
    
\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen