summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2022-07-09 20:10:48 +0000
committerKarl Berry <karl@freefriends.org>2022-07-09 20:10:48 +0000
commit0bc467b2fe6735f21a5f8d9d3ec5ceaf6c4d3be2 (patch)
tree27da88b712357c20d8e2980bb580fa554ce3c594 /Master/texmf-dist/tex
parent302715d312e974c8fa6ed085e507b77d7dca6636 (diff)
derivative (9jul22)
git-svn-id: svn://tug.org/texlive/trunk@63850 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex')
-rw-r--r--Master/texmf-dist/tex/latex/derivative/derivative.sty770
1 files changed, 359 insertions, 411 deletions
diff --git a/Master/texmf-dist/tex/latex/derivative/derivative.sty b/Master/texmf-dist/tex/latex/derivative/derivative.sty
index a26080b4318..4e9a8308c2b 100644
--- a/Master/texmf-dist/tex/latex/derivative/derivative.sty
+++ b/Master/texmf-dist/tex/latex/derivative/derivative.sty
@@ -1,5 +1,5 @@
% derivative.sty
-% Copyright 2019-2021 Simon Jensen
+% Copyright 2019-2022 Simon Jensen
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
@@ -15,9 +15,9 @@
\NeedsTeXFormat{LaTeX2e}
-\RequirePackage{expl3,xparse}[2018/05/09]
+\RequirePackage{expl3,xparse}[2021/11/07]
\RequirePackage{l3keys2e}
-\ProvidesExplPackage{derivative}{2021/06/03}{1.1}{Nice and easy derivatives and differentials for LaTeX}
+\ProvidesExplPackage{derivative}{2022/07/09}{1.2}{Nice and easy derivatives and differentials for LaTeX}
\bool_new:N \l__deriv_pkg_italic_bool
\bool_new:N \l__deriv_pkg_upright_bool
@@ -25,34 +25,34 @@
\keys_define:nn { deriv/pkg }
{
italic .choice:,
+ italic .usage:n = { load },
italic .default:n = { true },
italic / true .code:n =
- {
- \bool_set_true:N \l__deriv_pkg_italic_bool
- \bool_set_false:N \l__deriv_pkg_upright_bool
- },
+ {
+ \bool_set_true:N \l__deriv_pkg_italic_bool
+ \bool_set_false:N \l__deriv_pkg_upright_bool
+ },
italic / false .code:n =
- {
- \bool_set_false:N \l__deriv_pkg_italic_bool
- \bool_set_true:N \l__deriv_pkg_upright_bool
- },
- italic / unknown .code:n =
- { \msg_error:nnx { deriv } { boolean-values-only } \l_keys_key_str },
-
+ {
+ \bool_set_false:N \l__deriv_pkg_italic_bool
+ \bool_set_true:N \l__deriv_pkg_upright_bool
+ },
+ italic / unknown .code:n = { \msg_error:nnx { deriv } { boolean-values-only } \l_keys_key_str },
+
upright .choice:,
+ upright .usage:n = { load },
upright .default:n = { true },
upright / true .code:n =
- {
- \bool_set_true:N \l__deriv_pkg_upright_bool
- \bool_set_false:N \l__deriv_pkg_italic_bool
- },
+ {
+ \bool_set_true:N \l__deriv_pkg_upright_bool
+ \bool_set_false:N \l__deriv_pkg_italic_bool
+ },
upright / false .code:n =
- {
- \bool_set_false:N \l__deriv_pkg_upright_bool
- \bool_set_true:N \l__deriv_pkg_italic_bool
- },
- upright / unknown .code:n =
- { \msg_error:nnx { deriv } { boolean-values-only } \l_keys_key_str },
+ {
+ \bool_set_false:N \l__deriv_pkg_upright_bool
+ \bool_set_true:N \l__deriv_pkg_italic_bool
+ },
+ upright / unknown .code:n = { \msg_error:nnx { deriv } { boolean-values-only } \l_keys_key_str },
upright .initial:n = true,
}
@@ -60,33 +60,15 @@
%%%%% Useful conditionals %%%%%
-\prg_new_conditional:Npnn \__deriv_if_pkg:n #1 { p, TF }
-{
- \@ifpackageloaded{unicode-math}
- { \prg_return_true: }
- { \prg_return_false: }
-}
-
-\prg_new_conditional:Npnn \__deriv_if_novalue:n #1 { T , F , TF }
+\prg_new_conditional:Npnn \__deriv_if_value:n #1 { T, TF }
{
\tl_if_novalue:nTF {#1}
- { \prg_return_true: }
+ { \prg_return_false: }
{
\tl_if_blank:nTF {#1}
- { \prg_return_true: }
- { \prg_return_false: }
- }
-}
-
-\prg_new_conditional:Npnn \__deriv_if_novalue_and:nn #1 #2 { F, TF }
-{
- \__deriv_if_novalue:nTF {#1}
- {
- \__deriv_if_novalue:nTF {#2}
- { \prg_return_true: }
- { \prg_return_false: }
+ { \prg_return_false: }
+ { \prg_return_true: }
}
- { \prg_return_false: }
}
\prg_new_conditional:Npnn \__deriv_show_order:N #1 { T, TF }
@@ -96,67 +78,35 @@
{ \prg_return_true: }
}
-\cs_new:Npn \__deriv_case:n #1
-{ \exp:w \__deriv_case_begin:nTF {#1} { } { } }
-
-\cs_new:Npn \__deriv_case:nT #1#2
-{ \exp:w \__deriv_case_begin:nTF {#1} {#2} { } }
-
-\cs_new:Npn \__deriv_case:nF #1#2
-{ \exp:w \__deriv_case_begin:nTF {#1} { } {#2} }
-
-\cs_new:Npn \__deriv_case:nTF #1
-{ \exp:w \__deriv_case_begin:nTF {#1} }
-
-\cs_new:Npn \__deriv_case_begin:nTF #1#2#3
-{ \__deriv_case:w #1 \c_true_bool { } \q_mark {#2} \q_mark {#3} \q_stop }
-
-\cs_new:Npn \__deriv_case:w #1#2
-{
- \bool_if:nTF {#1}
- { \__deriv_case_end:nw {#2} }
- { \__deriv_case:w }
-}
-
-\cs_new:Npn \__deriv_case_end:nw #1#2#3 \q_mark #4#5 \q_stop
-{ \exp_end: #1 #4 }
-
%%%%% Variables: derivatives %%%%%
-\tl_new:N \l__deriv_cs_name_tl
-\tl_new:N \l__deriv_derivset_tl
+\tl_new:N \l__deriv_dv_denom_tl
-\seq_new:N \l__deriv_new_var_seq
-\seq_new:N \l__deriv_rubber_seq
+\seq_new:N \l__deriv_dv_var_seq
+\seq_new:N \l__deriv_dv_order_seq
-\prop_new:N \l__deriv_tmp_keys_prop
-\seq_new:N \l__deriv_tmp_keys_seq
-\tl_new:N \l__deriv_tmp_keys_tl
+\seq_new:N \l__deriv_dv_variant_seq
%%%%% Variables: differential %%%%%
\seq_new:N \l__deriv_i_var_seq
-\seq_new:N \l__deriv_i_orders_seq
-\tl_new:N \l__deriv_i_tmpa_tl
+\seq_new:N \l__deriv_i_order_seq
\tl_new:N \l__deriv_i_denom_tl
\seq_new:N \l__deriv_i_variant_seq
%%%%% Variables: other %%%%%
-
-\seq_new:N \l__deriv_dv_variant_seq
-\seq_new:N \l__deriv_add_var_bool_seq
+\tl_new:N \l__deriv_cs_name_tl
+\tl_new:N \l__deriv_derivset_tl
\tl_new:N \l__deriv_tmpa_tl
\tl_new:N \l__deriv_tmpb_tl
\tl_new:N \l__deriv_tmpc_tl
\seq_new:N \l__deriv_tmpa_seq
-\tl_new:N \l__deriv_dv_denom_tl
-
-\seq_new:N \l__deriv_dv_var_seq
-\seq_new:N \l__deriv_dv_order_seq
-\seq_new:N \l__deriv_dv_mo_seq
+\seq_new:N \l__deriv_new_var_seq
+\seq_new:N \l__deriv_rubber_seq
+\seq_new:N \l__deriv_add_var_bool_seq
\int_new:N \l__deriv_vmo_int
@@ -168,27 +118,20 @@
\seq_new:N \l__deriv_input_seq
\seq_new:N \l__deriv_extract_seq
-\seq_new:N \l__deriv_unsorted_seq
+\seq_new:N \l__deriv_permutation_seq
\seq_new:N \l__deriv_sorted_seq
-
\seq_new:N \l__deriv_symbol_seq
\seq_new:N \l__deriv_number_seq
-\seq_new:N \l__deriv_rebuild_seq
+\int_new:N \l__deriv_var_count_int
\int_new:N \l__deriv_tmpa_int
\int_new:N \l__deriv_tmpb_int
\int_new:N \l__deriv_numerical_int
-\int_new:N \l__deriv_sort_counter_int
\int_new:N \l__deriv_sort_max_int
-\int_new:N \l__deriv_position_int
-\int_new:N \l__deriv_rebuild_int
-
-\bool_new:N \l__deriv_tmpa_bool
-
-\regex_const:Nn \c__deriv_pattern_regex { \A([\+\-]?\d*)(.*) }
\regex_const:Nn \c__deriv_cs_numbers_regex { \A\-?\d+(?:,\d+){0,2}\Z }
+\tl_const:Nn \c__deriv_digits_tl {-1234567890}
%%%%% default values %%%%%
@@ -223,12 +166,14 @@
sep-eval-sp = 0,
switch-* = false,
switch-/ = false,
+ switch-sort = true,
sort-method = {sign, symbol, abs},
sort-numerical = auto,
sort-abs-reverse = false,
sort-number-reverse = false,
sort-sign-reverse = false,
sort-symbol-reverse = false,
+ sort-lexical-reverse = false,
fun = false,
frac = false,
var = none,
@@ -286,16 +231,16 @@
\keys_define:nn { deriv/dv/#1 }
{
style-inf .tl_set:c = { l__deriv_dv_#1_style_inf_tl },
- style-var .tl_set:c = { l__deriv_dv_#1_style_var_tl },
+ style-var .code:n = { \__deriv_set_style_var:nn {#1} {##1} },
style-frac .cs_set:cp = { __deriv_dv_#1_style_frac:nn } {##1},
style-frac-/ .cs_set:cp = { __deriv_dv_#1_style_frac_slash:nn } {##1},
- scale-eval .choices:nn = { auto, none, big, Big, bigg, Bigg } { \tl_set:cn { l__deriv_dv_#1_scale_eval_tl } {##1} },
- scale-eval-/ .choices:nn = { auto, none, big, Big, bigg, Bigg } { \tl_set:cn { l__deriv_dv_#1_scale_eval_slash_tl } {##1} },
- scale-fun .choices:nn = { auto, none, big, Big, bigg, Bigg } { \tl_set:cn { l__deriv_dv_#1_scale_fun_tl } {##1} },
- scale-var .choices:nn = { auto, none, big, Big, bigg, Bigg } { \tl_set:cn { l__deriv_dv_#1_scale_var_tl } {##1} },
- scale-frac .choices:nn = { auto, none, big, Big, bigg, Bigg } { \tl_set:cn { l__deriv_dv_#1_scale_frac_tl } {##1} },
- scale-frac-/ .choices:nn = { auto, none, big, Big, bigg, Bigg } { \tl_set:cn { l__deriv_dv_#1_scale_frac_slash_tl } {##1} },
+ scale-eval .choices:nn = { auto, none, big, Big, bigg, Bigg } { \__deriv_set_scale:nnn {dv_#1} {##1} { eval } },
+ scale-eval-/ .choices:nn = { auto, none, big, Big, bigg, Bigg } { \__deriv_set_scale:nnn {dv_#1} {##1} { eval_slash } },
+ scale-fun .choices:nn = { auto, none, big, Big, bigg, Bigg } { \__deriv_set_scale:nnn {dv_#1} {##1} { fun } },
+ scale-var .choices:nn = { auto, none, big, Big, bigg, Bigg } { \__deriv_set_scale:nnn {dv_#1} {##1} { var } },
+ scale-frac .choices:nn = { auto, none, big, Big, bigg, Bigg } { \__deriv_set_scale:nnn {dv_#1} {##1} { frac } },
+ scale-frac-/ .choices:nn = { auto, none, big, Big, bigg, Bigg } { \__deriv_set_scale:nnn {dv_#1} {##1} { frac_slash } },
delims-eval .tl_set:c = { l__deriv_dv_#1_delims_eval_tl },
delims-eval-/ .tl_set:c = { l__deriv_dv_#1_delims_eval_slash_tl },
@@ -318,6 +263,7 @@
switch-* .bool_set:c = { l__deriv_dv_#1_switch_star_bool },
switch-/ .bool_set:c = { l__deriv_dv_#1_switch_slash_bool },
+ switch-sort .bool_set:c = { l__deriv_dv_#1_switch_sort_bool },
fun .bool_set:c = { l__deriv_dv_#1_misc_fun_bool },
frac .bool_set:c = { l__deriv_dv_#1_misc_frac_bool },
@@ -329,27 +275,94 @@
mixed-order .tl_set:c = { l__deriv_dv_#1_misc_mixed_order_tl },
mixord .tl_set:c = { l__deriv_dv_#1_misc_mixed_order_tl },
- sort-method .clist_set:c = { l__deriv_dv_#1_sort_method_clist },
+ sort-method .code:n = { \__deriv_set_sort_method:nn {#1} {##1} },
sort-numerical .choices:nn = { auto, first, last, symbolic } { \tl_set:cn { l__deriv_dv_#1_sort_numerical_tl } {##1} },
- sort-abs-reverse .bool_set:c = { l__deriv_dv_#1_sort_abs_reverse_bool },
- sort-number-reverse .bool_set:c = { l__deriv_dv_#1_sort_number_reverse_bool },
- sort-sign-reverse .bool_set:c = { l__deriv_dv_#1_sort_sign_reverse_bool },
- sort-symbol-reverse .bool_set:c = { l__deriv_dv_#1_sort_symbol_reverse_bool }
+ sort-abs-reverse .bool_set:c = { l__deriv_dv_#1_sort_abs_reverse_bool },
+ sort-number-reverse .bool_set:c = { l__deriv_dv_#1_sort_number_reverse_bool },
+ sort-sign-reverse .bool_set:c = { l__deriv_dv_#1_sort_sign_reverse_bool },
+ sort-symbol-reverse .bool_set:c = { l__deriv_dv_#1_sort_symbol_reverse_bool },
+ sort-lexical-reverse .bool_set:c = { l__deriv_dv_#1_sort_lexical_reverse_bool },
+ }
+}
+% variant, value
+\cs_new:Npn \__deriv_set_sort_method:nn #1 #2
+{
+ \seq_clear:c { l__deriv_dv_#1_sort_method_seq }
+ \seq_set_from_clist:Nn \l__deriv_tmpa_seq {#2}
+ \seq_map_indexed_inline:Nn \l__deriv_tmpa_seq
+ {
+ \str_case:nn {##2}
+ {
+ { sign } { \seq_put_right:cn { l__deriv_dv_#1_sort_method_seq } { \__deriv_sort_sign:n } }
+ { symbol } { \seq_put_right:cn { l__deriv_dv_#1_sort_method_seq } { \__deriv_sort_symbol:n } }
+ { abs } { \seq_put_right:cn { l__deriv_dv_#1_sort_method_seq } { \__deriv_sort_abs:n } }
+ { number } { \seq_put_right:cn { l__deriv_dv_#1_sort_method_seq } { \__deriv_sort_number:n } }
+ { lexical } { \seq_put_right:cn { l__deriv_dv_#1_sort_method_seq } { \__deriv_sort_lexical:n } }
+ }
+ \int_compare:nNnT {##1} = { 3 } { \seq_map_break: }
+ }
+}
+% variant, value
+\cs_new:Npn \__deriv_set_style_var:nn #1 #2
+{
+ \str_case:nn {#2}
+ {
+ { single } { \tl_set:cn { l__deriv_dv_#1_style_var_tl } { \__deriv_dv_build_single:NNNn } }
+ { multiple } { \tl_set:cn { l__deriv_dv_#1_style_var_tl } { \__deriv_dv_build_multiple:NNNn } }
+ }
+}
+% varaint, value, name
+\cs_new:Npn \__deriv_set_style_notation:nnn #1 #2 #3
+{
+ \str_case:nn {#2}
+ {
+ { single } { \tl_set:cn { l__deriv_i_#1_style_notation#3_tl } { \__deriv_i_build_single:NNNnn } }
+ { multiple } { \tl_set:cn { l__deriv_i_#1_style_notation#3_tl } { \__deriv_i_build_multiple:NNNnn } }
+ { mixed } { \tl_set:cn { l__deriv_i_#1_style_notation#3_tl } { \__deriv_i_build_mixed:NNNnn } }
+ }
+}
+% dv_variant, scale, name
+\cs_new:Npn \__deriv_set_scale:nnn #1 #2 #3
+{
+ \str_case:nnF {#2}
+ {
+ { auto } { \tl_set:cn { l__deriv_#1_scale_#3_tl } { \__deriv_scale_auto:nnn } }
+ { none } { \tl_set:cn { l__deriv_#1_scale_#3_tl } { \__deriv_scale_none:nnn } }
+ }
+ { \tl_set:cn { l__deriv_#1_scale_#3_tl } { \__deriv_scale_big:nnnn {#2} } }
+}
+% muskip, tl
+\cs_new:Npn \__deriv_set_rubber_length:Nn #1 #2
+{
+ \regex_match:NnTF \c__deriv_cs_numbers_regex {#2}
+ {
+ \str_case:nnF {#2}
+ {
+ { 0 } { \tl_clear:N #1 }
+ { 0,0 } { \tl_clear:N #1 }
+ { 0,0,0 } { \tl_clear:N #1 }
+ }
+ {
+ \seq_set_split:Nnn \l__deriv_rubber_seq { , } {#2}
+ \tl_set:Nf #1 { \seq_use:Nnnn \l__deriv_rubber_seq { mu plus } { mu plus } { mu minus } mu }
+ \tl_put_left:Nn #1 { \mskip }
+ }
}
+ { \tl_set:Nn #1 {#2} }
}
%%%%%% Key-val: derivatives %%%%%%
-
+% variant
\cs_new:Npn \__deriv_i_define_keys:n #1
{
\keys_define:nn { deriv/i/#1 }
{
style-inf .tl_set:c = { l__deriv_i_#1_style_inf_tl },
- style-notation .tl_set:c = { l__deriv_i_#1_style_notation_tl },
- style-notation-* .tl_set:c = { l__deriv_i_#1_style_notation_star_tl },
+ style-notation .code:n = { \__deriv_set_style_notation:nnn {#1} {##1} {} },
+ style-notation-* .code:n = { \__deriv_set_style_notation:nnn {#1} {##1} { _star } },
- scale-var .choices:nn = { auto, none, big, Big, bigg, Bigg } { \tl_set:cn { l__deriv_i_#1_scale_var_tl } {##1} },
- scale-var-* .choices:nn = { auto, none, big, Big, bigg, Bigg } { \tl_set:cn { l__deriv_i_#1_scale_var_star_tl } {##1} },
+ scale-var .choices:nn = { auto, none, big, Big, bigg, Bigg } { \__deriv_set_scale:nnn {i_#1} {##1} { var } },
+ scale-var-* .choices:nn = { auto, none, big, Big, bigg, Bigg } { \__deriv_set_scale:nnn {i_#1} {##1} { var_slash } },
delims-var .tl_set:c = { l__deriv_i_#1_delims_var_tl },
delims-var-* .tl_set:c = { l__deriv_i_#1_delims_var_star_tl },
@@ -430,9 +443,6 @@
{ \__deriv_preamble_aux:Vnn #1 { style-inf={#3} } {#5} }
{ \__deriv_preamble_aux:Vnn #1 { style-inf={#3}, #4} {#5} }
}
-% variant, inf, dv/i
-\cs_new_protected:Npn \deriv_set_style_inf:nnn #1 #2 #3
-{ \__deriv_set_default:nnn {#1} { style-inf = {#2} } {#3} }
% variant, key-value, dv/i
\cs_new_protected:Npn \__deriv_preamble_aux:nnn #1 #2 #3
{
@@ -459,10 +469,10 @@
\__deriv_new:nnnn { tl } {dv_#1} { scale } { eval, eval_slash, fun, var, frac, frac_slash }
\__deriv_new:nnnn { tl } {dv_#1} { delims } { eval, eval_slash, fun, var, frac, frac_slash }
\__deriv_new:nnnn { tl } {dv_#1} { sep } { inf_ord, inf_fun, ord_fun, frac_fun, inf_var, var_ord, var_inf, ord_inf, eval_sb, eval_sp }
- \__deriv_new:nnnn { bool } {dv_#1} { switch } { star, slash }
- \__deriv_new:nnnn { clist } {dv_#1} { sort } { method }
+ \__deriv_new:nnnn { bool } {dv_#1} { switch } { star, slash, sort }
+ \__deriv_new:nnnn { seq } {dv_#1} { sort } { method }
\__deriv_new:nnnn { tl } {dv_#1} { sort } { numerical }
- \__deriv_new:nnnn { bool } {dv_#1} { sort } { abs_reverse, sign_reverse, symbol_reverse, number_reverse }
+ \__deriv_new:nnnn { bool } {dv_#1} { sort } { abs_reverse, sign_reverse, symbol_reverse, number_reverse, lexical_reverse }
\__deriv_new:nnnn { bool } {dv_#1} { misc } { fun, frac }
\__deriv_new:nnnn { clist } {dv_#1} { misc } { var }
@@ -489,30 +499,17 @@
{
\tl_if_novalue:nTF {#2}
{ \prop_set_eq:cc { l__deriv_#3_#1_user_keys_prop } { c__deriv_#3_pkg_keys_prop } }
- { \__deriv_update_prop:cn { l__deriv_#3_#1_user_keys_prop } {#2} }
+ { \prop_put_from_keyval:cn { l__deriv_#3_#1_user_keys_prop } {#2} }
- \__deriv_set_default_from_prop:Nc \l__deriv_tmp_keys_tl { l__deriv_#3_#1_user_keys_prop }
- \__deriv_set_default_aux:Vnn \l__deriv_tmp_keys_tl {#1} {#3}
-}
-% user-prop, key-val
-\cs_new_protected:Npn \__deriv_update_prop:Nn #1 #2
-{
- \prop_set_from_keyval:Nn \l__deriv_tmp_keys_prop {#2}
- \prop_map_inline:Nn \l__deriv_tmp_keys_prop { \prop_put:Nnn #1 {##1} {##2} }
-}
-% user-prop
-\cs_new_protected:Npn \__deriv_set_default_from_prop:NN #1 #2
-{
- \seq_clear:N \l__deriv_tmp_keys_seq
- \prop_map_inline:Nn #2 { \seq_put_right:Nn \l__deriv_tmp_keys_seq { ##1 = {##2} } }
- \tl_set:Nx #1 { \seq_use:Nn \l__deriv_tmp_keys_seq { , } }
+ \__deriv_set_default_auxi:cnn { l__deriv_#3_#1_user_keys_prop } {#1} {#3}
+ \keys_set:nn { deriv/#3/#1 } { default }
}
+% prop-key-val, variant, dv/i
+\cs_new_protected:Npn \__deriv_set_default_auxi:Nnn #1 #2 #3
+{ \__deriv_set_default_auxii:fnn { \prop_to_keyval:N #1 } {#2} {#3} }
% key-val, variant, dv/i
-\cs_new_protected:Npn \__deriv_set_default_aux:nnn #1 #2 #3
-{
- \keys_define:nn { deriv/#3/#2 } { default .meta:n = {#1} }
- \keys_set:nn { deriv/#3/#2 } { default }
-}
+\cs_new_protected:Npn \__deriv_set_default_auxii:nnn #1 #2 #3
+{ \keys_define:nn { deriv/#3/#2 } { default .meta:n = {#1} } }
% new/delare/renew/provide, variant, macro
\cs_new_protected:Npn \deriv_dv_define:Nnn #1 #2 #3
{
@@ -608,7 +605,8 @@
{ \__deriv_dv_denominator:n {#1} }
}
}
-}% variant, function
+}
+% variant, function
\cs_new_protected:Npn \__deriv_dv_numerator_fun:nn #1 #2
{
\__deriv_insert_inf:n {#1}
@@ -636,28 +634,18 @@
\seq_set_from_clist:Nn \l__deriv_dv_var_seq {#3}
\seq_set_from_clist:Nc \l__deriv_dv_order_seq { l__deriv_#2_misc_order_clist }
- \__deriv_dv_choose_var:NNNn \l__deriv_dv_var_seq \l__deriv_dv_order_seq #1 {#2}
-}
-% var-seq, order-seq, denom-tl, variant
-\cs_new_protected:Npn \__deriv_dv_choose_var:NNNn #1 #2 #3 #4
-{
- \exp_args:Nv
- \str_case:nn { l__deriv_#4_style_var_tl }
- {
- { single } { \__deriv_dv_build_single:NNNn #1 #2 #3 {#4} }
- { multiple } { \__deriv_dv_build_multiple:NNNn #1 #2 #3 {#4} }
- }
+ \tl_use:c { l__deriv_#2_style_var_tl } \l__deriv_dv_var_seq \l__deriv_dv_order_seq #1 {#2}
}
% var_seq, order_seq, denom-tl, variant
\cs_new_protected:Npn \__deriv_dv_build_multiple:NNNn #1 #2 #3 #4
{
- \int_set:Nn \l__deriv_tmpa_int { \seq_count:N #1 }
- \__deriv_adjust_ord_seq:NN #1 #2
+ \int_set:Nn \l__deriv_var_count_int { \seq_count:N #1 }
+ \__deriv_adjust_ord_seq:NN \l__deriv_var_count_int #2
\str_if_eq:cNT { l__deriv_#4_misc_mixed_order_tl } 1
{ \__deriv_mixed_order:cNn { l__deriv_#4_misc_mixed_order_tl } #2 {#4} }
- \__deriv_var_bool_seq:cNN { l__deriv_#4_misc_var_clist } \l__deriv_tmpa_seq \l__deriv_tmpa_int
+ \__deriv_var_bool_seq:cNN { l__deriv_#4_misc_var_clist } \l__deriv_tmpa_seq \l__deriv_var_count_int
\seq_map_indexed_inline:Nn #1
{
@@ -671,11 +659,11 @@
\__deriv_show_order:NTF \l__deriv_tmpa_tl
{
\__deriv_insert_ord:Nnn \l__deriv_tmpa_tl {#4} { var_ord }
- \int_compare:nNnF {##1} = { \l__deriv_tmpa_int }
+ \int_compare:nNnF {##1} = { \l__deriv_var_count_int }
{ \__deriv_insert_mskip:nn {#4} { ord_inf } }
}
{
- \int_compare:nNnF {##1} = { \l__deriv_tmpa_int }
+ \int_compare:nNnF {##1} = { \l__deriv_var_count_int }
{ \__deriv_insert_mskip:nn {#4} { var_inf } }
}
}
@@ -684,10 +672,10 @@
% var_seq, order_seq, denom-tl, variant
\cs_new_protected:Npn \__deriv_dv_build_single:NNNn #1 #2 #3 #4
{
- \int_set:Nn \l__deriv_tmpa_int { \seq_count:N #1 }
- \tl_set:Nx \l__deriv_tmpa_tl { \seq_use:Nn #1 { \__deriv_insert_mskip:nn {#4} { var_var } } }
+ \int_set:Nn \l__deriv_var_count_int { \seq_count:N #1 }
+ \tl_set:Nf \l__deriv_tmpa_tl { \seq_use:Nn #1 { \__deriv_insert_mskip:nn {#4} { var_var } } }
- \__deriv_var_bool_seq:cNN { l__deriv_#4_misc_var_clist } \l__deriv_tmpa_seq \l__deriv_tmpa_int
+ \__deriv_var_bool_seq:cNN { l__deriv_#4_misc_var_clist } \l__deriv_tmpa_seq \l__deriv_var_count_int
\seq_pop_left:NN #2 \l__deriv_tmpb_tl
\seq_pop_left:NN \l__deriv_tmpa_seq \l__deriv_tmpc_tl
@@ -705,19 +693,12 @@
% var_seq, order_seq
\cs_new_protected:Npn \__deriv_adjust_ord_seq:NN #1 #2
{
- \int_set:Nn \l__deriv_vmo_int { \seq_count:N #1 - \seq_count:N #2 }
-
+ \int_set:Nn \l__deriv_vmo_int { #1 - \seq_count:N #2 }
\int_compare:nNnF { \l__deriv_vmo_int } = { 0 }
{
\int_compare:nNnTF { \l__deriv_vmo_int } < { 0 }
- {
- \int_step_inline:nn { -1 * \l__deriv_vmo_int }
- { \seq_pop_right:NN #2 \l__deriv_tmpa_tl }
- }
- {
- \int_step_inline:nn { \l__deriv_vmo_int }
- { \seq_put_right:Nn #2 { 1 } }
- }
+ { \int_step_inline:nn { -1*\l__deriv_vmo_int } { \seq_pop_right:NN #2 \l__deriv_tmpa_tl } }
+ { \int_step_inline:nn { \l__deriv_vmo_int } { \seq_put_right:Nn #2 { 1 } } }
}
}
% avd-clist, bool-seq, count
@@ -725,16 +706,10 @@
{
\seq_clear:N #2
\clist_if_in:NnTF #1 { all }
- {
- \exp_args:NNx
- \seq_set_from_clist:Nn #2 { \prg_replicate:nn {#3} { \c_true_bool , } }
- }
+ { \exp_args:NNf \seq_set_from_clist:Nn #2 { \prg_replicate:nn {#3} { \c_true_bool , } } }
{
\clist_if_in:NnTF #1 { none }
- {
- \exp_args:NNx
- \seq_set_from_clist:Nn #2 { \prg_replicate:nn {#3} { \c_false_bool , } }
- }
+ { \exp_args:NNf \seq_set_from_clist:Nn #2 { \prg_replicate:nn {#3} { \c_false_bool , } } }
{
\int_step_inline:nn {#3}
{
@@ -749,7 +724,6 @@
\cs_new_protected:Npn \__deriv_adjust_trailing_ord:NN #1 #2
{
\seq_clear:N \l__deriv_tmpa_seq
- \bool_set_false:N \l__deriv_tmpa_bool
\int_set:Nn \l__deriv_vmo_int { \seq_count:N #2 - \seq_count:N #1 }
\int_compare:nNnT { \l__deriv_vmo_int } < { 0 }
@@ -758,21 +732,15 @@
{ \seq_pop_right:NN #1 \l__deriv_tmpa_tl }
}
- \seq_reverse:N #1
- \seq_map_inline:Nn #1
+ \int_step_inline:nn { \seq_count:N #1 }
{
- \bool_if:NTF \l__deriv_tmpa_bool
- { \seq_put_right:Nn \l__deriv_tmpa_seq {##1} }
+ \seq_pop_right:NN #1 \l__deriv_tmpa_tl
+ \str_if_eq:VnF \l__deriv_tmpa_tl { 1 }
{
- \str_if_eq:nnF {##1} { 1 }
- {
- \seq_put_right:Nn \l__deriv_tmpa_seq {##1}
- \bool_set_true:N \l__deriv_tmpa_bool
- }
+ \seq_put_right:NV #1 \l__deriv_tmpa_tl
+ \prg_break:
}
}
- \seq_set_eq:NN #1 \l__deriv_tmpa_seq
- \seq_reverse:N #1
}
%%%%% infinisimal definition %%%%%
@@ -803,27 +771,16 @@
\seq_set_from_clist:Nn \l__deriv_i_var_seq {#3}
\seq_set_from_clist:Nc \l__deriv_i_order_seq { l__deriv_#2_misc_order_clist }
- \__deriv_i_choose_build:NNNnn \l__deriv_i_var_seq \l__deriv_i_order_seq #1 {#2} {#4}
-}
-% var-seq, order-seq, print-tl, variant, if star
-\cs_new_protected:Npn \__deriv_i_choose_build:NNNnn #1 #2 #3 #4 #5
-{
- \exp_args:Nv
- \str_case:nn { l__deriv_#4_style_notation#5_tl }
- {
- { single } { \__deriv_i_build_single:NNNnn #1 #2 #3 {#4} {#5} }
- { multiple } { \__deriv_i_build_multiple:NNNnn #1 #2 #3 {#4} {#5} }
- { mixed } { \__deriv_i_build_mixed:NNNnn #1 #2 #3 {#4} {#5} }
- }
+ \tl_use:c { l__deriv_#2_style_notation#4_tl } \l__deriv_i_var_seq \l__deriv_i_order_seq #1 {#2} {#4}
}
% var-seq, order-seq, print-tl, variant, if star
\cs_new_protected:Npn \__deriv_i_build_single:NNNnn #1 #2 #3 #4 #5
{
- \int_set:Nn \l__deriv_tmpa_int { \seq_count:N #1 }
- \__deriv_var_bool_seq:cNN { l__deriv_#4_misc_var_clist } \l__deriv_add_var_bool_seq \l__deriv_tmpa_int
+ \int_set:Nn \l__deriv_var_count_int { \seq_count:N #1 }
+ \__deriv_var_bool_seq:cNN { l__deriv_#4_misc_var_clist } \l__deriv_add_var_bool_seq \l__deriv_var_count_int
\__deriv_adjust_trailing_ord:NN #2 #1
- \int_set:Nn \l__deriv_tmpb_int { \seq_count:N #2 }
+ \int_set:Nn \l__deriv_tmpa_int { \seq_count:N #2 }
\seq_map_indexed_inline:Nn #1
{
@@ -831,7 +788,7 @@
\tl_put_right:Nx \l__deriv_tmpb_tl
{
\__deriv_insert_var:Nnnn \l__deriv_tmpa_tl {##2} {#4} {#5}
- \int_compare:nNnF {##1} = { \l__deriv_tmpa_int }
+ \int_compare:nNnF {##1} = { \l__deriv_var_count_int }
{ \__deriv_insert_mskip:nn {#4} { var_var } }
}
}
@@ -840,7 +797,7 @@
\tl_put_right:Nx \l__deriv_tmpc_tl
{
\exp_not:n {##2}
- \int_compare:nNnF {##1} = { \l__deriv_tmpb_int }
+ \int_compare:nNnF {##1} = { \l__deriv_tmpa_int }
{ \__deriv_insert_mskip:nn {#4} { ord_ord } }
}
}
@@ -865,9 +822,9 @@
% var-seq, order-seq, print-tl, variant
\cs_new_protected:Npn \__deriv_i_build_multiple:NNNnn #1 #2 #3 #4 #5
{
- \int_set:Nn \l__deriv_tmpa_int { \seq_count:N #1 }
- \__deriv_var_bool_seq:cNN { l__deriv_#4_misc_var_clist } \l__deriv_add_var_bool_seq \l__deriv_tmpa_int
- \__deriv_adjust_ord_seq:NN #1 #2
+ \int_set:Nn \l__deriv_var_count_int { \seq_count:N #1 }
+ \__deriv_var_bool_seq:cNN { l__deriv_#4_misc_var_clist } \l__deriv_add_var_bool_seq \l__deriv_var_count_int
+ \__deriv_adjust_ord_seq:NN \l__deriv_var_count_int #2
\seq_map_indexed_inline:Nn #1
{
@@ -884,7 +841,7 @@
{ \__deriv_insert_mskip:nn {#4} { inf_var } }
\__deriv_insert_var:Nnnn \l__deriv_tmpb_tl {##2} {#4} {#5}
- \int_compare:nNnF {##1} = { \l__deriv_tmpa_int }
+ \int_compare:nNnF {##1} = { \l__deriv_var_count_int }
{ \__deriv_insert_mskip:nn {#4} { var_inf } }
}
}
@@ -892,9 +849,9 @@
% var-seq, order-seq, print-tl, variant
\cs_new_protected:Npn \__deriv_i_build_mixed:NNNnn #1 #2 #3 #4 #5
{
- \int_set:Nn \l__deriv_tmpa_int { \seq_count:N #1 }
- \__deriv_var_bool_seq:cNN { l__deriv_#4_misc_var_clist } \l__deriv_add_var_bool_seq \l__deriv_tmpa_int
- \__deriv_adjust_ord_seq:NN #1 #2
+ \int_set:Nn \l__deriv_var_count_int { \seq_count:N #1 }
+ \__deriv_var_bool_seq:cNN { l__deriv_#4_misc_var_clist } \l__deriv_add_var_bool_seq \l__deriv_var_count_int
+ \__deriv_adjust_ord_seq:NN \l__deriv_var_count_int #2
\seq_map_indexed_inline:Nn #1
{
@@ -910,7 +867,7 @@
\__deriv_insert_mskip:nn {#4} { inf_var }
\__deriv_insert_var:Nnnn \l__deriv_tmpb_tl {##2} {#4} {#5}
}
- \int_compare:nNnF {##1} = { \l__deriv_tmpa_int }
+ \int_compare:nNnF {##1} = { \l__deriv_var_count_int }
{ \__deriv_insert_mskip:nn {#4} { var_inf } }
}
}
@@ -955,31 +912,7 @@
}
% dv, name
\cs_new:Npn \__deriv_insert_mskip:nn #1 #2
-{
- %[#2]
- \tl_if_empty:cF { l__deriv_#1_sep_#2_tl }
- { \exp_not:v { l__deriv_#1_sep_#2_tl } }
- %\exp_not:v { l__deriv_#1_sep_#2_tl }
-}
-% muskip, length
-\cs_new:Npn \__deriv_set_rubber_length:Nn #1 #2
-{
- \regex_match:NnTF \c__deriv_cs_numbers_regex {#2}
- {
- \str_case_e:nnF {#2}
- {
- { 0 } { \tl_clear:N #1 }
- { 0,0 } { \tl_clear:N #1 }
- { 0,0,0 } { \tl_clear:N #1 }
- }
- {
- \seq_set_split:Nnn \l__deriv_rubber_seq { , } {#2}
- \tl_set:Nf #1 { \seq_use:Nnnn \l__deriv_rubber_seq { mu plus } { mu plus } { mu minus } mu }
- \tl_put_left:Nn #1 { \mskip }
- }
- }
- { \tl_set:Nn #1 {#2} }
-}
+{ \exp_not:v { l__deriv_#1_sep_#2_tl } }
%%%%% Scale, delimiters, evaluation %%%%%
% variable
@@ -1009,63 +942,82 @@
% dv, sub, sup, code-for-fraction
\cs_new:Npn \__deriv_evaluation:nnnn #1 #2 #3 #4
{
- \__deriv_if_novalue_and:nnTF {#2} {#3}
- {#4}
+ \__deriv_if_value:nTF {#2}
{
\__deriv_add_delims:nnn {#1} { eval } {#4}
- \__deriv_if_novalue:nF {#2} { \sb{ \__deriv_insert_mskip:nn {#1} { eval_sb } #2 } }
- \__deriv_if_novalue:nF {#3} { \sp{ \__deriv_insert_mskip:nn {#1} { eval_sp } #3 } }
+ \sb{ \__deriv_insert_mskip:nn {#1} { eval_sb } #2 }
+ \__deriv_if_value:nT {#3}
+ { \sp{ \__deriv_insert_mskip:nn {#1} { eval_sp } #3 } }
+ }
+ {
+ \__deriv_if_value:nTF {#3}
+ {
+ \__deriv_add_delims:nnn {#1} { eval } {#4}
+ \sp{ \__deriv_insert_mskip:nn {#1} { eval_sp } #3 }
+ }
+ {#4}
}
}
% dv, sub, sup, code-for-fraction
\cs_new:Npn \__deriv_evaluation_slash:nnnn #1 #2 #3 #4
{
- \__deriv_if_novalue_and:nnTF {#2} {#3}
- {#4}
+ \__deriv_if_value:nTF {#2}
{
\__deriv_add_delims:nnn {#1} { eval_slash } {#4}
- \__deriv_if_novalue:nF {#2} { \sb{ \__deriv_insert_mskip:nn {#1} { eval_sb } #2 } }
- \__deriv_if_novalue:nF {#3} { \sp{ \__deriv_insert_mskip:nn {#1} { eval_sp } #3 } }
+ \sb{ \__deriv_insert_mskip:nn {#1} { eval_sb } #2 }
+ \__deriv_if_value:nT {#3}
+ { \sp{ \__deriv_insert_mskip:nn {#1} { eval_sp } #3 } }
+ }
+ {
+ \__deriv_if_value:nTF {#3}
+ {
+ \__deriv_add_delims:nnn {#1} { eval_slash } {#4}
+ \sp{ \__deriv_insert_mskip:nn {#1} { eval_sp } #3 }
+ }
+ {#4}
}
}
% dv, name, value
\cs_new:Npn \__deriv_add_delims:nnn #1 #2 #3
+{ \tl_use:c { l__deriv_#1_scale_#2_tl } {#1} {#2} {#3} }
+% dv, name, code
+\cs_new:Npn \__deriv_scale_auto:nnn #1 #2 #3
{
- \__deriv_scale:Nnnnn \__deriv_auto_left:n {#1} {#2} { 1 } { l }
+ \__deriv_auto_left:n \tl_item:cn { l__deriv_#1_delims_#2_tl } { 1 }
#3
- \__deriv_scale:Nnnnn \__deriv_auto_right:n {#1} {#2} { 2 } { r }
+ \__deriv_auto_right:n \tl_item:cn { l__deriv_#1_delims_#2_tl } { 2 }
}
-% dv, name
-\cs_new:Npn \__deriv_scale:Nnnnn #1 #2 #3 #4 #5
+% dv, name, code
+\cs_new:Npn \__deriv_scale_none:nnn #1 #2 #3
{
- \exp_args:Nv \str_case:nnF { l__deriv_#2_scale_#3_tl }
- {
- { auto } { \__deriv_scale_auto:Nnnn #1 {#2} {#3} {#4} }
- { none } { \__deriv_scale_none:nnn {#2} {#3} {#4} }
- }
- { \__deriv_scale_big:nnnn {#2} {#3} {#4} {#5} }
+ \__deriv_dont_use_dot:x { \tl_item:cn { l__deriv_#1_delims_#2_tl } { 1 } }
+ #3
+ \__deriv_dont_use_dot:x { \tl_item:cn { l__deriv_#1_delims_#2_tl } { 2 } }
}
-% left/right, variant, name, number
-\cs_new:Npn \__deriv_scale_auto:Nnnn #1 #2 #3 #4
-{ #1 \tl_item:cn { l__deriv_#2_delims_#3_tl } {#4} }
-% dv, name, number
-\cs_new:Npn \__deriv_scale_none:nnn #1 #2 #3
-{ \str_if_eq:cNF { l__deriv_#1_delims_#2_tl } . { \tl_item:cn { l__deriv_#1_delims_#2_tl } {#3} } }
-% dv, name, number, l/r
+% item
+\cs_new:Npn \__deriv_dont_use_dot:n #1
+{ \str_if_eq:nnF {#1} { . } {#1} }
+% dv, name, code
\cs_new:Npn \__deriv_scale_big:nnnn #1 #2 #3 #4
-{ \tl_use:c { \tl_use:c { l__deriv_#1_scale_#2_tl } #4 } { \tl_item:cn { l__deriv_#1_delims_#2_tl } {#3} } }
-
+{ \__deriv_scale_big_auxi:ncn {#1} { l__deriv_#2_delims_#3_tl } {#4} }
+% scaling, delims, code
+\cs_new:Npn \__deriv_scale_big_auxi:nNn #1 #2 #3
+{
+ \tl_use:c { #1 l } { \tl_item:Nn #2 { 1 } }
+ #3
+ \tl_use:c { #1 r } { \tl_item:Nn #2 { 2 } }
+}
%%%%% Calculation of mixed order %%%%%
-% mixed-order-tl, mixed-order-seq, variant
+% mixed-order-tl, order-seq, variant
\cs_new:Npn \__deriv_mixed_order:NNn #1 #2 #3
{
\__deriv_replace:NN \l__deriv_input_seq #2
- \__deriv_seq_counting:N \l__deriv_input_seq
- \__deriv_combine_seq:Nn \l__deriv_unsorted_seq {#3}
- \__deriv_sort:NNn \l__deriv_sorted_seq \l__deriv_unsorted_seq {#3}
+ \__deriv_seq_counting:NNN \l__deriv_symbol_seq \l__deriv_number_seq \l__deriv_input_seq
+ \__deriv_sort:NNNn \l__deriv_permutation_seq \l__deriv_symbol_seq \l__deriv_number_seq {#3}
+ \__deriv_combine_seq:NNNNn \l__deriv_sorted_seq \l__deriv_permutation_seq \l__deriv_symbol_seq \l__deriv_number_seq {#3}
\__deriv_output:NNNn #1 \l__deriv_sorted_seq \l__deriv_numerical_int {#3}
}
-% input-seq, mixed-order-seq
+% input-seq, order-seq
\cs_new_protected:Npn \__deriv_replace:NN #1 #2
{
\tl_set:Nf \l__deriv_input_tl { \seq_use:Nn #2 { , } }
@@ -1074,29 +1026,38 @@
\tl_replace_all:Nnn \l__deriv_input_tl { - } { ,- }
\tl_replace_all:Nnn \l__deriv_input_tl { + } { , }
- \exp_args:NNV \seq_set_from_clist:Nn #1 \l__deriv_input_tl
+ \seq_set_split:NnV #1 { , } \l__deriv_input_tl
+ \seq_remove_all:Nn #1 {}
}
-% input-seq
-\cs_new_protected:Npn \__deriv_seq_counting:N #1
+% symbol-seq, number-seq, input-seq
+\cs_new_protected:Npn \__deriv_seq_counting:NNN #1 #2 #3
{
- \seq_clear:N \l__deriv_symbol_seq
- \seq_clear:N \l__deriv_number_seq
+ \seq_clear:N #1
+ \seq_clear:N #2
- \seq_map_inline:Nn #1
+ \seq_map_inline:Nn #3
{
\__deriv_extract:NNn \l__deriv_sym_tmpa_tl \l__deriv_num_tmpa_tl {##1}
\seq_if_in:NVTF \l__deriv_symbol_seq \l__deriv_sym_tmpa_tl
- { \__deriv_update_seq:NN \l__deriv_sym_tmpa_tl \l__deriv_num_tmpa_tl }
- { \__deriv_add_to_seq:NN \l__deriv_sym_tmpa_tl \l__deriv_num_tmpa_tl }
+ { \__deriv_update_seq:NNNN #1 #2 \l__deriv_sym_tmpa_tl \l__deriv_num_tmpa_tl }
+ { \__deriv_add_to_seq:NNNN #1 #2 \l__deriv_sym_tmpa_tl \l__deriv_num_tmpa_tl }
}
}
% sym-tl, num-tl, seq-item
\cs_new_protected:Npn \__deriv_extract:NNn #1 #2 #3
{
- \regex_extract_once:NnN \c__deriv_pattern_regex {#3} \l__deriv_extract_seq
- \seq_pop_right:NN \l__deriv_extract_seq #1
- \seq_pop_right:NN \l__deriv_extract_seq #2
+ \int_zero:N \l__deriv_tmpa_int
+ \tl_map_inline:nn {#3}
+ {
+ \tl_if_in:NnTF \c__deriv_digits_tl {##1}
+ { \int_incr:N \l__deriv_tmpa_int }
+ { \tl_map_break: }
+ }
+
+ \tl_set:Nx #2 { \tl_range:nnn {#3} { 1 } \l__deriv_tmpa_int }
+ \int_incr:N \l__deriv_tmpa_int
+ \tl_set:Nx #1 { \tl_range:nnn {#3} \l__deriv_tmpa_int { -1 } }
\exp_args:NV \str_case:nn #2
{
@@ -1104,167 +1065,164 @@
{ - } { \tl_set:Nn #2 { -1 } }
}
}
-% unsorted-seq, variant
-\cs_new:Npn \__deriv_combine_seq:Nn #1 #2
+% sym-tl, num-tl
+\cs_new_protected:Npn \__deriv_add_to_seq:NNNN #1 #2 #3 #4
+{
+ \seq_put_right:NV #1 #3
+ \seq_put_right:NV #2 #4
+}
+% sym-tl, num-tl
+\cs_new_protected:Npn \__deriv_update_seq:NNNN #1 #2 #3 #4
+{
+ \seq_map_indexed_inline:Nn #1
+ {
+ \tl_if_eq:NnT #3 {##2}
+ {
+ \exp_args:NNnx
+ \seq_set_item:Nnn #2 {##1}
+ { \int_eval:n { \seq_item:Nn #2 {##1} + #4 } }
+ \seq_map_break:
+ }
+ }
+}
+% sorted-seq, permutation-seq, symbol-seq, number-seq, variant
+\cs_new:Npn \__deriv_combine_seq:NNNNn #1 #2 #3 #4 #5
{
\seq_clear:N #1
\int_zero:N \l__deriv_numerical_int
- \seq_map_inline:Nn \l__deriv_symbol_seq
+ \seq_map_inline:Nn #2
{
- \seq_pop_left:NN \l__deriv_number_seq \l__deriv_num_tmpa_tl
- \__deriv_eval_term:NVnn #1 \l__deriv_num_tmpa_tl {##1} {#2}
+ \tl_set:Nx \l__deriv_sym_tmpa_tl { \seq_item:Nn #3 {##1} }
+ \tl_set:Nx \l__deriv_num_tmpa_tl { \seq_item:Nn #4 {##1} }
+ \__deriv_eval_term:NVVn #1 \l__deriv_sym_tmpa_tl \l__deriv_num_tmpa_tl {#5}
}
}
-% unsorted-seq, num-tl, seq-item (sym), variant
+% sorted-seq, sym-tl, num-tl, variant
\cs_new_protected:Npn \__deriv_eval_term:Nnnn #1 #2 #3 #4
{
- \__deriv_case:nF
+ \tl_if_empty:nTF {#2}
+ { \__deriv_numerical_term:Nnn #1 {#3} {#4} }
{
- { \tl_if_empty_p:n {#3} } { \__deriv_numerical_term:Nnn #1 {#2} {#4} }
- { \int_compare_p:nNn {#2} = { 1 } } { \seq_put_left:Nn #1 {#3} }
- { \int_compare_p:nNn {#2} = { 0 } } { \prg_do_nothing: }
- { \int_compare_p:nNn {#2} = { -1 } } { \seq_put_left:Nn #1 { -#3 } }
+ \int_compare:nNnTF {#3} = { 1 }
+ { \seq_put_right:Nn #1 {#2} }
+ {
+ \int_compare:nNnTF {#3} = { 0 }
+ { \prg_do_nothing: }
+ {
+ \int_compare:nNnTF {#3} = { -1 }
+ { \seq_put_right:Nn #1 { -#2 } }
+ { \seq_put_right:Nn #1 {#3#2} }
+ }
+ }
}
- { \seq_put_left:Nn #1 {#2#3} }
}
-% unsorted-seq, num-tl, variant
+% sorted-seq, num-tl, variant
\cs_new_protected:Npn \__deriv_numerical_term:Nnn #1 #2 #3
{
\str_if_eq:vnTF { l__deriv_#3_sort_numerical_tl } { symbolic }
- { \seq_put_left:Nn #1 {#2} }
+ { \seq_put_right:Nn #1 {#2} }
{ \int_set:Nn \l__deriv_numerical_int {#2} }
}
-% sym-tl, num-tl
-\cs_new_protected:Npn \__deriv_add_to_seq:NN #1 #2
+% permutation-seq, symbol-seq, number-seq, variant
+\cs_new_protected:Npn \__deriv_sort:NNNn #1 #2 #3 #4
{
- \seq_put_left:NV \l__deriv_symbol_seq #1
- \seq_put_left:NV \l__deriv_number_seq #2
-}
-% sym-tl, num-tl
-\cs_new_protected:Npn \__deriv_update_seq:NN #1 #2
-{
- \__deriv_get_position:NN \l__deriv_position_int #1
- \__deriv_rebuild_seq:NNN \l__deriv_number_seq \l__deriv_position_int #2
-}
-% position-int, sym-tl
-\cs_new:Npn \__deriv_get_position:NN #1 #2
-{
- \int_zero:N #1
- \seq_map_inline:Nn \l__deriv_symbol_seq
- {
- \int_incr:N #1
- \exp_args:NV \tl_if_eq:nnT #2 {##1} { \seq_map_break: }
- }
-}
-% num-seq, position-int, num-tl
-\cs_new_protected:Npn \__deriv_rebuild_seq:NNN #1 #2 #3
-{
- \int_zero:N \l__deriv_rebuild_int
- \seq_clear:N \l__deriv_rebuild_seq
+ \seq_clear:N #1
+ \int_step_inline:nn { \seq_count:N #2 }
+ { \seq_put_right:Nn #1 {##1} }
- \seq_map_inline:Nn #1
+ \bool_if:cT { l__deriv_#4_switch_sort_bool }
{
- \int_incr:N \l__deriv_rebuild_int
- \int_compare:nNnTF \l__deriv_rebuild_int = #2
+ \int_set:Nn \l__deriv_sort_max_int { \seq_count:c { l__deriv_#4_sort_method_seq } }
+ \seq_sort:Nn #1
{
- \tl_set:Nf \l__deriv_num_tmpb_tl { \int_eval:n { ##1 + #3 } }
- \seq_put_right:NV \l__deriv_rebuild_seq \l__deriv_num_tmpb_tl
+ \tl_set:Nx \l__deriv_sym_tmpa_tl { \seq_item:Nn #2 {##1} }
+ \tl_set:Nx \l__deriv_sym_tmpb_tl { \seq_item:Nn #2 {##2} }
+ \tl_set:Nx \l__deriv_num_tmpa_tl { \seq_item:Nn #3 {##1} }
+ \tl_set:Nx \l__deriv_num_tmpb_tl { \seq_item:Nn #3 {##2} }
+
+ \__deriv_sort_method:cn { l__deriv_#4_sort_method_seq } {#4}
}
- { \seq_put_right:Nn \l__deriv_rebuild_seq {##1} }
- }
- \seq_set_eq:NN #1 \l__deriv_rebuild_seq
-}
-% sorted-seq, unsorted-seq, variant
-\cs_new_protected:Npn \__deriv_sort:NNn #1 #2 #3
-{
- \int_set:Nn \l__deriv_sort_max_int { \int_min:nn { 3 } { \clist_count:c { l__deriv_#3_sort_method_clist } } }
-
- \seq_sort:Nn #2
- {
- \__deriv_extract:NNn \l__deriv_sym_tmpa_tl \l__deriv_num_tmpa_tl {##1}
- \__deriv_extract:NNn \l__deriv_sym_tmpb_tl \l__deriv_num_tmpb_tl {##2}
- \int_zero:N \l__deriv_sort_counter_int
- \__deriv_sort_method:n {#3}
}
- \seq_set_eq:NN #1 #2
}
-% dv
-\cs_new_protected:Npn \__deriv_sort_method:n #1
+% method-seq, dv
+\cs_new_protected:Npn \__deriv_sort_method:Nn #1 #2
{
- \int_incr:N \l__deriv_sort_counter_int
-
- \exp_args:Nf
- \str_case:nn { \clist_item:cn { l__deriv_#1_sort_method_clist } { \l__deriv_sort_counter_int } }
+ \seq_map_indexed_inline:Nn #1
{
- { sign } { \__deriv_sort_sign:n {#1} }
- { symbol } { \__deriv_sort_symbol:n {#1} }
- { abs } { \__deriv_sort_abs:n {#1} }
- { number } { \__deriv_sort_number:n {#1} }
+ ##2 {#2}
+ \int_compare:nNnT {##1} = { \l__deriv_sort_max_int }
+ { \seq_map_break:n { \sort_return_same: } }
}
}
% dv
\cs_new_protected:Npn \__deriv_sort_sign:n #1
{
- \__deriv_case:nF
+ \tl_if_head_eq_charcode:VNTF \l__deriv_num_tmpb_tl -
{
- { \tl_if_head_eq_charcode_p:VN \l__deriv_num_tmpb_tl - && ! \tl_if_head_eq_charcode_p:VN \l__deriv_num_tmpa_tl - } { \__deriv_sort_reverse:nnn {#1} { sign } { same } }
- { \tl_if_head_eq_charcode_p:VN \l__deriv_num_tmpa_tl - && ! \tl_if_head_eq_charcode_p:VN \l__deriv_num_tmpb_tl - } { \__deriv_sort_reverse:nnn {#1} { sign } { swapped } }
+ \tl_if_head_eq_charcode:VNF \l__deriv_num_tmpa_tl -
+ { \__deriv_sort_reverse:Nnn \c_false_bool {#1} { sign } }
}
{
- \int_compare:nNnTF { \l__deriv_sort_counter_int } = { \l__deriv_sort_max_int }
- { \sort_return_same: }
- { \__deriv_sort_method:n {#1} }
+ \tl_if_head_eq_charcode:VNT \l__deriv_num_tmpa_tl -
+ { \__deriv_sort_reverse:Nnn \c_true_bool {#1} { sign } }
}
}
% dv
\cs_new_protected:Npn \__deriv_sort_symbol:n #1
{
- \__deriv_case:nF
+ \int_set:Nn \l__deriv_tmpa_int { \tl_count:N \l__deriv_sym_tmpa_tl }
+ \int_set:Nn \l__deriv_tmpb_int { \tl_count:N \l__deriv_sym_tmpb_tl }
+
+ \int_compare:nNnTF \l__deriv_tmpa_int > \l__deriv_tmpb_int
+ { \__deriv_sort_reverse:Nnn \c_false_bool {#1} { symbol } }
{
- { \int_compare_p:nNn { \tl_count:N \l__deriv_sym_tmpa_tl } > { \tl_count:N \l__deriv_sym_tmpb_tl } } { \__deriv_sort_reverse:nnn {#1} { symbol } { same } }
- { \int_compare_p:nNn { \tl_count:N \l__deriv_sym_tmpa_tl } < { \tl_count:N \l__deriv_sym_tmpb_tl } } { \__deriv_sort_reverse:nnn {#1} { symbol } { swapped } }
+ \int_compare:nNnT \l__deriv_tmpa_int < \l__deriv_tmpb_int
+ { \__deriv_sort_reverse:Nnn \c_true_bool {#1} { symbol } }
}
+}
+% dv
+\cs_new_protected:Npn \__deriv_sort_lexical:n #1
+{ \__deriv_sort_lexical_auxi:VVn \l__deriv_sym_tmpa_tl \l__deriv_sym_tmpb_tl {#1} }
+% dv
+\cs_new_protected:Npn \__deriv_sort_lexical_auxi:nnn #1 #2 #3
+{
+ \str_compare:nNnTF {#1} < {#2}
+ { \__deriv_sort_reverse:Nnn \c_false_bool {#3} { lexical } }
{
- \int_compare:nNnTF { \l__deriv_sort_counter_int } = { \l__deriv_sort_max_int }
- { \sort_return_same: }
- { \__deriv_sort_method:n {#1} }
+ \str_compare:nNnT {#1} > {#2}
+ { \__deriv_sort_reverse:Nnn \c_true_bool {#3} { lexical } }
}
}
% dv
\cs_new_protected:Npn \__deriv_sort_abs:n #1
{
- \__deriv_case:nF
- {
- { \int_compare_p:nNn { \int_abs:n \l__deriv_num_tmpa_tl } > { \int_abs:n \l__deriv_num_tmpb_tl } } { \__deriv_sort_reverse:nnn {#1} { abs } { same } }
- { \int_compare_p:nNn { \int_abs:n \l__deriv_num_tmpa_tl } < { \int_abs:n \l__deriv_num_tmpb_tl } } { \__deriv_sort_reverse:nnn {#1} { abs } { swapped } }
- }
+ \int_set:Nn \l__deriv_tmpa_int { \int_abs:n \l__deriv_num_tmpa_tl }
+ \int_set:Nn \l__deriv_tmpb_int { \int_abs:n \l__deriv_num_tmpb_tl }
+
+ \int_compare:nNnTF \l__deriv_tmpa_int > \l__deriv_tmpb_int
+ { \__deriv_sort_reverse:Nnn \c_false_bool {#1} { abs } }
{
- \int_compare:nNnTF { \l__deriv_sort_counter_int } = { \l__deriv_sort_max_int }
- { \sort_return_same: }
- { \__deriv_sort_method:n {#1} }
+ \int_compare:nNnT \l__deriv_tmpa_int < \l__deriv_tmpb_int
+ { \__deriv_sort_reverse:Nnn \c_true_bool {#1} { abs } }
}
}
% dv
\cs_new_protected:Npn \__deriv_sort_number:n #1
{
- \__deriv_case:nF
+ \int_compare:nNnTF \l__deriv_num_tmpa_tl > \l__deriv_num_tmpb_tl
+ { \__deriv_sort_reverse:Nnn \c_false_bool {#1} { number } }
{
- { \int_compare_p:nNn { \l__deriv_num_tmpa_tl } > { \l__deriv_num_tmpb_tl } } { \__deriv_sort_reverse:nnn {#1} { number } { same } }
- { \int_compare_p:nNn { \l__deriv_num_tmpa_tl } < { \l__deriv_num_tmpb_tl } } { \__deriv_sort_reverse:nnn {#1} { number } { swapped } }
- }
- {
- \int_compare:nNnTF { \l__deriv_sort_counter_int } = { \l__deriv_sort_max_int }
- { \sort_return_same: }
- { \__deriv_sort_method:n {#1} }
+ \int_compare:nNnT \l__deriv_num_tmpa_tl < \l__deriv_num_tmpb_tl
+ { \__deriv_sort_reverse:Nnn \c_true_bool {#1} { number } }
}
}
-% dv, sort-method, same/swapped
-\cs_new_protected:Npn \__deriv_sort_reverse:nnn #1 #2 #3
+% true/false, dv, sort-method
+\cs_new_protected:Npn \__deriv_sort_reverse:Nnn #1 #2 #3
{
- \exp_args:Nc
- \bool_xor:nnTF { l__deriv_#1_sort_#2_reverse_bool } { \str_if_eq_p:nn {#3} { same } }
- { \sort_return_same: }
- { \sort_return_swapped: }
+ \exp_args:NNc
+ \bool_xor:nnTF #1 { l__deriv_#2_sort_#3_reverse_bool }
+ { \seq_map_break:n { \sort_return_swapped: } }
+ { \seq_map_break:n { \sort_return_same: } }
}
% mixed-order-tl, sorted-seq, numerical-term, variant
\cs_new_protected:Npn \__deriv_output:NNNn #1 #2 #3 #4
@@ -1282,7 +1240,7 @@
{ first } { \tl_put_left:Nx #1 { \int_use:N #3 + } }
}
{
- \bool_if:nTF { \tl_if_head_eq_charcode_p:VN #1 - }
+ \tl_if_head_eq_charcode:VNTF #1 -
{ \tl_put_left:NV #1 #3 }
{ \tl_put_right:Nx #1 { + \int_use:N #3 } }
}
@@ -1420,28 +1378,25 @@
%%%%% Generate variants %%%%%
\prg_generate_conditional_variant:Nnn \__deriv_show_order:N { c } { T, TF }
+\prg_generate_conditional_variant:Nnn \tl_if_head_eq_charcode:nN { V } { T, F, TF }
-\cs_generate_variant:Nn \tl_if_head_eq_charcode_p:nN { V }
\cs_generate_variant:Nn \__deriv_set_rubber_length:Nn { c }
-\cs_generate_variant:Nn \__deriv_dv_variables:n { V }
-\cs_generate_variant:Nn \__deriv_dv_define_keys:n { V }
\cs_generate_variant:Nn \deriv_dv_define:Nnn { NV }
-\cs_generate_variant:Nn \__deriv_i_variables:n { V }
-\cs_generate_variant:Nn \__deriv_i_define_keys:n { V }
\cs_generate_variant:Nn \deriv_i_define:Nnn { NV }
\cs_generate_variant:Nn \deriv_set_keys:nn { V }
+\cs_generate_variant:Nn \__deriv_dont_use_dot:n { x }
+\cs_generate_variant:Nn \__deriv_scale_big_auxi:nNn { nc }
\cs_generate_variant:Nn \__deriv_insert_ord:Nnn { c }
\cs_generate_variant:Nn \__deriv_insert_var:Nnn { NV }
-\prg_generate_conditional_variant:Nnn \__deriv_if_novalue:n { f } { T }
-\prg_generate_conditional_variant:Nnn \__deriv_if_novalue:n { V } { TF }
\cs_generate_variant:Nn \__deriv_mixed_order:NNn { c }
-\cs_generate_variant:Nn \__deriv_eval_term:Nnnn { NV }
+\cs_generate_variant:Nn \__deriv_sort_method:Nn { c }
+\cs_generate_variant:Nn \__deriv_eval_term:Nnnn { NVV }
+\cs_generate_variant:Nn \__deriv_sort_lexical_auxi:nnn { VV }
-\cs_generate_variant:Nn \__deriv_set_default_aux:nnn { V }
-\cs_generate_variant:Nn \__deriv_set_default_from_prop:NN { Nc }
-\cs_generate_variant:Nn \__deriv_update_prop:Nn { c }
+\cs_generate_variant:Nn \__deriv_set_default_auxi:Nnn { c }
+\cs_generate_variant:Nn \__deriv_set_default_auxii:nnn { f }
\cs_generate_variant:Nn \__deriv_preamble_aux:nnn { V }
\cs_generate_variant:Nn \__deriv_var_bool_seq:NNN { c }
@@ -1480,15 +1435,14 @@
{ \derivset{all}[scale-auto = mleftmright] }
{ \derivset{all}[scale-auto = leftright] }
-\cs_new_protected:Npn \deriv_define_legacy_italic_cs:
+
+\bool_if:NTF \l__deriv_pkg_italic_bool
{
\DeclareDerivative{\odv}{\mathnormal{d}}
\DeclareDerivative{\mdv}{\mathnormal{D}}
\DeclareDifferential{\odif}{\mathnormal{d}}
\DeclareDifferential{\mdif}{\mathnormal{D}}[style-notation=single, style-notation-*=mixed]
}
-
-\cs_new_protected:Npn \deriv_define_legacy_upright_cs:
{
\DeclareDerivative{\odv}{\mathrm{d}}
\DeclareDerivative{\mdv}{\mathrm{D}}
@@ -1496,12 +1450,6 @@
\DeclareDifferential{\mdif}{\mathrm{D}}[style-notation=single, style-notation-*=mixed]
}
-\__deriv_case:n
-{
- { \l__deriv_pkg_italic_bool } { \deriv_define_legacy_italic_cs: }
- { \l__deriv_pkg_upright_bool } { \deriv_define_legacy_upright_cs: }
-}
-
\DeclareDerivative{\fdv}{\delta}
\DeclareDerivative{\adv}{\Delta}
\DeclareDerivative{\jdv}{\partial}[fun=true, var=1]