例3: リスト上のマッピングの展開

例3: リスト上のマッピングの展開

パッケージは、xcolor実際に必要な場合にのみロードされるように色の定義を「準備」することができ、これは、たとえば、後での の呼び出しによって示される場合があります\providecolors{<id-list>}

このパッケージには、共通のプレフィックス/サフィックスを共有する多数の色セットを定義するための便利なコマンドも含まれています。\preparecolorset{HTML}{<prefix>}{<suffix>}{red,ff0000;blue,0000ff}<prefix>red<suffix>とを準備します<prefix>blue<suffix>

これらの色は、 を呼び出すことによって読み込むことができます\providecolors{<prefix>red<suffix>,<prefix>blue<suffix>}

色の共有プレフィックスとサフィックスを繰り返し記述しなくても済むように、便利なコマンドを実装しようとしています。構文は次のようになります\ProvideColorsFromSet{<prefix>}{<suffix>}{<list>}

しかし、かなりシンプルだと思っていた以下のコードは、エラーをスローしUndefined color 'my-red'ますUndefined color 'my-blue'

問題は拡張に関係していると思うので、(なし\exp_args:...)と\exp_not:...(なし)のさまざまな組み合わせを試してみました。本当にclist自分が何をしているのかわかってはいるものの、役に立ちませんでした。を に変換したりseq\..._map_functionの代わりにを使用したりもしました\..._map_inlineが、成功しませんでした。

ご協力いただければ幸いです。ありがとうございます!

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

補遺:

定義\providecolorsxcolor

\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,,}

答え1

指定された 3 番目の引数からを構築し、clistその中の各項目に、最初の引数と 2 番目の引数で指定されたとおりに接頭辞と接尾辞を付けて、そのリストを に渡します\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}

ここに画像の説明を入力してください

関連情報