From f72d4261f1d88b9543cdae61918a314cc69118e4 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sun, 19 Jun 2016 21:37:34 +0000 Subject: xassoccnt (19jun16) git-svn-id: svn://tug.org/texlive/trunk@41500 c570f23f-e606-0410-a88d-b1316a301751 --- .../texmf-dist/tex/latex/xassoccnt/xassoccnt.sty | 270 ++++++++++++++++++++- 1 file changed, 257 insertions(+), 13 deletions(-) (limited to 'Master/texmf-dist/tex/latex/xassoccnt') diff --git a/Master/texmf-dist/tex/latex/xassoccnt/xassoccnt.sty b/Master/texmf-dist/tex/latex/xassoccnt/xassoccnt.sty index 38410d2c686..db0ebec8c2f 100644 --- a/Master/texmf-dist/tex/latex/xassoccnt/xassoccnt.sty +++ b/Master/texmf-dist/tex/latex/xassoccnt/xassoccnt.sty @@ -1,4 +1,4 @@ -%% LaTeX package xassoccnt - version 0.8 (2016/06/10 -- 23/28/27) +%% LaTeX package xassoccnt - version 0.9 (2016/06/19 -- 08/11/05) %% Source file for xassoccnt.sty %% %% @@ -19,11 +19,11 @@ %% %% -\def\xassoccntpackageversion{0.8} +\def\xassoccntpackageversion{0.9} \NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesPackage{xassoccnt}[2016/06/10 - v\xassoccntpackageversion] - +\ProvidesPackage{xassoccnt}[2016/06/19 - v\xassoccntpackageversion] +\RequirePackage{graphicx} \RequirePackage{xcolor} \RequirePackage{xparse} \RequirePackage{l3keys2e} @@ -61,6 +61,9 @@ \bool_new:N \l__xassoccnt_is_supertotalcounter_bool +\bool_new:N \l_xassoccnt_resetperiodiccounters_bool +\bool_new:N \l_xassoccnt_wrapperiodiccounters_bool + \seq_new:N \l__xassoccnt_counterreset_seq %%% @@ -163,7 +166,14 @@ supertotal .bool_set:N={\l__xassoccnt_is_supertotalcounter_bool }, - resetbackup .bool_set:N={\l__xassoccnt_resetbackupcounters_bool } + resetbackup .bool_set:N={\l__xassoccnt_resetbackupcounters_bool }, + +% resetperiodic .bool_set:N={ \l_xassoccnt_resetperiodiccounters_bool } +} + +\keys_define:nn {xassoccnt_periodiccounter} {% + reset .bool_set:N={ \l_xassoccnt_resetperiodiccounters_bool }, + wrap .bool_set:N={ \l_xassoccnt_wrapperiodiccounters_bool } } \keys_set:nn{xassoccnt}{nonumberofruns} @@ -266,6 +276,7 @@ \cs_set_eq:NN \xassoccnt_standardsetcounter \setcounter + % Needed for Backup/Restore features \AtBeginDocument{% @@ -284,7 +295,7 @@ }{} \AtEndOfPackage{ - \PackageInfo{xassoccnt}{2016/06/10 - v\xassoccntpackageversion -- stepping counters simultaneously and other features} + \PackageInfo{xassoccnt}{2016/06/19 - v\xassoccntpackageversion -- stepping counters simultaneously and other features} \@ifpackageloaded{calc}{% \msg_warning:nnn{xassoccnt}{incompatiblepackagenonfatal}{calc}% Warning \bool_set_true:N \l__xassoccnt_calcpackage_loaded @@ -349,8 +360,14 @@ \seq_new:N \g__xassoccnt_totalcounter_container +\prop_new:N \g_xassoccnt_totalcounter_prop \seq_new:N \g__xassoccnt_supertotalcounter_container + +\seq_new:N \g_xassoccnt_periodiccounter_container_seq +\prop_new:N \g_xassoccnt_periodiccounter_prop + + \cs_new_nopar:Nn \__xassoccnt_container_perdriver_new:n { \seq_if_exist:cF{ \__xassoccnt_drivercontainer:n {#1} } { % Generate only if there is no driver container sequence so far! @@ -852,7 +869,9 @@ %% More generic macros (hidding the internal features of the lists) -\cs_new:Nn \xassoccnt_container_datatype: {seq} +\cs_new_nopar:Nn \xassoccnt_container_property: {prop} + +\cs_new_nopar:Nn \xassoccnt_container_datatype: {seq} \cs_new:Nn \__xassoccnt_construct_cs:n {% @@ -1331,12 +1350,170 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%% + +\NewDocumentCommand{\DeclarePeriodicCounter}{O{}mm}{% + \xassoccnt_add_periodiccounter:nnn {#1} {#2} {#3}% +} + + +\prg_new_conditional:Nnn \xassoccnt_is_periodiccounter:n {TF,T,F} +{% + \seq_if_in:NnTF \g_xassoccnt_periodiccounter_container_seq {#1} + {\prg_return_true:} + {\prg_return_false:} +} + +\cs_new:Nn \xassoccnt_stepcounter_periodiccounter:n {% + \xassoccnt_is_periodiccounter:nT {#1}{% + \int_compare:nNnT {\prop_item:Nn \g_xassoccnt_periodiccounter_prop {#1}} = {\use:c{c@#1}}% + { \__xassoccnt_setdocumentcounter:nnn {} {#1}{\c_zero} } + } +} +\cs_new:Nn \xassoccnt_addtocounter_periodiccounter:nnn {% + \keys_set:nn {xassoccnt_periodiccounter} {wrap=true,#3} + \int_set:Nn \l_tmpa_int { \int_eval:n {\number\value{#1}+#2 } } + \bool_if:NTF \l_xassoccnt_wrapperiodiccounters_bool {% + \int_set:Nn \l_tmpb_int { \int_mod:nn {\l_tmpa_int} {\prop_item:Nn \g_xassoccnt_periodiccounter_prop {#1}}}% + \__xassoccnt_setdocumentcounter:nnn {} {#1}{\l_tmpb_int}% Wrap around!!!! + }{% + \__xassoccnt_setdocumentcounter:nnn {} {#1}{\l_tmpa_int}% Don't Wrap around!!!! + }% +} + + +\cs_new:Nn \xassoccnt_reset_periodiccounter:nn {% + \keys_set:nn {xassoccnt_periodiccounter} {reset=true,#1} + % Reset the periodic counter if requested (by default this is true!) + \bool_if:NT \l_xassoccnt_resetperiodiccounters_bool {% + \__xassoccnt_setdocumentcounter:nnn {} {#2} {\c_zero}% + } +} + +\cs_new:Nn \xassoccnt_remove_periodiccounter:nn {% + \seq_gremove_all:Nn \g_xassoccnt_periodiccounter_container_seq {#2}% + \prop_remove:Nn \g_xassoccnt_periodiccounter_prop {#2}% + \xassoccnt_reset_periodiccounter:nn {#1} {#2} +} + +\cs_new:Nn \xassoccnt_add_periodiccounter:nnn {% + \keys_set:nn {xassoccnt} {#1} + \seq_put_right:Nn \g_xassoccnt_periodiccounter_container_seq {#2}% + \seq_gremove_duplicates:N \g_xassoccnt_periodiccounter_container_seq + \xassoccnt_changecondition_periodiccounter:nnn {reset=false} {#2} {#3} % Check the optional argument later on!!!! +} + +\cs_new:Nn \xassoccnt_changecondition_periodiccounter:nnn {% + \xassoccnt_is_periodiccounter:nTF {#2}{% + \prop_put:Nnn \g_xassoccnt_periodiccounter_prop {#2} {#3}% + \xassoccnt_reset_periodiccounter:nn {#1} {#2} + } +} + +\NewDocumentCommand{\ChangePeriodicCounterCondition}{O{}mm}{% + \xassoccnt_changecondition_periodiccounter:nnn {#1}{#2}{#3}% +} + +\NewDocumentCommand{\RemovePeriodicCounter}{O{}m}{% + \xassoccnt_remove_periodiccounter:nn{#1} {#2} +} + +\NewDocumentCommand{\AddPeriodicCounter}{O{}mm}{% + \xassoccnt_add_periodiccounter:nnn {#1} {#2} {#3} +} + +\NewDocumentCommand{\IsPeriodicCounterTF}{m+m+m}{% + \xassoccnt_is_periodiccounter:nTF{#1}{#2}{#3}% +} + +\NewDocumentCommand{\IsPeriodicCounterT}{m+m}{% + \xassoccnt_is_periodiccounter:nT{#1}{#2} +} + +\NewDocumentCommand{\IsPeriodicCounterF}{m+m}{% + \xassoccnt_is_periodiccounter:nF{#1}{#2} +} + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %%%% Redefinition of standard counter macros + +\NewDocumentCommand{\stepcounteroldnototal}{m}{% + \__xassoccnt_translate_countername:cn {l_tmpa_tl} {#1}% + \xassoccnt_is_suspendedcounter:nF{#1}{% + \xassoccnt_is_coupledcounter:nTF {#1} + { \xassoccnt_stepcounter_coupledcounters:n{#1} } + {% No, not a coupled counter! + \cs_gset_nopar:Nn \__xassoccnt_laststeppedcounter: {\l_tmpa_tl}% + \xassoccnt_countersinresetlist:n{\l_tmpa_tl}% + \__xassoccnt_getresetlist:n {\l_tmpa_tl}% + \seq_if_empty:NTF \l__xassoccnt_counterreset_seq + {% + \xassoccnt_standardaddtocounter{\l_tmpa_tl}{\c_one}% Use the original one! + \int_gset:Nn \g__xassoccnt_lastcountervalue_int {\number\value{\l_tmpa_tl}}% + \__xassoccnt_step_associatedcounters:n {\l_tmpa_tl} + }{ % reset list is not empty! + % This is the replacement of \csname cl@#1\endcsname + \xassoccnt_standardaddtocounter{\l_tmpa_tl}{\c_one} + \seq_map_inline:Nn \l__xassoccnt_counterreset_seq {% + \xassoccnt_is_drivercounter:nTF{##1}{% + \csname c@##1\endcsname\c_zero % Reset but do not increase + }{% + \csname c@##1\endcsname\c_minus_one + \xassoccnt_standardstepcounter{##1}% + } + } + \__xassoccnt_step_associatedcounters:n {\l_tmpa_tl} % step the remaining associated counters + }% End of not empty reset list + }% End of coupled counters + } % end of not suspended counter +} + + + +\NewDocumentCommand{\stepcounterTotal}{m}{% + \__xassoccnt_translate_countername:cn {l_tmpa_tl} {#1}% + \xassoccnt_is_suspendedcounter:nF{#1}{% + \xassoccnt_is_coupledcounter:nTF {#1} + { \xassoccnt_stepcounter_coupledcounters:n{#1} } + {% No, not a coupled counter! + \cs_gset_nopar:Nn \__xassoccnt_laststeppedcounter: {\l_tmpa_tl}% + \xassoccnt_countersinresetlist:n{\l_tmpa_tl}% + \__xassoccnt_getresetlist:n {\l_tmpa_tl}% + \seq_if_empty:NTF \l__xassoccnt_counterreset_seq + {% + \xassoccnt_standardaddtocounter{\l_tmpa_tl}{\c_one}% Use the original one! + \int_gset:Nn \g__xassoccnt_lastcountervalue_int {\number\value{\l_tmpa_tl}}% + \__xassoccnt_step_associatedcounters:n {\l_tmpa_tl} + }{ % reset list is not empty! + % This is the replacement of \csname cl@#1\endcsname + \xassoccnt_standardaddtocounter{\l_tmpa_tl}{\c_one} + \seq_map_inline:Nn \l__xassoccnt_counterreset_seq {% + \xassoccnt_is_drivercounter:nTF{##1}{% + \csname c@##1\endcsname\c_zero % Reset but do not increase + }{% + \csname c@##1\endcsname\c_minus_one + \xassoccnt_standardstepcounter{##1}% + } + } + \__xassoccnt_step_associatedcounters:n {\l_tmpa_tl} % step the remaining associated counters + }% End of not empty reset list + }% End of coupled counters + } % end of not suspended counter + \__xassoccnt_is_totalcounter:nT {#1} {% + \__xassoccnt_store_totalcounter_value:n {#1}% + } +} + + \RenewDocumentCommand{\stepcounter}{m}{% \__xassoccnt_translate_countername:cn {l_tmpa_tl} {#1}% \xassoccnt_is_suspendedcounter:nF{#1}{% + \xassoccnt_stepcounter_periodiccounter:n {#1}% \xassoccnt_is_coupledcounter:nTF {#1} { \xassoccnt_stepcounter_coupledcounters:n{#1} } {% No, not a coupled counter! @@ -1363,8 +1540,23 @@ }% End of not empty reset list }% End of coupled counters } % end of not suspended counter + \__xassoccnt_is_totalcounter:nT {#1} {% + \__xassoccnt_store_totalcounter_value:n {#1}% + } } +\RenewDocumentCommand{\addtocounter}{mmO{}}{% + \xassoccnt_is_periodiccounter:nTF {#1}{% + \xassoccnt_addtocounter_periodiccounter:nnn {#1} {#2} {#3}% + }{% + \xassoccnt_standardaddtocounter{#1}{#2}% + } +} + + + + + \NewDocumentCommand{\xassoccnt_addtocounter}{mmO{}}{% @@ -1374,9 +1566,28 @@ \xassoccnt_standardaddtocounter{\l_tmpb_tl}{#2}% \cs_gset_nopar:Nn \__xassoccnt_lastaddtocounter: {\l_tmpb_tl}% }% + % Now check if #1 is a total counter and set the property correspondingly + \__xassoccnt_is_totalcounter:nT {#1} {% + \__xassoccnt_store_totalcounter_value:n {#1}% + } +} + + +\RenewDocumentCommand{\xassoccnt_addtocounter}{mmO{}}{% + % Only add to a counter if this counter isn't on the suspended counters list! + \xassoccnt_is_suspendedcounter:nF{#1}{% + \__xassoccnt_translate_countername:cn {l_tmpb_tl} {#1}% + \xassoccnt_standardaddtocounter{\l_tmpb_tl}{#2}% + \cs_gset_nopar:Nn \__xassoccnt_lastaddtocounter: {\l_tmpb_tl}% + }% + % Now check if #1 is a total counter and set the property correspondingly + \__xassoccnt_is_totalcounter:nT {#1} {% + \__xassoccnt_store_totalcounter_value:n {#1}% + } } + \cs_new:Nn \__xassoccnt_setdocumentcounter:nnn {% \__xassoccnt_translate_countername:cn {l_tmpa_tl} {#2}% \xassoccnt_standardsetcounter{\l_tmpa_tl}{#3}% @@ -1468,6 +1679,10 @@ \cs_gset_nopar:Nn \__xassoccnt_lastsetcounter: {#1} \xassoccnt_standardsetcounter{\tl_use:N \l_tmpb_tl}{#2}% \int_gset:Nn \g__xassoccnt_lastcountervalue_int {\number\value{\l_tmpb_tl}}% + \__xassoccnt_is_totalcounter:nT {#1} {% + \__xassoccnt_store_totalcounter_value:n {#1}% + %\prop_put:Nnn \g_xassoccnt_totalcounter_prop {#1} {\number\value{\tl_use:N \l_tmpa_tl}} + } } @@ -1514,6 +1729,8 @@ + + \NewDocumentCommand{\NewDocumentCounter}{O{initial=\c_zero}mo}{% \IfValueTF{#3}{% \__xassoccnt_newcounter_ltx:nnn{#1}{#2}{#3} @@ -1626,11 +1843,15 @@ \NewDocumentCommand{\NewTotalDocumentCounter}{O{}m}{% \keys_set:nn {xassoccnt} {supertotal=false,#1} \__xassoccnt_ifis_latexcounter:nF {#2} {% Define the counter - \DeclareDocumentCounter[sloppy=false]{#2}% + \xassoccnt_declaredocumentcounter:nn{sloppy=false}{#2}% }% \__xassoccnt_registertotaldocumentcounter:nn{#1}{#2} } +\cs_new:Nn \__xassoccnt_store_totalcounter_value:n {% + \prop_put:Nnn \g_xassoccnt_totalcounter_prop {#1} {\number\value{\__xassoccnt_expand_totalcountername:n{#1}}} +} + \cs_new:Nn \__xassoccnt_registertotaldocumentcounter:nn {% \keys_set:nn {xassoccnt} {supertotal=false,#1} \__xassoccnt_ifis_latexcounter:nF {#2} {% Counter does not exist -- do not autodefine @@ -1639,8 +1860,10 @@ % If the counter already exists -> check for the internal totalcounter name \cs_if_exist:cF { c@\__xassoccnt_expand_totalcountername:n{#2} } { - \DeclareDocumentCounter[sloppy=false,initial={\c_minus_one}]{\__xassoccnt_expand_totalcountername:n{#2}} - \seq_gput_right:Nx \g__xassoccnt_totalcounter_container {\__xassoccnt_expand_totalcountername:n{#2}} + \xassoccnt_declaredocumentcounter:nn{sloppy=false,initial={\c_minus_one}}{\__xassoccnt_expand_totalcountername:n{#2}}% + \seq_gput_right:Nx \g__xassoccnt_totalcounter_container {\__xassoccnt_expand_totalcountername:n{#2}}% + \__xassoccnt_store_totalcounter_value:n {#2}% + %\prop_put:Nnn \g_xassoccnt_totalcounter_prop {#2} {\number\value{\__xassoccnt_expand_totalcountername:n{#2}}} \bool_if:NT \l__xassoccnt_is_supertotalcounter_bool {% \__xassoccnt_add_supertotalcounter:n {#2} } @@ -1669,6 +1892,12 @@ \number\value{\tl_use:N \l_tmpa_tl}% } +\renewcommand{\TotalValue}[1]{% + \prop_item:Nn \g_xassoccnt_totalcounter_prop {#1}% +} + +%\newcommand{\loadstore} + \cs_new:Nn \__xassoccnt_writetotalcounters:nn {% @@ -1999,6 +2228,18 @@ +%%%%%%%%%%%%%%%%%%%% + +\cs_new:Nn \xassoccnt_declaredocumentcounteropt:nnn{% + \__xassoccnt_newcounter_ltx:nnn{#1}{#2}{#3}% +} + +\cs_new:Nn \xassoccnt_declaredocumentcounter:nn{% + \__xassoccnt_newcounter_ltx:nn{#1}{#2}{}% +} + + + %%%%%%%%%%%%%%%%%%%% \NewDocumentCommand{\EnableNumberofrunsTF}{mm}{% @@ -2006,17 +2247,19 @@ #1 }{#2} } -\ExplSyntaxOff \NewDocumentCommand{\DeclareDocumentCounter}{O{initial={0}}mo}{% \IfValueTF{#3}{% - \NewDocumentCounter[#1]{#2}[#3]% + \xassoccnt_declaredocumentcounteropt:nnn{#1}{#2}{#3}% }{% - \NewDocumentCounter[#1]{#2}% + \xassoccnt_declaredocumentcounter:nn{#1}{#2}% }% } +\ExplSyntaxOff + + \EnableNumberofrunsTF{% \NewTotalDocumentCounter[supertotal=true]{numberofruns} @@ -2055,6 +2298,7 @@ \AddFeature[sublists=true]{coupledcounters} % New style, not fully implemented so far +\AddFeature[sublists=false]{periodiccounters} % New style, not fully implemented so far % Some more to be done -- cgit v1.2.3