From 5fd760969b1a06d4ef546ad1e06439f3ba3661dc Mon Sep 17 00:00:00 2001
From: Karl Berry <karl@freefriends.org>
Date: Sun, 30 Apr 2017 20:33:07 +0000
Subject: xassoccnt (30apr17)

git-svn-id: svn://tug.org/texlive/trunk@44127 c570f23f-e606-0410-a88d-b1316a301751
---
 .../texmf-dist/tex/latex/xassoccnt/xassoccnt.sty   | 874 +++++++++++++++++++--
 1 file changed, 803 insertions(+), 71 deletions(-)

(limited to 'Master/texmf-dist/tex/latex/xassoccnt/xassoccnt.sty')

diff --git a/Master/texmf-dist/tex/latex/xassoccnt/xassoccnt.sty b/Master/texmf-dist/tex/latex/xassoccnt/xassoccnt.sty
index 628d992ce3f..932f421190f 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 1.3 (2017/03/05 -- 18:08:47)
+%% LaTeX package xassoccnt - version 1.4 (2017/04/30 -- 00:47:05)
 %% Source file for xassoccnt.sty
 %%
 %%
@@ -19,10 +19,10 @@
 %%
 %%
 
-\def\xassoccntpackageversion{1.3}
+\def\xassoccntpackageversion{1.4}
 \NeedsTeXFormat{LaTeX2e}[1995/12/01]
 
-\ProvidesPackage{xassoccnt}[2017/03/05 - v\xassoccntpackageversion]
+\ProvidesPackage{xassoccnt}[2017/04/30 - v\xassoccntpackageversion]
 \RequirePackage{etoolbox}
 \RequirePackage{letltxmacro}
 \RequirePackage{xcolor}
@@ -33,27 +33,51 @@
 \ExplSyntaxOn
 
 \newif\ifexplversionnew
-\explversionnewfalse
+\explversionnewtrue
 
 % Some variants of standard expl3 contributions
 
 \cs_generate_variant:Nn \seq_set_from_clist:Nn { Nx, cx }
 \cs_generate_variant:Nn \seq_gset_from_clist:Nn { Nx, cx }
+\cs_generate_variant:Nn \seq_set_split:Nnn  {Nxn,cxn,Nxx,cxx,cox,Nox,Non,con}
 
 \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}
-\cs_generate_variant:Nn \prop_put:Nnn {cxx}
+\cs_generate_variant:Nn \prop_put:Nnn {cxx,nxx,nxn,cxn,Nxx,Nxn}
+\cs_generate_variant:Nn \prop_gput:Nnn {cxx,nxx,nxn,cxn,Nxx,Nxn,NVx,Nvn,cVn,cVx}
 \cs_generate_variant:Nn \prop_remove:Nn {cx,Nx}
-\cs_generate_variant:Nn \prop_item:Nn {NV,cV,cx,No,co}
-\cs_generate_variant:Nn \int_set:Nn {NV,Nx}
+\cs_generate_variant:Nn \prop_gremove:Nn {Nx,cx,No,co,NV,cV}
+\cs_generate_variant:Nn \prop_item:Nn {NV,cV,cx,No,co,Nx,nx}
+\cs_generate_variant:Nn \int_set:Nn {NV,Nx,Nx,cx}
+\cs_generate_variant:Nn \cs_gset:Npn {NpV,Npv,cpV,cpv,cpo,Npo}
+\cs_generate_variant:Nn \tl_set:Nn {No,Nx,NV}
 
 
 % First some local or global values
 
+% global/local scratch variables
+\seq_new:N \l__xassoccnt_tmpa_seq
+
+\tl_new:N \l__xassoccnt_tmpa_tl
+\tl_new:N \l__xassoccnt_tmpb_tl
+
+\tl_new:N \g__xassoccnt_tmpa_tl
+\tl_new:N \g__xassoccnt_tmpb_tl
+
+\prop_new:N \l__xassoccnt_tmpa_prop
+\prop_new:N \g__xassoccnt_tmpa_prop
+
+\int_new:N \g__xassoccnt_tmpa_int
+\int_new:N \l__xassoccnt_tmpa_int
+
+
+\bool_new:N \l__xassoccnt_alphalphpackage_loaded_bool
 \bool_new:N \l__xassoccnt_hyperrefpackage_loaded_bool
 \bool_new:N \l__xassoccnt_cleverefpackage_loaded_bool
 
+\prop_new:N \g__xassoccnt_loadedpackages_prop
+
 \ifexplversionnew
 \str_const:Nn \c__xassoccnt_modulename_str {xassoccnt}
 \else
@@ -62,6 +86,9 @@
 
 \bool_new:N \l__xassoccnt_calcpackage_loaded
 
+\int_const:Nn \c_xassoccnt_false_int {0}
+\int_const:Nn \c_xassoccnt_true_int {1}
+
 \int_new:N \l__xassoccnt_initialcountervalue_int
 \int_new:N \g__xassoccnt_lastcountervalue_int
 
@@ -90,13 +117,21 @@
 
 
 % Reset of counters related 'variables'
+
+\seq_new:N \g_xassoccnt_reset_seq 
 \seq_new:N \l__xassoccnt_counterreset_seq
 
+% All counters
 \seq_new:N \g_xassoccnt_all_latex_counters_seq
 
 \prop_new:N \g_xassoccnt_latex_parentcounters_prop
 
 
+% Counter formats 
+
+\prop_new:N \l_xassoccnt_counter_format_prop
+\prop_new:N \g_xassoccnt_counter_formatdata_prop 
+
 %%%
 \int_new:N \g__xassoccnt_backupcalls_int
 \int_new:N \l__xassoccnt_backuptmpa_int
@@ -104,7 +139,6 @@
 \seq_new:N  \l__xassoccnt_countervaluesbackup_seq
 \seq_new:N \l__xassoccnt_backupresetlist_seq
 \bool_new:N \l__xassoccnt_counternamestarred_bool % Not needed actually
-
 \seq_new:N \g__xassoccnt_counternamesbackuplist_seq
 
 
@@ -137,6 +171,7 @@
 
 \prop_gput:Nnn \g_xassoccnt_module_data_prop {scratchname} {scratch}
 \prop_gput:Nnn \g_xassoccnt_module_data_prop {backupfeaturename} {backupcounters}
+\prop_gput:NnV \g_xassoccnt_module_data_prop {standardcounterformats} {\c_xassoccnt_true_int}
 
 \prop_gput:Nnn \g_xassoccnt_module_data_prop {prefix-sep} {::}
 
@@ -145,6 +180,12 @@
 }
 
 
