summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty')
-rw-r--r--Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty336
1 files changed, 269 insertions, 67 deletions
diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty b/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty
index 5020a57c4dd..3a81714bff8 100644
--- a/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty
+++ b/Master/texmf-dist/tex/latex/l3experimental/l3color/l3color.sty
@@ -20,30 +20,24 @@
%%
%% File: l3color.dtx
\RequirePackage{expl3}
-\ProvidesExplPackage{l3color}{2020-06-18}{}
+\ProvidesExplPackage{l3color}{2020-07-17}{}
{L3 Experimental color support}
\tl_new:N \l__color_internal_tl
\scan_new:N \s__color_mark
\prg_new_conditional:Npnn \__color_if_defined:n #1 { T, F, TF }
{
- \tl_if_exist:cTF { l__color_named_ #1 _tl }
+ \prop_if_exist:cTF { l__color_named_ #1 _prop }
\prg_return_true:
\prg_return_false:
}
+\cs_new:Npn \__color_model:N #1 { \exp_after:wN \use_i:nn #1 }
+\cs_new:Npn \__color_values:N #1 { \exp_after:wN \use_ii:nn #1 }
\cs_new_protected:Npn \__color_extract:nNN #1#2#3
{
- \exp_after:wN \exp_after:wN \exp_after:wN
- \__color_extract:NNnn
- \exp_after:wN \exp_after:wN \exp_after:wN #2
- \exp_after:wN \exp_after:wN \exp_after:wN #3
- \cs:w l__color_named_ #1 _tl \cs_end:
+ \tl_set_eq:Nc #2 { l__color_named_ #1 _tl }
+ \prop_get:cVN { l__color_named_ #1 _prop } #2 #3
}
\cs_generate_variant:Nn \__color_extract:nNN { V }
-\cs_new_protected:Npn \__color_extract:NNnn #1#2#3#4
- {
- \tl_set:Nn #1 {#3}
- \tl_set:Nn #2 {#4}
- }
\cs_new_protected:Npn \__color_convert:nnN #1#2#3
{ \__color_convert:nnVN {#1} {#2} #3 #3 }
\cs_generate_variant:Nn \__color_convert:nnN { VV }
@@ -54,7 +48,7 @@
\tl_set:Nx #4
{ \use:c { __color_convert_ #1 _ #2 :w } #3 ~ 0 ~ 0 ~ 0 \s__color_stop }
}
-\cs_generate_variant:Nn \__color_convert:nnnN { nnV }
+\cs_generate_variant:Nn \__color_convert:nnnN { nV , nnV }
\cs_new:Npn \__color_convert_gray_rgb:w #1 ~ #2 \s__color_stop
{ #1 ~ #1 ~ #1 }
\cs_new:Npn \__color_convert_gray_cmyk:w #1 ~ #2 \s__color_stop
@@ -85,30 +79,61 @@
\tl_new:N \l__color_value_tl
\tl_new:N \l__color_next_model_tl
\tl_new:N \l__color_next_value_tl
-\cs_new_protected:Npn \color_parse:nN #1#2
+\cs_new_protected:Npx \__color_parse:nN #1#2
{
- \__color_backend_pickup:N \l__color_current_tl
- \tl_set_eq:cN { l__color_named_ . _tl } \l__color_current_tl
- \exp_args:Ne \__color_parse:nN { \tl_to_str:n {#1} } #2
+ \exp_not:N \__color_backend_pickup:N \exp_not:N \l__color_current_tl
+ \tl_set:Nx \exp_not:c { l__color_named_ . _tl }
+ { \exp_not:N \__color_model:N \exp_not:N \l__color_current_tl }
+ \prop_put:NVx \exp_not:c { l__color_named_ . _prop }
+ \exp_not:c { l__color_named_ . _tl }
+ { \exp_not:N \__color_values:N \exp_not:N \l__color_current_tl }
+ \exp_not:N \exp_args:Ne \exp_not:N \__color_parse_aux:nN
+ { \exp_not:N \tl_to_str:n {#1} } #2
}
-\cs_new_protected:Npn \__color_parse:nN #1#2
+\cs_new_protected:Npn \__color_parse_aux:nN #1#2
{
- \tl_if_exist:cTF { l__color_named_ #1 _tl }
- { \tl_set_eq:Nc #2 { l__color_named_ #1 _tl } }
+ \tl_if_exist:cTF { l__color_named_ #1 _prop }
+ { \__color_parse_set_eq:Nn #2 {#1} }
{ \__color_parse:Nw #2#1 ! \s__color_stop }
\__color_check_model:N #2
}
+\cs_new_protected:Npn \__color_parse_set_eq:Nn #1#2
+ {
+ \tl_if_empty:NTF \l_color_fixed_model_tl
+ { \exp_args:Nv \__color_parse_set_eq:nNn { l__color_named_ #2 _tl } }
+ { \exp_args:NV \__color_parse_set_eq:nNn \l_color_fixed_model_tl }
+ #1 {#2}
+ }
+\cs_new_protected:Npn \__color_parse_set_eq:nNn #1#2#3
+ {
+ \prop_get:cnNTF
+ { l__color_named_ #3 _prop } {#1}
+ \l__color_value_tl
+ { \tl_set:Nx #2 { {#1} { \l__color_value_tl } } }
+ {
+ \tl_set_eq:Nc \l__color_model_tl { l__color_named_ #3 _tl }
+ \prop_get:cVN { l__color_named_ #3 _prop } \l__color_model_tl
+ \l__color_value_tl
+ \__color_convert:nnN
+ \l__color_model_tl {#1} \l__color_value_tl
+ \tl_set:Nx #2
+ {
+ {#1}
+ { \l__color_value_tl }
+ }
+ }
+ }
\cs_new_protected:Npn \__color_parse:Nw #1#2 ! #3 \s__color_stop
{
\__color_if_defined:nTF {#2}
{
\tl_if_blank:nTF {#3}
- { \tl_set_eq:Nc #1 { l__color_named_ #2 _tl } }
+ { \__color_parse_set_eq:Nn #1 {#2} }
{ \__color_parse_loop_init:Nnn #1 {#2} {#3} }
}
{
\__kernel_msg_error:nnn { color } { unknown-color } {#2}
- \tl_set_eq:NN \l__color_current_tl \l__color_named_black_tl
+ \tl_set:Nn \l__color_current_tl { { gray } { 0 } }
}
}
\cs_new_protected:Npn \__color_parse_loop_init:Nnn #1#2#3
@@ -153,24 +178,9 @@
\__color_extract:nNN {#2} \l__color_next_model_tl \l__color_next_value_tl
\tl_if_eq:NNF \l__color_model_tl \l__color_next_model_tl
{
- \str_if_eq:VnT \l__color_model_tl { gray }
- {
- \use:x
- {
- \tl_set:Nn \exp_not:N \l__color_model_tl
- { \l__color_next_model_tl }
- \tl_set:Nn \exp_not:N \l__color_value_tl
- { \l__color_next_value_tl }
- \tl_set:Nn \exp_not:N \l_next__color_model_tl
- { \l__color_model_tl }
- \tl_set:Nn \exp_not:N \l_next__color_value_tl
- { \l__color_value_tl }
- }
- }
- \__color_convert:VVN
- \l__color_next_model_tl
- \l__color_model_tl
- \l__color_next_value_tl
+ \str_if_eq:VnTF \l__color_model_tl { gray }
+ { \__color_parse_gray:n {#2} }
+ { \__color_parse_std:n {#2} }
}
\tl_set:Nx \l__color_value_tl
{
@@ -184,6 +194,27 @@
\__color_parse_break:w
}
}
+\cs_new_protected:Npn \__color_parse_gray:n #1
+ {
+ \tl_set_eq:NN \l__color_model_tl \l__color_next_model_tl
+ \tl_set:Nn \l__color_next_model_tl { gray }
+ \exp_args:NnV \__color_convert:nnN { gray } \l__color_model_tl
+ \l__color_value_tl
+ \prop_get:cVN { l__color_named_ #1 _prop } \l__color_model_tl
+ \l__color_next_value_tl
+ }
+\cs_new_protected:Npn \__color_parse_std:n #1
+ {
+ \prop_get:cVNF { l__color_named_ #1 _prop }
+ \l__color_model_tl
+ \l__color_next_value_tl
+ {
+ \__color_convert:VVN
+ \l__color_next_model_tl
+ \l__color_model_tl
+ \l__color_next_value_tl
+ }
+ }
\cs_new_protected:Npn \__color_parse_break:w #1 \__color_parse_end: { }
\cs_new_protected:Npn \__color_parse_end: { }
\cs_new:Npn \__color_parse_mix:Nnnn #1#2#3#4
@@ -334,60 +365,148 @@
\tl_set:Nn \l__color_model_tl {#1}
\tl_set:Nn \l__color_value_tl {#2}
}
-\cs_new_protected:Npn \__color_select:
+\cs_new_protected:Npx \__color_select:
{
- \tl_set_eq:cN { l__color_named_ . _tl } \l__color_current_tl
- \__color_select:N \l__color_current_tl
+ \tl_set:Nx \exp_not:c { l__color_named_ . _tl }
+ { \exp_not:N \__color_model:N \exp_not:N \l__color_current_tl }
+ \prop_clear:N \exp_not:c { l__color_named_ . _prop }
+ \prop_put:NVx \exp_not:c { l__color_named_ . _prop }
+ \exp_not:c { l__color_named_ . _tl }
+ { \exp_not:N \__color_values:N \exp_not:N \l__color_current_tl }
+ \__color_select:N \exp_not:N \l__color_current_tl
}
\cs_new_protected:Npn \color_select:n #1
{
- \color_parse:nN {#1} \l__color_current_tl
+ \__color_parse:nN {#1} \l__color_current_tl
\__color_select:
}
\cs_new_protected:Npn \color_select:nn #1#2
{
- \__color_direct:nnN {#1} {#2} \l__color_current_tl
+ \__color_select_main:Nw \l__color_current_tl
+ #1 / / \s__color_mark #2 / / \s__color_stop
\__color_select:
}
-\cs_new_protected:Npn \__color_direct:nnN #1#2#3
+\cs_new_protected:Npn \__color_select_main:Nw
+ #1 #2 / #3 / #4 \s__color_mark #5 / #6 / #7 \s__color_stop
+ {
+ \__color_select:nnN {#2} {#5} #1
+ \bool_lazy_or:nnF
+ { \tl_if_empty_p:N \l_color_fixed_model_tl }
+ { \str_if_eq_p:nV {#2} \l_color_fixed_model_tl }
+ { \__color_select_loop:Nw #1 #3 / #4 \s__color_mark #6 / #7 \s__color_stop }
+ }
+\cs_new_protected:Npn \__color_select_loop:Nw
+ #1 #2 / #3 \s__color_mark #4 / #5 \s__color_stop
+ {
+ \str_if_eq:nVTF {#2} \l_color_fixed_model_tl
+ { \__color_select:nnN {#2} {#4} #1 }
+ {
+ \tl_if_blank:nTF {#2}
+ { \exp_after:wN \__color_select_swap:Nnn \exp_after:wN #1 #1 }
+ { \__color_select_loop:Nw #1 #3 \s__color_mark #5 \s__color_stop }
+ }
+ }
+\cs_new_protected:Npn \__color_select:nnN #1#2#3
{
\cs_if_exist:cTF { __color_parse_model_ #1 :w }
{
\tl_set:Nx #3
{ \use:c { __color_parse_model_ #1 :w } #2 , 0 , 0 , 0 , 0 \s__color_stop }
- \__color_check_model:N #3
- }
- {
- \__kernel_msg_error:nnn { color } { unknown-model } {#1}
}
+ { \__kernel_msg_error:nnn { color } { unknown-model } {#1} }
+ }
+\cs_new_protected:Npn \__color_select_swap:Nnn #1#2#3
+ {
+ \__color_convert:nVnN {#2} \l_color_fixed_model_tl {#3} \l__color_value_tl
+ \tl_set:Nx #1
+ { { \l_color_fixed_model_tl } { \l__color_value_tl } }
}
\tl_new:N \l__color_named_tl
-\cs_new_protected:Npn \__color_store:Nn #1#2
+\cs_new_protected:Npn \color_set:nn #1#2
+ {
+ \exp_args:NV \__color_set:nnn
+ \l_color_fixed_model_tl {#1} {#2}
+ }
+\cs_new_protected:Npn \__color_set:nnn #1#2#3
{
- \str_if_eq:nnF {#2} { . }
+ \tl_clear:N \l_color_fixed_model_tl
+ \__color_set:nn {#2} {#3}
+ \tl_set:Nn \l_color_fixed_model_tl {#1}
+ }
+\cs_new_protected:Npn \__color_set:nn #1#2
+ {
+ \str_if_eq:nnF {#1} { . }
{
- \tl_clear_new:c { l__color_named_ #2 _tl }
- \tl_set_eq:cN { l__color_named_ #2 _tl } #1
+ \__color_parse:nN {#2} \l__color_named_tl
+ \tl_clear_new:c { l__color_named_ #1 _tl }
+ \tl_set:cx { l__color_named_ #1 _tl }
+ { \__color_model:N \l__color_named_tl }
+ \prop_clear_new:c { l__color_named_ #1 _prop }
+ \prop_put:cvx { l__color_named_ #1 _prop } { l__color_named_ #1 _tl }
+ { \__color_values:N \l__color_named_tl }
+ \__color_set:nnw {#1} {#2} #2 ! \s__color_stop
}
}
-\cs_new_protected:Npn \color_set:nn #1#2
+\cs_new_protected:Npn \__color_set:nnw #1#2#3 ! #4 \s__color_stop
{
- \color_parse:nN {#2} \l__color_named_tl
- \__color_store:Nn \l__color_named_tl {#1}
+ \clist_map_inline:nn { cmyk , gray , rgb }
+ {
+ \prop_get:cnNT { l__color_named_ #3 _prop } {##1} \l__color_internal_tl
+ {
+ \prop_if_in:cnF { l__color_named_ #1 _prop } {##1}
+ {
+ \group_begin:
+ \tl_set:cn { l__color_named_ #3 _tl } {##1}
+ \__color_parse:nN {#2} \l__color_internal_tl
+ \exp_args:NNNV \group_end:
+ \tl_set:Nn \l__color_internal_tl \l__color_internal_tl
+ \prop_put:cxx { l__color_named_ #1 _prop }
+ { \__color_model:N \l__color_internal_tl }
+ { \__color_values:N \l__color_internal_tl }
+ }
+ }
+ }
}
\cs_new_protected:Npn \color_set:nnn #1#2#3
{
- \__color_direct:nnN {#2} {#3} \l__color_named_tl
- \__color_store:Nn \l__color_named_tl {#1}
+ \str_if_eq:nnF {#1} { . }
+ {
+ \tl_clear_new:c { l__color_named_ #1 _tl }
+ \prop_clear_new:c { l__color_named_ #1 _prop }
+ \__color_set_loop:nw {#1} #2 / / \s__color_mark #3 / / \s__color_stop
+ }
+ }
+\cs_new_protected:Npn \__color_set_loop:nw
+ #1#2 / #3 \s__color_mark #4 / #5 \s__color_stop
+ {
+ \tl_if_blank:nF {#2}
+ {
+ \__color_select:nnN {#2} {#4} \l__color_named_tl
+ \tl_set:Nx \l__color_internal_tl { \__color_model:N \l__color_named_tl }
+ \tl_if_empty:cT { l__color_named_ #1 _tl }
+ { \tl_set_eq:cN { l__color_named_ #1 _tl } \l__color_internal_tl }
+ \prop_put:cVx { l__color_named_ #1 _prop } \l__color_internal_tl
+ { \__color_values:N \l__color_named_tl }
+ \__color_set_loop:nw {#1} #3 \s__color_mark #5 \s__color_stop
+ }
}
\cs_new_protected:Npn \color_set_eq:nn #1#2
{
\__color_if_defined:nTF {#2}
{
\tl_clear_new:c { l__color_named_ #1 _tl }
+ \prop_clear_new:c { l__color_named_ #1 _prop }
\str_if_eq:nnTF {#2} { . }
- { \tl_set_eq:cN { l__color_named_ #1 _tl } \l__color_current_tl }
- { \tl_set_eq:cc { l__color_named_ #1 _tl } { l__color_named_ #2 _tl } }
+ {
+ \tl_set:cx { l__color_named_ #1 _tl }
+ { \__color_model:N \l__color_current_tl }
+ \prop_put:cvx { l__color_named_ #1 _prop } { l__color_named_ #1 _tl }
+ { \__color_values:N \l__color_current_tl }
+ }
+ {
+ \tl_set_eq:cc { l__color_named_ #1 _tl } { l__color_named_ #2 _tl }
+ \prop_set_eq:cc { l__color_named_ #1 _prop } { l__color_named_ #2 _prop }
+ }
}
{
\__kernel_msg_error:nnn { color } { unknown-color } {#2}
@@ -401,24 +520,101 @@
\color_set:nnn { red } { rgb } { 1 , 0 , 0 }
\color_set:nnn { green } { rgb } { 0 , 1 , 0 }
\color_set:nnn { blue } { rgb } { 0 , 0 , 1 }
+\prop_new:c { l__color_named_._prop }
\tl_new:c { l__color_named_._tl }
-\tl_set_eq:cN { l__color_named_._tl } \l__color_current_tl
+\tl_set:cx { l__color_named_._tl } { \__color_model:N \l__color_current_tl }
+\cs_new_protected:Npn \color_export:nnN #1#2#3
+ {
+ \group_begin:
+ \tl_if_exist:cT { c__color_export_ #2 _tl }
+ { \tl_set_eq:Nc \l_color_fixed_model_tl { c__color_export_ #2 _tl } }
+ \__color_parse:nN {#1} #3
+ \__color_export:nN {#2} #3
+ \exp_args:NNNV \group_end:
+ \tl_set:Nn #3 #3
+ }
+\cs_new_protected:Npn \color_export:nnnN #1#2#3#4
+ {
+ \__color_select_main:Nw #4
+ #1 / / \s__color_mark #2 / / \s__color_stop
+ \__color_export:nN {#3} #4
+ }
+\cs_new_protected:Npn \__color_export:nN #1#2
+ { \exp_after:wN \__color_export:nnnN #2 {#1} #2 }
+\cs_new:Npn \__color_export:nnnN #1#2#3#4
+ {
+ \cs_if_exist_use:cF { __color_export_format_ #3 :nnN }
+ {
+ \__kernel_msg_error:nnn { color } { unknown-export-format } {#3}
+ \use_none:nnn
+ }
+ {#1} {#2} #4
+ }
+\cs_new_protected:Npn \__color_export_format_backend:nnN #1#2#3
+ { \tl_set:Nn #3 { {#1} {#2} } }
+\cs_new_protected:Npn \__color_export:nnnNN #1#2#3#4#5
+ {
+ \str_if_eq:nnTF {#2} {#1}
+ { #5 #4 #3 \s__color_stop }
+ {
+ \__color_convert:nnnN {#2} {#1} {#3} #4
+ \exp_after:wN #5 \exp_after:wN #4
+ #4 \s__color_stop
+ }
+ }
+\tl_const:Nn \c__color_export_HTML_tl { rgb }
+\tl_const:cn { c__color_export_space-sep-cmyk_tl } { cmyk }
+\tl_const:cn { c__color_export_space-sep-rgb_tl } { rgb }
+\cs_new_protected:cpx { __color_export_format_space-sep-cmyk:nnN } #1#2#3
+ {
+ \exp_not:N \__color_export:nnnNN { cmyk } {#1} {#2} #3
+ \exp_not:c { __color_export_space-sep-cmyk:Nw }
+ }
+\cs_new_protected:cpn { __color_export_space-sep-cmyk:Nw } #1#2 \s__color_stop
+ { \tl_set:Nx #1 {#2} }
+\cs_new_protected:Npn \__color_export_format_HTML:nnN #1#2#3
+ { \__color_export:nnnNN { rgb } {#1} {#2}#3 \__color_export_HTML:Nw }
+\cs_new_protected:cpx { __color_export_format_space-sep-rgb:nnN } #1#2#3
+ {
+ \exp_not:N \__color_export:nnnNN { rgb } {#1} {#2} #3
+ \exp_not:c { __color_export_space-sep-rgb:Nw }
+ }
+\cs_new_protected:Npn \__color_export_HTML:Nw #1#2 ~ #3 ~ #4 \s__color_stop
+ {
+ \tl_set:Nx #1
+ {
+ \__color_export_HTML:n {#2}
+ \__color_export_HTML:n {#3}
+ \__color_export_HTML:n {#4}
+ }
+ }
+\cs_new:Npn \__color_export_HTML:n #1
+ {
+ \fp_compare:nNnTF {#1} = { 0 }
+ { 00 }
+ { \int_to_Hex:n { \fp_to_int:n { #1 * 255 } } }
+ }
+\cs_new_protected:cpn { __color_export_space-sep-rgb:Nw } #1#2 \s__color_stop
+ { \tl_set:Nx #1 {#2} }
\cs_new_protected:Npn \color_show:n #1
{
\msg_show:nnxxxx { LaTeX / color } { show }
{#1}
{
- \__color_if_defined:nTF {#1}
- { \exp_last_unbraced:Nv \__color_show:nn { l__color_named_ #1 _tl } }
- { }
+ \__color_if_defined:nT {#1}
+ {
+ \exp_args:Nv \__color_show:n { l__color_named_ #1 _tl }
+ \prop_map_function:cN
+ { l__color_named_ #1 _prop }
+ \msg_show_item_unbraced:nn
+ }
}
{ }
{ }
}
-\cs_new:Npn \__color_show:nn #1#2
+\cs_new:Npn \__color_show:n #1
{
\msg_show_item_unbraced:nn { model } {#1}
- \msg_show_item_unbraced:nn { value } {#2}
}
\__kernel_msg_new:nnnn { color } { unknown-color }
{ Unknown~color~'#1'. }
@@ -426,6 +622,12 @@
LaTeX~has~been~asked~to~use~a~color~named~'#1',~
but~this~has~never~been~defined.
}
+\__kernel_msg_new:nnnn { color } { unknown-export-format }
+ { Unknown~export~format~'#1'. }
+ {
+ LaTeX~has~been~asked~to~export~a~color~in~format~'#1',~
+ but~this~has~never~been~defined.
+ }
\__kernel_msg_new:nnnn { color } { unknown-model }
{ Unknown~color~model~'#1'. }
{