diff options
author | Karl Berry <karl@freefriends.org> | 2020-06-20 20:40:11 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2020-06-20 20:40:11 +0000 |
commit | 542262014b6cc6afc0abc938c970167885bd6f13 (patch) | |
tree | e6ee181a15f03b58c89429840cff3326e8671595 /Master/texmf-dist/tex/generic/namedef | |
parent | 52754e17bbd32c1dc6bd13621df8bc3149abe864 (diff) |
namedef (20jun20)
git-svn-id: svn://tug.org/texlive/trunk@55606 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/generic/namedef')
-rw-r--r-- | Master/texmf-dist/tex/generic/namedef/namedef.sty | 406 |
1 files changed, 406 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/generic/namedef/namedef.sty b/Master/texmf-dist/tex/generic/namedef/namedef.sty new file mode 100644 index 00000000000..9804b80aaa4 --- /dev/null +++ b/Master/texmf-dist/tex/generic/namedef/namedef.sty @@ -0,0 +1,406 @@ +%% +%% This is file `namedef.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% namedef.dtx (with options: `package') +%% +%% This is a generated file. +%% +%% Copyright 2019--2020 Phelype Oleinik /phelype.oleinik@latex-project.org/ +%% +%% This work may be distributed and/or modified under the conditions of the +%% LaTeX Project Public License, either version 1.3c of this license or (at +%% your option) any later version. The latest version of this license is in +%% +%% http://www.latex-project.org/lppl.txt +%% +%% and version 1.3c or later is part of all distributions of LaTeX version +%% 2005/12/01 or later. +%% +\def\namedefDate{2020-06-20} +\def\namedefVersion{1.0} +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname RequirePackage\endcsname\relax + \input expl3-generic.tex +\else + \RequirePackage{expl3}[2018-05-15] +\fi +\ExplSyntaxOn +\cs_if_exist:NTF \ProvidesExplPackage + { + \cs_new_eq:NN \__namedef_end_package_hook: \prg_do_nothing: + \ExplSyntaxOff + \ProvidesExplPackage + } + { + \cs_new_eq:NN \__namedef_end_package_hook: \ExplSyntaxOff + \group_begin: + \ExplSyntaxOff + \cs_set_protected:Npn \__namedef_tmp:w #1#2#3#4 + { + \group_end: + \tl_gset:cx { ver @ #1 . sty } { #2 ~ v#3 ~ #4 } + \cs_if_exist_use:NF \wlog { \iow_log:x } + { Package: ~ #1 ~ #2 ~ v#3 ~ #4 } + } + \__namedef_tmp:w + } + {namedef} {\namedefDate} {\namedefVersion} + {Named parameters in TeX definitions (PHO)} +\flag_new:n { __namedef_parm_count } +\tl_const:Nn \c__namedef_prefix_tl { namedef~parm~-> } +\tl_new:N \l__namedef_macro_tl +\quark_new:N \q__namedef_mark +\quark_new:N \q__namedef_stop +\scan_new:N \s__namedef +\cs_new:Npn \__namedef_skip_to_scan_mark:w #1 \s__namedef { } +\cs_new:Npn \__namedef_skip_to_scan_mark:nw #1 #2 \s__namedef {#1} +\cs_new_eq:NN \__namedef_tmp:w ? +\cs_new_protected:Npn \named { \__namedef_grab_prefix:nN { } } +\cs_new_protected:Npn \__namedef_grab_prefix:nN #1 #2 + { + \__namedef_if_prefix:NTF #2 + { \__namedef_grab_prefix:nN } + { \__namedef_detect_prefixes:Nn \__namedef_kill_outer:nN } + { #1#2 } + } +\prg_new_conditional:Npnn \__namedef_if_prefix:N #1 { TF } + { + \if_int_compare:w 0 + \if_meaning:w \tex_protected:D #1 1 \fi: + \if_meaning:w \tex_global:D #1 1 \fi: + \if_meaning:w \tex_outer:D #1 1 \fi: + \if_meaning:w \tex_long:D #1 1 \fi: + \if_meaning:w \scan_stop: #1 1 \fi: + = 1 \exp_stop_f: + \prg_return_true: + \else: + \prg_return_false: + \fi: + } +\cs_new_protected:Npn \__namedef_detect_prefixes:Nn #1 #2 + { + \cs_set_nopar:Npn \__namedef_tmp:w { } + \use:x + { + \exp_not:N #1 + { + \exp_after:wN \exp_after:wN + \exp_after:wN \__namedef_extract_prefixes:w + \exp_after:wN \token_to_meaning:N + \cs:w __namedef_tmp:w \cs_end: \s__namedef + \exp_not:n {#2} + } + } + } +\use:x + { + \cs_new:Npn \exp_not:N \__namedef_extract_prefixes:w ##1 + \tl_to_str:n { macro: } ##2 \s__namedef + { + \exp_not:N \__namedef_extract_protected:n {##1} + \exp_not:N \__namedef_extract_long:n {##1} + \exp_not:N \__namedef_extract_outer:n {##1} + } + } +\cs_set_protected:Npn \__namedef_tmp:w #1 #2 + { + \use:x + { + \cs_new:cpn { __namedef_extract_#1:n } ####1 + { + \exp_not:c { __namedef_extract_#1_aux:w } ####1 + \token_to_str:N #2 \scan_stop: \token_to_str:N #2 \s__namedef + } + \cs_new:cpn { __namedef_extract_#1_aux:w } ####1 + \token_to_str:N #2 ####2 \token_to_str:N #2 ####3 \s__namedef + { + \exp_not:N \if_meaning:w \scan_stop: ####2 + \exp_not:N \else: + \exp_not:c { tex_#1:D } + \exp_not:N \fi: + } + } + } +\__namedef_tmp:w { protected } { \protected } +\__namedef_tmp:w { long } { \long } +\__namedef_tmp:w { outer } { \outer } +\cs_new_protected:Npn \__namedef_kill_outer:nN #1 + { + \cs_set:Npn \__namedef_tmp:w { \__namedef_start:nNp {#1} } + \exp_after:wN \__namedef_tmp:w \exp_not:N + } +\cs_new_protected:Npn \__namedef_start:nNp #1 #2 #3 # + { + \group_begin: + \int_set:Nn \tex_escapechar:D { `\\ } + \exp_after:wN \cs_set_eq:NN \exp_not:N #2 \scan_stop: + \__namedef_replace_named:nNnn {#1} #2 {#3} + } +\cs_new_protected:Npn \__namedef_replace_named:nNnn #1 #2 #3 #4 + { + \tl_set:Nx \l__namedef_macro_tl { \token_to_str:N #2 } + \__namedef_replace_parameter:Nn \__namedef_in_parameter:nN {#3} + \__namedef_replace_parameter:Nn \__namedef_in_replacement:nN {#4} + \__namedef_define:nnnN {#1} #2 + \s__namedef + } +\cs_new_protected:Npn \__namedef_define:nnnN #1 #2 #3 #4 + { + \group_end: + #3#4#2{#1} + } +\cs_new_protected:Npn \__namedef_replace_parameter:Nn #1 #2 + { + \cs_set_eq:NN \__namedef_handle_parameter:nN #1 + \__namedef_replace_parm:Nn \__namedef_parameter_output:nnw {#2} + } +\cs_new_eq:NN \__namedef_handle_parameter:nN ? +\cs_new_protected:Npn \__namedef_parameter_output:nnw #1 #2 + #3 \__namedef_define:nnnN + { #2 #3 \__namedef_define:nnnN {#1} } +\cs_new:Npn \__namedef_in_parameter:nN #1 + { + \if_cs_exist:w \c__namedef_prefix_tl #1 \cs_end: + \exp_after:wN \use_i:nn + \else: + \exp_after:wN \use_ii:nn + \fi: + { \msg_expandable_error:nnn { namedef } { repeated-parm } {#1} } + { + \exp_after:wN \use_none:n \cs:w \c__namedef_prefix_tl #1 \cs_end: + \flag_raise:n { __namedef_parm_count } + } + \exp_args:Nf \__namedef_append_output:nnNwnn + { \flag_height:n { __namedef_parm_count } } + {#1} + } +\cs_new:Npn \__namedef_in_replacement:nN #1 #2 + { + \cs_if_exist:cTF { \c__namedef_prefix_tl #1 } + { + \exp_args:Nf \__namedef_append_output:nnNwnn + { \use:c { \c__namedef_prefix_tl #1 } } + { } + } + { + \msg_expandable_error:nnn { namedef } { unknown-parm } {#1} + \exp_args:Ne \__namedef_append_output:nnNwnn + { #2 \__namedef_begin_name_token: #1 \__namedef_end_name_token: } + { \cs_end: { } \use_none:nn } + } + #2 + } +\cs_new:Npn \__namedef_replace_parm:Nn #1 #2 + { + \exp_after:wN #1 + \exp:w + \__namedef_replace_loop:w #2 + \q__namedef_mark \q__namedef_stop { } { } + } +\cs_new:Npn \__namedef_replace_loop:w #1 \q__namedef_stop + { + \tl_if_head_is_N_type:nTF {#1} + { \__namedef_replace_normal:N } + { + \tl_if_head_is_group:nTF {#1} + { \__namedef_replace_group:n } + { \__namedef_replace_space:w } + } + #1 \q__namedef_stop + } +\cs_new:Npn \__namedef_replace_end:wnn \q__namedef_stop #1 #2 + { \exp_end: {#1} {#2} } +\cs_new:Npn \__namedef_flush:nw #1 + #2 \q__namedef_stop #3 #4 + { \__namedef_replace_loop:w #2 \q__namedef_stop { #3 #1 } {#4} } +\cs_new:Npn \__namedef_append_output:nnNwnn #1 #2 #3 + #4 \q__namedef_stop #5 #6 + { + \__namedef_replace_loop:w #4 \q__namedef_stop + { #5 #3#1 } + { #6 \cs_set:cpn { \c__namedef_prefix_tl #2 } {#1} } + } +\cs_new:Npn \__namedef_abort_definition:w + #1 \q__namedef_stop #2 #3 + { + \__namedef_replace_loop:w #1 \q__namedef_stop + {#2} { #3 \group_end: \__namedef_skip_to_scan_mark:w } + } +\cs_new:Npn \__namedef_replace_normal:N #1 + { + \token_if_eq_meaning:NNTF \q__namedef_mark #1 + { \__namedef_replace_end:wnn } + { + \token_if_parameter:NTF #1 + { \__namedef_grab_parm:Nw } + { \__namedef_flush:nw } + {#1} + } + } +\cs_new:Npn \__namedef_replace_group:n #1 + { \__namedef_replace_parm:Nn \__namedef_flush_group:nnw {#1} } +\cs_new:Npn \__namedef_flush_group:nnw #1 #2 + { \__namedef_flush:nw { {#1} } } +\exp_last_unbraced:NNo +\cs_new:Npn \__namedef_replace_space:w \c_space_tl + { \__namedef_flush:nw { ~ } } +\cs_new:Npn \__namedef_grab_parm:Nw #1 #2 \q__namedef_stop + { + \tl_if_head_is_N_type:nTF {#2} + { \__namedef_grab_parm_aux:NNw } + { \__namedef_flush:nw } + #1 #2 \q__namedef_stop + } +\cs_new:Npn \__namedef_grab_parm_aux:NNw #1 #2 + { + \exp_args:No \token_if_eq_charcode:NNTF + { \__namedef_begin_name_token: } #2 + { \__namedef_grab_parm_scan:NNw } + { \__namedef_grab_parm_noop:NNw } + #1 #2 + } +\cs_new:Npn \__namedef_grab_parm_noop:NNw #1 #2 + { + \token_if_eq_meaning:NNTF \q__namedef_mark #2 + { \__namedef_flush:nw { #1 } #2 } + { \__namedef_flush:nw { #1 #2 } } + } +\cs_new:Npn \__namedef_grab_parm_scan:NNw #1 #2 #3 \q__namedef_stop + { \__namedef_grab_parm_loop:nw { } #3 \q__namedef_stop {#1} } +\cs_new:Npn \__namedef_grab_parm_loop:nw #1 #2 \q__namedef_stop + { + \tl_if_head_is_N_type:nTF {#2} + { \__namedef_parm_get_normal:nN } + { + \tl_if_head_is_group:nTF {#2} + { \__namedef_parm_get_group:nn } + { \__namedef_parm_get_space:nw } + } + {#1} #2 \q__namedef_stop + } +\cs_new:Npn \__namedef_parm_get_normal:nN #1 #2 + { + \token_if_eq_meaning:NNTF \q__namedef_mark #2 + { + \msg_expandable_error:nn { namedef } { missing-end } + \__namedef_grab_parm_end:nw {#1} #2 + } + { + \exp_args:No \token_if_eq_charcode:NNTF + { \__namedef_end_name_token: } #2 + { \__namedef_grab_parm_end:nw {#1} } + { \__namedef_grab_parm_loop:nw {#1#2} } + } + } +\cs_new:Npn \__namedef_parm_get_group:nn #1 #2 + { \__namedef_grab_parm_loop:nw { #1{#2} } } +\cs_new:Npn \__namedef_parm_get_space:nw #1 ~ + { \__namedef_grab_parm_loop:nw { #1~ } } +\cs_new:Npn \__namedef_grab_parm_end:nw #1 #2 \q__namedef_stop #3 + { \__namedef_handle_parameter:nN {#1} #3 #2 \q__namedef_stop } +\cs_new:Npn \__namedef_begin_name_token: { [ } +\cs_new:Npn \__namedef_end_name_token: { ] } +\cs_new_protected:Npn \NamedDelim + { \__namedef_named_delim_set:Nnn \cs_set:Npn } +\cs_new_protected:Npn \globalNamedDelim + { \__namedef_named_delim_set:Nnn \cs_gset:Npn } +\named \cs_new_protected:Npn \__namedef_named_delim_set:Nnn + #[def] #[begin] #[end] + { + \tl_trim_spaces_apply:nN {#[begin]} \__namedef_check_delimiter:n + \tl_trim_spaces_apply:nN {#[end]} \__namedef_check_delimiter:n + #[def] \__namedef_begin_name_token: {#[begin]} + #[def] \__namedef_end_name_token: {#[end]} + \s__namedef + } +\named \cs_new_protected:Npn \__namedef_check_delimiter:n #[token] + { + \tl_if_empty:nT {#[token]} + { + \msg_error:nn { namedef } { blank-delim } + \__namedef_skip_to_scan_mark:w + } + \tl_if_single_token:nF {#[token]} + { + \msg_error:nnn { namedef } { multi-token-delim } {#[token]} + \__namedef_skip_to_scan_mark:w + } + \bool_lazy_or:nnT + { \token_if_group_begin_p:N #[token] } + { \token_if_group_end_p:N #[token] } + { + \msg_error:nnx { namedef } { group-delim } + { \cs_to_str:N #[token] } + \__namedef_skip_to_scan_mark:w + } + \token_if_parameter:NT #[token] + { + \msg_error:nnx { namedef } { param-delim } + { \cs_to_str:N #[token] } + \__namedef_skip_to_scan_mark:w + } + \token_if_cs:NT #[token] + { + \msg_error:nnx { namedef } { macro-delim } + { \c_backslash_str \cs_to_str:N #[token] } + \__namedef_skip_to_scan_mark:w + } + } +\msg_new:nnn { namedef } { repeated-parm } + { + Parameter~\iow_char:N\#[#1]~duplicated~in~ + definition~of~\l__namedef_macro_tl. + } +\msg_new:nnn { namedef } { unknown-parm } + { + Unknown~parameter~\iow_char:N\#[#1]~in~ + definition~of~\l__namedef_macro_tl. + } +\msg_new:nnn { namedef } { multi-token-delim } + { + Invalid~\iow_char:N\\named~parameter~delimiter~`#1'.~ + Delimiters~for~named~parameters~must~be~single~tokens. + } +\msg_new:nnn { namedef } { macro-delim } + { + Invalid~\iow_char:N\\named~parameter~delimiter~`#1'.~ + Delimiters~for~named~parameters~can't~be~control~sequence~nor~ + active~characters. + } +\msg_new:nnn { namedef } { group-delim } + { + Invalid~\iow_char:N\\named~parameter~delimiter~`\iow_char:N\\#1'.~ + Delimiters~for~named~parameters~can't~be~ + begin-/end-group~character~tokens. + } +\msg_new:nnn { namedef } { blank-delim } + { + Invalid~\iow_char:N\\named~parameter~delimiter.~ + Delimiters~for~named~parameters~can't~be~empty~nor~space~tokens. + } +\msg_new:nnn { namedef } { param-delim } + { + Invalid~\iow_char:N\\named~parameter~delimiter.~ + Delimiters~for~named~parameters~can't~be~parameter~tokens. + } +\msg_new:nnn { namedef } { missing-end } + { + Missing~\__namedef_end_name_token:\iow_char:N\ inserted~in~ + definition~of~\l__namedef_macro_tl. + } +\__namedef_end_package_hook: +%% +%% This work is "maintained" (as per the LPPL maintenance status) +%% by Phelype Oleinik. +%% +%% This work consists of the files namedef.dtx, and +%% namedef.ins, +%% and the derived files namedef.sty, +%% namedef.pdf, +%% README.md, and +%% README.txt. +%% +%% End of file `namedef.sty'. |