From 02c193f4bbd220bc6a44c64c3115effc739a7450 Mon Sep 17 00:00:00 2001
From: Karl Berry <karl@freefriends.org>
Date: Sun, 10 Feb 2013 23:12:30 +0000
Subject: acro (10feb13)

git-svn-id: svn://tug.org/texlive/trunk@29073 c570f23f-e606-0410-a88d-b1316a301751
---
 Master/texmf-dist/tex/latex/acro/acro.sty | 473 +++++++++++++++++++++++-------
 1 file changed, 371 insertions(+), 102 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 af47b4d9740..12deaec79fd 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,xparse,l3keys2e,xtemplate}
 \ProvidesExplPackage
   {acro}
-  {2013/01/29}
-  {1.1a}
+  {2013/02/09}
+  {1.2}
   {Typeset Acronyms}
 
 % warning and error messages:
@@ -63,6 +63,7 @@
 
 % boolean variables:
 \bool_new:N \l__acro_mark_as_used_bool
+\bool_new:N \l__acro_mark_first_as_used_bool
 \bool_new:N \l__acro_use_single_bool
 \bool_new:N \l__acro_print_only_used_bool
 \bool_set_true:N \l__acro_print_only_used_bool
@@ -74,6 +75,8 @@
 \bool_new:N \l__acro_create_macros_bool
 \bool_new:N \l__acro_xspace_bool
 \bool_new:N \l__acro_first_upper_bool
+\bool_new:N \l__acro_indefinite_bool
+\bool_new:N \l__acro_upper_indefinite_bool
 \bool_new:N \l__acro_sort_bool
 \bool_set_true:N \l__acro_sort_bool
 \bool_new:N \l__acro_capitalize_list_bool
@@ -91,7 +94,10 @@
 \tl_new:N   \l__acro_short_format_tl
 \tl_new:N   \l__acro_list_short_format_tl
 \tl_new:N   \l__acro_long_format_tl
+\tl_new:N   \l__acro_first_long_format_tl
 \tl_new:N   \l__acro_list_long_format_tl
+\tl_new:N   \l__acro_default_indefinite_tl
+\tl_set:Nn  \l__acro_default_indefinite_tl { a }
 \tl_new:N   \l__acro_extra_format_tl
 \tl_new:N   \l__acro_first_instance_tl
 \tl_set:Nn  \l__acro_first_instance_tl { default }
@@ -137,11 +143,15 @@
 \prop_new:N \l__acro_replace_plural_prop
 \prop_new:N \l__acro_short_plural_prop
 \prop_new:N \l__acro_long_plural_prop
+\prop_new:N \l__acro_short_indefinite_prop
+\prop_new:N \l__acro_long_indefinite_prop
+\prop_new:N \l__acro_alt_indefinite_prop
 \prop_new:N \l__acro_long_pre_prop
 \prop_new:N \l__acro_long_post_prop
 \prop_new:N \l__acro_extra_prop
 \prop_new:N \l__acro_format_prop
 \prop_new:N \l__acro_long_format_prop
+\prop_new:N \l__acro_first_long_format_prop
 \prop_new:N \l__acro_citation_prop
 \prop_new:N \l__acro_citation_pre_prop
 \prop_new:N \l__acro_citation_post_prop