+\cs_new:Npn \xasdata #1{%
+  \xassoccnt_extract_moduledata:n {#1}%
+}
+
+
+
 \keys_define:nn {xassoccnt}
 {
   initial               .code:n={ \int_set:Nn \l__xassoccnt_initialcountervalue_int {#1}},
@@ -208,9 +249,13 @@
 
   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 }
-
+  resetbackup .bool_set:N=\l__xassoccnt_resetbackupcounters_bool ,
+  standardcounterformats .choice:,
+  standardcounterformats /on .code:n={\prop_gput:NnV \g_xassoccnt_module_data_prop {standardcounterformats} {\c_xassoccnt_true_int}},
+  standardcounterformats /off .code:n={\prop_gput:NnV \g_xassoccnt_module_data_prop {standardcounterformats} {\c_xassoccnt_false_int}},
+  redefinelabel .bool_set:N= { \g__xassoccnt_redefinelabel_bool },
+  map-name .code:n= { \prop_put:Nnn \g_xassoccnt_module_data_prop {map-name} {#1}},
+  counter-name .code:n= { \prop_put:Nnn \g_xassoccnt_module_data_prop {counter-name} {#1}}
 }
 
 \keys_define:nn {xassoccnt_periodiccounter} {%
@@ -229,7 +274,7 @@
 }
 
 
-\keys_set:nn{xassoccnt}{nonumberofruns, redefinelabel=true}
+\keys_set:nn{xassoccnt}{nonumberofruns, redefinelabel=true,standardcounterformats=on}
 
 \ProcessKeysOptions{xassoccnt}
 
@@ -242,6 +287,9 @@
   Error:~Entity~#1~does~not~name~a~counter\\
 }
 
+%Messages related to Counter formats 
+\msg_new:nnn {xassoccnt} {counterformatnotdefined} {The~counter~format~"#1"~is~not~defined~for~counter~"#2"}
+\msg_new:nnn {xassoccnt} {counterformatwrongortooshort} {The~counter~format~for~"#1"~is~wrong~or~the~separator~is~missing}
 
 
 \msg_new:nnn{xassoccnt}{crossassociation}{%
@@ -339,12 +387,100 @@
   This~is~an~error! 
 }
 
+\msg_new:nnn{xassoccnt}{packagenotloadedfatal}{%
+  Error:~Package~"#1"~is~not~loaded~but~required~\\
+  This~is~an~error! 
+}
+
+
 
 \msg_new:nnn{xassoccnt}{containeralreadyexists}{%
   Error:~Container~named~#1~already~exists\\
 }
 
 
+\msg_new:nnn{xassoccnt}{languagemappingalreadyexists}{%
+  Warning:~Language~mapping~#1~already~exists!\\
+}
+
+
+\msg_new:nnn{xassoccnt}{undefinedlanguagemapping}{%
+  Error:~Language~mapping~#1~is~undefined!\\
+}
+
+
+
+%%%%%%%%%%%%%%%%%%%
+
+\cs_new:Nn \xassoccnt_trackloadedpackages:n {%
+  \seq_set_from_clist:Nn \l_tmpa_seq {#1} 
+  \seq_map_inline:Nn \l_tmpa_seq {%
+    \@ifpackageloaded{##1}{%
+      \prop_gput:Nnn \g__xassoccnt_loadedpackages_prop {##1} {\c_one}
+    }{%
+      \prop_gput:Nnn \g__xassoccnt_loadedpackages_prop {##1} {\c_zero}
+    }
+  }
+}
+
+\prg_new_conditional:Nnn \xassoccnt_package_loaded:n {T,F,TF}{%
+  \prop_if_in:NnTF \g__xassoccnt_loadedpackages_prop {#1} {%
+    \int_compare:nNnTF {\prop_item:Nn \g__xassoccnt_loadedpackages_prop {#1}} = {\c_zero } {\prg_return_false:} {\prg_return_true:}%
+  }{%
+    \prg_return_false:
+  }	
+}
+
+\prg_new_conditional:Nnn \xassoccnt_package_notloaded:n {T,F,TF}{%
+  \prop_if_in:NnTF \g__xassoccnt_loadedpackages_prop {#1} {%
+    \int_compare:nNnTF {\prop_item:Nn \g__xassoccnt_loadedpackages_prop {#1}} = {\c_zero } {\prg_return_true:} {\prg_return_false:}%
+  }{%
+    \prg_return_true:
+  }	
+}
+
+\prg_new_conditional:Nnn \__xassoccnt_package_notloaded_fatal:n {T,F,TF}{%
+  \xassoccnt_package_notloaded:nTF{#1}{%
+    \msg_error:nnn{xassoccnt}{packagenotloadedfatal}{#1}
+  }{%
+    \prg_return_true:
+  }
+}
+
+\cs_new:Nn \xassoccnt_package_notloaded_fatal:nn {%
+  \__xassoccnt_package_notloaded_fatal:nF {#1} {#2}
+}
+
+
+\NewDocumentCommand{\IfPackageLoadedT}{m+m}{%
+  \xassoccnt_package_loaded:nT {#1}{#2}
+}
+
+\NewDocumentCommand{\IfPackageLoadedF}{m+m}{%
+  \xassoccnt_package_loaded:nF {#1}{#2}
+}
+
+\NewDocumentCommand{\IfPackageLoadedTF}{m+m+m}{%
+  \xassoccnt_package_loaded:nTF {#1}{#2}{#3}
+}
+
+
+\NewDocumentCommand{\IfNotPackageLoadedTF}{m+m+m}{%
+  \xassoccnt_package_notloaded:nTF {#1}{#2}{#3}
+}
+
+\NewDocumentCommand{\IfNotPackageLoadedT}{m+m}{%
+  \xassoccnt_package_notloaded:nT {#1}{#2}
+}
+
+\NewDocumentCommand{\IfNotPackageLoadedF}{m+m}{%
+  \xassoccnt_package_notloaded:nF {#1}{#2}
+}
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%
+
 
 \cs_new:Nn \__xassoccnt_intinc:n {\int_gincr:N \l_xassoccnt_resetlist_counter}%
 
@@ -366,17 +502,17 @@
 
 
 \cs_new:Nn \xassoccnt_bootstrap_fullreset_list:n {%
-  \begingroup
+  \group_begin:
   \def\@elt##1{\seq_gput_right:cn {#1_fullresetlist_seq} {##1}}
   \use:c{cl@#1}
-  \endgroup
+  \group_end:
 }
 
 \cs_new:Nn \xassoccnt_local_list:nn {%
-  \begingroup
+  \group_begin:
   \def\@elt##1{\seq_gput_right:cn {#1} {##1}}
   \use:c{cl@#2}
-  \endgroup
+  \group_end:
 }
 
 
@@ -413,8 +549,27 @@
 }
 
 
+\NewDocumentCommand{\ClearCounterResetList}{sm}{%
+  \cs_if_exist:cT {cl@#2} {%  
+    \seq_clear:N \l__xassoccnt_tmpa_seq
+    \xassoccnt_local_list:nn {l__xassoccnt_tmpa_seq} {#2}
+    \seq_map_inline:Nn \l__xassoccnt_tmpa_seq {
+      \IfBooleanTF{#1}{%
+        \CounterWithout*{##1}{#2}%
+      }{%
+        \CounterWithout{##1}{#2}%
+      }%
+    }
+    \IfBooleanF{#1}{%
+      \xassoccnt_default_counterformat:n{#2}
+    }%
+    \cs_gset_eq:cc {cl@#2} {relax}%
+  }
+}
+
 
 \NewDocumentCommand{\RemoveFromReset}{mm}{%
+  \seq_clear:N \l_tmpa_seq
   \xassoccnt_local_list:nn {l_tmpa_seq} {#2}
   \seq_set_from_clist:Nn \l_tmpb_seq {#1} 
   \seq_map_inline:Nn \l_tmpb_seq {%
@@ -446,13 +601,63 @@
   \__xassoccnt_latexcounter_exists:nTF {#2} { 
     \seq_set_from_clist:Nn \l_tmpa_seq {#1} 
     \seq_map_inline:Nn \l_tmpa_seq {%
-      \@addtoreset{##1}{#2}%
-    }
+      \__xassoccnt_ifinresetlist:nnF{##1}{#2}{%
+        % Do not add the master counter to its own reset list!
+        \tl_if_eq:nnF { ##1 } {#2} {%
+          \@addtoreset{##1}{#2}%
+        }%
+      }
+    }% End of \seq_map_inline
   }{% 
     \msg_fatal:nnn{xassoccnt}{nameisnocounter}{#1}%   
   }%
 }
 
+
+
+
+%%%% CounterWithin - Features
+
+
+\NewDocumentCommand{\CounterWithin}{smm}{%
+  \__xassoccnt_latexcounter_exists:nTF {#3} {% 
+    \seq_set_from_clist:Nn \l_tmpa_seq {#2} %
+    \seq_map_inline:Nn \l_tmpa_seq {%
+      \__xassoccnt_ifinresetlist:nnF{##1}{#3}{%
+        % Do not add the master counter to its own reset list!
+        \tl_if_eq:nnF { ##1 } {#3} {%
+          \@addtoreset{##1}{#3}%
+        }%
+        \IfBooleanF{#1}{%
+          % Needs overhaul!
+          \cs_set:cpn {the##1} {\csname the#3\endcsname.\arabic{##1}}
+        }
+      }
+    }% End of \seq_map_inline
+  }{% 
+    \msg_fatal:nnn{xassoccnt}{nameisnocounter}{#2}%   
+  }%
+}
+
+
+\NewDocumentCommand{\CounterWithout}{smm}{%
+  \seq_clear:N \l_tmpa_seq
+  \xassoccnt_local_list:nn {l_tmpa_seq} {#3}
+  \seq_set_from_clist:Nn \l_tmpb_seq {#2} 
+  \seq_map_inline:Nn \l_tmpb_seq {%
+    \IfBooleanF{#1}{%
+      \cs_set:cpn {the##1} {\arabic{##1}}%
+    }	
+    \seq_remove_all:Nn \l_tmpa_seq {##1}%
+  }%
+  \cs_set:cpx {cl@#3}{\empty}
+  \seq_map_inline:Nn \l_tmpa_seq {%
+    \@addtoreset{##1}{#3}%
+  }
+}
+
+
+
 %%%% The original counter related routines!
 
 
@@ -465,14 +670,24 @@
 
 % Needed for Backup/Restore features 
 
-%\AtBeginDocument{%
+
 \AtEndPreamble{
+  \@ifpackageloaded{alphalph}{%
+    \bool_gset_true:N \l__xassoccnt_alphalphpackage_loaded_bool%
+  }{}%
   \@ifpackageloaded{hyperref}{%
     \bool_gset_true:N \l__xassoccnt_hyperrefpackage_loaded_bool%
   }{}%
   \@ifpackageloaded{cleveref}{%
     \bool_gset_true:N \l__xassoccnt_cleverefpackage_loaded_bool%
   }{}
+  \xassoccnt_trackloadedpackages:n{alphalph,calc,cleveref,hyperref}
+}
+
+\AtEndOfPackage{%
+  \@ifpackageloaded{alphalph}{%
+    \bool_gset_true:N \l__xassoccnt_alphalphpackage_loaded_bool%
+  }{}%
 }
 
 
@@ -485,7 +700,8 @@
 }{}
 
 \AtEndOfPackage{
-  \PackageInfo{xassoccnt}{2017/03/05 - v\xassoccntpackageversion -- stepping counters simultaneously and other features}
+  \PackageInfo{xassoccnt}{2017/04/30 - v\xassoccntpackageversion -- stepping counters simultaneously and other features}
+  \xassoccnt_trackloadedpackages:n{alphalph,calc,cleveref,hyperref}
   \@ifpackageloaded{calc}{%
     \msg_warning:nnn{xassoccnt}{incompatiblepackagenonfatal}{calc}% Warning
     \bool_set_true:N \l__xassoccnt_calcpackage_loaded
@@ -609,7 +825,7 @@
 }
 
 \cs_new:Nn \__xassoccnt_autodefine_associatedcounters:nn {%
-  \bool_if:nTF{ \g__xassoccnt_autodefine_counters }{%
+  \bool_if:NTF  \g__xassoccnt_autodefine_counters {%
     \seq_map_inline:Nn #2 { \__xassoccnt_newcounter_ltx:nnn {sloppy}{##1}{} }
   }{%
     \keys_set:nn{xassoccnt}{#1}
@@ -694,7 +910,9 @@
 
 
 \cs_new:Nn \__xassoccnt_newcounter_ltx:nn{%
+  \group_begin:
   \keys_set:nn {xassoccnt}{sloppy=false,initial=\c_zero,#1}
+%  \__xassoccnt_declare_language_map:nn {\prop_item:Nn \g_xassoccnt_module_data_prop {map-name} }{#2;;\prop_item:Nn \g_xassoccnt_module_data_prop {counter-name}}  
   \cs_if_exist:cTF{c@#2}{%
     \bool_if:nF {\l__xassoccnt_sloppy_newcounter }{
       \msg_error:nnn{xassoccnt}{counteralreadyexists}{#2}% Warning
@@ -703,12 +921,14 @@
     \newcounter{#2}%
     \xassoccnt_standardsetcounter{#2}{\l__xassoccnt_initialcountervalue_int}
   }%
+  \group_end:
 }
 
 
 \ifexplversionnew
 \cs_new:Nn \__xassoccnt_newcounter_ltx:nnn{%
-  \keys_set:nn {xassoccnt}{sloppy=false,initial=\c_zero,#1}
+  \group_begin:
+  \keys_set:nn {xassoccnt}{map-name=default,counter-name=#2,sloppy=false,initial=\c_zero,#1}
   \str_set:Nx \l_tmpa_str {#3}%
   \__xassoccnt_latexcounter_exists:nTF{#2}{%
     \bool_if:nF {\l__xassoccnt_sloppy_newcounter }{%
@@ -722,6 +942,7 @@
     }%
     \xassoccnt_standardsetcounter{#2}{\l__xassoccnt_initialcountervalue_int}%
   }
+  \group_end:
 }
 \else
 \cs_new:Nn \__xassoccnt_newcounter_ltx:nnn{%
@@ -745,27 +966,6 @@
 
 
 
-\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}%
-  }{%
-    % 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}
-}
-
-
-
 \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
@@ -1855,7 +2055,7 @@
 \NewDocumentCommand{\ClearBackupState}{O{}m}{%
   \keys_set:nn {xassoccnt_container} {backup-id={},#1}
   \xassoccnt_backup_clear_backupstate:nn { \__xassoccnt_backup_id_tl } {#2}
-  \prop_map_inline:cn {\xassoccnt_backup_subproplist:n{#2}} {##1->##2\par}%  
+  %\prop_map_inline:cn {\xassoccnt_backup_subproplist:n{#2}} {##1->##2\par}%  
 }
 
 
@@ -2135,7 +2335,6 @@
 
 \NewDocumentCommand{\RemoveAllPeriodicCounters}{O{}}{%
   \seq_map_inline:Nn \g_xassoccnt_periodiccounter_container_seq {\xassoccnt_remove_periodiccounter:nn {#1} {##1}}
-%  \cs_new:Nn \xassoccnt_remove_periodiccounter:nn {%
   \seq_gclear:N \g_xassoccnt_periodiccounter_container_seq
   \prop_gclear:N \g_xassoccnt_periodiccounter_prop
 }
@@ -2165,9 +2364,9 @@
 %%%% Redefinition of standard counter macros 
 
 
+\cs_set:Npn \stepcounter #1{%
 
-
-\RenewDocumentCommand{\stepcounter}{m}{% 
+%\def\stepcounter#1{% 
   \__xassoccnt_translate_countername:cn {l_tmpa_tl} {#1}%
   \xassoccnt_is_suspendedcounter:nF{#1}{%
     \xassoccnt_stepcounter_periodiccounter:n {#1}%
@@ -2203,6 +2402,7 @@
   }
 }
 
+
 \RenewDocumentCommand{\addtocounter}{mmO{}}{%
   \xassoccnt_is_periodiccounter:nTF {#1}{%
     \xassoccnt_addtocounter_periodiccounter:nnn {#1} {#2} {#3}%
@@ -2212,12 +2412,7 @@
 }
 
 
-
-
-
-
-
-\NewDocumentCommand{\xassoccnt_addtocounter}{mmO{}}{%
+\NewDocumentCommand{\xassoccnt_addtocounterfoo}{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}%
@@ -2231,12 +2426,11 @@
 }
 
 
-\RenewDocumentCommand{\xassoccnt_addtocounter}{mmO{}}{%
+\NewDocumentCommand{\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}% Remove this
     \cs_gset_nopar:Npx \LastAddedToCounter {\tl_use:N \l_tmpb_tl}%
   }%
   % Now check if #1 is a total counter and set the property correspondingly
@@ -2334,6 +2528,7 @@
 }
 
 
+
 \RenewDocumentCommand{\setcounter}{mm}{%
   \__xassoccnt_translate_countername:cn {l_tmpb_tl}{#1}%
 %  \cs_gset_nopar:Nn \__xassoccnt_lastsetcounter: {#1}
@@ -2346,8 +2541,7 @@
 }
 
 
-
-\RenewDocumentCommand{\refstepcounter}{m}{%
+\cs_set:Npn \refstepcounter #1 {%
   \seq_if_in:NxF \g_xassoccnt_suspendedcnt_seq {#1} {%
     \cs_gset_nopar:Npx \LastRefSteppedCounter {#1}
     \xassoccnt_standardrefstepcounter{#1}%
@@ -2356,7 +2550,6 @@
 }
 
 
-
 \newcommand{\LastCounterValue}{%
   \int_use:N \g__xassoccnt_lastcountervalue_int
 }
@@ -2365,6 +2558,7 @@
 %%%%% Wrappers for \newcounter etc. 
 
 \NewDocumentCommand{\NewDocumentCounter}{O{initial=\c_zero}mo}{%
+  \group_begin:
   \seq_set_from_clist:Nx \l_tmpa_seq {#2} 
   \seq_map_inline:Nn \l_tmpa_seq {%
     \IfValueTF{#3}{%
@@ -2373,6 +2567,7 @@
       \__xassoccnt_newcounter_ltx:nnn{#1}{##1}{}
     }
   }
+  \group_end:
 }
 
 \NewDocumentCommand{\CopyDocumentCounters}{O{}mm}{% 
@@ -2429,13 +2624,10 @@
   \__xassoccnt_ifinresetlist:nnF{#2}{#3}{#4}%
 }
 
-
-
 \cs_new_nopar:Npn \GetAllResetLists {%
   \group_begin:
   \def\@elt##1{%
     \seq_gput_right:Nn \g_xassoccnt_all_latex_counters_seq {##1}%
-%    \seq_set:c { g_latex_cntr_##1_seq }
   }
   \cl@@ckpt%
   \seq_map_inline:Nn \g_xassoccnt_all_latex_counters_seq {%
@@ -2448,13 +2640,74 @@
       \prop_gput:Nnn \g_xassoccnt_latex_parentcounters_prop {####1} {##1}
     }
   }
+  % \prop_show:N \g_xassoccnt_latex_parentcounters_prop %\g_latex_cntr_subsubsection_seq
   \group_end:
 }
 
 
+\cs_new:Nn \xassoccnt_full_reset_list_recursive_other:nn {
+  \seq_clear:N \l_tmpa_seq
+  \xassoccnt_local_list:nn {l_tmpa_seq} {#2}
+  \seq_map_inline:Nn \l_tmpa_seq {%
+    \seq_gput_right:cn {#1_fullresetlist_seq} {##1}%
+    \seq_remove_duplicates:c {#1_fullresetlist_seq } % Remove the duplicates 
+    \xassoccnt_full_reset_list_recursive:nn {#1} {##1}% Recursive call
+  }
+}
+
+
 % Gives the parent counter of a specific counter (or nothing)
 \cs_new:Npn \GetParentCounter #1{%
-  \prop_item:No \g_xassoccnt_latex_parentcounters_prop {#1}
+  \prop_if_in:NoT \g_xassoccnt_latex_parentcounters_prop {#1} {%
+    \prop_item:No \g_xassoccnt_latex_parentcounters_prop {#1}
+  }
+}
+
+
+
+
+\cs_new:Nn \__xassoccnt_parent_counter_chain:n {%
+  \int_gincr:N \g__xassoccnt_tmpa_int
+  \tl_set:Nx \l_tmpa_tl {#1}
+  \tl_set:Nx \l_tmpb_tl {\GetParentCounter{#1}}
+%  \seq_show:N \l__xassoccnt_tmpa_seq
+  \seq_gput_right:Nx \l__xassoccnt_tmpa_seq {\GetParentCounter{#1}}
+  \seq_remove_duplicates:N \l__xassoccnt_tmpa_seq 
+  \tl_set:Nx \l_tmpb_tl {\GetParentCounter{\l_tmpa_tl}}
+  \int_compare:nNnF{\tl_count:N  \l_tmpb_tl } = {0} {
+    \__xassoccnt_parent_counter_chain:V{\l_tmpb_tl}
+  }
+}
+
+
+\cs_new:Nn \xassoccnt_parent_counter_chain:n {%
+  \prop_if_exist:cTF {g_xassoccnt_#1_counter_chain_prop}{
+    \prop_gclear:c {g_xassoccnt_#1_counter_chain_prop} 
+  }{
+    \prop_new:c {g_xassoccnt_#1_counter_chain_prop} 
+  }
+  \seq_if_exist:cTF {g_xassoccnt_#1_counter_chain_seq} {
+    \seq_gclear:c {g_xassoccnt_#1_counter_chain_seq} 
+  }{
+    \seq_new:c {g_xassoccnt_#1_counter_chain_seq} 
+  }
+  \prop_clear:N \g__xassoccnt_tmpa_prop
+  \seq_clear:N \l__xassoccnt_tmpa_seq
+  
+  \int_gzero:N \g__xassoccnt_tmpa_int 
+  \prop_gput:NVx \g__xassoccnt_tmpa_prop {\g__xassoccnt_tmpa_int} {#1}
+  \seq_gput_right:Nx \l__xassoccnt_tmpa_seq {#1}%
+  \__xassoccnt_parent_counter_chain:x{#1}
+  \seq_gset_eq:cN {g_xassoccnt_#1_counter_chain_seq} \l__xassoccnt_tmpa_seq
+  \seq_pop_right:cN {g_xassoccnt_#1_counter_chain_seq} \l_tmpa_tl
+  \prop_gset_eq:cN {g_xassoccnt_#1_counter_chain_prop} \l__xassoccnt_tmpa_prop
+}
+
+\cs_generate_variant:Nn   \xassoccnt_parent_counter_chain:n {x,V}
+\cs_generate_variant:Nn \__xassoccnt_parent_counter_chain:n {x,V}
+
+\NewDocumentCommand{\GetParentCounterChain}{m}{%
+  \xassoccnt_parent_counter_chain:n{#1}
 }
 
 
@@ -2515,11 +2768,25 @@
 }
 
 
+\NewDocumentCommand{\DeclareTotalDocumentCounter}{O{}m}{%
+  \keys_set:nn {xassoccnt} {supertotal=false,#1}
+  \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}}
+  \prop_gput:Nnn \g_xassoccnt_totalcounter_prop {#1} {\number\value{\__xassoccnt_expand_totalcountername:n{#1}}}
+  \prop_gput:Nnn \g_xassoccnt_totalcounter_prop {#1name} {\__xassoccnt_expand_totalcountername:n{#1}}
+  \prop_gput:Nxx \g_xassoccnt_totalcounter_prop {\__xassoccnt_expand_totalcountername:n{#1}} {#1}% back reference
 }
 
 \cs_new:Nn \__xassoccnt_registertotaldocumentcounter:nn {%
@@ -2536,23 +2803,27 @@
     \bool_if:NT \l__xassoccnt_is_supertotalcounter_bool {%
       \__xassoccnt_add_supertotalcounter:n {#2}
     }
-    \AtEndDocument{%
-      \__xassoccnt_writetotalcounters:nn {#2}{#2}
-    }%
+% Removed on 2017/03/12
+%    \AtEndDocument{%
+%      \__xassoccnt_writetotalcounters:nn {#2}{#2}
+%    }%
   }%
 }
 
+\cs_generate_variant:Nn \__xassoccnt_registertotaldocumentcounter:nn {nx}
+
 \NewDocumentCommand{\RegisterTotalDocumentCounter}{O{}m}{%
   \__xassoccnt_registertotaldocumentcounter:nn{#1}{#2}%
 }
 
 
 % Expandable version
-\newcommand{\TotalValue}[1]{%
+\cs_new:Npn \TotalValue #1{%
   \prop_item:Nn \g_xassoccnt_totalcounter_prop {#1}%
 }
 
-\cs_new:Nn \__xassoccnt_writetotalcounters:nn {%
+
+\cs_new:Nn \__xassoccnt_writetotalcounters_old:nn {%
   \immediate\write\@mainaux {%
     \string\IfIsDocumentCounterF\expandafter{\__xassoccnt_expand_totalcountername:n{#1}}{\string\DeclareDocumentCounter\expandafter{\__xassoccnt_expand_totalcountername:n{#1}}}
   }
@@ -2567,6 +2838,33 @@
   }
 }
 
+\cs_generate_variant:Nn \__xassoccnt_writetotalcounters_old:nn {nx,xx}
+
+
+\cs_new_nopar:Nn \__xassoccnt_writetotalcounters_atend: {%
+  \seq_map_inline:Nn \g__xassoccnt_totalcounter_container {
+    \immediate\write\@mainaux{%
+      \string\IfIsDocumentCounterF{##1}{\string\DeclareDocumentCounter{##1}}^^J
+    }
+    \seq_if_in:NnTF \g__xassoccnt_supertotalcounter_container {##1} {%
+      \immediate\write\@mainaux{%
+        \string\setcounter{\__xassoccnt_expand_totalcountername:n{##1}}{\number\value{\__xassoccnt_expand_totalcountername:n{##1}}}%
+      }
+    }{%
+      \immediate\write\@mainaux{%      
+        \string\setcounter{##1}{\number\value{\prop_item:Nn \g_xassoccnt_totalcounter_prop {##1}}}
+      }
+    }
+  }
+}
+
+\NewDocumentCommand{\WriteCountersAtEnd}{}{%
+  \__xassoccnt_writetotalcounters_atend:%
+}
+
+
+
+
 \NewDocumentCommand{\TotalCounterInternalNameExp}{m}{%
   \prop_item:Nn \g_xassoccnt_totalcounter_prop {#1name}%
 }
@@ -2875,6 +3173,24 @@
 }
 
 
+\NewDocumentCommand{\LoopCounterResetList}{mm}{%
+  \seq_gclear:N \g_xassoccnt_reset_seq
+  \group_begin:
+  \cs_if_exist:cT {cl@#1} {%
+    \def\@elt##1{%
+      \seq_gput_right:Nn \g_xassoccnt_reset_seq {##1}
+    }
+    \use:c{cl@#1}% Fill the list
+  }
+  \group_end:
+  \seq_map_inline:Nn \g_xassoccnt_reset_seq  {%
+    \use:c{\cs_to_str:N #2}{#1}{##1}
+  }
+}
+
+
+
+
 %%%%
 
 %% Counter-Values-Mapping-To-Something-Different - Macros
@@ -2913,6 +3229,211 @@
 }
 
 
+\cs_generate_variant:Nn \xassoccnt_declaredocumentcounter:nn {nx}
+
+
+%%% Counter Output
+
+
+\cs_new:Npn \BinaryValue#1{%
+  \int_to_bin:n{\number\value{#1}}%
+}
+
+\cs_new:Npn \hexValue#1{%
+  \int_to_hex:n{\number\value{#1}}%
+}
+
+\cs_new:Npn \HexValue#1{%
+  \int_to_Hex:n{\number\value{#1}}%
+}
+
+\cs_new:Npn \OctalValue#1{%
+  \int_to_oct:n{\number\value{#1}}%
+}
+
+
+\cs_new:Npn \xalphalph #1 {%
+  \int_to_alph:n{\number\value{#1}}
+}
+
+\cs_new:Npn \xAlphAlph #1 {%
+  \int_to_Alph:n{\number\value{#1}}
+}
+
+
+\cs_new:Nn \xassoccnt_default_counterformat:n{%
+  \arabic{#1}%
+}
+
+\cs_new:Nn \xassoccnt_alphalph_wrapper:n{%
+  \xassoccnt_package_notloaded:nTF {alphalph}{%
+    \cs_set:cpn {the#1}{\int_to_alph:n{\number\value{#1}}}
+  }{%
+    \cs_set:cpn {the#1}{\alphalph{\value{#1}}}
+  }
+}
+
+\cs_new:Nn \xassoccnt_AlphAlph_wrapper:n{%
+  \xassoccnt_package_notloaded:nTF {alphalph}{%
+    \cs_set:cpn {the#1}{\int_to_Alph:n{\number\value{#1}}}
+  }{%
+    \cs_set:cpn {the#1}{\AlphAlph{\value{#1}}}
+  }
+}
+
+
+\NewDocumentCommand{\alphalphinternal}{m}{%
+  \xassoccnt_alphalph_wrapper:n{#1}
+}
+
+\NewDocumentCommand{\AlphAlphinternal}{m}{%
+  \xassoccnt_AlphAlph_wrapper:n{#1}
+}
+
+
+
+
+\keys_define:nn {xassoccnt(COUNTERFORMAT)} {
+  separator .initial:n={!},
+  separator .code:n={\prop_put:Nnn \l__xassoccnt_tmpa_prop {counterformatseparator} {#1}},
+  recursive .bool_set:N=\l_tmpa_bool
+}
+
+
+\cs_new:Nn \__xassoccnt_add_counter_formats:nn {%
+  \group_begin:
+  \seq_set_from_clist:Nn \l_tmpa_seq {#2}
+  \seq_map_inline:Nn \l_tmpa_seq {%
+    \seq_set_split:Nxn \l_tmpb_seq {#1} {##1}
+    \int_compare:nNnTF {\seq_count:N \l_tmpb_seq } > {1} {
+      \prop_gput:Nxx \g_xassoccnt_counter_formatdata_prop {\seq_item:Nn \l_tmpb_seq {1}} { \seq_item:Nn \l_tmpb_seq {2} }
+    }{
+      \msg_fatal:nnx {xassoccnt}{counterformatwrongortooshort}{\seq_item:Nn \l_tmpb_seq {1}}
+    }
+  }
+  \group_end:
+}
+
+\cs_new:Nn \__xassoccnt_remove_counter_formats:nn {%
+  \seq_set_from_clist:Nn \l_tmpa_seq {#2}
+  \seq_map_inline:Nn \l_tmpa_seq {
+    \prop_gremove:Nx \g_xassoccnt_counter_formatdata_prop {##1}
+  }
+}
+
+
+
+\NewDocumentCommand{\StoreCounterFormats}{O{}m}{%
+  \group_begin:
+  \keys_set:nn {xassoccnt(COUNTERFORMAT)}{separator=!,#1}
+  \__xassoccnt_add_counter_formats:nn {\prop_item:Nn \l__xassoccnt_tmpa_prop {counterformatseparator}}{#2}
+  \group_end:
+}
+
+\NewDocumentCommand{\AddCounterFormats}{O{}m}{%
+  \group_begin:
+  \keys_set:nn {xassoccnt(COUNTERFORMAT)}{separator={!},#1}
+  \__xassoccnt_add_counter_formats:nn {\prop_item:Nn \l__xassoccnt_tmpa_prop {counterformatseparator}}{#2}
+  \group_end:
+}
+
+\NewDocumentCommand{\RemoveCounterFormats}{O{}m}{%
+  % First optional arg is reserved for later purposes
+  \__xassoccnt_remove_counter_formats:nn {}{#2}
+}
+
+\NewDocumentCommand{\ClearCounterFormats}{}{%
+  \prop_gclear:N \g_xassoccnt_counter_formatdata_prop
+}
+
+\NewDocumentCommand{\ShowCounterFormats}{}{%
+  \prop_map_inline:Nn \g_xassoccnt_counter_formatdata_prop {##1~uses~\cs_to_str:N ##2\par}
+}
+
+
+
+
+% \seq_item 1 / seq_item 2 
+\cs_new:Nn \__xassoccnt_set_counterformat:nnn{%
+  \group_begin:
+  \tl_clear:N \l_tmpb_tl
+  \int_compare:nNnTF {#1} > {1} {%
+    \tl_set:Nx \l_tmpb_tl {#3}
+  }{% Only one or less arguments -> use \arabic as counter format}
+    \tl_set:Nn \l_tmpb_tl {n} % Arabic counter format (ar)
+  }
+  \prop_if_in:NVTF  \g_xassoccnt_counter_formatdata_prop {\l_tmpb_tl}  {%
+    \tl_clear:N \l_tmpa_tl
+    \tl_put_right:Nx \l_tmpa_tl { \prop_item:NV \g_xassoccnt_counter_formatdata_prop {\l_tmpb_tl}{#2}}
+    \cs_gset:cpV {the #2} {\l_tmpa_tl}
+  }{%
+    \msg_fatal:nnxx {xassoccnt}{counterformatnotdefined}{\tl_use:N \l_tmpb_tl}{#2}
+  }
+  \group_end:
+}
+
+
+\cs_new:Nn \xassoccnt_set_counterformat:n {%
+  \seq_set_split:Nxn \l_tmpb_seq {\prop_item:Nn \l__xassoccnt_tmpa_prop {counterformatseparator}} {#1}
+    
+  \__xassoccnt_set_counterformat:nnn { \seq_count:N \l_tmpb_seq }{ \seq_item:Nn \l_tmpb_seq {1}} {  \seq_item:Nn \l_tmpb_seq {2} }
+}
+
+
+
+
+
+\NewDocumentCommand{\CounterFormat}{O{}m}{%
+  \group_begin:
+  \keys_set:nn {xassoccnt(COUNTERFORMAT)}{recursive=false,separator={!},#1}
+  \bool_if:NTF \l_tmpa_bool {%
+    \xassoccnt_recursive_counter_format:n{#2}
+  }{%
+    \seq_set_from_clist:Nx \l_tmpa_seq {#2}
+    \seq_map_inline:Nn \l_tmpa_seq {%
+      \xassoccnt_set_counterformat:n {##1}
+    }
+  }
+  \group_end:
+}
+
+\cs_new:Nn \__xassoccnt_recursive_counter_format:nn {%
+  \tl_set:Nx \l__xassoccnt_tmpb_tl {#2}%
+  \xassoccnt_parent_counter_chain:n {#1}
+  \seq_if_exist:cT {g_xassoccnt_#1_counter_chain_seq}{
+    \seq_map_inline:cn {g_xassoccnt_#1_counter_chain_seq } {%
+      \int_incr:N \l__xassoccnt_tmpa_int
+      \int_compare:nNnTF{ \l__xassoccnt_tmpa_int} < {\seq_count:c {g_xassoccnt_#1_counter_chain_seq}} {%
+        \int_set:NV \l_tmpa_int { \l__xassoccnt_tmpa_int }
+        \int_incr:N \l_tmpa_int
+        \tl_set:Nn \l_tmpa_tl {\csname}
+        \tl_put_right:Nx \l_tmpa_tl {the\seq_item:cn {g_xassoccnt_#1_counter_chain_seq} {\l_tmpa_int}}
+        \tl_put_right:Nn \l_tmpa_tl {\endcsname.}
+        \tl_put_right:NV \l_tmpa_tl {\l__xassoccnt_tmpb_tl{##1}}
+      }{%
+        % Last element of the list, must only have its own representation usually, say \arabic{
+        \tl_clear:N \l_tmpa_tl
+        \tl_put_right:NV \l_tmpa_tl {\l__xassoccnt_tmpb_tl{##1}}
+      }
+      \cs_gset:cpV {the##1} {\l_tmpa_tl}
+    }
+  }% End of \seq_if_exist:cT
+}
+
+\cs_new:Nn \xassoccnt_recursive_counter_format:n {%
+  \group_begin:
+  \seq_set_split:Nxn \l_tmpb_seq {\prop_item:Nn \l__xassoccnt_tmpa_prop {counterformatseparator}} {#1}
+  % Get format
+  \tl_clear:N \l_tmpb_tl
+  \int_compare:nNnTF {\seq_count:N \l_tmpb_seq} > {1} {%
+    \tl_set:Nx \l_tmpb_tl {\seq_item:Nn \l_tmpb_seq {2}}
+  }{% Only one or less arguments -> use \arabic as counter format}
+    \tl_set:Nn \l_tmpb_tl {n} % Arabic counter format (n)
+  }
+  \__xassoccnt_recursive_counter_format:nn {\seq_item:Nn \l_tmpb_seq {1}}{\prop_item:NV \g_xassoccnt_counter_formatdata_prop {\l_tmpb_tl}}
+  \group_end:
+}
+
 
 %%%%%%%%%%%%%%%%%%%%
 
@@ -3084,6 +3605,212 @@
 }
 
 
+%%%%%%%%%%%%%%%%%%%%
+
+%%% Counter names to human language maps
+
+\seq_new:N \g_xassoccnt_language_map_seq 
+
+
+\cs_new:Nn \__xassoccnt_declare_language_map:n {%
+  \seq_set_from_clist:Nx \l_tmpa_seq {#1}
+  \seq_map_inline:Nn \l_tmpa_seq {
+    \seq_gput_right:Nn \g_xassoccnt_language_map_seq {##1}
+    \prop_if_exist:cF {g_xassoccnt_language_map_##1_prop } {
+      \prop_new:c { g_xassoccnt_language_map_##1_prop } 
+    }
+  }
+}
+
+\cs_new:Nn \__xassoccnt_new_language_mapping:n {
+  \seq_if_in:NnTF \g_xassoccnt_language_map_seq {#1} {
+    \msg_warning:nnn{xassoccnt}{languagemappingalreadyexists} {#1}
+  }{
+    \__xassoccnt_declare_language_map:n {#1}
+  }
+}
+
+
+\cs_new:Nn \__xassoccnt_declare_language_map:nn {
+  \__xassoccnt_new_language_mapping:n {#1 }
+  \__xassoccnt_add_language_mappings:nn {#1} {#2}
+%  \seq_set_from_clist:Nx \l_tmpa_seq {#2}
+%  \seq_new:c { g_xassoccnt_language_map_#1_seq }
+%  \seq_map_inline:Nn \l_tmpa_seq {
+%    \__xassoccnt_split_mapping_sequence:nn {#1} {##1}
+%  }
+%  \prop_log:c {g_xassoccnt_language_map_#1_prop }
+
+}
+
+\cs_new:Nn \__xassoccnt_add_language_mappings:nn {%
+  \group_begin:
+  \seq_set_from_clist:Nx \l_tmpa_seq {#2}
+  \seq_if_exist:cF { g_xassoccnt_language_map_#1_seq } {
+    \seq_new:c { g_xassoccnt_language_map_#1_seq }
+  }
+  \seq_map_inline:Nn \l_tmpa_seq {
+    \__xassoccnt_split_mapping_sequence:nn {#1} {##1}
+  }
+  \group_end:
+}
+
+
+\cs_new:Nn \__xassoccnt_use_if_empty:nn {%
+  \int_compare:nNnTF {\tl_count:n {#2} } = {0} {
+    #1
+  }{%
+    #2
+  }
+}
+
+\cs_generate_variant:Nn \__xassoccnt_use_if_empty:nn {nx,no,xx,xn}
+
+
+\cs_new:Nn \prop_put_uppercase_first:Nnn {
+  \prop_put:Nnn #1 {#2} {\__xassoccnt_uppercase_first:n {#3}}
+}
+
+\cs_new:Nn \prop_gput_uppercase_first:Nnn {%
+  \typeout{Content~is~#3}
+  \tl_set:Nn \l_tmpa_tl {#3}
+  %\__xassoccnt_uppercase_first:n {
+  \typeout{Content is \tl_use:N \l_tmpa_tl}
+  \prop_gput:NnV #1 {#2} {\l_tmpa_tl }
+}
+
+
+\cs_new:Nn \prop_gput_uppercase_first:Nnnn {%
+  \tl_if_empty:nTF {#4} {
+    \prop_gput:Nnx #1 {#2} {\__xassoccnt_uppercase_first:n {#3}}
+  }{
+    \prop_gput:NnV #1 {#2} {\__xassoccnt_uppercase_first:n {#4}}
+  }
+%  \tl_set:Nn \l_tmpa_tl {#3}
+%  %\__xassoccnt_uppercase_first:n {
+%  \typeout{Content is \tl_use:N \l_tmpa_tl}
+%  \prop_gput:NnV #1 {#2} {\l_tmpa_tl }
+}
+
+
+\cs_new:Nn \__xassoccnt_uppercase_first:n {%
+  \tl_upper_case:n {\tl_head:n{#1}}\tl_tail:n{#1}
+%  \typeout{  \tl_upper_case:n {\tl_head:n{#1}}\tl_tail:n{#1}}%
+%  \typeout{  \tl_upper_case:n {\tl_head:n{#1}}\tl_tail:n{#1}}
+}
+
+\cs_generate_variant:Nn \__xassoccnt_uppercase_first:n {x,o,c,V}
+
+\cs_generate_variant:Nn \prop_put_uppercase_first:Nnn {Nxx,Nnx,Nno,Nxn, cxn, cno,cxx,cnn}
+\cs_generate_variant:Nn \prop_gput_uppercase_first:Nnn {Nxx,Nnx,Nno,Nxn, cxn, cno,cxx,cnn}
+
+\cs_generate_variant:Nn \prop_gput_uppercase_first:Nnnn {Nxxx,Nnxx,cxxx,cnnn}
+
+
+
+
+\cs_new:Nn \__xassoccnt_split_mapping_sequence:nn {%
+  \group_begin:
+  \seq_set_split:Nnn \l_tmpb_seq {;;} {#2}
+  \seq_gput_right:cx {g_xassoccnt_language_map_#1_seq } { \seq_item:Nn \l_tmpb_seq {1}}
+  \int_compare:nNnT { \seq_count:N \l_tmpb_seq } = { \c_one } 
+  {
+    % Append the first element to be the reference entry
+    \seq_put_right:Nx \l_tmpb_seq { \seq_item:Nn \l_tmpb_seq {1} }
+  }
+%  \seq_map_inline:Nn \l_tmpb_seq {\typeout{##1~}}
+  \typeout{Checking arg 2}
+  \prop_gput:cxx { g_xassoccnt_language_map_#1_prop } {\seq_item:Nn \l_tmpb_seq {1}-singular} {\__xassoccnt_use_if_empty:xn{\seq_item:Nn \l_tmpb_seq {2}}{\seq_item:Nn \l_tmpb_seq {2}}}
+  \typeout{Checking arg 3}
+  \prop_gput:cxx { g_xassoccnt_language_map_#1_prop } {\seq_item:Nn \l_tmpb_seq {1}-plural} {\__xassoccnt_use_if_empty:xn{\seq_item:Nn \l_tmpb_seq {2}}{\seq_item:Nn \l_tmpb_seq {3}}}
+  \typeout{Checking arg 4}
+%  \prop_gput_uppercase_first:cxx { g_xassoccnt_language_map_#1_prop } {\seq_item:Nn \l_tmpb_seq {1}-uppercase-singular} {\__xassoccnt_use_if_empty:xn{\seq_item:Nn \l_tmpb_seq {2}}{\seq_item:Nn \l_tmpb_seq {4}}}
+
+  \prop_gput_uppercase_first:cxxx { g_xassoccnt_language_map_#1_prop } {\seq_item:Nn \l_tmpb_seq {1}-uppercase-singular} {\seq_item:Nn \l_tmpb_seq {2}}{\seq_item:Nn \l_tmpb_seq {4}}
+
+  \prop_gput_uppercase_first:cxxx { g_xassoccnt_language_map_#1_prop } {\seq_item:Nn \l_tmpb_seq {1}-uppercase-plural} {\seq_item:Nn \l_tmpb_seq {2}}{\seq_item:Nn \l_tmpb_seq {5}}
+
+
+%  \prop_gput:cxx { g_xassoccnt_language_map_#1_prop } {\seq_item:Nn \l_tmpb_seq {1}-uppercase-singular} {\__xassoccnt_uppercase_first:x{\__xassoccnt_use_if_empty:nn{\seq_item:Nn \l_tmpb_seq {2}}{\seq_item:Nn \l_tmpb_seq {4}}}}
+%  \prop_gput:cxx { g_xassoccnt_language_map_#1_prop } {\seq_item:Nn \l_tmpb_seq {1}-uppercase-plural} {\__xassoccnt_uppercase_first:x{\__xassoccnt_use_if_empty:nn{\seq_item:Nn \l_tmpb_seq {2}s}{\seq_item:Nn \l_tmpb_seq {5}}}}
+%  \prop_show:c { g_xassoccnt_language_map_#1_prop }
+  \group_end:
+}
+
+
+
+%  \seq_show:N \l_tmpb_seq 
+%  \prop_gput:cxx { g_xassoccnt_language_map_#1_prop } {\seq_item:Nn \l_tmpb_seq {1}} {\__xassoccnt_use_if_empty:xn{\seq_item:Nn \l_tmpb_seq {2}}{\seq_item:Nn \l_tmpb_seq {1}}}
+
+
+\cs_generate_variant:Nn \__xassoccnt_declare_language_map:nn {nx,xx}
+\cs_generate_variant:Nn \__xassoccnt_declare_language_map:n {x}
+
+
+\NewDocumentCommand{\DeclareLanguageMap}{m}{%
+  \__xassoccnt_declare_language_map:n {#1}
+}
+
+\NewDocumentCommand{\DeclareLanguageMappings}{m+m}{%
+  \__xassoccnt_declare_language_map:nn {#1}{#2}
+}
+
+\NewDocumentCommand{\AddLanguageMappings}{m+m}{%
+  \__xassoccnt_add_language_mappings:nn{#1}{#2}%
+}
+
+
+  
+\cs_generate_variant:Nn \prop_map_inline:Nn {Nx,cx}
+
+\NewDocumentCommand{\ShowLanguageMappings}{m}{%
+  \seq_map_inline:cn {g_xassoccnt_language_map_#1_seq }{%
+    ##1 ~ \prop_item:cx { g_xassoccnt_language_map_#1_prop } { ##1-singular } ~ \prop_item:cx { g_xassoccnt_language_map_#1_prop } { ##1-plural } ~ \prop_item:cx { g_xassoccnt_language_map_#1_prop } { ##1-uppercase-singular } ~ \prop_item:cx { g_xassoccnt_language_map_#1_prop } { ##1-uppercase-plural } \par
+  }
+  %\prop_map_inline:cn {g_xassoccnt_language_map_#1_prop }{#1 ~ ##1 ~ ##2 \par}
+}
+
+  
+\cs_new:Npn \RetrieveCounterSingularName #1#2{%
+ \prop_item:cn {g_xassoccnt_language_map_#1_prop }{#2-singular}
+}
+
+\cs_new:Npn \SetLanguageMapping #1 {%
+  \seq_if_in:NnTF \g_xassoccnt_language_map_seq {#1} {
+    \prop_gput:Nnn \g_xassoccnt_module_data_prop {currentlanguage} {#1}
+  }{% Begin of False
+    \msg_error:nnn{xassoccnt}{undefinedlanguagemapping}{#1}
+  }% End of False	
+}
+
+\cs_new:Npn \GetLanguageMapping  {%
+  \prop_item:Nn \g_xassoccnt_module_data_prop {currentlanguage}
+}
+
+
+
+\cs_new:Npn \xassingularname #1#2 {%
+  \prop_item:cn {g_xassoccnt_language_map_#1_prop }{#2-singular}
+}
+
+\cs_new:Npn \xaspluralname #1#2 {%
+  \prop_item:cn {g_xassoccnt_language_map_#1_prop }{#2-plural}
+}
+
+
+%%%%%%%%%%%%%%%%%%%
+
+% This is ad-hoc code for a yet - to be defined bool <-> prop list matching code
+
+\cs_new:Npn \PropertyHasValueTF #1#2#3#4 {%
+  \int_compare:nNnTF {\prop_item:Nn \g_xassoccnt_module_data_prop {#1}} = {#2} {
+    #3
+  }{%
+    #4
+  }
+}
+
+
 \ExplSyntaxOff
 
 \EnableNumberofrunsTF{%
@@ -3103,7 +3830,7 @@
 
 
 
-\@onlypreamble{\NewTotalDocumentCounter}
+\@onlypreamble{\DeclareTotalDocumentCounter}
 \@onlypreamble{\RegisterTotalDocumentCounter}
 \@onlypreamble{\DeclareAssociatedCounters}
 \@onlypreamble{\DeclareTotalAssociatedCounters}
@@ -3119,9 +3846,15 @@
 }
 
 \AtBeginDocument{%
+  \PropertyHasValueTF{standardcounterformats} {1} {%
+    \StoreCounterFormats{n!\arabic, b!\BinaryValue,h!\hexValue,H!\HexValue,r!\roman,R!\Roman,A!\Alph,a!\alph,aa!\xalphalph,o!\OctalValue,AA!\xAlphAlph}%
+  }{}
   \DeclareBackupCountersGroupName{scratch}%
 }
 
+\AtEndDocument{%
+  \WriteCountersAtEnd%
+}
 
 %%% Colour output routines
 
@@ -3131,7 +3864,6 @@
 \newcommand{\TotalCounterInfoColor}{violet}
 
 
-
 \AddFeature[sublists=true,publicname={Coupled Counters Feature}]{coupledcounters}
 \AddFeature[sublists=true,publicname={Backup Counters Feature}]{backupcounters}  % New style, not fully implemented so far
 
-- 
cgit v1.2.3

