From 7bd517903406aa8d487340f84350c10826ff5e54 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sat, 4 Mar 2017 23:13:23 +0000 Subject: xassoccnt (4mar17) git-svn-id: svn://tug.org/texlive/trunk@43396 c570f23f-e606-0410-a88d-b1316a301751 --- .../texmf-dist/tex/latex/xassoccnt/xassoccnt.sty | 195 ++++++++++++++++++--- 1 file changed, 171 insertions(+), 24 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 47f1da6ae8c..26f22e893f1 100644 --- a/Master/texmf-dist/tex/latex/xassoccnt/xassoccnt.sty +++ b/Master/texmf-dist/tex/latex/xassoccnt/xassoccnt.sty @@ -1,9 +1,9 @@ -%% LaTeX package xassoccnt - version 1.1 (2016/10/29 -- 13:34:52) +%% LaTeX package xassoccnt - version 1.2 (2017/03/04 -- 00:46:43) %% Source file for xassoccnt.sty %% %% %% ------------------------------------------------------------------------------------------- -%% Copyright (c) 2015 -- 2016 by Dr. Christian Hupfer +%% Copyright (c) 2015 -- 2017 by Dr. Christian Hupfer %% ------------------------------------------------------------------------------------------- %% %% This work may be distributed and/or modified under the @@ -19,10 +19,12 @@ %% %% -\def\xassoccntpackageversion{1.1} +\def\xassoccntpackageversion{1.2} \NeedsTeXFormat{LaTeX2e}[1995/12/01] -\ProvidesPackage{xassoccnt}[2016/10/29 - v\xassoccntpackageversion] +\ProvidesPackage{xassoccnt}[2017/03/04 - v\xassoccntpackageversion] +\RequirePackage{etoolbox} +\RequirePackage{letltxmacro} \RequirePackage{xcolor} \RequirePackage{xparse} \RequirePackage{l3keys2e} @@ -35,6 +37,8 @@ % Some variants of standard expl3 contributions +\cs_generate_variant:Nn \seq_set_from_clist:Nn { Nx, cx } + \cs_generate_variant:Nn \seq_remove_all:Nn { cV, NV } \cs_generate_variant:Nn \seq_gremove_all:Nn { cV, NV } \cs_generate_variant:Nn \seq_gput_right:cn {cx} @@ -47,6 +51,7 @@ % First some local or global values \bool_new:N \l__xassoccnt_hyperrefpackage_loaded_bool +\bool_new:N \l__xassoccnt_cleverefpackage_loaded_bool \ifexplversionnew \str_const:Nn \c__xassoccnt_modulename_str {xassoccnt} @@ -122,8 +127,10 @@ \prop_new:N \g_xassoccnt_module_data_prop -\prop_put:Nnn \g_xassoccnt_module_data_prop {scratchname} {scratch} -\prop_put:Nnn \g_xassoccnt_module_data_prop {backupfeaturename} {backupcounters} +\prop_gput:Nnn \g_xassoccnt_module_data_prop {scratchname} {scratch} +\prop_gput:Nnn \g_xassoccnt_module_data_prop {backupfeaturename} {backupcounters} + +\prop_gput:Nnn \g_xassoccnt_module_data_prop {prefix-sep} {::} \cs_new:Nn \xassoccnt_extract_moduledata:n {% \prop_item:Nn \g_xassoccnt_module_data_prop {#1} @@ -194,6 +201,7 @@ supertotal .bool_set:N={\l__xassoccnt_is_supertotalcounter_bool }, resetbackup .bool_set:N={\l__xassoccnt_resetbackupcounters_bool }, + redefinelabel .bool_set:N= { \g__xassoccnt_redefinelabel_bool } } @@ -213,7 +221,7 @@ } -\keys_set:nn{xassoccnt}{nonumberofruns} +\keys_set:nn{xassoccnt}{nonumberofruns, redefinelabel=true} \ProcessKeysOptions{xassoccnt} @@ -449,10 +457,14 @@ % Needed for Backup/Restore features -\AtBeginDocument{% +%\AtBeginDocument{% +\AtEndPreamble{ \@ifpackageloaded{hyperref}{% - \bool_set_true:N \l__xassoccnt_hyperrefpackage_loaded_bool% + \bool_gset_true:N \l__xassoccnt_hyperrefpackage_loaded_bool% }{}% + \@ifpackageloaded{cleveref}{% + \bool_gset_true:N \l__xassoccnt_cleverefpackage_loaded_bool% + }{} } @@ -465,7 +477,7 @@ }{} \AtEndOfPackage{ - \PackageInfo{xassoccnt}{2016/10/29 - v\xassoccntpackageversion -- stepping counters simultaneously and other features} + \PackageInfo{xassoccnt}{2017/03/04 - 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 @@ -724,7 +736,8 @@ -\cs_new:Nn \xassoccnt_declareassociatedcounters:nnn {% + +\cs_new:Nn \xassoccnt_declareassociatedcounters_old:nnn {% \__xassoccnt_container_if_in:cnTF{\__xassoccnt_generate_countercontainername:n{\c_xassoccnt_mastername_str}:}{#2}{% % Not contained in the driver counter list \__xassoccnt_addassociatedcounters:nnn{#1}{#2}{#3}% @@ -745,6 +758,25 @@ +\cs_new:Nn \xassoccnt_declareassociatedcounters:nnn {% + \__xassoccnt_container_if_in:cnTF{\__xassoccnt_generate_countercontainername:n{\c_xassoccnt_mastername_str}:}{#2}{% + % Not contained in the driver counter list + \__xassoccnt_addassociatedcounters:nnn{#1}{#2}{#3}% + }{% + % Check first if there is a potential cross association + \__xassoccnt_adddrivercounter:nn{#1}{#2}% + \xassoccnt_is_associatedtocounter:nnTF{#3}{#2}{% + \msg_fatal:nnnn{xassoccnt}{crossassociation}{#2}{#3}% Fatal message + % Not necessary unless the fatal message above is removed + \__xassoccnt_container_removecounter:cn{\__xassoccnt_generate_countercontainername:n{\c_xassoccnt_mastername_str}:}{#2} + }{% No, we don't try to cross-associate two counters + \__xassoccnt_addassociatedcounters:nnn{#1}{#2}{#3}% + }% + }% + \__xassoccnt_container_removeduplicates:n{\__xassoccnt_drivercontainer:n{#2}} + \__xassoccnt_autodefine_drivercounter:nn { }{#2} +} + \prg_new_conditional:Nnn \xassoccnt_is_drivercounter:n {T,F,TF} @@ -823,6 +855,13 @@ \seq_map_inline:cn {\__xassoccnt_drivercontainer:n{#2}} { \__xassoccnt_container_removecounter:nn{\c_xassoccnt_associatedname_str}{##1} }% Remove from associated list container \__xassoccnt_container_gclear:c {\__xassoccnt_drivercontainer:n{#2} } } + + + + + + + %%%%%%%%%%%%%%%%%%%%% User interface routines @@ -2299,7 +2338,7 @@ \RenewDocumentCommand{\refstepcounter}{m}{% \seq_if_in:NxF \g_xassoccnt_suspendedcnt_seq {#1} {% - \cs_gset_nopar:Nn \__xassoccnt_lastrefsteppedcounter: {#1} + \cs_gset_nopar:Nx \__xassoccnt_lastrefsteppedcounter: {#1} \xassoccnt_standardrefstepcounter{#1}% \int_gset:Nn \g__xassoccnt_lastcountervalue_int {\number\value{#1}}% } @@ -2339,13 +2378,27 @@ \NewDocumentCommand{\NewDocumentCounter}{O{initial=\c_zero}mo}{% - \IfValueTF{#3}{% - \__xassoccnt_newcounter_ltx:nnn{#1}{#2}{#3} - }{% - \__xassoccnt_newcounter_ltx:nnn{#1}{#2}{} + \seq_set_from_clist:Nx \l_tmpa_seq {#2} + \seq_map_inline:Nn \l_tmpa_seq {% + \IfValueTF{#3}{% + \__xassoccnt_newcounter_ltx:nnn{#1}{##1}{#3} + }{% + \__xassoccnt_newcounter_ltx:nnn{#1}{##1}{} + } } } +%\NewDocumentCommand{\NewDocumentCounters}{O{initial=\c_zero}mo}{% +% \seq_map_inline:Nn \l_tmpa_seq {% +% \IfValueTF{#3}{% +% \NewDocumentCounter[#1]{##1}[#3]% +% }{% +% \NewDocumentCounter[#1]{##1}% +% }% +% }% +%} + + \NewDocumentCommand{\CopyDocumentCounters}{O{}mm}{% \__xassoccnt_copycounters:nnn{#1}{#2}{#3}% } @@ -2371,12 +2424,12 @@ \prg_new_conditional:Nnn \__xassoccnt_ifinresetlist:nn {T,F,TF} {% \bool_set_false:N \l__xassoccnt_isinresetlist_bool - \cs_set:Nn \l__tmpa_cs: {#2} + \cs_set:Nx \l__tmpa_cs: {#2} \def\@elt##1{% Can't use \cs_new:Nn here :-( \cs_set:Nn \l__tmpb_cs: {##1} % Check if \l__tmpa_cs: and \l__tmpb_cs: are equal \cs_if_eq:NNT \l__tmpa_cs: \l__tmpb_cs: { - \bool_set_true:N \l__xassoccnt_isinresetlist_bool + \bool_gset_true:N \l__xassoccnt_isinresetlist_bool } } \use:c{ cl@#1 } @@ -2447,12 +2500,18 @@ \NewDocumentCommand{\NewTotalDocumentCounter}{O{}m}{% \keys_set:nn {xassoccnt} {supertotal=false,#1} - \__xassoccnt_ifis_latexcounter:nF {#2} {% Define the counter - \xassoccnt_declaredocumentcounter:nn{sloppy=false}{#2}% - }% - \__xassoccnt_registertotaldocumentcounter:nn{#1}{#2} + \seq_set_from_clist:Nn \l_tmpa_seq {#2} + \seq_map_inline:Nn \l_tmpa_seq { + \__xassoccnt_ifis_latexcounter:nF {##1} {% Define the counter + \xassoccnt_declaredocumentcounter:nn{sloppy=false}{##1}% + }% + \__xassoccnt_registertotaldocumentcounter:nn{#1}{##1} + } } + + + \cs_new:Nn \__xassoccnt_store_totalcounter_value:n {% \prop_put:Nnn \g_xassoccnt_totalcounter_prop {#1} {\number\value{\__xassoccnt_expand_totalcountername:n{#1}}} \prop_put:Nnn \g_xassoccnt_totalcounter_prop {#1name} {\__xassoccnt_expand_totalcountername:n{#1}} @@ -2557,6 +2616,13 @@ { #2 } } +\NewDocumentCommand{\DeclareTotalAssociatedCounters}{omm}{% + \NewTotalDocumentCounter{#3}% + \DeclareAssociatedCounters{#2}{#3}% +} + + + %%% Counter backup list features % Those macros all deal with the global reset list% @@ -2828,11 +2894,17 @@ %%%%%%%%%%%%%%%%%%%% \cs_new:Nn \xassoccnt_declaredocumentcounteropt:nnn{% - \__xassoccnt_newcounter_ltx:nnn{#1}{#2}{#3}% + \seq_set_from_clist:Nx \l_tmpa_seq {#2} + \seq_map_inline:Nn \l_tmpa_seq { + \__xassoccnt_newcounter_ltx:nnn{#1}{##1}{#3}% + } } \cs_new:Nn \xassoccnt_declaredocumentcounter:nn{% - \__xassoccnt_newcounter_ltx:nn{#1}{#2}{}% + \seq_set_from_clist:Nx \l_tmpa_seq {#2} + \seq_map_inline:Nn \l_tmpa_seq { + \__xassoccnt_newcounter_ltx:nn{#1}{##1}{}% + } } @@ -2853,6 +2925,73 @@ }% } + +\cs_new:Nn \__xassoccnt_generate_associated_counters_labels:Nn {% + \seq_map_inline:Nn #1 {% + \prop_set_eq:NN \l_tmpb_prop \l_tmpa_prop + \prop_if_in:NnF \l_tmpb_prop {prefix } { \prop_put:Nnn \l_tmpb_prop {prefix} {##1} } + \def\@tempa{##1}% + \def\cref@result{2}% + \protected@edef\cref@currentlabel{% + [\@tempa][\arabic{##1}][\cref@result]% + \csname p@##1\endcsname\csname the##1\endcsname}% + \__xassoccnt_internal_label:nn {##1} {\prop_item:Nn \l_tmpb_prop {prefix}\prop_item:Nn\l_tmpb_prop {prefix-sep}#2} + }% End of \seq_map_inline +} + + +%%%% + +%%% Label features --- Experimental --- from 2017/03/03 + +\NewDocumentCommand{\RedefineLabelCommand}{}{% + \bool_if:NT \g__xassoccnt_redefinelabel_bool { + + \cs_new:Nn \__xassoccnt_internal_label:n {% + \latex@@label{##1}% + } + + \cs_new:Nn \__xassoccnt_internal_label:nn {% + \bool_if:NTF \l__xassoccnt_cleverefpackage_loaded_bool {% + \latex@@label[##1]{##2}% + }{ + \latex@@label{##2}% + } + } + + \keys_define:nn {xassoccntlabel} {% + all .bool_set:N = \l_xassoccnt_allassociatedcounters_labeled_bool, + select .code:n= { \seq_set_from_clist:Nx \l_tmpa_seq { ##1 }\bool_set_false:N \l_xassoccnt_allassociatedcounters_labeled_bool }, + prefix .code:n={ \prop_put:Nnx \l_tmpa_prop {prefix} {##1} }, + prefix-sep .code:n={ \prop_put:Nnx \l_tmpa_prop {prefix-sep} {##1} } + } + \RenewDocumentCommand{\label}{omO{}}{% + \group_begin: + \prop_clear:N \l_tmpa_prop + \seq_clear:N \l_tmpa_seq + \keys_set:nn {xassoccntlabel} {all=true,prefix-sep={\xassoccnt_extract_moduledata:n{prefix-sep}},##3}% + % + \IfValueTF{##1}{% + % Generate the regular label + \__xassoccnt_internal_label:nn {##1} {##2} + }{% + \__xassoccnt_internal_label:n {##2} + } + \bool_if:NT \l_xassoccnt_allassociatedcounters_labeled_bool {% + % The prefix is made from the associated counter + \prop_remove:Nn \l_tmpa_prop {prefix} + \seq_set_eq:Nc \l_tmpa_seq {\__xassoccnt_drivercontainer:n{\LastRefSteppedCounter}} + } + \seq_if_empty:NF \l_tmpa_seq {% Check whether either the only - list or the driver container list is empty (i.e. it was no driver container at all + % If non-empty -> generate the labels with the given naming scheme + \__xassoccnt_generate_associated_counters_labels:Nn \l_tmpa_seq {##2} + }% End of \seq_if_empty + \group_end: + }% End of \RenewDocumentCommand{\label} + } +} + + \ExplSyntaxOff \EnableNumberofrunsTF{% @@ -2875,9 +3014,17 @@ \@onlypreamble{\NewTotalDocumentCounter} \@onlypreamble{\RegisterTotalDocumentCounter} \@onlypreamble{\DeclareAssociatedCounters} +\@onlypreamble{\DeclareTotalAssociatedCounters} \@onlypreamble{\DeclareDocumentCounter} \@onlypreamble{\DeclareCoupledCounters} +\AtEndPreamble{% + \AtBeginDocument{% + \LetLtxMacro\latex@@label\label + \RedefineLabelCommand% + } +} + \AtBeginDocument{% \DeclareBackupCountersGroupName{scratch}% } -- cgit v1.2.3