From 98890e60b2f71ab52763c5ddeb6b68160de110c2 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Tue, 1 Jan 2019 22:50:44 +0000 Subject: diffcoeff (1jan19) git-svn-id: svn://tug.org/texlive/trunk@49571 c570f23f-e606-0410-a88d-b1316a301751 --- .../tex/latex/diffcoeff/diffcoeff-doc.def | 19 +- .../texmf-dist/tex/latex/diffcoeff/diffcoeff.sty | 446 +++++++++++---------- 2 files changed, 236 insertions(+), 229 deletions(-) (limited to 'Master/texmf-dist/tex/latex/diffcoeff') diff --git a/Master/texmf-dist/tex/latex/diffcoeff/diffcoeff-doc.def b/Master/texmf-dist/tex/latex/diffcoeff/diffcoeff-doc.def index 34a03b2c7f2..8b6b415acfa 100644 --- a/Master/texmf-dist/tex/latex/diffcoeff/diffcoeff-doc.def +++ b/Master/texmf-dist/tex/latex/diffcoeff/diffcoeff-doc.def @@ -108,14 +108,13 @@ subscr-nudge = -3 mu } -% partial, scriptstyle -\diffdef { pscr } +% partial, wide sep of terms +\diffdef { pwide } { - op-symbol = \partial, - op-order-sep = 0 mu , - denom-term-sep = 0 mu , - left-delim = \left ( , - right-delim = \right ), - subscr-nudge = -3 mu - } - + op-symbol = \partial, + denom-term-sep = 3 mu , + /-denom-term-sep = 3 mu , + left-delim = \left ( , + right-delim = \right ), + subscr-nudge = -6 mu + } \ No newline at end of file diff --git a/Master/texmf-dist/tex/latex/diffcoeff/diffcoeff.sty b/Master/texmf-dist/tex/latex/diffcoeff/diffcoeff.sty index 65e09470687..63be1a33dbc 100644 --- a/Master/texmf-dist/tex/latex/diffcoeff/diffcoeff.sty +++ b/Master/texmf-dist/tex/latex/diffcoeff/diffcoeff.sty @@ -9,7 +9,7 @@ % \RequirePackage{expl3} \RequirePackage{xparse,l3keys2e,xtemplate} -\ProvidesExplPackage {diffcoeff} {2018/12/05} {2.1} +\ProvidesExplPackage {diffcoeff} {2019/01/01} {3} {Write differential coefficients consistently and easily.} % \keys_define:nn { diffcoeff } @@ -23,15 +23,9 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \cs_generate_variant:Nn \tl_if_eq:nnTF { nV } -\tl_new:N \l__diffcoeff_op_tl -\tl_new:N \l__diffcoeff_op_alt_tl -\tl_new:N \l__diffcoeff_ldelim_tl -\tl_new:N \l__diffcoeff_rdelim_tl \tl_new:N \l__diffcoeff_oporder_tl \tl_new:N \l__diffcoeff_differentiand_tl \tl_new:N \l__diffcoeff_type_tl -\tl_new:N \l__diffcoeff_order_spec_tl -\tl_new:N \l__diffcoeff_denom_tl \tl_new:N \l__diffcoeff_tot_order_tl \tl_new:N \l__diffcoeff_curr_num_tl \tl_new:N \l__diffcoeff_curr_var_tl @@ -50,27 +44,16 @@ \bool_new:N \l__diffcoeff_op_left_bool \bool_new:N \l__diffcoeff_single_var_bool \bool_new:N \l__diffcoeff_opwrap_bool +\bool_new:N \l__diffcoeff_integ_bool +\int_new:N \l__diffcoeff_vars_int \int_new:N \l__diffcoeff_format_int \int_new:N \l__diffcoeff_curr_tok_int \int_new:N \l__diffcoeff_curr_state_int \int_new:N \l__diffcoeff_nos_int \int_new:N \l__diffcoeff_parenvar_int -\muskip_new:N \l__diffcoeff_oporder_muskip -\muskip_new:N \l__diffcoeff_opnudge_muskip -\muskip_new:N \l__diffcoeff_elbowrm_muskip -\muskip_new:N \l__diffcoeff_subnudge_muskip -\muskip_new:N \l__diffcoeff_varsep_muskip -\muskip_new:N \l_tmpc_muskip -\muskip_new:N \l_tmpd_muskip %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Derivatives -% #1 order spec(seqvar) -% #2 order override(tlvar) -% #3 differentiand(tlvar) -% #4 denominator(seqvar) -% #5 subscript(tlvar) \DeclareObjectType { derivative } { 5 } % defaults: ordinary deriv. values @@ -84,9 +67,10 @@ *-italic-nudge : muskip = 3 mu , */-op-wrap : boolean = true , long-var-wrap : choice { dv, d(v), (dv) } - = d(v) , + = d(v) , denom-term-sep : muskip = 2 mu , /-denom-term-sep : muskip = 1 mu , + term-sep-adjust : muskip = -1 mu , left-delim : tokenlist = \left . , right-delim : tokenlist = \right |, elbowroom : muskip = 0 mu , @@ -94,9 +78,11 @@ /-left-delim : tokenlist = ( , /-right-delim : tokenlist = ) , /-elbowroom : muskip = 0 mu , - /-subscr-nudge : muskip = 0 mu + /-subscr-nudge : muskip = 0 mu } - +% #1 order spec(seqvar); #2 order override(tlvar) +% #3 differentiand(tlvar); #4 denominator(seqvar) +% #5 subscript(tlvar) \DeclareTemplateCode { derivative } { DERIV } { 5 } { op-symbol = \l__diffcoeff_op_tl , @@ -107,17 +93,18 @@ *-italic-nudge = \l__diffcoeff_opnudge_muskip , */-op-wrap = \l__diffcoeff_opwrap_bool , long-var-wrap = { - dv = \cs_set_eq:NN \__diffcoeff_wrap_longvars:NN - \__diffcoeff_wrap_none:NN, - d(v) = \cs_set_eq:NN \__diffcoeff_wrap_longvars:NN - \__diffcoeff_wrap_var:NN , - (dv) = \cs_set_eq:NN \__diffcoeff_wrap_longvars:NN - \__diffcoeff_wrap_dvar:NN, - unknown = \cs_set_eq:NN \__diffcoeff_wrap_longvars:NN - \__diffcoeff_wrap_var:NN + dv = \cs_set:Npn \__diffcoeff_wrap_longvars:nn #1#2 + { \l__diffcoeff_op_alt_tl {#2}^{#1} }, + d(v) = \cs_set:Npn \__diffcoeff_wrap_longvars:nn #1#2 + { \l__diffcoeff_op_alt_tl {(#2)}^{#1} }, + (dv) = \cs_set:Npn \__diffcoeff_wrap_longvars:nn #1#2 + { (\l__diffcoeff_op_alt_tl {#2)}^{#1} }, + unknown = \cs_set:Npn \__diffcoeff_wrap_longvars:nn #1#2 + { \l__diffcoeff_op_alt_tl {(#2)}^{#1} } } , denom-term-sep = \l__diffcoeff_varsep_muskip , /-denom-term-sep = \l_tmpb_muskip , + term-sep-adjust = \l__diffcoeff_sep_adj_muskip , left-delim = \l__diffcoeff_ldelim_tl , right-delim = \l__diffcoeff_rdelim_tl , elbowroom = \l__diffcoeff_elbowrm_muskip , @@ -129,9 +116,13 @@ } { \AssignTemplateKeys - \int_compare:nNnT { \l__diffcoeff_format_int } > { 1 } - { \__diffcoeff_slash_vals: } - \__diffcoeff_build:NNNNN #1#2#3#4#5 + + \bool_if:NF\l__diffcoeff_integ_bool + { + \int_compare:nNnT { \l__diffcoeff_format_int } > { 1 } + { \__diffcoeff_slash_vals: } + \__diffcoeff_build:NNNNN #1#2#3#4#5 + } } %%%%%%%%%% \cs_new:Npn \__diffcoeff_slash_vals: @@ -150,9 +141,13 @@ \exp_args:NV\tl_if_novalue:nF #5 { \l__diffcoeff_ldelim_tl \mkern \l__diffcoeff_elbowrm_muskip } \bool_if:NTF \l__diffcoeff_single_var_bool - { \__diffcoeff_single:NNN #2 #3 #4 } { - \seq_mapthread_function:NNN #1 #4 \__diffcoeff_map_orders:nn + \tl_set:Nx \l_tmpa_tl { \seq_use:Nn #4 { , } } + \__diffcoeff_single:NNN #2 #3 \l_tmpa_tl + } + { + \int_zero:N \l_tmpa_int + \seq_mapthread_function:NNN #1 #4 \__diffcoeff_map_orders:nn \__diffcoeff_mixed:NNN #2 #3 \l__diffcoeff_denom_seq } \exp_args:NV\tl_if_novalue:nF #5 @@ -166,8 +161,8 @@ } } %%%%%%%%%%%%%%%%%%%% -% (ptl) form denom from #1 orders, & #2 vars, seqs -\cs_new:Npn \__diffcoeff_map_orders:nn #1#2 +% (ptl) form denom from #1 orders seq & #2 vars seq +\cs_new_protected:Npn \__diffcoeff_map_orders:nn #1#2 { \tl_if_eq:nnTF { #1 } { 1 } { \seq_put_right:Nn \l__diffcoeff_denom_seq { \l__diffcoeff_op_alt_tl #2 } } @@ -178,12 +173,12 @@ { \l__diffcoeff_op_alt_tl #2^{ #1 } } } { - \seq_put_right:Nx \l__diffcoeff_denom_seq - { \__diffcoeff_wrap_longvars:NN { #1 } { #2 } } + \seq_put_right:Nn \l__diffcoeff_denom_seq + { \__diffcoeff_wrap_longvars:nn { #1\vphantom{)} } { #2 } } } } } -% #1 order(tlvar) ; #2 diff'iand(tlvar); % #3 denom(tlvar) +% #1 order(tlvar) ; #2 diff'iand(tlvar); #3 denom(tlvar) \cs_new:Npn \__diffcoeff_single:NNN #1#2#3 { \__diffcoeff_numer:N { #1 } @@ -192,19 +187,35 @@ \l__diffcoeff_differentiand_tl { \__diffcoeff_denom_single:NN #1 #3 } } -% #1 total order -% #2 differentiand -% #3 denominator seq -\cs_new:Npn \__diffcoeff_mixed:NNN #1#2#3 +% #1 total order; #2 differentiand; #3 denom seq +\cs_new_protected:Npn \__diffcoeff_mixed:NNN #1#2#3 { \__diffcoeff_numer:N #1 \__diffcoeff_form_deriv:NNn \l__diffcoeff_oporder_tl \l__diffcoeff_differentiand_tl - { \seq_use:Nn #3 { \mskip \l__diffcoeff_varsep_muskip } } + { \__diffcoeff_denom_sep:N #3 } + } +\cs_new:Npn \__diffcoeff_denom_sep:N #1 + { + \int_zero:N \l_tmpa_int + \seq_map_inline:Nn #1 + { + \int_incr:N \l_tmpa_int ##1 + \int_compare:nNnT { \l_tmpa_int } < { \l__diffcoeff_vars_int } + { + \seq_pop:NN \l__diffcoeff_orders_seq \l_tmpa_tl + \str_if_eq:VnTF \l_tmpa_tl { 1 } + { \mkern \l__diffcoeff_varsep_muskip } + { + \mkern \muskip_eval:n { \l__diffcoeff_varsep_muskip + + \l__diffcoeff_sep_adj_muskip } + } + } + } } % #1(tl) total order -\cs_new:Npn \__diffcoeff_numer:N #1 +\cs_new_protected:Npn \__diffcoeff_numer:N #1 { \bool_if:NTF \l__diffcoeff_op_left_bool { @@ -222,23 +233,16 @@ { \tl_put_right:Nn \l__diffcoeff_oporder_tl { \hfill } } } % #1 order; #2 var -\cs_new:Npn \__diffcoeff_denom_single:NN #1#2 +\cs_new_protected:Npn \__diffcoeff_denom_single:NN #1#2 { \tl_if_eq:nVTF { 1 } #1 { \l__diffcoeff_op_alt_tl #2 } { \int_compare:nNnTF { \tl_count:N #2 } = { 1 } { \l__diffcoeff_op_alt_tl #2^{ #1 } } - { \__diffcoeff_wrap_longvars:NN #1 #2 } + { \__diffcoeff_wrap_longvars:nn { #1\vphantom) } { #2 } } } } -\cs_new:Npn \__diffcoeff_wrap_none:NN #1#2 - { \l__diffcoeff_op_alt_tl #2^{#1} } -\cs_new:Npn \__diffcoeff_wrap_var:NN #1#2 - { \l__diffcoeff_op_alt_tl (#2)^{#1} } -\cs_new:Npn \__diffcoeff_wrap_dvar:NN #1#2 - { (\l__diffcoeff_op_alt_tl #2)^{#1} } - % #1 op+order; #2 diff'iand; #3 denom % 0 frac; 1 frac append; 2 slash ; 3 slash append \cs_new:Npn \__diffcoeff_form_deriv:NNn #1#2#3 @@ -252,112 +256,60 @@ { 4 } { #1 / #3 { #2 } } } } -%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% create new instances or edit existing ones -% #1 = name; #2 = key-value list -\NewDocumentCommand \diffdef { > { \TrimSpaces } m m } - { - \tl_if_empty:nTF { #1 } - { - \EditTemplateDefaults { derivative } - { DERIV } { #2 } - \EditInstance { derivative } { ord } { #2 } - } - { - \IfInstanceExistTF { derivative } { ord.#1 } - { \EditInstance { derivative } { ord.#1 } { #2 } } - { - \DeclareInstance { derivative } { ord.#1 } - { DERIV } { #2 } - } - } - } -% superseded relic from version 1 -\NewDocumentCommand \diffset { o } - { \msg_warning:nn { diffcoeff } { obsolete } } - -% ordinary -\DeclareInstance { derivative } { ord } { DERIV } { } -\bool_if:NTF \g__diffcoeff_ISO_bool - { - \diffdef {} - { - op-symbol = \mathrm{d}, - op-order-sep = 0 mu , - left-delim = \left ( , - right-delim = \right ) , - subscr-nudge = -6 mu - } - \diffdef { D } { op-symbol = \mathrm{D} } - } - { \diffdef { D } { op-symbol = D } } - -% partial -\diffdef { p } +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% differential +% #1 = space before d (0--9); mu is assumed +\NewDocumentCommand \dl { d.. m } { - op-symbol = \partial , - left-delim = \left ( , - right-delim = \right ) , - subscr-nudge = -6 mu - } -\NewDocumentCommand \diffp { } { \diff.p. } - -\diffdef { delta } - { - op-symbol = \delta , - op-order-sep = 0 mu - } -\diffdef { Delta } - { - op-symbol = \Delta , - op-order-sep = 0 mu + \group_begin: + \bool_set_true:N \l__diffcoeff_integ_bool + \bool_set_true:N \l__diffcoeff_single_var_bool + \seq_set_from_clist:Nn \l__diffcoeff_orders_seq { 1 } + \tl_set:Nn \l__diffcoeff_tot_order_tl { 1 } + \IfValueT { #1 } { \tl_set:Nn \l__diffcoeff_type_tl { .#1 } } + \UseInstance { derivative } { ord\l__diffcoeff_type_tl } + \l__diffcoeff_orders_seq \l__diffcoeff_tot_order_tl + \c_empty_tl \c_empty_seq \c_empty_tl + \tl_if_in:NnTF \c__diffcoeff_digits_tl { #2 } + { \mkern #2 mu \l__diffcoeff_op_tl } + { \l__diffcoeff_op_tl #2 } + \group_end: } -% for compatibility with version 1 -\NewDocumentCommand \Diff { } { \diff.D. } -\NewDocumentCommand \diffd { } { \diff.delta. } -\NewDocumentCommand \Diffd { } { \diff.Delta. } - -% user-defined variants -\file_if_exist:nT { \g__diffcoeff_def_tl.def } - { \file_input:n { \g__diffcoeff_def_tl.def } } -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\NewDocumentCommand \negmu {} { \mkern -1 mu } +\NewDocumentCommand \nilmu {} { \mkern 0 mu } +\NewDocumentCommand \onemu {} { \mkern 1 mu } +\NewDocumentCommand \twomu {} { \mkern 2 mu } % derivative -% #1(tl) = name of variant -% #2(*) = append differentiand boolean -% #3(clist) = orders of diff. in each var. -% #4(tl) = order override -% #5(tl) = differentiand -% #6 ( / ) = slash boolean -% #7(clist) = vars of diff. in order -% #8(tl) = pt of eval./vars held constant -% #9(tl) = #8 for backwards compatibility +% #1(tl) = name of variant; #2(*)= append diff'iand boolean +% #3(clist) = orders of diff. in each var.; #4(tl) = order override +% #5(tl) = diff'iand; #6( / ) = slash boolean +% #7(clist) = vars of diff.; #8(tl) = pt of eval./vars held const +% #9(tl) = as #8 (for backwards compat) \NewDocumentCommand \diff{ d.. s O{1} o m t/ m !O{#9} g } { \group_begin: \tl_set:Nn \l__diffcoeff_differentiand_tl { #5 } \tl_set:Nn \l__diffcoeff_trailing_tl { #8 } - - \tl_set:Nn \l__diffcoeff_denom_tl { #7 } - \seq_set_split:Nnn \l__diffcoeff_vars_seq { , } { #7 } - + \seq_set_from_clist:Nn \l__diffcoeff_vars_seq { #7 } \seq_set_from_clist:Nn \l__diffcoeff_orders_seq { #3 } - \tl_set:Nn \l__diffcoeff_order_spec_tl { [#3] } - - \int_set:Nn \l_tmpa_int { \seq_count:N \l__diffcoeff_vars_seq } + \int_set:Nn \l__diffcoeff_vars_int + { \seq_count:N \l__diffcoeff_vars_seq } \int_set:Nn \l_tmpb_int { \seq_count:N \l__diffcoeff_orders_seq } - \int_compare:nNnTF { \l_tmpa_int } = { 1 } + + \int_compare:nNnTF { \l__diffcoeff_vars_int } = { 1 } { \bool_set_true:N \l__diffcoeff_single_var_bool } { - \int_compare:nNnTF { \l_tmpa_int } < { \l_tmpb_int } + \int_compare:nNnTF { \l__diffcoeff_vars_int } < { \l_tmpb_int } { - \msg_error:nnxx { diffcoeff } { numbers-conflict } - { \int_use:N \l_tmpa_int } { \int_use:N \l_tmpb_int } + \msg_error:nnxxxx { diffcoeff } { numbers-conflict } + { \int_use:N \l__diffcoeff_vars_int } { \int_use:N \l_tmpb_int } + { \seq_use:Nn \l__diffcoeff_orders_seq { , } } + { \seq_use:Nn \l__diffcoeff_vars_seq { , } } } { % pad orders seq if nec. \int_step_inline:nnnn - { 1 + \l_tmpb_int } { 1 } { \l_tmpa_int } + { 1 + \l_tmpb_int } { 1 } { \l__diffcoeff_vars_int } { \seq_put_right:Nn \l__diffcoeff_orders_seq { 1 } } - \tl_set:NV \l__diffcoeff_denom_tl \l__diffcoeff_vars_seq } } % override/calc total order @@ -381,7 +333,7 @@ \l__diffcoeff_orders_seq \l__diffcoeff_tot_order_tl \l__diffcoeff_differentiand_tl - \l__diffcoeff_denom_tl + \l__diffcoeff_vars_seq \l__diffcoeff_trailing_tl \group_end: } % end of \diff @@ -414,7 +366,7 @@ { \tl_clear:N \l__diffcoeff_nos_tl } } % #1 curr tok (tl); #2 <== curr tok ndx (int) -\cs_new:Npn \__diffcoeff_get_curr_ndx:nN #1#2 +\cs_new_protected:Npn \__diffcoeff_get_curr_ndx:nN #1#2 { \tl_if_in:NnTF \c__diffcoeff_digits_tl { #1 } { \int_set:Nn #2 { 1 } } % digit @@ -446,9 +398,9 @@ } % transitions from the signed state % #1(tl) curr tok; #2(int) 0, curr state; #3 curr tok ndx -\cs_new:Npn \__diffcoeff_sgn_transitions:nNN #1#2#3 +\cs_new_protected:Npn \__diffcoeff_sgn_transitions:nNN #1#2#3 { - \int_case:nnTF { #3 } + \int_case:nnT { #3 } { { 0 } % tok = s { @@ -472,27 +424,31 @@ } } { \int_set_eq:NN #2 #3 } - { - \msg_error:nnxxx { diffcoeff } { order-specification } - { \l__diffcoeff_order_spec_tl } { #1 } { sign } - } } % transitions from the numeric state % #1 = curr. tok.; #2 = 0, curr. state; #3 curr. tok. index -\cs_new:Npn \__diffcoeff_num_transitions:nNN #1#2#3 +\cs_new_protected:Npn \__diffcoeff_num_transitions:nNN #1#2#3 { - \int_case:nnTF { #3 } + \int_case:nnT { #3 } { { 0 } % tok = s { - \__diffcoeff_store_num:NNN \l__diffcoeff_nos_tl - \l__diffcoeff_paren_tl \l__diffcoeff_curr_num_tl + \tl_put_right:NV\l__diffcoeff_nos_tl + { \l__diffcoeff_paren_tl * \l__diffcoeff_curr_num_tl } \tl_set:Nn \l__diffcoeff_curr_num_tl { #1 } } { 1 } % tok = d { \tl_put_right:Nn \l__diffcoeff_curr_num_tl { #1 } } { 2 } % tok = v - { \tl_set:Nn \l__diffcoeff_curr_var_tl { #1 } } + { + \tl_if_in:nnTF { ^ \times * / \div } { #1 } + { + \msg_error:nnxxx { diffcoeff } { order-specification } + { \seq_use:Nn \l__diffcoeff_orders_seq { , } } + { #1 } { number } + } + { \tl_set:Nn \l__diffcoeff_curr_var_tl { #1 } } + } { 3 } % tok = ( { \seq_push:NV \l__diffcoeff_paren_seq \l__diffcoeff_paren_tl @@ -503,22 +459,18 @@ } { 4 } % tok = ) { - \__diffcoeff_store_num:NNN \l__diffcoeff_nos_tl - \l__diffcoeff_paren_tl \l__diffcoeff_curr_num_tl + \tl_put_right:NV \l__diffcoeff_nos_tl + { \l__diffcoeff_paren_tl * \l__diffcoeff_curr_num_tl } } } { \int_set_eq:NN #2 #3 } - { - \msg_error:nnxxx { diffcoeff } { order-specification } - { \l__diffcoeff_order_spec_tl } { #1 } { number } - } } % transitions from the algebraic state % #1 = curr. tok.; #2 = 2, curr. state; #3 curr. tok. index \cs_new:Npn \__diffcoeff_alg_transitions:nNN #1#2#3 { - \int_case:nnTF { #3 } + \int_case:nnT { #3 } { { 0 } % tok = s { @@ -563,11 +515,6 @@ } } { \int_set_eq:NN #2 #3 } - { - \msg_error:nnxxx { diffcoeff } { order-specification } - { \l__diffcoeff_order_spec_tl } { #1 } - { variable } - } } % transitions from the ) state % #1 = curr. tok.; #2 = 4, curr. state; #3 curr. tok. index @@ -581,64 +528,40 @@ } { \msg_error:nnxxx { diffcoeff } { order-specification } - { \l__diffcoeff_order_spec_tl } { #1 } { ) } + { \seq_use:Nn \l__diffcoeff_orders_seq { , } } { #1 } { ) } } } -% #1=store (tlvar); #2=num. coeff. (tlvar); #3=num.(tlvar) -\cs_new:Npn \__diffcoeff_store_num:NNN #1#2#3 - { - \tl_put_right:NV #1 #2 - \tl_put_right:Nn #1 { * } - \tl_put_right:NV #1 #3 - } % #1 is var. (tlvar); #2 is num. (tlvar); #3 num. coeff. (tlvar) \cs_new:Npn \__diffcoeff_store_var:NNN #1#2#3 { \prop_get:NVNF \l__diffcoeff_vars_prop #1 \l_tmpa_tl { \tl_clear:N \l_tmpa_tl } - \__diffcoeff_store_num:NNN \l_tmpa_tl #2 #3 + \tl_put_right:NV \l_tmpa_tl { #2 * #3 } \prop_put:NVV \l__diffcoeff_vars_prop #1 \l_tmpa_tl } -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% #1 (prop) vars (keys) & coeffs (vals); #2 total order -\cs_new:Npn \__diffcoeff_evaluate:NN #1#2 - { - \prop_map_inline:Nn #1 - { - \int_compare:nNnF { \int_eval:n { ##2 } } = { 0 } - { - \seq_put_right:Nx \l_tmpa_seq - { { +\int_eval:n { ##2 } } { ##1 } } - } - } +% #1 (propv) key=var, val=coeff; #2 <= total order +\cs_new_protected:Npn \__diffcoeff_evaluate:NN #1#2 + { + \prop_map_inline:Nn #1 { \seq_put_left:Nn \l_tmpa_seq { ##1 } } \seq_sort:Nn \l_tmpa_seq { - \int_compare:nNnTF - { \tl_count:V { \use_ii:nn ##1 } } < - { \tl_count:V { \use_ii:nn ##2 } } - { \sort_return_swapped: } - { \sort_return_same: } + \int_compare:nNnTF { \tl_count:n { ##1 } } < { \tl_count:n { ##2 } } + { \sort_return_same: } { \sort_return_swapped: } } - \tl_set:Nx \l_tmpa_tl { \seq_use:Nn \l_tmpa_seq { } } - \seq_set_split:NnV \l_tmpa_seq {} \l_tmpa_tl - \tl_clear:N \l_tmpa_tl \seq_map_inline:Nn \l_tmpa_seq - { - \tl_if_eq:nnTF { +-1 } { ##1 } - { \tl_put_right:Nn \l_tmpa_tl { - } } - { - \tl_if_eq:nnTF { +1 } { ##1 } - { \tl_put_right:Nn \l_tmpa_tl { + } } - { \tl_put_right:Nn \l_tmpa_tl { ##1 } } - } - } - \tl_replace_all:Nnn \l_tmpa_tl { +- } { - } + { + \prop_pop:NnN #1 { ##1 } \l_tmpb_tl + \seq_put_right:Nx \l_tmpb_seq { \int_eval:n \l_tmpb_tl } + } + \tl_clear:N \l_tmpa_tl + \seq_mapthread_function:NNN \l_tmpa_seq \l_tmpb_seq + \__diffcoeff_tot_order:nn \exp_args:NV \tl_if_head_eq_charcode:nNTF \l_tmpa_tl + { + \tl_set:Nx \l_tmpb_tl { \tl_tail:N \l_tmpa_tl } \int_compare:nNnT { \l__diffcoeff_nos_int } > { 0 } { \tl_put_left:Nn \l__diffcoeff_nos_tl { + } } - \tl_set:Nx \l_tmpb_tl { \tl_tail:N \l_tmpa_tl } - \tl_concat:NNN #2 \l_tmpb_tl \l__diffcoeff_nos_tl + \tl_concat:NNN #2 \l_tmpb_tl \l__diffcoeff_nos_tl } { \int_compare:nNnTF { \l__diffcoeff_nos_int } > { 0 } @@ -647,6 +570,92 @@ } \tl_set_rescan:Nno #2 { } #2 } +\cs_new:Npn \__diffcoeff_tot_order:nn #1#2 + { + \int_compare:nNnTF { #2 } > { 0 } + { + \int_compare:nNnTF { #2 } = { 1 } + { \tl_put_left:Nn \l_tmpa_tl { +#1 } } + { \tl_put_left:Nn \l_tmpa_tl { +#2#1 } } + } + { + \int_compare:nNnT { #2 } < { 0 } + { + \int_compare:nNnTF { #2 } = { -1 } + { \tl_put_right:Nn \l_tmpa_tl { -#1 } } + { \tl_put_right:Nn \l_tmpa_tl { #2#1 } } + } + } + } +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% create new instances or edit existing ones +% #1 = name; #2 = key-value list +\NewDocumentCommand \diffdef { > { \TrimSpaces } m m } + { + \tl_if_empty:nTF { #1 } + { + \EditTemplateDefaults { derivative } + { DERIV } { #2 } + \EditInstance { derivative } { ord } { #2 } + } + { + \IfInstanceExistTF { derivative } { ord.#1 } + { \EditInstance { derivative } { ord.#1 } { #2 } } + { + \DeclareInstance { derivative } { ord.#1 } + { DERIV } { #2 } + } + } + } +% relic from version 1 +\NewDocumentCommand \diffset { o } + { \msg_warning:nn { diffcoeff } { obsolete } } + +% ordinary & D +\DeclareInstance { derivative } { ord } { DERIV } { } +\bool_if:NTF \g__diffcoeff_ISO_bool + { + \diffdef {} + { + op-symbol = \mathrm{d}, + op-order-sep = 0 mu , + left-delim = \left ( , + right-delim = \right ) , + subscr-nudge = -6 mu + } + \diffdef { D } { op-symbol = \mathrm{D} } + } + { \diffdef { D } { op-symbol = D } } + +% partial +\diffdef { p } + { + op-symbol = \partial , + left-delim = \left ( , + right-delim = \right ) , + subscr-nudge = -6 mu + } +\NewDocumentCommand \diffp { } { \diff.p. } + +% delta +\diffdef { delta } + { + op-symbol = \delta , + op-order-sep = 0 mu + } +\diffdef { Delta } + { + op-symbol = \Delta , + op-order-sep = 0 mu + } +% for compatibility with version 1 +\NewDocumentCommand \Diff { } { \diff.D. } +\NewDocumentCommand \diffd { } { \diff.delta. } +\NewDocumentCommand \Diffd { } { \diff.Delta. } + +% user-defined +\file_if_exist:nT { \g__diffcoeff_def_tl.def } + { \file_input:n { \g__diffcoeff_def_tl.def } } %%%%%%%%%%%%%%%%%%%% % Jacobian \NewDocumentCommand \jacob { m t/ m } @@ -657,23 +666,22 @@ { \frac{ \partial(#1) } { \partial(#3) } } \group_end: } -%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%% % messages \msg_new:nnn { diffcoeff } { order-specification } { - Is~this~intended:~#3~followed~by~#2~in~the~order~ - specification~#1~\msg_line_context:?~Diffcoeff~cannot~calculate~ - the~overall~order~of~differentiation~in~this~case.~ - Use~the~order-override~option~to~enter~the~overall~order. + #3~followed~by~#2~in~the~order~specification~[#1]~\msg_line_context:.~ + Diffcoeff~cannot~calculate~the~overall~order~of~differentiation~in~ + this~case.~Use~the~order-override~option~to~enter~the~overall~order. } \msg_new:nnn { diffcoeff } { obsolete } { - Obsolete~command:~\diffset has~been~superseded~by~the~\diffdef\ + Obsolete~command:~\diffset is~superseded~by~the~\diffdef\ command.~\msg_see_documentation_text:n { diffcoeff } } \msg_new:nnn { diffcoeff } { numbers-conflict } { - #2~orders~specified~for~#1~variables;~\l__diffcoeff_order_spec_tl - \ (\msg_line_context:)~for~variables~\l__diffcoeff_denom_tl. + #2~orders~of~differentiation~specified~for~#1~variables;~ + orders~[#3]\ (\msg_line_context:)~for~variables~#4. } % end of file diffcoeff.sty \ No newline at end of file -- cgit v1.2.3