From ff37512bde5f73a7c823f417675c27545da3dea0 Mon Sep 17 00:00:00 2001
From: Karl Berry <karl@freefriends.org>
Date: Sat, 3 Oct 2015 23:09:59 +0000
Subject: acro (3oct15)

git-svn-id: svn://tug.org/texlive/trunk@38537 c570f23f-e606-0410-a88d-b1316a301751
---
 Master/texmf-dist/tex/latex/acro/acro.sty | 721 ++++++++++++++++--------------
 1 file changed, 373 insertions(+), 348 deletions(-)

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

diff --git a/Master/texmf-dist/tex/latex/acro/acro.sty b/Master/texmf-dist/tex/latex/acro/acro.sty
index d9b996a194a..c8b8046c807 100644
--- a/Master/texmf-dist/tex/latex/acro/acro.sty
+++ b/Master/texmf-dist/tex/latex/acro/acro.sty
@@ -31,8 +31,8 @@
 \RequirePackage{expl3,l3sort,xparse,l3keys2e,xtemplate,etoolbox}
 \ProvidesExplPackage
   {acro}
-  {2015/09/05}
-  {2.1}
+  {2015/10/03}
+  {2.2}
   {Typeset Acronyms}
 
 % --------------------------------------------------------------------------
@@ -87,6 +87,12 @@
     form~ instead.
   }
 
