summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/xpackages/xbase/template.sty
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex/xpackages/xbase/template.sty')
-rw-r--r--Master/texmf-dist/tex/latex/xpackages/xbase/template.sty566
1 files changed, 566 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/xpackages/xbase/template.sty b/Master/texmf-dist/tex/latex/xpackages/xbase/template.sty
new file mode 100644
index 00000000000..b91b2d6715e
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/xpackages/xbase/template.sty
@@ -0,0 +1,566 @@
+%%
+%% This is file `template.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% template.dtx (with options: `package,trace')
+%%
+%% (C) Copyright The LaTeX3 Project and any individual authors
+%% listed elsewhere in this file.
+%%
+%% This is a generated file.
+%%
+%% This file was generated from file(s) of the xbase bundle.
+%% ---------------------------------------------------------
+%%
+%% This file may only be distributed together with a copy of this bundle.
+%% You may however distribute the bundle without such generated files.
+%%
+%% ======================================================================
+%%
+%% File: template.dtx (C) Copyright 1999-2001 David Carlisle, Frank Mittelbach
+%% (C) Copyright 2004-2009 Frank Mittelbach, LaTeX3 Project
+%%
+%% It may be distributed and/or modified under the conditions of the
+%% LaTeX Project Public License (LPPL), either version 1.3c of this
+%% license or (at your option) any later version. The latest version
+%% of this license is in the file
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% This file is part of the ``xbase bundle'' (The Work in LPPL)
+%% and all files in that bundle must be distributed together.
+%%
+%% The released version of this bundle is available from CTAN.
+%%
+%% -----------------------------------------------------------------------
+%%
+%% The development version of the bundle can be found at
+%%
+%% http://www.latex-project.org/cgi-bin/cvsweb.cgi/
+%%
+%% for those people who are interested.
+%%
+%%%%%%%%%%%
+%% NOTE: %%
+%%%%%%%%%%%
+%%
+%% Snapshots taken from the repository represent work in progress and may
+%% not work or may contain conflicting material! We therefore ask
+%% people _not_ to put them into distributions, archives, etc. without
+%% prior consultation with the LaTeX Project Team.
+%%
+%% -----------------------------------------------------------------------
+%%
+\RequirePackage{expl3}
+\GetIdInfo$Id: template.dtx 1461 2009-08-15 08:38:12Z joseph $
+ {template}
+\ProvidesExplPackage
+ {\filename}{\filedate}{\fileversion}{\filedescription}
+\RequirePackage{expl3}
+\RequirePackage{ldcsetup,xparse}
+\toks_new:N\l_TP_KV_assignments_toks
+\toks_new:N\l_TP_default_assignments_toks
+\cs_new_nopar:Nn \TP_declare_instance:Nnn {
+ \group_begin:
+ \TP_instdecl_generate_assignments:nn {#2}{#3}
+ \cs_gset_nopar:Npx #1 {
+ \tl_if_eq:cNTF { TP>/#2 } \c_TP_doparameterassignments_tl
+ { \toks_use:N \l_TP_KV_assignments_toks }
+ {
+ \exp_not:N \TP_push_assignments:n
+ {\toks_use:N\l_TP_KV_assignments_toks}
+ \exp_not:c {TP>/#2}
+ }
+ }
+ \group_end:}
+\cs_generate_variant:Nn \TP_declare_instance:Nnn {cnn}
+\tl_set:Nn \c_TP_doparameterassignments_tl {\DoParameterAssignments}
+\cs_new_nopar:Npn \UseTemplate #1#2#3{
+ \TP_instdecl_generate_assignments:nn {#1/#2}{#3}
+ \TP_push_assignments:
+ \use:c { TP>/#1/#2 }
+}
+\cs_new_nopar:Npn \DoParameterAssignments{
+ \exp_after:wN
+ \TP_pop_and_execute_assignments:nw
+ \toks_use:N \g_TP_assignments_stack_toks \q_stop
+}
+\cs_new_nopar:Npn \TP_pop_and_execute_assignments:nw#1#2\q_stop{
+ \toks_gset:Nn \g_TP_assignments_stack_toks {#2}
+ #1}
+\toks_new:N \g_TP_assignments_stack_toks
+\toks_gset:Nn \g_TP_assignments_stack_toks {\scan_stop:}% avoid brace loss
+\cs_new:Npn \TP_push_assignments:n#1{
+ \toks_gput_left:Nn\g_TP_assignments_stack_toks{{#1}}
+}
+\cs_new_nopar:Npn \TP_push_assignments:{
+ \toks_gset:No \g_TP_assignments_stack_toks
+ {\exp_after:wN
+ {\toks_use:N\exp_after:wN\l_TP_KV_assignments_toks\exp_after:wN}
+ \toks_use:N\g_TP_assignments_stack_toks}
+}
+\cs_new_nopar:Npn \DeclareTemplateType #1#2{
+ \tl_set:cn {TP@<#1>} {{}#2}}
+\cs_new_nopar:Nn \TP_get_csname_prefix:n {
+ <\exp_after:wN\exp_after:wN\exp_after:wN
+ \use_i:nn
+ \cs:w TP@<#1>\cs_end:>#1/
+}
+\cs_new_nopar:Nn \TP_get_arg_count:n {
+ \exp_after:wN\exp_after:wN\exp_after:wN
+ \use_ii:nn
+ \cs:w TP@<#1>\cs_end:
+}
+\cs_new:Npn\DeclareTemplate #1#2#3#4#5{
+ \cs_if_free:cTF{TP@<#1>}
+ {\undefinedtype\DeclareTemplateType{#1}#3}
+ {
+ \intexpr_compare:nNnF{#3}={\TP_get_arg_count:n{#1}}
+ { \BadArgCount }
+ }
+ \cs_set_eq:NN \KV_elt:nn \TP_templdecl_process_KV:nn
+ \cs_set_nopar:Npn \KV_default_elt:n##1{
+ \PackageError{template}{Missing~ =~ after~ ##1}\@ehd}
+ \cs_set_eq:NN\KV@elt\KV_elt:nn
+ \cs_set_eq:NN\KV@default@elt\KV_default_elt:n
+ \tl_set:Nn \l_TP_curr_name_tl {#1/#2}
+ \toks_clear:N\l_TP_default_assignments_toks
+ %\intexpr_compare:nNnTF{\char_value_catcode:n{`\ }}=\c_nine
+ %\KV_parse_picky_no_space_removal_no_sanitize:n
+ %\KV_parse_picky_space_removal_no_sanitize:n
+ \KV@parse{#4}
+ \cs_set_nopar:cpx { TPD>/\l_TP_curr_name_tl }
+ {\toks_use:N\l_TP_default_assignments_toks}
+
+ \tl_clear:c {TPR>/\l_TP_curr_name_tl}
+
+ \tl_set_eq:cN {TPO>/\l_TP_curr_name_tl}\l_TP_curr_name_tl
+ \cs_generate_from_arg_count:cNnn {TP>/\l_TP_curr_name_tl}
+ \cs_set:Npn {#3}{#5}
+}
+\cs_set:Npn \tl_set:cx {\exp_args:Nc \tl_set:Nx}
+\cs_new_nopar:Nn \TP_templdecl_process_KV:nn {%
+ \cs_set_eq:NN \TP_templdecl_add_global_or_nothing: \prg_do_nothing:
+ \bool_set_false:N\l_TP_global_assignment_bool
+ \tl_set:Nn\l_TP_currkey_tl{#1}
+ \TP_templdecl_parse_KV:N#2\q_stop}
+\cs_new_nopar:Nn \TP_templdecl_parse_KV:N {
+ \cs_if_free:cTF{TP_use_arg_type_#1:w}
+ {\PackageError{template}{Unknown~key~type~ (#1)~for~\l_TP_currkey_tl}\@eha}
+ {\use:c{TP_use_arg_type_#1:w}}
+}
+\bool_new:N \l_TP_global_assignment_bool
+\cs_new_nopar:cpn{TP_use_arg_type_+:w} {
+ \bool_set_true:N\l_TP_global_assignment_bool
+ \cs_set_nopar:Npn \TP_templdecl_add_global_or_nothing:
+ {\toks_put_right:Nn \l_TP_KV_assignments_toks {\pref_global:D} }
+ \TP_templdecl_parse_KV:N
+}
+\cs_new_nopar:Npn\TP_use_arg_type_l:w {
+ \TP_parse_optional_key_default:nw
+ {
+ \cs_set_eq:NN \TP_templdecl_add_global_or_nothing: \prg_do_nothing:
+ \bool_if:NTF \l_TP_global_assignment_bool
+ {\TP_templdecl_setup_register_key:Nn\gsetlength}
+ {\TP_templdecl_setup_register_key:Nn\setlength}
+ }
+}
+\cs_new_nopar:Npn\TP_use_arg_type_L:w {
+ \TP_parse_optional_key_default:nw
+ {\TP_templdecl_setup_fakeregister_key:NNn\setlength\l_tmpa_skip}
+}
+\cs_new_nopar:Npn\TP_use_arg_type_c:w {
+ \TP_parse_optional_key_default:nw
+ {
+ \cs_set_eq:NN\TP_templdecl_add_global_or_nothing:\prg_do_nothing:
+ \bool_if:NTF \l_TP_global_assignment_bool
+ {\TP_templdecl_setup_register_key:Nn\GSetInternalCounter}
+ {\TP_templdecl_setup_register_key:Nn\SetInternalCounter}
+ }
+}
+\cs_new_nopar:Npn\TP_use_arg_type_C:w {
+ \TP_parse_optional_key_default:nw
+ {\TP_templdecl_setup_fakeregister_key:NNn
+ \SetInternalCounter\l_tmpa_int}
+}
+\cs_new_nopar:Npn\TP_use_arg_type_n:w {
+ \TP_parse_optional_key_default:nw
+ {\TP_templdecl_setup_n_key:N}
+}
+\cs_new_nopar:Npn\TP_use_arg_type_f:w #1{
+ %\TP_templdecl_parse_f_arg:nw {#1}
+ \TP_parse_optional_key_default:nw{\TP_templdecl_setup_f_key:Nn{#1}}
+}
+\cs_new_nopar:Npn \TP_templdecl_parse_f_arg:nw#1#2{
+ \TP_parse_optional_key_default:nw{\TP_templdecl_setup_f_key:Nn{#1}{#2}}
+}
+\cs_new_nopar:Npn\TP_use_arg_type_b:w {
+ \TP_parse_optional_key_default:nw
+ {\TP_templdecl_setup_b_key:n}
+}
+\cs_new_nopar:Npn \TP_templdecl_setup_b_key:n#1{
+ \cs_set_eq:cN { if#1 } \if_true:
+ \TP_templdecl_define_key:n
+ { \TP_templdecl_eval_b_key_value:nn {#1}{##1} }
+}
+\cs_new_nopar:Npn \TP_templdecl_eval_b_key_value:nn#1#2{
+ \cs_if_free:cTF {if#2}
+ { \PackageError{template}{Bad~boolean~setting~#1=#2}\@eha }
+ { \tl_set_eq:cc {if_#1:}{if_#2:}
+ \toks_put_right:Nf \l_TP_KV_assignments_toks
+ { \tl_set_eq:cc {if_#1:}{if_#2:} }
+ }
+}
+\cs_new_nopar:Npn\TP_use_arg_type_s:w {
+ \TP_parse_optional_key_default:nw
+ {\TP_templdecl_setup_s_key:n}
+}
+\cs_new_nopar:Npn \TP_templdecl_setup_s_key:n #1 {
+ \TP_templdecl_define_key:n
+ { \TP_templdecl_eval_s_key_value:nnn{##1}#1 }
+}
+\cs_new_nopar:Npn\TP_use_arg_type_i:w #1{
+ \TP_parse_optional_key_default:nw{\TP_templdecl_setup_i_key:nnn{#1}}
+}
+\cs_new_nopar:Npn \TP_templdecl_setup_i_key:nnn#1#2{
+ \TP_templdecl_define_key:n
+ {
+ \TP_templdecl_eval_i_key_value:Nnn #2 {#1}{##1}
+ }
+}
+\cs_new_nopar:Npn \TP_templdecl_eval_i_key_value:Nnn #1#2#3 {
+ \tl_if_head_eq_meaning:nNTF {#3.}\UseTemplate
+ {
+ \iow_term:x{\token_to_str:N\UseTemplate\space seen}
+ {\TP_templdecl_declare_tmp_instance:nnnn #3 }
+ \toks_put_right:No \l_TP_KV_assignments_toks
+ { \exp_after:wN \KV@toks \exp_after:wN {\g_tmpa_tl} }
+ %\TP_templdecl_add_global_or_nothing:
+ %\toks_put_right:Nn \l_TP_KV_assignments_toks
+ % { \cs_set_nopar:Npx #1{ \toks_use:N \KV@toks} }
+ \bool_if:NTF \l_TP_global_assignment_bool
+ {\toks_put_right:Nn \l_TP_KV_assignments_toks
+ {\cs_gset_nopar:Npx #1 { \toks_use:N \KV@toks}}
+ }
+ {\toks_put_right:Nn \l_TP_KV_assignments_toks
+ {\cs_set_nopar:Npx #1 { \toks_use:N \KV@toks}}
+ }
+ }
+ {
+ \TP_let_instance:Nnn#1{#2}{#3}
+ \toks_put_right:Nf \l_TP_KV_assignments_toks
+ { \TP_let_instance:Nnn#1{#2}{#3} }
+ }
+}
+\cs_new_nopar:Npn\TP_use_arg_type_x:w {
+ \TP_parse_optional_key_default:nw
+ {\TP_templdecl_setup_x_key:n}
+}
+\cs_new_nopar:Npn \TP_templdecl_setup_x_key:n#1{
+ \TP_templdecl_define_key:n
+ { \toks_put_right:Nn\l_TP_KV_assignments_toks{#1} }
+}
+\cs_new_nopar:Npn\TP_use_arg_type_g:w {
+ \TP_parse_optional_key_default:nw
+ {\TP_templdecl_setup_g_key:n}
+}
+\cs_new_nopar:Npn \TP_templdecl_setup_g_key:n #1 {
+ \TP_templdecl_define_key:n{#1}}
+\cs_new_nopar:Npn \TP_templdecl_define_key:n#1{
+ \exp_after:wN \cs_set:Npn \cs:w
+ KV@\l_TP_curr_name_tl @\l_TP_currkey_tl
+ \exp_after:wN\cs_end:
+ \exp_after:wN##\exp_after:wN1\exp_after:wN{
+ \exp_after:wN\TP_templdecl_remove_from_default_assignments:N
+ \cs:w KV@\l_TP_curr_name_tl @\l_TP_currkey_tl
+ \exp_after:wN \cs_end:
+ \TP_templdecl_add_global_or_nothing:
+ #1
+ }
+}
+\cs_set:Npn \TP_ignore_leading_space_in_arg_ii:nn#1#2{
+ \exp_args:Nf\TP_ignore_leading_space_in_arg_ii_aux:nn
+ {\exp_not:N #2}{#1}
+}
+\cs_set:Npn \TP_ignore_leading_space_in_arg_ii_aux:nn#1#2{#2{#1}}
+
+\DeclareDocumentCommand\TP_parse_optional_key_default:nw{mo}{
+ \IfNoValueTF{#2}
+ {\TP_templdecl_finish_key_setup:nw{#1}}
+ {\TP_templdecl_finish_key_setup_with_default:nnw{#1}{#2}}
+}
+\cs_new_nopar:Npn \TP_templdecl_finish_key_setup:nw#1#2\q_stop{
+ \TP_ignore_leading_space_in_arg_ii:nn{#1}{#2}
+ %%%#1{#2}
+}
+\cs_new_nopar:Npn \TP_templdecl_finish_key_setup_with_default:nnw#1#2#3\q_stop{
+ \TP_ignore_leading_space_in_arg_ii:nn{#1}{#3}
+ %%% #1 {#3}
+ \group_begin:
+ \toks_clear:N \l_TP_KV_assignments_toks
+ \cs_set_eq:NN \TP_templdecl_remove_from_default_assignments:N \use_none:n
+ \use:c{KV@\l_TP_curr_name_tl @\l_TP_currkey_tl}{#2}
+ \exp_after:wN
+ \group_end:
+ \exp_after:wN
+ \toks_set:Nn
+ \exp_after:wN
+ \l_TP_default_assignments_toks
+ \exp_after:wN
+ { \cs:w KV@\l_TP_curr_name_tl @\l_TP_currkey_tl \exp_after:wN \cs_end:
+ \exp_after:wN
+ { \toks_use:N \exp_after:wN \l_TP_KV_assignments_toks
+ \exp_after:wN
+ }
+ \toks_use:N\l_TP_default_assignments_toks
+ }
+}
+\tl_new:Nn \c_TP_true_tl {true}
+\cs_new_nopar:Npn \TP_templdecl_eval_s_key_value:nnn#1#2#3 {
+ \tl_set:Nn \l_tmpa_tl {#1}
+ \tl_if_eq:NNTF \l_tmpa_tl \c_TP_true_tl
+ { \toks_put_right:Nn \l_TP_KV_assignments_toks {#2} }
+ { \toks_put_right:Nn \l_TP_KV_assignments_toks {#3} }
+}
+\cs_new_nopar:Npn \TP_templdecl_setup_register_key:Nn #1#2{
+ \TP_templdecl_define_key:n{
+ \tl_if_head_eq_meaning:nNTF{##1}\DelayEvaluation
+ {
+ \toks_put_right:Nn \l_TP_KV_assignments_toks {#1#2{##1}}
+ %\toks_set:No\l_tmpa_toks{\use_ii:nn ##1}
+ %\toks_put_right:Nx \l_TP_KV_assignments_toks
+ % {\exp_not:n{#1#2}{\toks_use:N \l_tmpa_toks}}
+ }
+ {
+ \tl_if_head_eq_meaning:nNTF{##1..}\MultiSelection
+ {
+ \group_begin:
+ \TP_multiselection_add:nnnnnn #1#2##1
+ \group_end:
+ \tl_if_in:onTF{\toks_use:N\g_TP_multiselection_toks}\DelayEvaluation
+ {
+ \toks_put_right:No\l_TP_KV_assignments_toks
+ {
+ \exp_after:wN#1\exp_after:wN#2\exp_after:wN
+ {\toks_use:N\g_TP_multiselection_toks}
+ }
+ }
+ {
+ \toks_put_right:No\l_TP_KV_assignments_toks
+ {
+ \exp_after:wN #2
+ \exp_after:wN= \toks_use:N\g_TP_multiselection_toks\scan_stop:
+ }
+ }
+ }
+ {
+ #1#2{##1}
+ \toks_put_right:No\l_TP_KV_assignments_toks {
+ \exp_after:wN #2 \exp_after:wN = \tex_the:D #2\scan_stop:
+ }
+ }
+ }
+ }
+}
+\cs_new_nopar:Npn\DelayEvaluation #1{\use_none:n{\DelayEvaluation}#1}
+\cs_new_nopar:Npn\MultiSelection #1{\use_none:n{\MultiSelection}#1}
+\cs_new_nopar:Npn \TP_templdecl_remove_from_default_assignments:N#1{
+ \cs_set_nopar:Npn \TP_tmp:w ##1#1##2##3#1##4\q_stop{
+ \l_TP_default_assignments_toks{##1##3}
+ }
+ \exp_after:wN \TP_tmp:w
+ \toks_use:N\l_TP_default_assignments_toks #1\scan_stop:#1\q_stop}
+\cs_new_nopar:Npn \TP_templdecl_setup_f_key:Nn#1#2{
+ \TP_templdecl_define_key:n
+ { \TP_templdecl_define_function:NNn#1#2{##1} }
+}
+\cs_new_nopar:Npn \TP_templdecl_define_function:NNn#1#2#3{
+ \cs_generate_from_arg_count:NNnn #2 \cs_set:Npn {#1}{#3}
+ \toks_put_right:Nf \l_TP_KV_assignments_toks {
+ \cs_generate_from_arg_count:NNnn #2 \cs_set:Npn {#1}{#3}
+ }
+}
+\cs_new_nopar:Npn \TP_templdecl_setup_n_key:N#1{
+ \TP_templdecl_define_key:n{
+ \tl_if_head_eq_meaning:nNTF{##1..}\MultiSelection
+ {
+ \group_begin:
+ \TP_templdecl_multiselection:nnnn ##1
+ \group_end:
+ \toks_put_right:Nx\l_TP_KV_assignments_toks {
+ \exp_not:n{\tl_set:Nf #1} { \toks_use:N \g_TP_multiselection_toks}
+ }
+ }
+ {
+ \cs_set_nopar:Npn #1{##1} % setting it?
+ \toks_put_right:Nn \l_TP_KV_assignments_toks
+ { \tl_set:Nn #1{##1} }
+ }
+ }
+}
+\cs_new_nopar:Npn \TP_templdecl_multiselection:nnnn #1#2#3#4{
+ \toks_gset:Nn \g_TP_multiselection_toks {\if_case:w #2}
+ \clist_map_inline:nn {#3}{
+ \TP_multiselection_add_or_case:n {\exp_stop_f:##1}
+ }
+ \toks_gput_right:Nn\g_TP_multiselection_toks {
+ \else: \use_i_after_fi:nw { \exp_stop_f: #4} \fi:
+ }
+}
+\cs_new_nopar:Npn \DeclareInstance { \DeclareCollectionInstance{} }
+\cs_new:Npn \DeclareCollectionInstance#1#2#3#4{
+ \TP_declare_instance:cnn { <#1>#2/#3 }{ #2/#4 }
+}
+\cs_new_nopar:Npn \UseCollection#1#2{
+ \tl_set:cx { TP@<#1> }
+ { {#2} \TP_get_arg_count:n{#1} }
+}
+\cs_new_nopar:Npn \TP_let_instance:Nnn#1#2#3{
+ \cs_set_eq:Nc #1
+ {
+ \cs_if_free:cTF { \TP_get_csname_prefix:n{#2} #3 }
+ { <>#2/ }
+ { \TP_get_csname_prefix:n{#2} }
+ #3
+ }
+}
+\cs_new_nopar:Npn \UseInstance#1#2{
+ \TP_let_instance:Nnn \l_tmpa_tl {#1}{#2}
+ \tl_if_eq:NNTF \l_tmpa_tl \scan_stop:
+ \INSTANCEundefined
+ \l_tmpa_tl
+}
+\cs_new:Npn \TP_templdecl_declare_tmp_instance:nnnn#1#2#3{%
+ \TP_declare_instance:Nnn \g_tmpa_tl {#2/#3} }
+\cs_new_nopar:Npn \ShowTemplate#1#2{
+ \iow_term:x{*******~ Template:~ #1/#2~ *******}
+ \iow_term:x{*}
+ \iow_term:x{*~ Defaults:}
+ \iow_term:x{*}
+ \iow_term:x{\token_to_str:N\TPD>/#1/#2=
+ \cs_meaning:c{TPD>/#1/#2}}
+ \iow_term:x{*}
+ \iow_term:x{*~ Restrictions:}
+ \iow_term:x{*}
+ \iow_term:x{\token_to_str:N\TPR>/#1/#2=
+ \cs_meaning:c{TPR>/#1/#2}}
+ \iow_term:x{*}
+ \iow_term:x{*~ Body:}
+ \iow_term:x{*}
+ \cs_show:c {TP>/#1/#2}}
+\cs_new_nopar:Npn \ShowCollectionInstance#1#2#3{
+ \iow_term:x{*******~ Instance:~ <#1>#2/#3~ *******}
+ \iow_term:x{*}
+ \cs_show:c {<#1>#2/#3}}
+\cs_new_nopar:Npn \ShowInstance{\ShowCollectionInstance{}}
+\cs_new_nopar:Npn \TP_templdecl_setup_fakeregister_key:NNn#1#2#3{
+ \TP_templdecl_define_key:n{
+ \tl_if_head_eq_meaning:nNTF{##1..}\DelayEvaluation
+ {
+ \toks_set:No \l_tmpa_toks {\use_ii:nn ##1}
+ \toks_put_right:Nx \l_TP_KV_assignments_toks {
+ \exp_not:n{#1#2}{\toks_use:N \l_tmpa_toks}
+ \exp_not:n{ \cs_set_nopar:Npx #3{\toks_use:N#2} }
+
+ }
+ }
+ {
+ \tl_if_head_eq_meaning:nNTF{##1..}\MultiSelection
+ {
+ \group_begin:
+ \TP_multiselection_add:nnnnnn#1#2##1
+ \group_end:
+ \toks_put_right:Nx\l_TP_KV_assignments_toks
+ {\exp_not:n{\cs_set_nopar:Npn #3} {\toks_use:N\g_TP_multiselection_toks}}
+ }
+ {
+ #1#2{##1}
+ \toks_put_right:Nx\l_TP_KV_assignments_toks
+ {\exp_not:n{\cs_set_nopar:Npn#3} {\toks_use:N#2}}
+ }
+ }
+ }
+}
+\toks_new:N \g_TP_multiselection_toks
+\cs_new_nopar:Npn \TP_multiselection_add:nnnnnn #1#2#3#4#5#6{
+ \toks_gset:Nn \g_TP_multiselection_toks {\if_case:w #4}
+ \clist_map_inline:nn {#5}{
+ \tl_if_head_eq_meaning:nNTF{##1..}\DelayEvaluation
+ {
+ \TP_multiselection_add_or_case:n {##1}
+ }
+ {
+ #1#2{##1}
+ \TP_multiselection_add_or_case:o { \toks_use:N #2 }
+ }
+ }
+ \toks_gput_right:Nn \g_TP_multiselection_toks {
+ \else: \use_i_after_fi:nw{#6}\fi:
+ }
+}
+\cs_new_nopar:Npn \TP_multiselection_add_or_case:n #1 {
+ \toks_gput_right:Nn \g_TP_multiselection_toks {
+ \or: \use_i_after_orelse:nw{#1}
+ }
+}
+\cs_generate_variant:Nn \TP_multiselection_add_or_case:n {o}
+\cs_new_nopar:Npn \IfExistsInstanceTF#1#2{
+ \cs_if_exist:cTF{<>#1/#2}
+}
+\cs_set_nopar:Npn \IfExistsInstanceTF#1#2{
+ \TP_let_instance:Nnn \l_tmpa_tl {#1}{#2}
+ \if_meaning:w\l_tmpa_tl\scan_stop:
+ \exp_after:wN\use_ii:nn
+ \else:
+ \exp_after:wN\use_i:nn
+ \fi:}
+\cs_new_nopar:Npn \DeclareRestrictedTemplate#1#2#3#4{
+ % CCC do we need a group here??
+ \tl_set_eq:cc { TPD>/#1/#2 } { TPD>/#1/#3 }
+ \tl_set_eq:cc { TP>/#1/#2 } { TP>/#1/#3 }
+ \toks_set:Nv \l_TP_KV_assignments_toks { TPR>/ #1 / #3 }
+ \setkeys {\cs:w TPO>/#1/#3\cs_end:}{#4}
+
+ \tl_set:cx { TPR>/#1/#2 }
+ { \toks_use:N \l_TP_KV_assignments_toks }
+ \cs_if_free:cTF { TPO>/#1/#3 }
+ { \tl_set:cn {TPO>/#1/#2}{#1/#3} }
+ { \tl_set_eq:cc {TPO>/#1/#2}{TPO>/#1/#3} }
+}
+\cs_new_nopar:Npn \TP_instdecl_generate_assignments:nn#1#2 {
+ % Returns to \l_TP_KV_assignments_toks
+ % the restrictions
+ % stored in the TP-structure (at present
+ % in YAM) of the template #1
+ \exp_args:NNo \toks_set:No \l_TP_default_assignments_toks
+ {\cs:w TPD>/#1\cs_end:\scan_stop:\scan_stop:}
+ \toks_set:Nv \l_TP_KV_assignments_toks { TPR>/ #1 }
+ \setkeys { \cs:w TPO>/#1 \cs_end: }
+ { #2 } % adds stuff to \l_TP_KV_assignments_toks
+
+ \exp_after:wN\TP_instdecl_add_default_recurse:nn
+ \toks_use:N\l_TP_default_assignments_toks
+
+}
+\cs_new_nopar:Npn \TP_instdecl_add_default_recurse:nn#1#2{
+ \token_if_eq_meaning:NNF #1\scan_stop:
+ {
+ \l_tmpa_toks{#2}
+ \tl_set:Nx \l_tmpa_tl {
+ {\toks_use:N \l_tmpa_toks \toks_use:N \l_TP_KV_assignments_toks}
+ }
+ \l_TP_KV_assignments_toks \l_tmpa_tl
+ \TP_instdecl_add_default_recurse:nn
+ }
+}
+\cs_new_nopar:Npn \TP_split_finite_skip_value:nnNN #1#2{
+ \skip_split_finite_else_action:nnNN {#1} {
+ \PackageError{template}{Value~ for~ key~ #2~ contains~ `fil(ll)'}
+ {Only~ finite~ minus~ or~ plus~ parts~ are~ allowed~ for~ this~ key.}
+ }
+}
+\endinput
+%%
+%% End of file `template.sty'.