@@ -162,6 +172,7 @@
 
 \cs_new:Npn \__acro_first_upper_case:n #1
   { \tl_expandable_uppercase:n { \tl_head:n { #1 } } \tl_tail:n { #1 } }
+\cs_generate_variant:Nn \__acro_first_upper_case:n { x }
 
 \cs_new_eq:NN \acro_first_upper_case:n \__acro_first_upper_case:n
 
@@ -207,7 +218,10 @@
       \tl_set:Nn \l__acro_list_short_format_tl { #1 }               ,
     long-format       .code:n     =
       \tl_set:Nn \l__acro_long_format_tl { #1 }
+      \tl_set:Nn \l__acro_first_long_format_tl { #1 }
       \tl_set:Nn \l__acro_list_long_format_tl { #1 }                ,
+    first-long-format .code:n     =
+      \tl_set:Nn \l__acro_first_long_format_tl { #1 }               ,
     list-short-format .tl_set:N   = \l__acro_list_short_format_tl   ,
     list-long-format  .tl_set:N   = \l__acro_list_long_format_tl    ,
     extra-format      .tl_set:N   = \l__acro_extra_format_tl        ,
@@ -228,6 +242,11 @@
     list-table-width  .dim_set:N  = \l__acro_table_width_dim        ,
     hyperref          .bool_set:N = \l__acro_use_hyperref_bool      ,
     only-used         .bool_set:N = \l__acro_print_only_used_bool   ,
+    mark-as-used      .choice: ,
+    mark-as-used / first .code:n  =
+      \bool_set_true:N \l__acro_mark_first_as_used_bool             ,
+    mark-as-used / any   .code:n  =
+      \bool_set_false:N \l__acro_mark_first_as_used_bool            ,
     plural-ending     .tl_set:N   = \l__acro_default_plural_tl      ,
     list-caps         .bool_set:N = \l__acro_capitalize_list_bool   ,
     cite              .choice:                                      ,
@@ -396,7 +415,8 @@
     \AssignTemplateKeys
     \bool_if:nT { !\l__acro_first_only_short_bool && !\l__acro_first_reversed_bool }
       {
-        \__acro_write_long:No \l__acro_long_format_tl { #3 }
+        \__acro_indefinite:nn { #1 } { long }
+        \__acro_write_long:No \l__acro_first_long_format_tl { #3 }
         \tl_use:N \c_space_tl
         \tl_if_blank:VF \l__acro_first_between_tl
           {
@@ -407,6 +427,9 @@
     \bool_if:nT
       { \l__acro_first_use_brackets_bool && !\l__acro_first_reversed_bool }
       { \tl_head:N \l__acro_first_brackets_tl }
+    \bool_if:nT
+      { \l__acro_first_reversed_bool || \l__acro_first_only_short_bool }
+      { \__acro_indefinite:nn { #1 } { short } }
     \__acro_acc_supp:nn { #1 } { \__acro_write_short:n { #2 } }
     \bool_if:nT
       { \l__acro_first_use_brackets_bool && !\l__acro_first_reversed_bool }
@@ -423,12 +446,13 @@
         \bool_if:nT
           { \l__acro_first_use_brackets_bool && \l__acro_first_reversed_bool }
           { \tl_head:N \l__acro_first_brackets_tl }
-        \__acro_write_long:No \l__acro_long_format_tl { #3 }
+        \__acro_write_long:No \l__acro_first_long_format_tl { #3 }
         \bool_if:nT
           { \l__acro_first_use_brackets_bool && \l__acro_first_reversed_bool }
           { \tl_tail:N \l__acro_first_brackets_tl }
       }
-    \acro_after:n { #1 }
+    \__acro_cite_if:Nn \l__acro_citation_first_bool { #1 }
+    \__acro_index_if:Nn \l__acro_addto_index_bool { #1 }
   }
 
 % template for footnotes, sidenotes, ...
@@ -445,13 +469,15 @@
   }
   {
     \AssignTemplateKeys
+    \__acro_indefinite:nn { #1 } { short }
     \__acro_acc_supp:nn { #1 } { \__acro_write_short:n { #2 } }
     \bool_if:NT \l__acro_use_note_bool
       {
         \__acro_note_command:n
           {
-            \__acro_write_long:No \l__acro_long_format_tl { #3 }
+            \__acro_write_long:No \l__acro_first_long_format_tl { #3 }
             \__acro_cite_if:Nn \l__acro_citation_first_bool { #1 }
+            \__acro_index_if:Nn \l__acro_addto_index_bool { #1 }
           }
       }
   }
@@ -550,7 +576,7 @@
   { punct = true, brackets = false }
 
 % --------------------------------------------------------------------------
-% outputting the page numbers:
+% outputting the page numbers: (experimental, needs lots of improvements)
 \bool_new:N \l__acro_page_punct_bool
 \bool_new:N \l__acro_page_brackets_bool
 \bool_new:N \l__acro_page_display_bool
@@ -564,17 +590,17 @@
     \seq_new:c { g__acro_#1_pages_seq }
   }
 
-\cs_new:Npn \acro@hyper@page #1
+\cs_new:Npn \ac@hp #1
   {
-    \tl_if_in:nnTF { #1 } { \acro@no@hyperpage }
+    \tl_if_in:nnTF { #1 } { \ac@no@hp }
       { #1 }
       { \acro_hyper_page:n { #1 } }
   }
 
-\cs_new_protected:Npn \acro@no@hyperpage {}
+\cs_new_protected:Npn \ac@no@hp {}
 
 \cs_new:Npn \__acro_safe_pages_aux:n #1
-  { \noexpand \acro@hyper@page {#1}| }
+  { \noexpand \ac@hp {#1}| }
 
 \cs_new_eq:NN \acro_hyper_page:n \use:n
 
@@ -598,6 +624,10 @@
 
 \tl_new:N \l__acro_tmp_page_tl
 \tl_new:N \l__acro_last_page_tl
+\tl_new:N \g__acro_current_page_style_tl
+\tl_new:N \g__acro_last_page_style_tl
+
+\bool_new:N \g__acro_know_page_style_bool
 
 %TODO: this should be translated into expl3 syntax
 \cs_new:Npn \__acro_if_is_number:nTF #1
@@ -616,86 +646,124 @@
   }
 \cs_generate_variant:Nn \__acro_convert_to_arabic:n { V }
 
-\cs_new:Npn \acro_record_page_number:n #1
+\cs_new:Npn \__acro_check_for_style:n #1
   {
-    \seq_if_empty:cTF { g__acro_#1_pages_seq }
-      {% no pages recorded, yet
-        \seq_gput_right:cx { g__acro_#1_pages_seq } { \thepage }
-        \seq_gput_right:cx { g__acro_#1_tmp_seq } { \thepage }
+    \tl_if_in:xxT { \tl_to_str:V { \thepage } } { \tl_to_str:n { #1 } }
+      {
+        \tl_gset:Nn \g__acro_current_page_style_tl { #1 }
+        \bool_gset_true:N \g__acro_know_page_style_bool
       }
+  }
+\cs_generate_variant:Nn \tl_if_in:nnT { xx }
+\cs_generate_variant:Nn \tl_to_str:n { V }
+
+\cs_new:Npn \acro_check_page_style:
+  {
+    \tl_gset:Nn \g__acro_current_page_style_tl { unknown }
+    \bool_gset_false:N \g__acro_know_page_style_bool
+    \__acro_check_for_style:n { roman }
+    \__acro_check_for_style:n { Roman }
+    \__acro_check_for_style:n { arabic }
+  }
+
+\cs_new:Npn \acro_record_page_number:n #1
+  {
+    \tl_gset_eq:NN \g__acro_last_page_style_tl \g__acro_current_page_style_tl
+    \acro_check_page_style:
+    \bool_if:NT \g__acro_know_page_style_bool
       {
-        \seq_get_right:cN { g__acro_#1_tmp_seq } \l__acro_tmp_page_tl
-        \seq_get_right:cN { g__acro_#1_pages_seq } \l__acro_last_page_tl
-        \tl_if_eq:NNTF \l__acro_tmp_page_tl \l__acro_last_page_tl
-          {% range may have started
-            \int_compare:nNnF
-              { \value{page} }
-                =
-              { \__acro_convert_to_arabic:V \l__acro_tmp_page_tl }
-              {
-                \int_compare:nNnTF
-                  { \value{page} }
-                    =
-                  { \__acro_convert_to_arabic:V \l__acro_tmp_page_tl + 1 }
-                  {% range continues
-                    \seq_gput_right:cx { g__acro_#1_tmp_seq } { \thepage }
+        \seq_if_empty:cTF { g__acro_#1_pages_seq }
+          {% no pages recorded, yet
+            \seq_gput_right:cx { g__acro_#1_pages_seq }
+              { \use:c { \g__acro_current_page_style_tl } { page } }
+            \seq_gput_right:cx { g__acro_#1_tmp_seq }
+              { \use:c { \g__acro_current_page_style_tl } { page } }
+          }
+          {
+            \seq_get_right:cN { g__acro_#1_tmp_seq } \l__acro_tmp_page_tl
+            \seq_get_right:cN { g__acro_#1_pages_seq } \l__acro_last_page_tl
+            \tl_if_eq:NNTF \l__acro_tmp_page_tl \l__acro_last_page_tl
+              {% range may have started
+                \bool_if:nF
+                  {
+                    \int_compare_p:n
+                      { \value{page} = \__acro_convert_to_arabic:V \l__acro_tmp_page_tl }
+                      &&
+                    \tl_if_eq_p:NN
+                      \g__acro_last_page_style_tl
+                      \g__acro_current_page_style_tl
                   }
-                  {% no range (any more)
-                    \seq_gput_right:cx { g__acro_#1_pages_seq } { \acro@no@hyperpage,~ }
-                    \seq_gclear:c      { g__acro_#1_tmp_seq }
-                    \seq_gput_right:cx { g__acro_#1_tmp_seq }   { \thepage }
-                    \seq_gput_right:cx { g__acro_#1_pages_seq } { \thepage }
+                  {
+                    \int_compare:nNnTF
+                      { \value{page} }
+                        =
+                      { \__acro_convert_to_arabic:V \l__acro_tmp_page_tl + 1 }
+                      {% range continues
+                        \seq_gput_right:cx { g__acro_#1_tmp_seq }
+                          { \use:c { \g__acro_current_page_style_tl } { page } }
+                      }
+                      {% no range (any more)
+                        \seq_gput_right:cx { g__acro_#1_pages_seq } { \ac@no@hp,~ }
+                        \seq_gclear:c      { g__acro_#1_tmp_seq }
+                        \seq_gput_right:cx { g__acro_#1_tmp_seq }
+                          { \use:c { \g__acro_current_page_style_tl } { page } }
+                        \seq_gput_right:cx { g__acro_#1_pages_seq }
+                          { \use:c { \g__acro_current_page_style_tl } { page } }
+                      }
                   }
               }
-          }
-          {% we're in a range
-            \int_compare:nNnF
-              { \value{page} }
-                =
-              { \__acro_convert_to_arabic:V \l__acro_tmp_page_tl }
-              {
-                \int_compare:nNnTF
+              {% we're in a range
+                \int_compare:nNnF
                   { \value{page} }
                     =
-                  { \__acro_convert_to_arabic:V \l__acro_tmp_page_tl + 1 }
-                  {% range continues
-                    \seq_gput_right:cx { g__acro_#1_tmp_seq } { \thepage }
-                  }
-                  {% no range (any more)
+                  { \__acro_convert_to_arabic:V \l__acro_tmp_page_tl }
+                  {
                     \int_compare:nNnTF
-                      { \__acro_convert_to_arabic:V \l__acro_tmp_page_tl }
+                      { \value{page} }
                         =
-                      { \__acro_convert_to_arabic:V \l__acro_last_page_tl +1 }
-                      {
-                        \bool_if:NTF \l__acro_page_ranges_bool
-                          {
-                            \seq_gput_right:cn { g__acro_#1_pages_seq }
-                              { \acro@no@hyperpage,~ }
-                            \seq_gput_right:cx { g__acro_#1_pages_seq }
-                              { \l__acro_tmp_page_tl }
-                          }
-                          {
-                            \seq_gput_right:cn { g__acro_#1_pages_seq }
-                              { \acro@no@hyperpage\l__acro_next_page_tl }
-                          }
+                      { \__acro_convert_to_arabic:V \l__acro_tmp_page_tl + 1 }
+                      {% range continues
+                        \seq_gput_right:cx { g__acro_#1_tmp_seq }
+                          { \use:c { \g__acro_current_page_style_tl } { page } }
                       }
-                      {
-                        \bool_if:NTF \l__acro_page_ranges_bool
+                      {% no range (any more)
+                        \int_compare:nNnTF
+                          { \__acro_convert_to_arabic:V \l__acro_tmp_page_tl }
+                            =
+                          { \__acro_convert_to_arabic:V \l__acro_last_page_tl +1 }
                           {
-                            \seq_gput_right:cn { g__acro_#1_pages_seq }
-                              { \acro@no@hyperpage-- }
-                            \seq_gput_right:cx { g__acro_#1_pages_seq }
-                              { \l__acro_tmp_page_tl }
+                            \bool_if:NTF \l__acro_page_ranges_bool
+                              {
+                                \seq_gput_right:cn { g__acro_#1_pages_seq }
+                                  { \ac@no@hp,~ }
+                                \seq_gput_right:cx { g__acro_#1_pages_seq }
+                                  { \l__acro_tmp_page_tl }
+                              }
+                              {
+                                \seq_gput_right:cn { g__acro_#1_pages_seq }
+                                  { \ac@no@hp\l__acro_next_page_tl }
+                              }
                           }
                           {
-                            \seq_gput_right:cn { g__acro_#1_pages_seq }
-                              { \acro@no@hyperpage\l__acro_next_pages_tl }
+                            \bool_if:NTF \l__acro_page_ranges_bool
+                              {
+                                \seq_gput_right:cn { g__acro_#1_pages_seq }
+                                  { \ac@no@hp-- }
+                                \seq_gput_right:cx { g__acro_#1_pages_seq }
+                                  { \l__acro_tmp_page_tl }
+                              }
+                              {
+                                \seq_gput_right:cn { g__acro_#1_pages_seq }
+                                  { \ac@no@hp\l__acro_next_pages_tl }
+                              }
                           }
+                        \seq_gclear:c      { g__acro_#1_tmp_seq }
+                        \seq_gput_right:cx { g__acro_#1_tmp_seq }
+                          { \use:c { \g__acro_current_page_style_tl } { page } }
+                        \seq_gput_right:cn { g__acro_#1_pages_seq } { \ac@no@hp,~ }
+                        \seq_gput_right:cx { g__acro_#1_pages_seq }
+                          { \use:c { \g__acro_current_page_style_tl } { page } }
                       }
-                    \seq_gclear:c      { g__acro_#1_tmp_seq }
-                    \seq_gput_right:cx { g__acro_#1_tmp_seq }   { \thepage }
-                    \seq_gput_right:cn { g__acro_#1_pages_seq } { \acro@no@hyperpage,~ }
-                    \seq_gput_right:cx { g__acro_#1_pages_seq } { \thepage }
                   }
               }
           }
@@ -716,26 +784,26 @@
             \bool_if:NTF \l__acro_page_ranges_bool
               {
                 \seq_gput_right:cn { g__acro_#1_pages_seq }
-                  { \acro@no@hyperpage,~ }
+                  { \ac@no@hp,~ }
                 \seq_gput_right:cx { g__acro_#1_pages_seq }
                   { \l__acro_tmp_page_tl }
               }
               {
                 \seq_gput_right:cn { g__acro_#1_pages_seq }
-                  { \acro@no@hyperpage\l__acro_next_page_tl }
+                  { \ac@no@hp\l__acro_next_page_tl }
               }
           }
           {
             \bool_if:NTF \l__acro_page_ranges_bool
               {
                 \seq_gput_right:cn { g__acro_#1_pages_seq }
-                  { \acro@no@hyperpage-- }
+                  { \ac@no@hp-- }
                 \seq_gput_right:cx { g__acro_#1_pages_seq }
                   { \l__acro_tmp_page_tl }
               }
               {
                 \seq_gput_right:cn { g__acro_#1_pages_seq }
-                  { \acro@no@hyperpage\l__acro_next_pages_tl }
+                  { \ac@no@hp\l__acro_next_pages_tl }
               }
           }
       }
@@ -883,7 +951,7 @@
       {
         \clist_map_inline:nn { #2 }
           {
-            \prop_get:NnN \l__acro_class_prop { #1 } \l__acro_tmpa_tl
+            \prop_get:NnNF \l__acro_class_prop { #1 } \l__acro_tmpa_tl {}
             \tl_if_eq:nVT { ##1 } \l__acro_tmpa_tl
               { \bool_set_true:N \l__acro_is_excluded_bool }
           }
@@ -1178,6 +1246,7 @@
     \acro_is_used:nTF { #1 }
       {
         % this is not the first time
+        \__acro_indefinite:nn { #1 } { short }
         \__acro_acc_supp:nn
           { #1 }
           { \__acro_write_short:V \l__acro_short_tl }
@@ -1185,8 +1254,12 @@
       }
       {
         % this is the first time
+        \bool_gset_true:c { g__acro_#1_first_use_bool }
         \__acro_is_single:nTF { #1 }
-          { \__acro_write_long:NV \l__acro_long_format_tl \l__acro_long_tl }
+          {
+            \__acro_indefinite:nn { #1 } { long }
+            \__acro_write_long:NV \l__acro_long_format_tl \l__acro_long_tl
+          }
           { 
             \UseInstance { acro-first } { \l__acro_first_instance_tl }
               { #1 }
@@ -1218,17 +1291,22 @@
 
 \cs_new:Npn \acro_get:n #1
   {
+    \acro_defined:n { #1 }
     \__acro_activate_hyperref_support:
-    \prop_get:NnN \l__acro_short_prop { #1 } \l__acro_tmpa_tl
+    \prop_get:NnNF \l__acro_short_prop { #1 } \l__acro_tmpa_tl {}
     \__acro_make_link:nNN { #1 } \l__acro_short_tl \l__acro_tmpa_tl
-    \prop_get:NnN \l__acro_short_plural_prop { #1 } \l__acro_short_plural_tl
-    \prop_get:NnN \l__acro_long_prop { #1 } \l__acro_long_tl
-    \prop_get:NnNTF \l__acro_long_format_prop { #1 } \l__acro_custom_long_format_tl
+    \prop_get:NnNF \l__acro_short_plural_prop { #1 } \l__acro_short_plural_tl {}
+    \prop_get:NnNF \l__acro_long_prop { #1 } \l__acro_long_tl {}
+    \prop_get:NnNTF \l__acro_long_format_prop { #1 }
+      \l__acro_custom_long_format_tl
       { \bool_set_true:N  \l__acro_custom_long_format_bool }
       { \bool_set_false:N \l__acro_custom_long_format_bool }
+    \prop_get:NnNF \l__acro_first_long_format_prop { #1 }
+      \l__acro_first_long_format_tl
+      {}% to avoid hanging compilation if first-long-format hasn't been set
     \prop_get:NnNT \l__acro_long_pre_prop { #1 } \l__acro_long_pre_tl
       { \tl_put_left:NV \l__acro_long_tl \l__acro_long_pre_tl }
-    \prop_get:NnN \l__acro_alt_prop { #1 } \l__acro_tmpb_tl
+    \prop_get:NnNF \l__acro_alt_prop { #1 } \l__acro_tmpb_tl {}
     \__acro_make_link:nNN { #1 } \l__acro_alt_tl \l__acro_tmpb_tl
     \prop_get:NnNTF \l__acro_format_prop { #1 } \l__acro_custom_format_tl
       { \bool_set_true:N \l__acro_custom_format_bool }
@@ -1245,7 +1323,7 @@
     \bool_if:NT \l__acro_use_plural_bool
       {
         \bool_if:nTF { \prop_get:Nn \l__acro_replace_plural_prop { #1 } }
-          { \prop_get:NnN \l__acro_long_plural_prop { #1 } \l__acro_long_tl }
+          { \prop_get:NnNF \l__acro_long_plural_prop { #1 } \l__acro_long_tl {} }
           {
             \tl_put_right:Nn \l__acro_long_tl
               { \prop_get:Nn \l__acro_long_plural_prop { #1 } }
@@ -1258,7 +1336,18 @@
 % style for that:
 \cs_new:Npn \acro_is_used:nTF #1#2#3
   {
-    \bool_if:cTF { g__acro_#1_used_bool }
+    \bool_if:nTF
+      {
+        \bool_if_p:c { g__acro_#1_used_bool } &&
+        (
+          (
+            \bool_if_p:c { g__acro_#1_first_use_bool } &&
+            \l__acro_mark_first_as_used_bool
+          )
+          ||
+          ! \l__acro_mark_first_as_used_bool
+        )
+      }
       { \iow_now:Nx \@auxout { \string \acro@used@twice { #1 } } #2 }
       {
         \iow_now:Nx \@auxout { \string \acro@used@once { #1 } }
@@ -1309,6 +1398,7 @@
   {
     \acro_get:n { #1 }
     \acro_is_used:n { #1 }
+    \__acro_indefinite:nn { #1 } { short }
     \__acro_is_single:nT { #1 }
       { \cs_set_eq:NN \acro_hyper_link:nn \use_ii:nn }
     \__acro_acc_supp:nn
@@ -1322,6 +1412,7 @@
   {
     \acro_get:n { #1 }
     \acro_is_used:n { #1 }
+    \__acro_indefinite:nn { #1 } { alt }
     \__acro_is_single:nT { #1 }
       { \cs_set_eq:NN \acro_hyper_link:nn \use_ii:nn }
     \__acro_acc_supp:nn
@@ -1335,6 +1426,7 @@
   {
     \acro_get:n { #1 }
     \acro_is_used:n { #1 }
+    \__acro_indefinite:nn { #1 } { long }
     \__acro_is_single:nT { #1 }
       { \cs_set_eq:NN \acro_hyper_link:nn \use_ii:nn }
     \__acro_write_long:NV \l__acro_long_format_tl \l__acro_long_tl
@@ -1344,6 +1436,7 @@
 % output like the first time:
 \cs_new:Npn \acro_first:n #1
   {
+    \bool_gset_true:c { g__acro_#1_first_use_bool }
     \acro_get:n { #1 }
     \acro_is_used:n { #1 }
     \__acro_is_single:nT { #1 }
@@ -1354,6 +1447,20 @@
       { \l__acro_long_tl }
   }
 
+% output like the first time with own long version:
+\cs_new:Npn \acro_first_like:nn #1#2
+  {
+    \bool_gset_true:c { g__acro_#1_first_use_bool }
+    \acro_get:n { #1 }
+    \acro_is_used:n { #1 }
+    \__acro_is_single:nT { #1 }
+      { \cs_set_eq:NN \acro_hyper_link:nn \use_ii:nn }
+    \UseInstance { acro-first } { \l__acro_first_instance_tl }
+      { #1 }
+      { \l__acro_short_tl }
+      { #2 }
+  }
+
 % ----------------------------------------------------------------------------
 % citations:
 % #1 pre
@@ -1412,8 +1519,8 @@
 % #4: replace
 \cs_new:Npn \__acro_index:nnnn #1#2#3#4
   {
-    \prop_get:NnN \l__acro_short_prop  { #2 } \l__acro_tmpa_tl
-    \prop_get:NnN \l__acro_format_prop { #2 } \l__acro_tmpb_tl
+    \prop_get:NnNF \l__acro_short_prop  { #2 } \l__acro_tmpa_tl {}
+    \prop_get:NnNF \l__acro_format_prop { #2 } \l__acro_tmpb_tl {}
     \quark_if_no_value:VTF \l__acro_tmpb_tl
       { \tl_set:Nn \l__acro_tmpc_tl { \l__acro_short_format_tl \l__acro_tmpa_tl } }
       { \tl_set:Nn \l__acro_tmpc_tl { \l__acro_tmpb_tl \l__acro_tmpa_tl } }
@@ -1451,7 +1558,7 @@
         \cs_set:Npn \__acro_acc_supp:nn #1#2
           {
             \prop_get:NnNF \l__acro_acc_supp_prop { #1 } \l__acro_acc_supp_tl
-              { \prop_get:NnN \l__acro_short_prop { #1 } \l__acro_acc_supp_tl }
+              { \prop_get:NnNF \l__acro_short_prop { #1 } \l__acro_acc_supp_tl {} }
             \bool_if:NT \l__acro_use_plural_bool
               { \tl_put_right:NV \l__acro_acc_supp_tl \l__acro_short_plural_tl }
             \__acro_acc_supp_aux:Vn \l__acro_acc_supp_tl { #2 }
@@ -1459,6 +1566,19 @@
       }
   }
 
+% --------------------------------------------------------------------------
+% indefinite articles:
+\cs_new_protected:Npn \__acro_indefinite:nn #1#2
+  {
+    \bool_if:NT \l__acro_indefinite_bool
+      { \prop_get:cn { l__acro_#2_indefinite_prop } { #1 } ~ }
+    \bool_if:NT \l__acro_upper_indefinite_bool
+      {
+         \__acro_first_upper_case:x
+           { \prop_get:cn { l__acro_#2_indefinite_prop } { #1 } } ~
+      }
+  }
+
 % --------------------------------------------------------------------------
 % experimental sorting feature:
 \AtBeginDocument
@@ -1487,7 +1607,7 @@
             \seq_map_inline:Nn \l__acro_tmpa_seq
               {
                 % get ID:
-                \prop_get:NnN \l__acro_tmpa_prop { ##1 } \l__acro_tmpa_tl
+                \prop_get:NnNF \l__acro_tmpa_prop { ##1 } \l__acro_tmpa_tl {}
                 % get prop entry of ID in #1:
                 \prop_get:NVNT #1 \l__acro_tmpa_tl \l__acro_tmpb_tl
                   {
@@ -1528,6 +1648,26 @@
     \group_end:
   }
 
+\NewDocumentCommand \iac { sm }
+  {
+    \group_begin:
+      \acro_defined:n { #2 }
+      \acro_use_if:nn { #1 } { #2 }
+      \bool_set_true:N \l__acro_indefinite_bool
+      \acro_use:n { #2 }
+    \group_end:
+  }
+
+\NewDocumentCommand \Iac { sm }
+  {
+    \group_begin:
+      \acro_defined:n { #2 }
+      \acro_use_if:nn { #1 } { #2 }
+      \bool_set_true:N \l__acro_upper_indefinite_bool
+      \acro_use:n { #2 }
+    \group_end:
+  }
+
 \NewDocumentCommand \Ac { sm }
   {
     \group_begin:
@@ -1569,6 +1709,26 @@
     \group_end:
   }
 
+\NewDocumentCommand \iacs { sm }
+  {
+    \group_begin:
+      \acro_defined:n { #2 }
+      \acro_use_if:nn { #1 } { #2 }
+      \bool_set_true:N \l__acro_indefinite_bool
+      \acro_short:n { #2 }
+    \group_end:
+  }
+
+\NewDocumentCommand \Iacs { sm }
+  {
+    \group_begin:
+      \acro_defined:n { #2 }
+      \acro_use_if:nn { #1 } { #2 }
+      \bool_set_true:N \l__acro_upper_indefinite_bool
+      \acro_short:n { #2 }
+    \group_end:
+  }
+
 \NewDocumentCommand \acsp { sm }
   {
     \group_begin:
@@ -1589,6 +1749,26 @@
     \group_end:
   }
 
+\NewDocumentCommand \iaca { sm }
+  {
+    \group_begin:
+      \acro_defined:n { #2 }
+      \acro_use_if:nn { #1 } { #2 }
+      \bool_set_true:N \l__acro_indefinite_bool
+      \acro_alt:n { #2 }
+    \group_end:
+  }
+
+\NewDocumentCommand \Iaca { sm }
+  {
+    \group_begin:
+      \acro_defined:n { #2 }
+      \acro_use_if:nn { #1 } { #2 }
+      \bool_set_true:N \l__acro_upper_indefinite_bool
+      \acro_alt:n { #2 }
+    \group_end:
+  }
+
 \NewDocumentCommand \acap { sm }
   {
     \group_begin:
@@ -1609,6 +1789,26 @@
     \group_end:
   }
 
+\NewDocumentCommand \iacl { sm }
+  {
+    \group_begin:
+      \acro_defined:n { #2 }
+      \acro_use_if:nn { #1 } { #2 }
+      \bool_set_true:N \l__acro_indefinite_bool
+      \acro_long:n { #2 }
+    \group_end:
+  }
+
+\NewDocumentCommand \Iacl { sm }
+  {
+    \group_begin:
+      \acro_defined:n { #2 }
+      \acro_use_if:nn { #1 } { #2 }
+      \bool_set_true:N \l__acro_upper_indefinite_bool
+      \acro_long:n { #2 }
+    \group_end:
+  }
+
 \NewDocumentCommand \Acl { sm }
   {
     \group_begin:
@@ -1650,6 +1850,26 @@
     \group_end:
   }
 
+\NewDocumentCommand \iacf { sm }
+  {
+    \group_begin:
+      \acro_defined:n { #2 }
+      \acro_use_if:nn { #1 } { #2 }
+      \bool_set_true:N \l__acro_indefinite_bool
+      \acro_first:n { #2 }
+    \group_end:
+  }
+
+\NewDocumentCommand \Iacf { sm }
+  {
+    \group_begin:
+      \acro_defined:n { #2 }
+      \acro_use_if:nn { #1 } { #2 }
+      \bool_set_true:N \l__acro_upper_indefinite_bool
+      \acro_first:n { #2 }
+    \group_end:
+  }
+
 \NewDocumentCommand \Acf { sm }
   {
     \group_begin:
@@ -1681,14 +1901,58 @@
     \group_end:
   }
 
+% first-like:
+\NewDocumentCommand \acflike { smm }
+  {
+    \group_begin:
+      \acro_defined:n { #2 }
+      \acro_use_if:nn { #1 } { #2 }
+      \acro_first_like:nn { #2 } { #3 }
+    \group_end:
+  }
+
+\NewDocumentCommand \iacflike { smm }
+  {
+    \group_begin:
+      \acro_defined:n { #2 }
+      \acro_use_if:nn { #1 } { #2 }
+      \bool_set_true:N \l__acro_indefinite_bool
+      \acro_first_like:nn { #2 } { #3 }
+    \group_end:
+  }
+
+\NewDocumentCommand \Iacflike { smm }
+  {
+    \group_begin:
+      \acro_defined:n { #2 }
+      \acro_use_if:nn { #1 } { #2 }
+      \bool_set_true:N \l__acro_upper_indefinite_bool
+      \acro_first_like:nn { #2 } { #3 }
+    \group_end:
+  }
+
+\NewDocumentCommand \acfplike { smm }
+  {
+    \group_begin:
+      \acro_defined:n { #2 }
+      \acro_use_if:nn { #1 } { #2 }
+      \bool_set_true:N \l__acro_use_plural_bool
+      \acro_first_like:nn { #2 } { #3 }
+    \group_end:
+  }
+
 % reset outputs, they'll behave like the first time again (!not like the _only_
 % time!):
 \cs_new:Npn \acro_reset:n #1
-  { \bool_gset_false:c { g__acro_#1_used_bool } }
+  {
+    \bool_gset_false:c { g__acro_#1_used_bool }
+    \bool_gset_false:c { g__acro_#1_first_use_bool }
+  }
 
 \cs_new:Npn \acro_mark_as_used:n #1
   {
     \bool_gset_true:c { g__acro_#1_used_bool }
+    \bool_gset_true:c { g__acro_#1_first_use_bool }
     \acro@used@once { #1 }
   }
 
@@ -1705,13 +1969,13 @@
   { \acro_mark_all_as_used: }
 
 \NewDocumentCommand \acreset { > { \SplitList { , } } m }
-  { \ProcessList { #1 } { \acro_reset:n } }
+  { \ProcessList { #1 } { \acro_reset:n } \ignorespaces }
 
 \NewDocumentCommand \acuse { > { \SplitList { , } } m }
-  { \ProcessList { #1 } { \acro_mark_as_used:n } }
-
-
+  { \ProcessList { #1 } { \acro_mark_as_used:n } \ignorespaces }
 
+% ---------------------------------------------------------------------------
+% process options:
 \ProcessKeysOptions { acro }
 
 % ---------------------------------------------------------------------------
@@ -1861,18 +2125,23 @@
 2013/01/29 v1.1a - added `long-format' key
                  - renamed `format' key into `short-format', kept `format' for
                    compatibility reasons
+2013/02/09 v1.2  - error message instead of hanging when an undefined acronym
+                   is used
+                 - added `first-long-format' key and `first-long-format' option
+                 - added \acflike and \acfplike
+                 - improvements and bug fixes to the page recording mechanism
+                 - new option `mark-as-used'
+                 - new keys: `short-indefinite', `alt-indefinite' and
+                   `long-indefinite'
+                 - new commands: \iac, \Iac, \iacs, \Iacs, \iaca, \Iaca, \iacl,
+                   \Iacl, \iacf, \Iacf, \iacflike and \Iacflike
 
 % --------------------------------------------------------------------------
 % TODO:
 - Option `totoc'!?
-- Optionen `list-header = addsec|addchap' (acro-title instance)
-- acro-first instance `none', die nur die Kurzform verwendet
-- Option `list-short-format'
-
 - revise list styles to allow _full_ customization by creating own instances!
   this probably needs a handfull of macros that give access to the entries
   without worrying about internals
 - record and list _all_ pagenumbers where an acronym occurs
-- compilation halts instead of throwing an error if an undefined acronym is used
 - add \ACF, \ACFP, \ACL and \ACLP that will print all words of the long form
   capitalized
\ No newline at end of file
-- 
cgit v1.2.3

