Expl3: 목록에 대한 매핑 확장

Expl3: 목록에 대한 매핑 확장

패키지는 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}

부록:

의 정의\providecolors안에 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,,}

답변1

clist모든 항목이 첫 번째 및 두 번째 인수에 표시된 대로 접두사와 접미사가 붙는 지정된 세 번째 인수에서 을 빌드한 다음 목록을 에 전달하려고 합니다 \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}

여기에 이미지 설명을 입력하세요

관련 정보