+\msg_new:nnn {acro} {unknown-list-style}
+  {
+    You're~ trying~ to~ use~ the~ list~ style~ `#1'~ which~ isn't~ defined.~
+    Using~ `#2'~ instead.
+  }
+
 % message macros:
 \cs_new:Npn \__acro_remove_backslash:N #1
   { \exp_after:wN \use_none:n \token_to_str:N #1 }
@@ -119,7 +125,7 @@
       { \acro_harmless_message:nnnn {replaced}   {option} {#1} {#2} }
   }
 \cs_new_protected:Npn \acro_option_deprecated:n #1
-  { \cs_new_protected:Npn \acro_option_deprecated:nn {#1} {} }
+  { \acro_option_deprecated:nn {#1} {} }
 
 \cs_new_protected:Npn \acro_command_deprecated:NN #1#2
   {
@@ -160,9 +166,10 @@
 \cs_generate_variant:Nn \prop_put:Nnn           { NnV, cnx, cnv }
 \cs_generate_variant:Nn \prop_get:NnNF          { cn, cnc }
 \cs_generate_variant:Nn \cs_generate_variant:Nn { c }
+\cs_generate_variant:Nn \str_case:nn            { V }
 
 % --------------------------------------------------------------------------
-% boolean variables:
+% variables:
 \bool_new:N      \l__acro_silence_bool
 \bool_new:N      \l__acro_mark_as_used_bool
 \bool_new:N      \g__acro_mark_first_as_used_bool
@@ -212,9 +219,8 @@
 \bool_set_true:N \l__acro_list_all_pages_bool
 \bool_new:N      \g__acro_first_acronym_declared_bool
 \bool_new:N      \l__acro_include_endings_format_bool
+\bool_new:N      \l__acro_list_reverse_long_extra_bool
 
-% --------------------------------------------------------------------------
-% token list variables:
 \tl_new:N   \l__acro_ignore_tl
 \tl_new:N   \l__acro_short_format_tl
 \tl_new:N   \l__acro_alt_format_tl
@@ -246,13 +252,15 @@
 \tl_new:N   \l__acro_next_pages_tl
 \tl_set:Nn  \l__acro_next_pages_tl     { \,ff.\@ }
 \tl_new:N   \l__acro_list_instance_tl
-\tl_set:Nn  \l__acro_list_instance_tl  { list }
+\tl_set:Nn  \l__acro_list_instance_tl  {description}
 \tl_new:N   \l__acro_list_type_tl
-\tl_set:Nn  \l__acro_list_type_tl      { description }
+\tl_new:N   \l__acro_list_tl
 \tl_new:N   \l__acro_list_title_tl
 \tl_set:Nn  \l__acro_list_title_tl     { section* }
 \tl_new:N   \l__acro_list_name_tl
 \tl_set:Nn  \l__acro_list_name_tl      { Acronyms }
+\tl_new:N   \l__acro_list_before_tl
+\tl_new:N   \l__acro_list_after_tl
 \tl_new:N   \l__acro_short_tl
 \tl_new:N   \l__acro_alt_tl
 \tl_new:N   \l__acro_long_tl
@@ -280,16 +288,13 @@
 \tl_new:N   \l__acro_single_form_tl
 \tl_set:Nn  \l__acro_single_form_tl {long}
 
-% --------------------------------------------------------------------------
-% length variables:
-\dim_new:N  \l__acro_table_width_dim
-\AtBeginDocument
-  { \dim_set:Nn \l__acro_table_width_dim { .7\columnwidth } }
 \dim_new:N  \l__acro_page_space_dim
 
-\dim_new:N \l__acro_short_width_dim
+\dim_new:N  \l__acro_short_width_dim
 \dim_set:Nn \l__acro_short_width_dim {3em}
 
+\prop_new:N \l__acro_list_styles_prop
+
 % --------------------------------------------------------------------------
 % small commands for use at various places
 \cs_new:Npn \acro_no_break: { \tex_penalty:D \c_ten_thousand }
@@ -385,14 +390,9 @@
     next-page         .value_required:n = true ,
     next-pages        .tl_set:N   = \l__acro_next_pages_tl ,
     next-pages        .value_required:n = true ,
-    % TODO: get rid of list-type (set it implicitly?)
-    % proposed syntax: list-style = table : longtable
-    % with             list-style = longtable
-    % being an alias if it is unique
-    list-style        .tl_set:N   = \l__acro_list_instance_tl ,
+    list-style        .code:n     = \acro_set_list_style:n {#1} ,
     list-style        .value_required:n = true ,
-    list-type         .tl_set:N   = \l__acro_list_type_tl ,
-    list-type         .value_required:n = true ,
+    list-type         .code:n     = \acro_option_deprecated:n {list-type} ,
     list-header       .code:n     =
       \acro_option_deprecated:nn {list-header} {list-heading}
       \tl_set:Nn \l__acro_list_title_tl {#1} ,
@@ -400,8 +400,8 @@
     list-heading      .value_required:n = true ,
     list-name         .tl_set:N   = \l__acro_list_name_tl ,
     list-name         .value_required:n = true ,
-    list-table-width  .dim_set:N  = \l__acro_table_width_dim ,
-    list-table-width  .value_required:n = true ,
+    list-table-width  .code:n     =
+      \acro_option_deprecated:n {list-table-width} ,
     hyperref          .bool_set:N = \l__acro_use_hyperref_bool ,
     only-used         .bool_set:N = \l__acro_print_only_used_bool ,
     mark-as-used      .choice: ,
@@ -465,6 +465,34 @@
 \NewDocumentCommand \acsetup { m }
   { \keys_set:nn {acro} {#1} \ignorespaces }
 
+% --------------------------------------------------------------------------
+% we use xtemplate for different object types and with a different number of
+% arguments; let's declare functions for usage later so we don't have to
+% bother
+
+% objects with one argument:
+\cs_new_protected:Npn \acro_page_number_instance:nn #1#2
+  { \UseInstance {acro-page-number} {#1} {#2} }
+\cs_generate_variant:Nn \acro_page_number_instance:nn {V}
+
+\cs_new_protected:Npn \acro_extra_instance:nn #1#2
+  { \UseInstance {acro-extra} {#1} {#2} }
+\cs_generate_variant:Nn \acro_extra_instance:nn {VV}
+
+\cs_new_protected:Npn \acro_title_instance:nn #1#2
+  { \UseInstance {acro-title} {#1} {#2} }
+\cs_generate_variant:Nn \acro_title_instance:nn {VV}
+
+% objects with two arguments:
+\cs_new_protected:Npn \acro_list_instance:nnn #1#2#3
+  { \UseInstance {acro-list} {#1} {#2} {#3} }
+\cs_generate_variant:Nn \acro_list_instance:nnn {VVV}
+
+% objects with three arguments:
+\cs_new_protected:Npn \acro_first_instance:nnnn #1#2#3#4
+  { \UseInstance {acro-first} {#1} {#2} {#3} {#4} }
+\cs_generate_variant:Nn \acro_first_instance:nnnn {VnV,VnVV}
+  
 % --------------------------------------------------------------------------
 % hyperref support
 \cs_new_eq:NN \acro_hyper_target:nn \use_ii:nn
@@ -639,14 +667,14 @@
   }
 
 % template for footnotes, sidenotes, ...
-\DeclareTemplateInterface { acro-first } { note } { 3 }
+\DeclareTemplateInterface {acro-first} {note} {3}
   {
     use-note     : boolean    = true ,
     note-command : function 1 = \footnote {#1} ,
     foreign-sep  : tokenlist  = ~
   }
 
-\DeclareTemplateCode { acro-first } { note } { 3 }
+\DeclareTemplateCode {acro-first} {note} {3}
   {
     use-note     = \l__acro_use_note_bool ,
     note-command = \__acro_note_command:n ,
@@ -1002,37 +1030,33 @@
     \acro_list_title_format:n {#1}
   }
 
+\cs_new_protected:Npn \acro_declare_list_heading:nn #1#2
+  {
+    \DeclareInstance {acro-title} {#1} {sectioning}
+      { name-format = #2 {##1} }
+  }
+
+\NewDocumentCommand \DeclareAcroListHeading {mm}
+  { \acro_declare_list_heading:nn {#1} {#2} }
+
 % the different styles:
-\DeclareInstance {acro-title} {chapter*}       {sectioning}
-  { name-format = \chapter* {#1} }
-\DeclareInstance {acro-title} {part*}          {sectioning}
-  { name-format = \part* {#1} }
-\DeclareInstance {acro-title} {section*}       {sectioning}
-  { name-format = \section* {#1} }
-\DeclareInstance {acro-title} {subsection*}    {sectioning}
-  { name-format = \subsection* {#1} }
-\DeclareInstance {acro-title} {subsubsection*} {sectioning}
-  { name-format = \subsubsection* {#1} }
-\DeclareInstance {acro-title} {chapter}        {sectioning}
-  { name-format = \chapter {#1} }
-\DeclareInstance {acro-title} {part}           {sectioning}
-  { name-format = \part {#1} }
-\DeclareInstance {acro-title} {section}        {sectioning}
-  { name-format = \section {#1} }
-\DeclareInstance {acro-title} {subsection}     {sectioning}
-  { name-format = \subsection {#1} }
-\DeclareInstance {acro-title} {subsubsection}  {sectioning}
-  { name-format = \subsubsection {#1} }
-\DeclareInstance {acro-title} {addchap}        {sectioning}
-  { name-format = \addchap {#1} }
-\DeclareInstance {acro-title} {addsec}         {sectioning}
-  { name-format = \addsec {#1} }
-\DeclareInstance {acro-title} {none}           {sectioning}
-  { name-format = \use_none:n {#1} }
+\acro_declare_list_heading:nn {part}           {\part}
+\acro_declare_list_heading:nn {part*}          {\part*}
+\acro_declare_list_heading:nn {chapter}        {\chapter}
+\acro_declare_list_heading:nn {chapter*}       {\chapter*}
+\acro_declare_list_heading:nn {addchap}        {\addchap}
+\acro_declare_list_heading:nn {section}        {\section}
+\acro_declare_list_heading:nn {section*}       {\section*}
+\acro_declare_list_heading:nn {addsec}         {\addsec}
+\acro_declare_list_heading:nn {subsection}     {\subsection}
+\acro_declare_list_heading:nn {subsection*}    {\subsection*}
+\acro_declare_list_heading:nn {subsubsection}  {\subsubsection}
+\acro_declare_list_heading:nn {subsubsection*} {\subsubsection*}
+\acro_declare_list_heading:nn {none}           {\use_none:n}
 
 % --------------------------------------------------------------------------
-% outputting the whole list
-\DeclareObjectType {acro-list} {3}
+% typesetting the acronym list
+\DeclareObjectType {acro-list} {2}
 
 % #1: id
 % #2: excluded classes
@@ -1053,11 +1077,68 @@
       }
   }
 
-% build the list, dummy functions to be redefined in the template code:
-\cs_new:Npn \acro_print_list_short:nn #1#2 { }
-\cs_new:Npn \acro_print_list_long:n   #1   { }
-\cs_new:Npn \acro_print_list_extra:n  #1   { }
-\cs_new:Npn \acro_print_list_page:n   #1   { }
+% build the list: default functions, may be redefined in the template code
+\cs_new_protected:Npn \acro_print_list_short:nn #1#2
+  { \acro_list_short_entry:nn {#1} {#2} }
+\cs_new_protected:Npn \acro_print_list_long:n #1
+  { \acro_list_long_entry:n {#1} }
+\cs_new_protected:Npn \acro_print_list_extra:n #1
+  { \acro_list_extra_entry:n {#1} }
+\cs_new_protected:Npn \acro_print_list_page:n #1
+  { \acro_list_page_entry:n {#1} }
+
+% macros for standard retrieval of items in the list:
+\cs_new_protected:Npn \acro_list_short_entry:nn #1#2
+  {
+    \acro_hyper_target:nn
+      {#1}
+      {
+        \acro_acc_supp:nn
+          {#1}
+          { \acro_write_short:nn {#1} { \l__acro_list_short_format_tl {#2} } }
+      }
+  }
+
+\cs_set_protected:Npn \acro_list_long_entry:n #1
+  {
+    \group_begin:
+      \bool_if:NT \l__acro_capitalize_list_bool
+        { \bool_set_true:N \l__acro_first_upper_bool }
+      \acro_write_long:Vf \l__acro_list_long_format_tl
+        { \prop_item:Nn \l__acro_long_prop {#1} }
+    \group_end:
+    \bool_if:NT \l__acro_foreign_bool
+      { \acro_get_foreign:n {#1} }
+    \acro_cite_if:Nn \l__acro_citation_all_bool {#1}
+  }
+
+\cs_set_protected:Npn \acro_list_extra_entry:n #1
+  {
+    \prop_get:NnNT \l__acro_extra_prop {#1} \l__acro_tmpa_tl
+      {
+        \acro_extra_instance:VV
+          \l__acro_extra_instance_tl
+          \l__acro_tmpa_tl
+      }
+  }
+
+\cs_set_protected:Npn \acro_list_page_entry:n #1
+  {
+    \bool_if:nT { \cs_if_exist_p:c { acro@#1@once } }
+      {
+        \acro_page_number_instance:Vn
+          \l__acro_page_instance_tl
+          {#1}
+      }
+  }
+
+% this macro may be redefined in templates:
+% #1: short
+% #2: long
+% #3: extra
+% #4: page number(s)
+\cs_new_protected:Npn \acro_print_list_entry:nnnn #1#2#3#4
+  { #1 #2 #3 #4 }
 
 \cs_new:Npn \acroenparen #1 { ( #1 ) }
 
@@ -1076,9 +1157,10 @@
 \cs_new_protected:Npn \acro_for_all_acronyms_do:n #1
   { \prop_map_inline:Nn \l__acro_short_prop {#1} }
   
-% Test, if acronyms should be printed or not; needs testing for in/excluded
-% classes and options `only-used' and `single':
-\cs_new_protected:Npn \acro_list_allow_items:nn #1#2
+% test, if acronyms should be printed or not; needs testing for in/excluded
+% classes and options `only-used' and `single' -- this macro should be used in
+% the template code for retrieving the list
+\cs_new_protected:Npn \acro_list_items:nn #1#2
   {
     \acro_for_all_acronyms_do:n
       {
@@ -1103,17 +1185,10 @@
               {
                 \tl_if_blank:nTF {#1}
                   {
-                    \acro_print_list_entry:nnn
+                    \acro_print_list_entry:nnnn
                       { \acro_print_list_short:nn {##1} {##2} }
-                      {
-                        \bool_if:NT \l__acro_capitalize_list_bool
-                          { \bool_set_true:N \l__acro_first_upper_bool }
-                        \acro_print_list_long:n {##1}
-                        \bool_set_false:N \l__acro_first_upper_bool
-                        \bool_if:NT \l__acro_foreign_bool
-                          { \acro_get_foreign:n {##1} }
-                        \acro_print_list_extra:n {##1}
-                      }
+                      { \acro_print_list_long:n {##1} }
+                      { \acro_print_list_extra:n {##1} }
                       { \acro_print_list_page:n {##1} }
                   }
                   {
@@ -1126,17 +1201,10 @@
                             \tl_trim_spaces:N \l__acro_tmpb_tl
                             \tl_if_eq:NNT \l__acro_tmpa_tl \l__acro_tmpb_tl
                               {
-                                \acro_print_list_entry:nnn
+                                \acro_print_list_entry:nnnn
                                   { \acro_print_list_short:nn {##1} {##2} }
-                                  {
-                                    \bool_if:NT \l__acro_capitalize_list_bool
-                                      { \bool_set_true:N \l__acro_first_upper_bool }
-                                    \acro_print_list_long:n {##1}
-                                    \bool_set_false:N \l__acro_first_upper_bool
-                                    \bool_if:NT \l__acro_foreign_bool
-                                      { \acro_get_foreign:n {##1} }
-                                    \acro_print_list_extra:n {##1}
-                                  }
+                                  { \acro_print_list_long:n {##1} }
+                                  { \acro_print_list_extra:n {##1} }
                                   { \acro_print_list_page:n {##1} }
                               }
                           }
@@ -1147,68 +1215,66 @@
       }
   }
 
+% --------------------------------------------------------------------------
+% declare templates for the list:
 % list template:
-\DeclareTemplateInterface {acro-list} {list} {3}
-  { foreign-sep : tokenlist = { ~ } }
+\DeclareTemplateInterface {acro-list} {list} {2}
+  {
+    foreign-sep : tokenlist = {~} ,
+    list        : tokenlist = {description} ,
+    reverse     : boolean   = false ,
+    before      : tokenlist = ,
+    after       : tokenlist =
+  }
 
-\DeclareTemplateCode {acro-list} {list} {3}
-  { foreign-sep = \l__acro_foreign_sep_tl }
+\DeclareTemplateCode {acro-list} {list} {2}
+  {
+    foreign-sep = \l__acro_foreign_sep_tl ,
+    list        = \l__acro_list_tl ,
+    reverse     = \l__acro_list_reverse_long_extra_bool ,
+    before      = \l__acro_list_before_tl ,
+    after       = \l__acro_list_after_tl
+  }
   {
     \AssignTemplateKeys
     \bool_set_true:N \l__acro_in_list_bool
     \acro_activate_hyperref_support:
-    \cs_set_eq:NN \acro_print_list_entry:nnn \use:nnn
-    \cs_set_protected:Npn \acro_print_list_short:nn ##1##2
+    \bool_if:NTF \l__acro_list_reverse_long_extra_bool
       {
-        \item
-          [
-            \acro_hyper_target:nn
-              {##1}
-              {
-                \acro_acc_supp:nn
-                  {##1}
-                  { \acro_write_short:nn {##1} { \l__acro_list_short_format_tl {##2} } }
-              }
-          ]
+        \cs_set_protected:Npn \acro_print_list_entry:nnnn ##1##2##3##4
+          { \item [##1] ##3 ##2 ##4 }
       }
-    \cs_set_protected:Npn \acro_print_list_long:n ##1
       {
-        \acro_write_long:Vf \l__acro_list_long_format_tl
-          {
-            \prop_if_in:NnTF \l__acro_list_prop {##1}
-              { \prop_item:Nn \l__acro_list_prop {##1} }
-              { \prop_item:Nn \l__acro_long_prop {##1} }
-          }
-        \acro_cite_if:Nn \l__acro_citation_all_bool {##1}
+        \cs_set_protected:Npn \acro_print_list_entry:nnnn ##1##2##3##4
+          { \item [##1] ##2 ##3 ##4 }
       }
-    \cs_set_protected:Npn \acro_print_list_extra:n ##1
-      {
-        \prop_get:NnNT \l__acro_extra_prop {##1} \l__acro_tmpa_tl
-          {
-            \UseInstance {acro-extra} { \l__acro_extra_instance_tl }
-              { \l__acro_tmpa_tl }
-          }
-      }
-    \cs_set_protected:Npn \acro_print_list_page:n ##1
+    \use:x
       {
-        \bool_if:nT { \cs_if_exist_p:c { acro@##1@once } }
-          { \UseInstance {acro-page-number} { \l__acro_page_instance_tl } {##1} }
+        \exp_not:V \l__acro_list_before_tl
+        \exp_not:N \begin { \exp_not:V \l__acro_list_tl }
+          \exp_not:n { \acro_list_items:nn {#1} {#2} }
+        \exp_not:N \end { \exp_not:V \l__acro_list_tl }
+        \exp_not:V \l__acro_list_after_tl
       }
-    \begin {#1}
-      \acro_list_allow_items:nn {#2} {#3}
-    \end {#1}
   }
 
-\DeclareTemplateInterface {acro-list} {list-of} {3}
+% list-of template:
+\DeclareTemplateInterface {acro-list} {list-of} {2}
   {
-    foreign-sep : tokenlist = { ~ } ,
-    style       : tokenlist = {toc}
+    foreign-sep : tokenlist = {~} ,
+    style       : tokenlist = {toc} ,
+    reverse     : boolean   = false ,
+    before      : tokenlist = ,
+    after       : tokenlist =
   }
 
-\DeclareTemplateCode {acro-list} {list-of} {3}
+\DeclareTemplateCode {acro-list} {list-of} {2}
   {
     foreign-sep = \l__acro_foreign_sep_tl ,
-    style       = \l__acro_list_of_style
+    style       = \l__acro_list_of_style ,
+    reverse     = \l__acro_list_reverse_long_extra_bool ,
+    before      = \l__acro_list_before_tl ,
+    after       = \l__acro_list_after_tl
   }
   {
     \AssignTemplateKeys
@@ -1218,20 +1284,43 @@
     \tl_set:Nn \l__acro_page_name_tl {}
     \tl_set:Nn \l__acro_pages_name_tl {}
     \acro_activate_hyperref_support:
-    \srt_case:NnF \l__acro_list_of_style
+    \str_case:Vn \l__acro_list_of_style
       {
         {toc}
         { % similar to the table of contents
-          \cs_set_protected:Npn \acro_print_list_entry:nnn ##1##2##3
+          \bool_if:NTF \l__acro_list_reverse_long_extra_bool
+            {
+              \cs_if_exist:NTF \chapter
+                {
+                  \cs_set_protected:Npn \acro_print_list_entry:nnnn ##1##2##3##4
+                    {
+                      \contentsline{chapter}{##1}{}{}
+                      \contentsline{section}{##3##2}{##4}{}
+                    } 
+                }
+                {
+                  \cs_set_protected:Npn \acro_print_list_entry:nnnn ##1##2##3##4
+                    {
+                      \contentsline{section}{##1}{}{}
+                      \contentsline{subsection}{##3##2}{##4}{}
+                    }
+                }
+            }
             {
               \cs_if_exist:NTF \chapter
                 {
-                  \contentsline{chapter}{##1}{}{}
-                  \contentsline{section}{##2}{##3}{}
+                  \cs_set_protected:Npn \acro_print_list_entry:nnnn ##1##2##3##4
+                    {
+                      \contentsline{chapter}{##1}{}{}
+                      \contentsline{section}{##2##3}{##4}{}
+                    } 
                 }
                 {
-                  \contentsline{section}{##2}{##3}{}
-                  \contentsline{subsection}{##2}{##3}{}
+                  \cs_set_protected:Npn \acro_print_list_entry:nnnn ##1##2##3##4
+                    {
+                      \contentsline{section}{##1}{}{}
+                      \contentsline{subsection}{##2##3}{##4}{}
+                    }
                 }
             }
         }
@@ -1239,261 +1328,182 @@
         { % similar to the list of figures
           \cs_set_protected:Npn \l@acro
             { \@dottedtocline {1} {1.5em} {\l__acro_short_width_dim} }
-          \cs_set_protected:Npn \acro_print_list_entry:nnn ##1##2##3
+          \bool_if:NTF \l__acro_list_reverse_long_extra_bool
             {
-              \contentsline{acro}{\numberline{##1}{##2}}{##3}{}
+              \cs_set_protected:Npn \acro_print_list_entry:nnnn ##1##2##3##4
+                { \contentsline{acro}{\numberline{##1}{##3##2}}{##4}{} }
+            }
+            {
+              \cs_set_protected:Npn \acro_print_list_entry:nnnn ##1##2##3##4
+                { \contentsline{acro}{\numberline{##1}{##2##3}}{##4}{} }
             }
         }
       }
-      { \ERROR }
-    \cs_set_protected:Npn \acro_print_list_short:nn ##1##2
-      {
-        \acro_hyper_target:nn
-          {##1}
-          {
-            \acro_acc_supp:nn
-              {##1}
-              { \acro_write_short:nn {##1} { \l__acro_list_short_format_tl {##2} } }
-          }
-      }
-    \cs_set_protected:Npn \acro_print_list_long:n ##1
-      {
-        \acro_write_long:Vf \l__acro_list_long_format_tl
-          {
-            \prop_if_in:NnTF \l__acro_list_prop {##1}
-              { \prop_item:Nn \l__acro_list_prop {##1} }
-              { \prop_item:Nn \l__acro_long_prop {##1} }
-          }
-        \acro_cite_if:Nn \l__acro_citation_all_bool {##1}
-      }
-    \cs_set_protected:Npn \acro_print_list_extra:n ##1
-      {
-        \prop_get:NnNT \l__acro_extra_prop {##1} \l__acro_tmpa_tl
-          {
-            \UseInstance {acro-extra} { \l__acro_extra_instance_tl }
-              { \l__acro_tmpa_tl }
-          }
-      }
-    \cs_set_protected:Npn \acro_print_list_page:n ##1
+    \use:x
       {
-        \bool_if:nT { \cs_if_exist_p:c {acro@##1@once} }
-          { \UseInstance {acro-page-number} { \l__acro_page_instance_tl } {##1} }
+        \exp_not:V \l__acro_list_before_tl
+        \exp_not:n { \acro_list_items:nn {#1} {#2} }
+        \exp_not:V \l__acro_list_before_tl
       }
-    % \begin {#1}
-      \acro_list_allow_items:nn {#2} {#3}
-    % \end {#1}
   }
   
 % table template:
-\DeclareTemplateInterface {acro-list} {table} {3}
+\DeclareTemplateInterface {acro-list} {table} {2}
   {
-    table       : tokenlist = longtable         ,
-    table-spec  : tokenlist = lp{\l__acro_table_width_dim} ,
-    foreign-sep : tokenlist = { ~ }
+    table       : tokenlist = tabular ,
+    table-spec  : tokenlist = lp{.7\linewidth} ,
+    foreign-sep : tokenlist = {~} ,
+    reverse     : boolean   = false ,
+    before      : tokenlist = ,
+    after       : tokenlist = 
   }
 
-\DeclareTemplateCode {acro-list} {table} {3}
+\DeclareTemplateCode {acro-list} {table} {2}
   {
     table       = \l__acro_list_table_tl      ,
     table-spec  = \l__acro_list_table_spec_tl ,
-    foreign-sep = \l__acro_foreign_sep_tl
+    foreign-sep = \l__acro_foreign_sep_tl ,
+    reverse     = \l__acro_list_reverse_long_extra_bool ,
+    before      = \l__acro_list_before_tl ,
+    after       = \l__acro_list_after_tl
   }
   {
     \AssignTemplateKeys
     \acro_activate_hyperref_support:
-    \cs_set_eq:NN \acro_print_list_entry:nnn \use:nnn
-    \cs_set_protected:Npn \acro_print_list_short:nn ##1##2
-      {
-        \acro_hyper_target:nn
-          {##1}
-          {
-            \acro_acc_supp:nn
-              {##1}
-              { \acro_write_short:nn {##1} { \l__acro_list_short_format_tl {##2} } }
-          }
-        &
-      }
-    \cs_set_protected:Npn \acro_print_list_long:n ##1
-      {
-        \acro_write_long:Vf \l__acro_list_long_format_tl
-          {
-            \prop_if_in:NnTF \l__acro_list_prop {##1}
-              { \prop_item:Nn \l__acro_list_prop {##1} }
-              { \prop_item:Nn \l__acro_long_prop {##1} }
-          }
-        \acro_cite_if:Nn \l__acro_citation_all_bool {##1}
-      }
-    \cs_set_protected:Npn \acro_print_list_extra:n ##1
+    \bool_if:NTF \l__acro_list_reverse_long_extra_bool
       {
-        \prop_get:NnNT \l__acro_extra_prop {##1} \l__acro_tmpa_tl
-          {
-            \UseInstance {acro-extra} { \l__acro_extra_instance_tl }
-              { \l__acro_tmpa_tl }
-          }
+        \cs_set_protected:Npn \acro_print_list_entry:nnnn ##1##2##3##4
+          { ##1 & ##3 ##2 ##4 \tabularnewline }
       }
-    \cs_set_protected:Npn \acro_print_list_page:n ##1
       {
-        \bool_if:nT { \cs_if_exist_p:c { acro@##1@once } }
-          { \UseInstance {acro-page-number} { \l__acro_page_instance_tl } {##1} }
-        \tabularnewline
+        \cs_set_protected:Npn \acro_print_list_entry:nnnn ##1##2##3##4
+          { ##1 & ##2 ##3 ##4 \tabularnewline }
       }
     \use:x
       {
+        \exp_not:V \l__acro_list_before_tl
         \exp_not:N \begin { \exp_not:V \l__acro_list_table_tl }
           { \exp_not:V \l__acro_list_table_spec_tl }
-        \exp_not:n { \acro_list_allow_items:nn {#2} {#3} }
+        \exp_not:n { \acro_list_items:nn {#1} {#2} }
         \exp_not:N \end { \exp_not:V \l__acro_list_table_tl }
+        \exp_not:V \l__acro_list_after_tl
       }
   }
 
 % extra-table template:
-\DeclareTemplateInterface {acro-list} {extra-table} {3}
+\DeclareTemplateInterface {acro-list} {extra-table} {2}
   {
-    table      : tokenlist = longtable         ,
-    table-spec : tokenlist = lp{\l__acro_table_width_dim}ll
+    table       : tokenlist = tabular ,
+    table-spec  : tokenlist = llll ,
+    foreign-sep : tokenlist = {~} ,
+    reverse     : boolean   = false ,
+    before      : tokenlist = ,
+    after       : tokenlist = 
   }
 
-\DeclareTemplateCode {acro-list} {extra-table} {3}
+\DeclareTemplateCode {acro-list} {extra-table} {2}
   {
-    table      = \l__acro_list_table_tl      ,
-    table-spec = \l__acro_list_table_spec_tl
+    table       = \l__acro_list_table_tl      ,
+    table-spec  = \l__acro_list_table_spec_tl ,
+    foreign-sep = \l__acro_foreign_sep_tl ,
+    reverse     = \l__acro_list_reverse_long_extra_bool ,
+    before      = \l__acro_list_before_tl ,
+    after       = \l__acro_list_after_tl
   }
   {
     \AssignTemplateKeys
     \acro_activate_hyperref_support:
-    \cs_set_eq:NN \acro_print_list_entry:nnn \use:nnn
-    \cs_set_protected:Npn \acro_print_list_short:nn ##1##2
+    \bool_if:NTF \l__acro_list_reverse_long_extra_bool
       {
-        \acro_hyper_target:nn
-          {##1}
-          {
-            \acro_acc_supp:nn
-              {##1}
-              { \acro_write_short:nn {##1} { \l__acro_list_short_format_tl {##2} } }
-          }
-        &
+        \cs_set_protected:Npn \acro_print_list_entry:nnnn ##1##2##3##4
+          { ##1 & ##3 & ##2 & ##4 \tabularnewline }
       }
-    \cs_set_protected:Npn \acro_print_list_long:n ##1
       {
-        \acro_write_long:Vf \l__acro_list_long_format_tl
-          {
-            \prop_if_in:NnTF \l__acro_list_prop {##1}
-              { \prop_item:Nn \l__acro_list_prop {##1} }
-              { \prop_item:Nn \l__acro_long_prop {##1} }
-          }
-        \acro_cite_if:Nn \l__acro_citation_all_bool {##1}
-        &
+        \cs_set_protected:Npn \acro_print_list_entry:nnnn ##1##2##3##4
+          { ##1 & ##2 & ##3 & ##4 \tabularnewline }
       }
-    \cs_set_protected:Npn \acro_print_list_extra:n ##1
-      {
-        \prop_get:NnNT \l__acro_extra_prop {##1} \l__acro_tmpa_tl
-          {
-            \UseInstance {acro-extra} { \l__acro_extra_instance_tl }
-              { \l__acro_tmpa_tl }
-          }
-        &
-      }
-    \cs_set_protected:Npn \acro_print_list_page:n ##1
+    \use:x
       {
-        \bool_if:nT { \cs_if_exist_p:c { acro@##1@once } }
-          { \UseInstance {acro-page-number} { \l__acro_page_instance_tl } {##1} }
-        \tabularnewline
+        \exp_not:V \l__acro_list_before_tl
+        \exp_not:N \begin { \exp_not:V \l__acro_list_table_tl }
+          { \exp_not:V \l__acro_list_table_spec_tl }
+        \exp_not:n { \acro_list_items:nn {#1} {#2} }
+        \exp_not:N \end { \exp_not:V \l__acro_list_table_tl }
+        \exp_not:V \l__acro_list_after_tl
       }
-    \exp_args:Noo
-    \begin { \l__acro_list_table_tl } { \l__acro_list_table_spec_tl }
-      \acro_list_allow_items:nn {#2} {#3}
-    \exp_args:No
-    \end { \l__acro_list_table_tl }
   }
 
-% extra-table-rev template:
-\DeclareTemplateInterface {acro-list} {extra-table-rev} {3}
+% --------------------------------------------------------------------------
+% declare new list styles:
+\cs_new_protected:Npn \acro_declare_list_style:nnn #1#2#3
   {
-    table      : tokenlist = longtable         ,
-    table-spec : tokenlist = llp{\l__acro_table_width_dim}l
+    \DeclareInstance {acro-list} {#1} {#2} {#3}
+    \prop_put:Nnn \l__acro_list_styles_prop  {#1} {#2}
   }
 
-\DeclareTemplateCode {acro-list} {extra-table-rev} {3}
-  {
-    table      = \l__acro_list_table_tl      ,
-    table-spec = \l__acro_list_table_spec_tl
-  }
+% #1: name
+% #2: template
+% #3: settings
+\NewDocumentCommand \DeclareAcroListStyle {mmm}
+  { \acro_declare_list_style:nnn {#1} {#2} {#3} }
+
+% set a list style
+\cs_new_protected:Npn \acro_set_list_style:n #1
   {
-    \AssignTemplateKeys
-    \acro_activate_hyperref_support:
-    \cs_set_eq:NN \acro_print_list_entry:nnn \use:nnn
-    \cs_set_protected:Npn \acro_print_list_short:nn ##1##2
+    \prop_if_in:NnTF \l__acro_list_styles_prop {#1}
+      { \__acro_set_list_style:n {#1} }
       {
-        \acro_hyper_target:nn
-          {##1}
-          { \acro_acc_supp:nn {##1} { \acro_write_short:nn {##1} {##2} } }
-        &
+        \msg_warning:nnnn {acro} {unknown-list-style} {#1} {description}
+        \__acro_set_list_style:n {description}
       }
-    \cs_set_protected:Npn \acro_print_list_extra:n ##1
-      {
-        \bool_if:NT \l__acro_capitalize_list_bool
-          { \bool_set_true:N \l__acro_first_upper_bool }
-        \acro_write_long:Vf \l__acro_long_format_tl
-          {
-            \prop_if_in:NnTF \l__acro_list_prop {##1}
-              { \prop_item:Nn \l__acro_list_prop {##1} }
-              { \prop_item:Nn \l__acro_long_prop {##1} }
-          }
-        \acro_cite_if:Nn \l__acro_citation_all_bool {##1}
-        &
-      }
-    \cs_set_protected:Npn \acro_print_list_long:n ##1
-      {
-        \prop_get:NnNT \l__acro_extra_prop {##1} \l__acro_tmpa_tl
-          {
-            \UseInstance {acro-extra} { \l__acro_extra_instance_tl }
-              { \l__acro_tmpa_tl }
-          }
-        &
-      }
-    \cs_set_protected:Npn \acro_print_list_page:n ##1
-      {
-        \bool_if:nT { \cs_if_exist_p:c { acro@##1@once } }
-          { \UseInstance {acro-page-number} { \l__acro_page_instance_tl } {##1} }
-        \tabularnewline
-      }
-    \exp_args:Noo \begin { \l__acro_list_table_tl } { \l__acro_list_table_spec_tl }
-      \acro_list_allow_items:nn {#2} {#3}
-    \exp_args:No \end { \l__acro_list_table_tl }
   }
 
-% the different styles:
-\DeclareInstance {acro-list} {list}
-  { list }
+\cs_new_protected:Npn \__acro_set_list_style:n #1
+  {
+    \tl_set:Nn \l__acro_list_instance_tl {#1}
+    \tl_set:Nx \l__acro_list_type_tl
+      { \prop_item:Nn \l__acro_list_styles_prop {#1} }
+  }
+
+% --------------------------------------------------------------------------
+% predefined list styles:
+\DeclareAcroListStyle {description} {list}
   { }
-\DeclareInstance {acro-list} {toc}
-  { list-of }
+
+\DeclareAcroListStyle {toc} {list-of}
   { }
-\DeclareInstance {acro-list} {lof}
-  { list-of }
+
+\DeclareAcroListStyle {lof} {list-of}
   { style = lof }
-\DeclareInstance {acro-list} {tabular}
-  { table }
+
+\DeclareAcroListStyle {tabular} {table}
   { table = tabular }
-\DeclareInstance {acro-list} {longtable}
-  { table }
-  { table = longtable }
-\DeclareInstance {acro-list} {extra-longtable}
-  { extra-table }
+
+\DeclareAcroListStyle {longtable} {table}
   { table = longtable }
-\DeclareInstance {acro-list} {extra-tabular}
-  { extra-table }
+
+\DeclareAcroListStyle {extra-tabular} {extra-table}
   { table = tabular }
-\DeclareInstance {acro-list} {extra-longtable-rev}
-  { extra-table-rev }
+
+\DeclareAcroListStyle {extra-longtable} {extra-table}
   { table = longtable }
-\DeclareInstance {acro-list} {extra-tabular-rev}
-  { extra-table-rev }
-  { table = tabular }
+
+\DeclareAcroListStyle {extra-tabular-rev} {extra-table}
+  {
+    table   = tabular ,
+    reverse = true
+  }
+
+\DeclareAcroListStyle {extra-longtable-rev} {extra-table}
+  {
+    table   = longtable ,
+    reverse = true
+  }
 
 % --------------------------------------------------------------------------
 % automatic typesetting, the internals of \ac:
 % #1: id
+  
 \cs_new_protected:Npn \acro_use:n #1
   {
     % get the acronym and the plural settings:
@@ -1511,10 +1521,11 @@
         \acro_if_is_single:nTF {#1}
           { \acro_single:n {#1} }
           { 
-            \UseInstance {acro-first} { \l__acro_first_instance_tl }
+            \acro_first_instance:VnVV
+              \l__acro_first_instance_tl
               {#1}
-              { \l__acro_short_tl }
-              { \l__acro_long_tl }
+              \l__acro_short_tl
+              \l__acro_long_tl
           }
       }
   }
@@ -1531,10 +1542,11 @@
           \acro_cite:n {#1}
         }
         {first} {
-          \UseInstance {acro-first} { \l__acro_first_instance_tl }
+          \acro_first_instance:VnVV
+            \l__acro_first_instance_tl
             {#1}
-            { \l__acro_short_tl }
-            { \l__acro_long_tl }
+            \l__acro_short_tl
+            \l__acro_long_tl
         }
       }
       { % other (e.g. short)
@@ -2108,14 +2120,11 @@
     \acro_is_used:n {#1}
     \acro_if_is_single:nT {#1}
       { \cs_set_eq:NN \acro_hyper_link:nn \use_ii:nn }
-    \use:x
-      {
-        \UseInstance {acro-first}
-          { \exp_not:V \l__acro_first_instance_tl }
-          { \exp_not:n {#1} }
-          { \exp_not:V \l__acro_short_tl }
-          { \exp_not:V \l__acro_long_tl }
-      }
+    \acro_first_instance:VnVV
+      \l__acro_first_instance_tl
+      {#1}
+      \l__acro_short_tl
+      \l__acro_long_tl
   }
 
 % output like the first time with own long version:
@@ -2128,9 +2137,10 @@
     \acro_is_used:n {#1}
     \acro_if_is_single:nT {#1}
       { \cs_set_eq:NN \acro_hyper_link:nn \use_ii:nn }
-    \UseInstance { acro-first } { \l__acro_first_instance_tl }
+    \acro_first_instance:VnVn
+      \l__acro_first_instance_tl
       {#1}
-      { \l__acro_short_tl }
+      \l__acro_short_tl
       {#2}
   }
 
@@ -2504,7 +2514,7 @@
   }
 
 % some user macros:
-\cs_new_protected:Npn \acro_dot: { \aciftrailing {dot} {} {.} }
+\cs_new_protected:Npn \acro_dot: { \aciftrailing {dot} {} {.\@} }
 \cs_new_eq:NN \acdot \acro_dot:
 
 \cs_new_protected:Npn \acro_space:
@@ -2621,12 +2631,13 @@
     \cs_new_protected:Npn #1 ##1##2
       {
         \cs_set:Npn \__acro_tmp_command:n ####1 {##2}
-        \exp_args:NNnx #2 ##1 {sm}
+        \exp_args:NNnx #2 ##1 {sO{}m}
           {
             \acro_begin:
               \acro_reset_specials:
-              \acro_check_and_mark_if:nn {########1} {########2}
-              \exp_not:o { \__acro_tmp_command:n {####2} }
+              \keys_set:nn {acro} {########2}
+              \acro_check_and_mark_if:nn {########1} {########3}
+              \exp_not:o { \__acro_tmp_command:n {####3} }
             \acro_end:
           }
       }
@@ -3324,13 +3335,6 @@
 \tl_new:N \l__acro_included_classes_tl
 \tl_new:N \l__acro_excluded_classes_tl
 
-\cs_new_protected:Npn \acro_use_list_instance:nn #1#2
-  {
-    \UseInstance {acro-list} { \l__acro_list_instance_tl }
-      { \l__acro_list_type_tl } {#1} {#2}
-  }
-\cs_generate_variant:Nn \acro_use_list_instance:nn { VV }
-
 \keys_define:nn { acro / print-acronyms }
   {
     include-classes .tl_set:N   = \l__acro_included_classes_tl ,
@@ -3356,11 +3360,13 @@
       \iow_now:Nx \@auxout { \string \acro@print@list }
       \bool_if:NT \l__acro_sort_bool
         { \acro_sort_prop:N \l__acro_short_prop }
-      \UseInstance {acro-title} { \l__acro_list_title_tl }
-        { \l__acro_list_name_tl }
+      \acro_title_instance:VV
+        \l__acro_list_title_tl
+        \l__acro_list_name_tl
       \cs_if_exist:NTF \acro@printed@list
         {
-          \acro_use_list_instance:VV
+          \acro_list_instance:VVV
+            \l__acro_list_instance_tl
             \l__acro_included_classes_tl
             \l__acro_excluded_classes_tl
         }
@@ -3412,6 +3418,19 @@
 \DeclareTranslation { Portuguese } { acronym-next-pages } { ss. }
 \tl_set:Nn \l__acro_next_pages_tl { \,\GetTranslation {acronym-next-pages }\@ }
 
+% --------------------------------------------------------------------------
+% allow for a configuration file:
+\tl_const:Nn \c_acro_config_file_name_tl      {acro}
+\tl_const:Nn \c_acro_config_file_extension_tl {cfg}
+
+\file_if_exist:nT
+  { \c_acro_config_file_name_tl .\c_acro_config_file_extension_tl }
+  {
+    \@onefilewithoptions
+      {\c_acro_config_file_name_tl} [] []
+      \c_acro_config_file_extension_tl
+  }
+
 \tex_endinput:D
 % --------------------------------------------------------------------------
 % HISTORY:
@@ -3556,6 +3575,12 @@
                  - correct bug in the `plain' extra style
                  - implemented `tooltip' property
                  - remove \tl_to_lowercase:n
+2015/10/03 v2.2  - fix https://bitbucket.org/cgnieder/acro/issue/52
+                 - fix typo in `list-of' object
+                 - \DeclareAcroListStyle
+                 - \DeclareAcroListHeading
+                 - input `acro.cfg' if present
+                 - all acro commands have an optional argument: \ac*[]{}
 
 % --------------------------------------------------------------------------
 update => http://tex.stackexchange.com/questions/236362
-- 
cgit v1.2.3

