From f9ae82e6878c08de47271500aa73687fc462eeee Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sun, 6 Mar 2016 01:00:56 +0000 Subject: xassoccnt (5mar16) git-svn-id: svn://tug.org/texlive/trunk@39946 c570f23f-e606-0410-a88d-b1316a301751 --- .../texmf-dist/tex/latex/xassoccnt/xassoccnt.sty | 289 ++++++++++++++++++--- 1 file changed, 251 insertions(+), 38 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 1e0137d168e..1c6809697a7 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.5 (2016/02/27 -- 19/52/22) +%% LaTeX package xassoccnt - version 0.6 (2016/03/05 -- 14/44/15) %% Source file for xassoccnt.sty %% %% @@ -19,10 +19,10 @@ %% %% -\def\xassoccntpackageversion{0.5} +\def\xassoccntpackageversion{0.6} \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{xassoccnt}[2016/02/27 - v\xassoccntpackageversion] +\ProvidesPackage{xassoccnt}[2016/03/05 - v\xassoccntpackageversion] \RequirePackage{xcolor} \RequirePackage{xparse} @@ -42,6 +42,7 @@ \int_new:N \g__xassoccnt_lastcountervalue_int \bool_new:N \g__xassoccnt_autodefine_counters % --> global document option +\bool_new:N \g__xassoccnt_nonumberofruns_bool % --> global document option \clist_new:N \l__xassoccnt_exclude_clist % clist for \clist_new:N \l__xassoccnt_onlycounters_clist % clist for the \SetDocumentCounter command @@ -102,6 +103,8 @@ initial .code:n={ \int_set:Nn \l__xassoccnt_initialcountervalue_int {#1}}, sloppy .bool_set:N=\l__xassoccnt_sloppy_newcounter, autodefinecounters .bool_set:N=\g__xassoccnt_autodefine_counters, + nonumberofruns .code:n={\typeout{Disabling numberofruns}\bool_gset_true:N \g__xassoccnt_nonumberofruns_bool}, + nonumberofruns .value_forbidden:n = true, % Choice keys autodefine .choice:, autodefine / all .code:n= {\bool_set_true:N \l__xassoccnt_autodefine_allcounters @@ -160,6 +163,8 @@ resetbackup .bool_set:N={\l__xassoccnt_resetbackupcounters_bool } } +%\keys_set:nn{xassoccnt}{nonumberofruns=false} + \ProcessKeysOptions{xassoccnt} @@ -190,6 +195,27 @@ ---~#2~--- } +\msg_new:nnn{xassoccnt}{addcoupledcountergroupundefined}{% + Warning:~There~is~no~coupled~counter~group~named~#2~\\ + The~addition~operation~is~ignored!\\ + ---~#1~--- +} + +\msg_new:nnn{xassoccnt}{clearcoupledcountergroupundefined}{% + Warning:~There~is~no~coupled~counter~group~named~#2~\\ + The~clearing~operation~is~ignored!\\ + ---~#1~--- +} + + +\msg_new:nnn{xassoccnt}{removingcoupledcountergroupundefined}{% + Warning:~There~is~no~coupled~counter~group~named~#2~\\ + The~removing~operation~is~ignored!\\ + ---~#1~--- +} + + + \msg_new:nnn{xassoccnt}{backupcollectionundefined}{% Error:~Backup~collection~#1~not~defined\\ @@ -867,14 +893,37 @@ } +\cs_new_nopar:Nn \xassoccnt_container_map_break: {% + \__xassoccnt_construct_cs:n{_map_break:} +} + +\cs_new:Nn \xassoccnt_container_concat:NNN {% + \__xassoccnt_construct_cs:n{_concat:NNN} #1 #2 #3 +} + +\cs_new:Nn \xassoccnt_container_gconcat:NNN {% + \__xassoccnt_construct_cs:n{_gconcat:NNN} #1 #2 #3 +} + + \prg_new_conditional:Nnn \xassoccnt_container_if_exist:N {TF,T,F}% { - \__xassoccnt_construct_cs:n{_if_exist:NTF} #1 +% \__xassoccnt_construct_cs:n{_if_exist:NTF} #1 + \seq_if_exist:NTF #1 {\prg_return_true:} {\prg_return_false:} } +\prg_new_conditional:Nnn \xassoccnt_container_if_exist:c {TF,T,F}% +{ +% \__xassoccnt_construct_cs:n{_if_exist:NTF} #1 + \seq_if_exist:cTF {#1} + {\prg_return_true:} + {\prg_return_false:} +} + + \prg_new_conditional:Nnn \xassoccnt_container_if_in:Nn {TF,T,F}% { @@ -903,8 +952,8 @@ \cs_generate_variant:Nn \xassoccnt_container_new:N {c} -\cs_generate_variant:Nn \xassoccnt_container_clear:N {c} -\cs_generate_variant:Nn \xassoccnt_container_gclear:N {c} +\cs_generate_variant:Nn \xassoccnt_container_clear:N {c,x} +\cs_generate_variant:Nn \xassoccnt_container_gclear:N {c,x} \cs_generate_variant:Nn \xassoccnt_container_set_eq:NN {cN,Nc,cc} \cs_generate_variant:Nn \xassoccnt_container_gset_eq:NN {cN,Nc,cc} @@ -918,6 +967,8 @@ \cs_generate_variant:Nn \xassoccnt_container_remove_duplicates:N {c} \cs_generate_variant:Nn \xassoccnt_container_gremove_duplicates:N {c} +\cs_generate_variant:Nn \xassoccnt_container_concat:NNN {ccc} +\cs_generate_variant:Nn \xassoccnt_container_gconcat:NNN {ccc} \cs_generate_variant:Nn \xassoccnt_container_remove_all:Nn {cn} \cs_generate_variant:Nn \xassoccnt_container_gremove_all:Nn {cn} @@ -937,7 +988,7 @@ \cs_generate_variant:Nn \xassoccnt_container_if_in:NnT {NVT,NvT,NoT,NxT,cnT,cVT,cvT,coT,cxT} \cs_generate_variant:Nn \xassoccnt_container_if_in:NnF {NVF,NvF,NoF,NxF,cnF,cVF,cvF,coF,cxF} -\cs_generate_variant:Nn \xassoccnt_container_if_exist:NTF {cTF} +\cs_generate_variant:Nn \xassoccnt_container_if_exist:NTF {cTF,xTF} \cs_generate_variant:Nn \xassoccnt_container_if_exist:NT {cT} \cs_generate_variant:Nn \xassoccnt_container_if_exist:NF {cF} @@ -946,19 +997,28 @@ \keys_define:nn {xassoccnt_container} { feature .bool_set:N=\l__xassoccnt_feature_bool, - sublists .bool_set:N=\l__xassoccnt_sublists_bool + sublists .bool_set:N=\l__xassoccnt_sublists_bool, + name .tl_set:N=\l__xassoccnt_countergroup_name_tl, + multiple .bool_set:N=\l__xassoccnt_multiple_bool, + featurename .tl_set:N=\l__xassoccnt_feature_name_tl } \seq_new:N \g__xassoccnt_feature_seq % The master control !!!! \seq_new:N \g__xassoccnt_sublists_seq -\cs_new:Nn \xassoccnt_create_featurename:n { xassoccnt_feature#1 } +\cs_new:Nn \xassoccnt_create_featurename:n { xassoccnt_feature_#1 } + +\cs_new:Nn \xassoccnt_featurename:n { xassoccnt_feature_#1 } + +\cs_new:Nn \xassoccnt_feature_subcontainer:nn { \xassoccnt_featurename:n{#1}_#2 } +\cs_new:Nn \xassoccnt_feature_group_container:n { \xassoccnt_featurename:n{#1}_group } % This holds the names of the several sub containers -\cs_new:Nn \xassoccnt_featurename:n { xassoccnt_feature#1 } +%% A feature is actually a super container that has sub containers (i.e. a list/seq of counters that have this feature ) -%% A feature is actually a super container that has sub containers (i.e. a list/seq of counters that have this feature +%% Example the feature 'coupledcounters' will have a group countainer, that holds the name of the counter groups +%% Each counter group (of a feature) itself will have a subcontainer where the counter names are stored. %% Multiple counters may occur in the per - feature - specific container list @@ -968,14 +1028,15 @@ \seq_if_in:NnF \g__xassoccnt_feature_seq {#2} {% \seq_gput_right:Nn \g__xassoccnt_feature_seq {#2}% \xassoccnt_create_container:nc {feature=true} { \xassoccnt_featurename:n { #2 } } - \bool_if:NTF \l__xassoccnt_sublists_bool { \seq_gput_right:NV \g__xassoccnt_sublists_seq {\c_one }} { \seq_gput_right:NV \g__xassoccnt_sublists_seq {\c_zero }} + \bool_if:NTF \l__xassoccnt_sublists_bool { + \xassoccnt_create_container:nc {feature=false} {\xassoccnt_feature_group_container:n{#2} } + \seq_gput_right:NV \g__xassoccnt_sublists_seq {\c_one } + } { \seq_gput_right:NV \g__xassoccnt_sublists_seq {\c_zero }} }% End of \seq_if_in } } - - \prg_new_conditional:Nnn \xassoccnt_feature_if_in:n {TF,T,F} { \seq_if_in:NnTF { \g__xassoccnt_feature_seq } {#1} @@ -1033,6 +1094,37 @@ } } + +\cs_new:Nn \xassoccnt_feature_add_to_subcontainer:nnn {% + \keys_set:nn{xassoccnt_container} {multiple=false,#1} + \clist_set:Nx \l_tmpa_clist {#3} + + \clist_map_inline:Nn \l_tmpa_clist {% + \xassoccnt_container_if_in:cnTF {\xassoccnt_feature_subcontainer:nn{\l__xassoccnt_feature_name_tl}{#2}} {##1} + {% + \bool_if:NT \l__xassoccnt_multiple_bool {% Add only if `multiple=true` was specified + \xassoccnt_container_put_right:cn {\xassoccnt_feature_subcontainer:nn{\l__xassoccnt_feature_name_tl}{#2}} {##1} + } + }{ % + \xassoccnt_container_put_right:cn {\xassoccnt_feature_subcontainer:nn{\l__xassoccnt_feature_name_tl}{#2}} {##1} + } + } % End of map_inline +} + + + +\cs_new:Nn \xassoccnt_feature_add_to_group_container:nn {% + \keys_set:nn{xassoccnt_container} {multiple=false,#1} + \xassoccnt_add_to_containerlist:cn {\xassoccnt_feature_group_container:n{\l__xassoccnt_feature_name_tl}} {#2}% Create the container first. + \bool_if:NF \l__xassoccnt_multiple_bool {% + \xassoccnt_container_remove_duplicates:c { \xassoccnt_feature_group_container:n{\l__xassoccnt_feature_name_tl} }% + } + \xassoccnt_container_if_exist:cF {\xassoccnt_feature_subcontainer:nn{\l__xassoccnt_feature_name_tl}{#2}} + { + \xassoccnt_create_container:nc {feature=false} {\xassoccnt_feature_subcontainer:nn{\l__xassoccnt_feature_name_tl}{#2}} % Creating and filling of the subcontainer + } +} + \cs_generate_variant:Nn \xassoccnt_add_to_containerlist:Nn {cn,nn} @@ -1047,21 +1139,134 @@ + \NewDocumentCommand{\NewContainer}{m}{% \xassoccnt_create_container:nc {feature=false} {#1} } +\bool_new:N \l__xassoccnt_is_coupledcounter_bool + + +\prg_new_conditional:Nnn \__xassoccnt_is_coupledcounter:n {TF,T,F} +{ + \xassoccnt_container_map_inline:cn { \xassoccnt_feature_group_container:n{coupledcounters} } {% + \bool_set_false:N \l__xassoccnt_is_coupledcounter_bool + \xassoccnt_container_if_in:cxT { \xassoccnt_feature_subcontainer:nn{coupledcounters}{##1} } {#1} + { + \bool_set_true:N \l__xassoccnt_is_coupledcounter_bool + \xassoccnt_container_map_break: + } + } + \bool_if:NTF \l__xassoccnt_is_coupledcounter_bool + {\prg_return_true:} + {\prg_return_false:} +} + +\cs_generate_variant:Nn \__xassoccnt_is_coupledcounter:nTF {c } +\cs_generate_variant:Nn \__xassoccnt_is_coupledcounter:nT { c } +\cs_generate_variant:Nn \__xassoccnt_is_coupledcounter:nF { c } + +\cs_new:Nn \xassoccnt_is_coupledcounter:nTF { % + \__xassoccnt_is_coupledcounter:nTF {#1} {#2} {#3} +} + +\cs_new:Nn \xassoccnt_is_coupledcounter:nT { % + \__xassoccnt_is_coupledcounter:nT {#1} {#2}% +} + +\cs_new:Nn \xassoccnt_is_coupledcounter:nF { % + \__xassoccnt_is_coupledcounter:nF {#1} {#2}% +} + + + +\cs_generate_variant:Nn \xassoccnt_is_coupledcounter:nTF { c } +\cs_generate_variant:Nn \xassoccnt_is_coupledcounter:nT { c } +\cs_generate_variant:Nn \xassoccnt_is_coupledcounter:nF { c } + + +% Declaring a new coupled counters group +\cs_new:Nn \xassoccnt_declare_coupledcountersgroup:n {% + \xassoccnt_container_if_exist:cF { \xassoccnt_feature_group_container:n{coupledcounters}{#1} } + { + \xassoccnt_feature_add_to_group_container:nn{multiple=false,featurename=coupledcounters}{#1}% + } +} + +% The stepcounter branch for coupled counters +\cs_new:Nn \xassoccnt_stepcounter_coupledcounters:n {% + \xassoccnt_container_map_inline:cn { \xassoccnt_feature_group_container:n{coupledcounters} } {% + \xassoccnt_container_if_in:cxT { \xassoccnt_feature_subcontainer:nn{coupledcounters}{##1} } {#1 } + { + \xassoccnt_container_map_inline:cn {\xassoccnt_feature_subcontainer:nn{coupledcounters}{##1}} { + \xassoccnt_standardstepcounter{####1}% + } + } + } +} + + +\NewDocumentCommand{\DeclareCoupledCountersGroup}{m}{% + \xassoccnt_declare_coupledcountersgroup:n{#1} +} + + \NewDocumentCommand{\DeclareCoupledCounters}{O{}m}{% - \xassoccnt_add_to_containerlist:cn {\xassoccnt_featurename:n {coupledcounters} } {#2}% + \keys_set:nn {xassoccnt_container} {multiple=false,#1} + % Check first if the counter group name is already registered + \xassoccnt_container_if_exist:cF { \xassoccnt_feature_subcontainer:nn{coupledcounters}{\l__xassoccnt_countergroup_name_tl} } + { + \xassoccnt_declare_coupledcountersgroup:n{\l__xassoccnt_countergroup_name_tl} + } + \xassoccnt_feature_add_to_subcontainer:nnn{multiple=false,#1,featurename=coupledcounters}{\l__xassoccnt_countergroup_name_tl}{#2}% } \NewDocumentCommand{\AddCoupledCounters}{O{}m}{% - \xassoccnt_add_to_containerlist:cn {\xassoccnt_featurename:n {coupledcounters} } {#2}% + \keys_set:nn {xassoccnt_container} {multiple=false,#1} + \xassoccnt_container_if_exist:cTF { \xassoccnt_feature_subcontainer:nn{coupledcounters}{\l__xassoccnt_countergroup_name_tl } } { + \xassoccnt_feature_add_to_subcontainer:nnn{#1,featurename=coupledcounters}{\l__xassoccnt_countergroup_name_tl}{#2}% + }{% + \msg_warning:nnxx{xassoccnt}{addcoupledcountergroupundefined}{AddCoupledCounters}{\l__xassoccnt_countergroup_name_tl}% Warning about undefined counter group + }% } \NewDocumentCommand{\RemoveCoupledCounters}{O{}m}{% - \xassoccnt_container_remove_by_clist:cn { \xassoccnt_featurename:n {coupledcounters} } {#2} + \keys_set:nn {xassoccnt_container} {#1} + \xassoccnt_container_if_exist:cTF { \xassoccnt_feature_subcontainer:nn{coupledcounters}{\l__xassoccnt_countergroup_name_tl } } {% + \xassoccnt_container_remove_by_clist:cn {\xassoccnt_feature_subcontainer:nn{coupledcounters}{\l__xassoccnt_countergroup_name_tl }} {#2} + }{% + \msg_warning:nnxx{xassoccnt}{removingcoupledcountergroupundefined}{RemoveCoupledCounters}{\l__xassoccnt_countergroup_name_tl}% Warning about undefined counter group + } +} + +\NewDocumentCommand{\ClearCoupledCounters}{m}{% + \keys_set:nn {xassoccnt_container} {#1} + \xassoccnt_container_if_exist:cTF { \xassoccnt_feature_subcontainer:nn{coupledcounters}{\l__xassoccnt_countergroup_name_tl } } {% + \xassoccnt_container_clear:c {\xassoccnt_feature_subcontainer:nn{coupledcounters}{\l__xassoccnt_countergroup_name_tl }} + }{% + \msg_warning:nnxx{xassoccnt}{clearcoupledcountergroupundefined}{ClearCoupledCounters}{\l__xassoccnt_countergroup_name_tl}% Warning about undefined counter group + } +} + +\NewDocumentCommand{\ClearAllCoupledCounters}{}{% + \xassoccnt_container_if_exist:cT { \xassoccnt_feature_group_container:n{coupledcounters} } {% + \xassoccnt_container_map_inline:cn { \xassoccnt_feature_group_container:n{coupledcounters} } {% + \ClearCoupledCounters{name=##1}% + } + } +} + +\NewDocumentCommand{\IsCoupledCounterTF}{mmm}{% + \xassoccnt_is_coupledcounter:nTF {#1} {#2} {#3} +} + +\NewDocumentCommand{\IsCoupledCounterT}{mm}{% + \xassoccnt_is_coupledcounter:nT {#1} {#2} +} + +\NewDocumentCommand{\IsCoupledCounterF}{mm}{% + \xassoccnt_is_coupledcounter:nF {#1} {#2} } %%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1073,12 +1278,9 @@ \RenewDocumentCommand{\stepcounter}{m}{% \__xassoccnt_translate_countername:cn {l_tmpa_tl} {#1}% \xassoccnt_is_suspendedcounter:nF{#1}{% - \xassoccnt_container_if_in:cxTF { \xassoccnt_featurename:n {coupledcounters} } {#1} {% - \xassoccnt_container_map_inline:cn {\xassoccnt_featurename:n {coupledcounters} } {% - \xassoccnt_standardstepcounter{##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}% @@ -1492,7 +1694,7 @@ % Prevent multiple addition of a counter name \seq_if_in:NnF #1 {#2} { - \seq_gput_right:Nn \l__xassoccnt_backupresetlist_seq {\c_zero} + \seq_gput_right:Nn \l__xassoccnt_backupresetlist_seq {\c_one} \seq_gput_right:Nn #1 { #2 } } } @@ -1502,7 +1704,7 @@ % Prevent multiple addition of a counter name \seq_if_in:NnF #1 {#2} { - \seq_gput_right:Nn \l__xassoccnt_backupresetlist_seq {\c_one} + \seq_gput_right:Nn \l__xassoccnt_backupresetlist_seq {\c_zero} \seq_gput_right:NV #1 {#2} } } @@ -1557,6 +1759,7 @@ \msg_error:nnn{xassoccnt}{nameisnocounter}{##1}% }% }% +% \seq_use:Nn \l__xassoccnt_countervaluesbackup_seq {\par} } @@ -1603,6 +1806,7 @@ \tl_set:Nn \l_tmpa_tl {#3} \int_zero:N \l_tmpa_int% \int_zero:N \l_tmpb_int% + \seq_clear:N \l_tmpa_seq% \seq_if_in:NnT \l__xassoccnt_counternamesbackup_seq {#3} {% \seq_map_inline:Nn \l__xassoccnt_counternamesbackup_seq @@ -1677,13 +1881,31 @@ %%%%%%%%%%%%%%%%%%%% +\NewDocumentCommand{\EnableNumberofrunsTF}{mm}{% + \bool_if:NF \g__xassoccnt_nonumberofruns_bool { + #1 + }{#2} +} \ExplSyntaxOff - -\AtBeginDocument{% - \stepcounter{numberofruns} +\NewDocumentCommand{\DeclareDocumentCounter}{O{initial={0}}mo}{% + \IfValueTF{#3}{% + \NewDocumentCounter[#1]{#2}[#3]% + }{% + \NewDocumentCounter[#1]{#2}% + }% } + + +\EnableNumberofrunsTF{% + \NewTotalDocumentCounter[supertotal=true]{numberofruns} + \AtBeginDocument{% + \stepcounter{numberofruns} + } +}{} + + @@ -1692,13 +1914,6 @@ % Extended interface functions -\NewDocumentCommand{\DeclareDocumentCounter}{O{initial={0}}mo}{% - \IfValueTF{#3}{% - \NewDocumentCounter[#1]{#2}[#3]% - }{% - \NewDocumentCounter[#1]{#2}% - }% -} \@onlypreamble{\NewTotalDocumentCounter} \@onlypreamble{\RegisterTotalDocumentCounter} @@ -1708,8 +1923,6 @@ -\NewTotalDocumentCounter[supertotal=true]{numberofruns} - %%% Colour output routines \newcommand{\GeneralCounterInfoColor}{orange} @@ -1718,7 +1931,7 @@ \newcommand{\TotalCounterInfoColor}{violet} -\AddFeature{coupledcounters} % New style, not fully implemented so far +\AddFeature[sublists=true]{coupledcounters} % New style, not fully implemented so far % Some more to be done -- cgit v1.2.3