该包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}