Das Paket xcolor
kann 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, clist
in ein umzuwandeln und anstelle von seq
zu 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\providecolors
In 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
clist
Sie 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}