texlive[54937] Master/texmf-dist: acro (29apr20)

commits+karl at tug.org commits+karl at tug.org
Wed Apr 29 23:22:30 CEST 2020


Revision: 54937
          http://tug.org/svn/texlive?view=revision&revision=54937
Author:   karl
Date:     2020-04-29 23:22:29 +0200 (Wed, 29 Apr 2020)
Log Message:
-----------
acro (29apr20)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/acro/README
    trunk/Master/texmf-dist/doc/latex/acro/acro-manual.pdf
    trunk/Master/texmf-dist/doc/latex/acro/acro-manual.tex
    trunk/Master/texmf-dist/tex/latex/acro/acro.sty

Added Paths:
-----------
    trunk/Master/texmf-dist/doc/latex/acro/examples/
    trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.acflike.pdf
    trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.acflike.tex
    trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.basic.pdf
    trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.basic.tex
    trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-109.pdf
    trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-109.tex
    trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-111.pdf
    trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-111.tex
    trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-119.pdf
    trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-119.tex
    trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-154.pdf
    trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-154.tex
    trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.possessive.pdf
    trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.possessive.tex
    trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.texsx-505891.pdf
    trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.texsx-505891.tex
    trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.texsx-507726.pdf
    trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.texsx-507726.tex
    trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.units.pdf
    trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.units.tex
    trunk/Master/texmf-dist/tex/latex/acro/acro2.sty

Removed Paths:
-------------
    trunk/Master/texmf-dist/doc/latex/acro/acro.history
    trunk/Master/texmf-dist/doc/latex/acro/example_one.tex
    trunk/Master/texmf-dist/doc/latex/acro/example_two.tex
    trunk/Master/texmf-dist/tex/latex/acro/acro-manual.cls
    trunk/Master/texmf-dist/tex/latex/acro/acro.definitions.tex

Modified: trunk/Master/texmf-dist/doc/latex/acro/README
===================================================================
--- trunk/Master/texmf-dist/doc/latex/acro/README	2020-04-29 21:21:14 UTC (rev 54936)
+++ trunk/Master/texmf-dist/doc/latex/acro/README	2020-04-29 21:22:29 UTC (rev 54937)
@@ -1,32 +1,50 @@
 --------------------------------------------------------------------------
-the ACRO package v2.11d 2020/03/07
+the ACRO package v3.0 2020/04/29
 
   Typeset Acronyms
 
 --------------------------------------------------------------------------
 Clemens Niederberger
-Web:    https://bitbucket.org/cgnieder/acro
+Web:    https://github.com/cgnieder/acro
 E-Mail: contact at mychemistry.eu
 --------------------------------------------------------------------------
 Copyright 2012--2020 Clemens Niederberger
 
 This work may be distributed and/or modified under the
-conditions of the LaTeX Project Public License, either version 1.3
+conditions of the LaTeX Project Public License, either version 1.3c
 of this license or (at your option) any later version.
 The latest version of this license is in
   http://www.latex-project.org/lppl.txt
-and version 1.3 or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+and version 1.3c or later is part of all distributions of LaTeX
+version 2008/05/04 or later.
 
 This work has the LPPL maintenance status `maintained'.
 
 The Current Maintainer of this work is Clemens Niederberger.
 --------------------------------------------------------------------------
-The acro package consists of the files
-- acro.sty, acro.definitions.tex, acro.cfg
-- acro-manual.tex, acro-manual.pdf, acro-manual.cls
-- acro.history, README
+The acro package consists of the code file:
+
+  acro.sty
+
+The acro package consists of documentation files:
+
+  README
+  acro-manual.tex
+  acro-manual.pdf
+  acro-manual.cls
+
+The acro package consists of example files -- these should be placed in a
+folder examples/ in the same folder as acro-manual.pdf:
+
+  acro.example.acflike.pdf, acro.example.acflike.tex
+  acro.example.basic.pdf, acro.example.basic.tex
+  acro.example.possessive.pdf, acro.example.possessive.tex
+  acro.example.units.pdf, acro.example.units.tex
+  acro.example.issue-109.pdf, acro.example.issue-109.tex
+  acro.example.issue-111.pdf, acro.example.issue-111.tex
+  acro.example.issue-119.pdf, acro.example.issue-119.tex
+  acro.example.issue-154.pdf, acro.example.issue-154.tex
+  acro.example.texsx-505891.pdf, acro.example.texsx-505891.tex
+  acro.example.texsx-507726.pdf, acro.example.texsx-507726.tex
+
 --------------------------------------------------------------------------
-If you have any ideas, questions, suggestions or bugs to report, please
-feel free to contact me.
---------------------------------------------------------------------------

Modified: trunk/Master/texmf-dist/doc/latex/acro/acro-manual.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/acro/acro-manual.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/acro/acro-manual.tex	2020-04-29 21:21:14 UTC (rev 54936)
+++ trunk/Master/texmf-dist/doc/latex/acro/acro-manual.tex	2020-04-29 21:22:29 UTC (rev 54937)
@@ -1,8 +1,8 @@
-% !arara: pdflatex: { interaction: nonstopmode }
+% arara: pdflatex: { interaction: nonstopmode }
 % !arara: biber
 % arara: pdflatex: { interaction: nonstopmode }
-% arara: pdflatex: { interaction: nonstopmode }
-% arara: pdflatex: { interaction: nonstopmode }
+% !arara: pdflatex: { interaction: nonstopmode }
+% !arara: pdflatex: { interaction: nonstopmode }
 % --------------------------------------------------------------------------
 % the ACRO package
 % 
@@ -10,7 +10,7 @@
 % 
 % --------------------------------------------------------------------------
 % Clemens Niederberger
-% Web:    https://bitbucket.org/cgnieder/acro/
+% Web:    https://github.com/cgnieder/acro/
 % E-Mail: contact at mychemistry.eu
 % --------------------------------------------------------------------------
 % Copyright 2011--2020 Clemens Niederberger
@@ -23,7 +23,7 @@
 % and version 1.3 or later is part of all distributions of LaTeX
 % version 2005/12/01 or later.
 % 
-% This work has the LPPL maintenance status `maintained'.
+% This work has nce status `maintained'.
 % 
 % The Current Maintainer of this work is Clemens Niederberger.
 % --------------------------------------------------------------------------
@@ -35,221 +35,446 @@
 % If you have any ideas, questions, suggestions or bugs to report, please
 % feel free to contact me.
 % --------------------------------------------------------------------------
+\PassOptionsToPackage{ngerman,latin,english}{babel}
+\PassOptionsToPackage{version=3,upgrade}{acro}
 \documentclass{acro-manual}
 
-\addbibresource{\jobname.bib}
-\addbibresource{cnltx.bib}
 \begin{filecontents}{\jobname.bib}
- at online{wikipedia,
-  author   = {Wikipedia},
-  title    = {Acronym and initialism},
-  urldate  = {2012-06-21},
-  url      = {http://en.wikipedia.org/wiki/Acronyms},
-  year     = {2012}
-}
 @online{NewYork,
   author   = {Wikipedia},
   title    = {New York City},
-  urldate  = {2012-09-27},
+  urldate  = {2020-04-11},
   url      = {http://en.wikipedia.org/wiki/New_York_City},
-  year     = {2012}
+  year     = {2020}
 }
- at manual{interface3,
-  author    = {{The \LaTeX3 Project Team}} ,
-  shorthand = {L3P} ,
-  sortname  = {LaTeX3 Project Team} ,
-  title     = {The \LaTeX3 Interfaces} ,
-  date      = {2015-09-06} ,
-  url       = {http://mirrors.ctan.org/macros/latex/contrib/l3kernel/interface3.pdf}
-}
 \end{filecontents}
 
-% declare acronyms
-\DeclareAcronym{cd}
-  {
-    short        = cd ,
-    long         = Compact Disc ,
-    short-format = \scshape
-  }
-\DeclareAcronym{ctan}
-  {
-    short     = ctan ,
-    long      = Comprehensive \TeX\ Archive Network ,
-    format    = \scshape ,
-    pdfstring = CTAN ,
-    accsupp   = CTAN
-  }
-\DeclareAcronym{ecu}
-  {
-    short   = ECU ,
-    long    = Steuerger\"at ,
-    foreign = Electronic Control Unit ,
-    foreign-lang = english
-  }
-\DeclareAcronym{id}
-  {
-    short        = id ,
-    long         = identification string ,
-    short-format = \scshape
-  }
-\DeclareAcronym{jpg}
-  {
-    short = JPEG ,
-    sort  = jpeg ,
-    alt   = JPG ,
-    long  = Joint Photographic Experts Group
-  }
-\DeclareAcronym{la}
-  {
-    short        = LA ,
-    short-plural = ,
-    long         = Los Angeles,
-    long-plural  = ,
-    class        = city
-  }
-\DeclareAcronym{lppl}
-  {
-    short     = lppl ,
-    long      = \LaTeX\ Project Public License ,
-    format    = \scshape ,
-    pdfstring = LPPL ,
-    accsupp   = LPPL ,
-    index-cmd = \csname @gobble\endcsname
-  }
-\DeclareAcronym{MP}
-  {
-    short = MP ,
-    long  = Member of Parliament ,
-    long-plural-form = Members of Parliament
-  }
-\DeclareAcronym{nato}
-  {
-    short        = nato ,
-    long         = North Atlantic Treaty Organization ,
-    extra        = \emph{deutsch}: Organisation des Nordatlantikvertrags ,
-    short-format = \scshape
-  }
-\DeclareAcronym{ny}
-  {
-    short        = NY ,
-    short-plural = ,
-    long         = New York ,
-    long-plural  = ,
-    class        = city ,
-    cite         = NewYork
-  }
-\DeclareAcronym{ot}
-  {
-    short        = ot ,
-    long         = Other Test ,
-    short-format = \scshape
-  }
-\DeclareAcronym{pdf}
-  {
-    short     = pdf ,
-    long      = Portable Document Format ,
-    format    = \scshape ,
-    pdfstring = PDF ,
-    accsupp   = PDF
-  }
-\DeclareAcronym{sw}
-  {
-    short       = SW ,
-    long        = Sammelwerk ,
-    long-plural = e
-  }
-\DeclareAcronym{test}
-  {
-    short = ST ,
-    long  = Some Test
-  }
-\DeclareAcronym{tex.sx}
-  {
-    short = \TeX.sx ,
-    sort  = TeX.sx ,
-    long  = \TeX{} StackExchange
-  }
+\addbibresource{\jobname.bib}
+\addbibresource{cnltx.bib}
+
+% declare example acronyms
+\DeclareAcronym{cd}{
+  short = CD ,
+  long  = compact disc
+}
+\DeclareAcronym{ctan}{
+  short     = ctan ,
+  long      = Comprehensive \TeX\ Archive Network ,
+  short-format = \scshape ,
+  pdfstring = CTAN ,
+  short-acc = CTAN ,
+  first-style = short-long ,
+  single-style = short
+}
+\DeclareAcronym{ecu}{
+  short   = ECU ,
+  long    = Steuergerät ,
+  foreign = Electronic Control Unit ,
+  foreign-babel = english ,
+  foreign-locale = englisch
+}
+\DeclareAcronym{eg}{
+  short = e.g\acdot ,
+  long  = for example ,
+  foreign = exempli gratia ,
+  foreign-babel  = latin ,
+  short-format = \textit ,
+  foreign-format = \textit
+}
+\DeclareAcronym{etc}{
+  short = etc\acdot ,
+  long = et cetera ,
+  format = \textit ,
+  first-style = long ,
+  plural = 
+}
+\DeclareAcronym{hadopi}{
+  short = HADOPI ,
+  long = Haute Autorit\'{e} pour la diffusion des \oe uvres et la protection des
+    droits sur l’Internet ,
+  short-definite = l'\nospace ,
+  long-definite = la ,
+}
+\DeclareAcronym{id}{
+  short        = id ,
+  long         = identification string ,
+  short-format = \scshape ,
+  short-acc    = ID ,
+  pdfstring    = ID ,
+  first-style  = short
+}
+\DeclareAcronym{jpg}{
+  short = JPEG ,
+  sort  = jpeg ,
+  alt   = JPG ,
+  long  = Joint Photographic Experts Group
+}
+\DeclareAcronym{la}{
+  short = LA ,
+  long = Los Angeles,
+  plural = ,
+  tag = city
+}
+\DeclareAcronym{lppl}{
+  short = lppl ,
+  long = \unexpanded{\LaTeX} Project Public License ,
+  short-format = \scshape ,
+  pdfstring = LPPL ,
+  short-acc = LPPL
+}
+\DeclareAcronym{MP}{
+  short = MP ,
+  long  = Member of Parliament ,
+  plural-form = Members of Parliament ,
+  long-possessive-form = Member's of Parliament
+}
+\DeclareAcronym{nato}{
+  short        = nato ,
+  long         = Organisation des Nordatlantikvertrags ,
+  foreign      = North Atlantic Treaty Organization ,
+  foreign-babel  = english ,
+  foreign-locale = englisch ,
+  short-format = \scshape
+}
+\DeclareAcronym{ny}{
+  short = NY ,
+  long = New York ,
+  plural = ,
+  tag = city ,
+  cite = NewYork
+}
+\DeclareAcronym{pdf}{
+  short = pdf ,
+  long = Portable Document Format ,
+  short-format = \scshape ,
+  pdfstring = PDF ,
+  short-acc = PDF
+}
+\DeclareAcronym{png}{
+  short = PNG ,
+  long  = Portable Network Graphics ,
+  first-style = short-long ,
+  single-style = short
+}
+\DeclareAcronym{PU}{
+  short = PU ,
+  long = Polyurethan ,
+  long-plural = e
+}
+\DeclareAcronym{sw}{
+  short       = SW ,
+  long        = Sammelwerk ,
+  long-plural = e ,
+  tag = exclude
+}
+\DeclareAcronym{tex.sx}{
+  short = \TeX.sx ,
+  sort  = TeX.sx ,
+  long  = \TeX{} StackExchange
+}
 \DeclareAcronym{ufo}{
-   short           = UFO ,
-   long            = unidentified flying object ,
-   long-indefinite = an
+  short = UFO ,
+  long = unidentified flying object ,
+  foreign = unbekanntes Flugobjekt ,
+  foreign-plural-form = unbekannte Flugobjekte ,
+  foreign-acc-plural-form = unbekannte Flugobjekte ,
+  foreign-babel = ngerman ,
+  long-indefinite = an
 }
 
-% because the mannual does not activate the `macros' option:
-\newcommand*\nato{\ac{nato}}
-\newcommand*\ny{\ac{ny}}
+% declare glossary terms:
+\DeclareAcronym{property}{
+  long = A \property*{property} is an option to the second argument of the
+    \cs*{DeclareAcroym} command.  They are options of an individual acronym if
+    you will. ,
+  tag = glossary , no-index
+}
+\DeclareAcronym{option}{
+  long = An \option*{option} is a package option of \acro\ which must set
+    with \cs*{acsetup}. It \emph{cannot} be set as option to \cs*{usepackage}. ,
+  tag = glossary , no-index
+}
+\DeclareAcronym{load-time option}{
+  long = A load-time \option*{option} is a package option of \acro\ which must
+    be set as option to \cs*{usepackage}\oarg{options}\Marg{acro}. ,
+  tag = glossary , no-index
+}
+\DeclareAcronym{template}{
+  long = A template determines how different objects of \acro\ are printed.
+    This includes the acronyms themselves but also for example the list of
+    acronyms as a whole. ,
+  tag = glossary , no-index
+}
+\DeclareAcronym{articles}{
+  long = {Articles are prefixes to acronyms, usually separated with a blank.
+    \emph{Different types of articles are mutually exclusive.}} ,
+  tag = glossary , no-index
+}
+\DeclareAcronym{endings}{
+  long = {Endings are postfixes to acronyms, usually not separated from the
+    acronym. \emph{Different types of endings are mutually exclusive.}} ,
+  tag = glossary , no-index
+}
+\DeclareAcronym{translations}{
+  long = Localisation strings which can be modified. ,
+  tag = glossary , no-index
+}
 
+\newcommand*\issues{\url{https://github.com/cgnieder/acro/issues}}
+
 \newcommand*\latin[1]{\textit{#1}}
 
 \begin{document}
-\section{Licence and Requirements}
+
+\clearpage
+\part{Get started with \acro}\label{part:get-started-with}
+
+\section{Licence and requirements}\label{sec:licence-requirements}
 \license
 
-\acro\ loads and needs the following packages:
-\pkg{expl3}\footnote{\CTANurl{l3kernel}}, \pkg{xparse}, \pkg{xtemplate},
-\pkg{l3keys2e}\footnote{\CTANurl{l3packages}},
-\pkg{zref-abspage}\footnote{\CTANurl{oberdiek}} and
-\needpackage{translations}~\cite{pkg:translations}.
+\section{Glossary}
+\printacronyms[include=glossary,template=glossary]
 
-\section{Basics}
-\subsection{Creating New Acronyms}
-Acronyms are created with the command \cs{DeclareAcronym}.
+\section{\acro\ for the impatient}\label{sec:acro-impatient}
+
+Acronyms are defined in the preamble via the command
 \begin{commands}
-  \command{DeclareAcronym}[\marg{id}\marg{list of keys}]
+  \command{DeclareAcronym}[\marg{id}\marg{properties}]
+    where \meta{id} is a unique string to identify the acronym and
+    \meta{properties} is a key\slash value list of acronym properties.  These
+    include:
+\end{commands}
+\begin{properties}
+  %% short
+  \propval{short}{text}\Default!
+    The short form of the acronym.  \emph{This property is required}: an
+    acronym must have a short form.
+  %% long
+  \propval{long}{text}\Default!
+    The long form of the acronym.  \emph{This property is required}: an
+    acronym must have a description.
+\end{properties}
+\begin{bewareofthedog}
+  In its simplest form an acronym needs a short and a long form.  Please note
+  that both properties \emph{must} be set.
+\end{bewareofthedog}  
+
+In the document acronyms are used with these commands:
+\begin{commands}
+  \command{ac}[\marg{id}\quad\cs{Ac}\marg{id}]
+    \cs{ac} prints the acronym \meta{id}, the first time with full description
+    and every subsequent use only the abbreviated form. \cs{Ac} does the same
+    but uppercases the first letter -- this may be needed at the beginning of
+    a sentence.
+  \command{acs}[\marg{id}\quad\cs{Acs}\marg{id}]
+    \cs{acs} prints the short form of the acronym \meta{id}. \cs{Acs} does the
+    same but uppercases the first letter.
+  \command{acl}[\marg{id}\quad\cs{Acl}\marg{id}]
+    \cs{acl} prints the long form of the acronym \meta{id}. \cs{Acl} does the
+    same but uppercases the first letter.
+  \command{acf}[\marg{id}\quad\cs{Acf}\marg{id}]
+    \cs{acf} prints the full form of the acronym \meta{id}. \cs{Acf} does the
+    same but uppercases the first letter.
+\end{commands}
+
+Let's say you defined \acs*{cd} as follows:
+\begin{sourcecode}
+  \DeclareAcronym{cd}{
+    short = CD ,
+    long  = compact disc
+  }
+\end{sourcecode}
+Then the usage is
+\begin{example}[side-by-side]
+  \begin{tabular}{ll}
+    first  & \ac{cd} \\
+    second & \ac{cd} \\
+    long   & \acl{cd} \\
+    short  & \acs{cd} \\
+    full   & \acf{cd}
+  \end{tabular}
+\end{example}
+
+\section{Setting options}\label{sec:setting-options}
+\subsection{Load-time options}\label{sec:load-time-options}
+\acro\ knows only a small set of load-time options which can be used as
+argument to \cs*{usepackage}:
+\begin{options}
+  \keychoice{version}{2,3}\Default{3}
+    The option allows you to use the last version prior to the update to
+    version~3.  This may help if you don't have the time to fix issues after
+    upgrading to the new version.
+  \keybool{upgrade}\Default{true}
+    When this option is used \acro\ tries to give as much helpful and
+    meaningful warning or error messages when a deprecated or removed command,
+    property, or option is used.  This is especially useful if you are
+    upgrading from version~2.  The option will initially be true for a few
+    months after the upgrade to version~3.
+\end{options}
+
+\subsection{Setup command}\label{sec:setup-command}
+All options of \acro\ that have \emph{not} been mentioned in
+section~\ref{sec:load-time-options} have to be set up either with this command
+\begin{commands}
+  \command{acsetup}[\marg{options}]
+    or as option to other commands.  If the latter is possible then it is
+    described when the corresponding commands are explained.  Options usually
+    follow a key\slash value syntax and are always described in the following
+    way:
+\end{commands}
+\begin{options}
+  \opt*{option}
+    An option without a value. Those options are very rare if there are any.
+  \keyval*{option}{value}\Default{preset}
+    An option where a value can be given.  The pre-set value is given to the
+    right.
+  \keychoice*{option}{\default{choiceA},choiceB,choiceC}\Default{choiceB}
+    An option with a determined set of choices. The underlined value is
+    chosen if the option is given without value.
+  \keybool*{option}
+    A boolean option with only the choices \code{true} and \code{false}.
+  \opt*{option}\Module{module}
+    An option at a deeper level belonging to the module \module*{module}.
+\end{options}
+All of the above is probably clear from an example (using real options):
+\begin{sourcecode}
+  \acsetup{
+    make-links = true , % boolean
+    index ,             % boolean
+    format = \emph ,    % standard
+    list / local ,      % boolean option of the list module
+    list/display = all  % choice option of the list module
+  }
+\end{sourcecode}
+
+\part{Comprehensive description of creation and usage of acronyms}\label{part:compr-descr-creat}
+\section{Declaring acronyms and other abbreviations}\label{sec:decl-acronyms-other}
+
+All acronyms have to be declared in the preamble with the following command in
+order to be used in the document. Any usage of an acronym which has not been
+declared leads to an error message.
+\begin{commands}
+  \command{DeclareAcronym}[\marg{id}\marg{list of properties}]
     The basic command for declaring an acronym where \meta{id} is a unique
-    string identifying the acronym.  Per default behaviour this is case
-    sensitive which means \code{id} is different from \code{ID}, for example.
-    There is an option \option{case-sensitive}\sinceversion{2.11} to change
-    this.
+    string identifying the acronym.  Per default this is case sensitive which
+    means \code{id} is different from \code{ID}, for example.
 \end{commands}
-This command understands a number of keys which are listed below.  Some of
-them are not described immediately but at appropriate places in the
-documentation.
+The command understands a number of properties which are listed in the
+following sections.  This is a comprehensive overview over the existing
+properties. Many properties are also explained in more detail in later
+sections of this manual.
+\begin{options}
+  \keybool{case-sensitive}\Default{false}
+    When this is set you can write the \ac{id} of the acronym upper- or lower-
+    or mixed case and it is recognized by \acro\ as the same.  This might be
+    useful when the acronym appears in the page header, for example.
+\end{options}
+
+\begin{bewareofthedog}
+  In its simplest form an acronym needs a short and a long form.  Please note
+  that both properties \emph{must} be set.
+\end{bewareofthedog}
+
+\subsection{Basic properties}\label{sec:basic-properties}
 \begin{properties}
   %% short
   \propval{short}{text}\Default!
     The short form of the acronym.  \emph{This property is required}: an
-    acronym must have a short form.  If this is set it \emph{must} be set as
-    first option! If another property is set first and notices the
-    \property{short} property missing it assumes that the \acs{id} should be
-    used as short version and sets it accordingly.  A warning will be written
-    to the log then.
+    acronym must have a short form.
+\end{properties}
+Maybe you mostly have simple acronyms where the \ac{id} and short form are
+the same.  In that case you can use
+\begin{options}
+  \keybool{use-id-as-short}\Default{false}
+    to use the \ac{id} of the acronym as short form. For more complicated
+    cases this would still allow you to set the short form.
+\end{options}
+\begin{properties}
   %% long
   \propval{long}{text}\Default!
     The long form of the acronym.  \emph{This property is required}: an
     acronym must have a description.
+  %% alt
+  \propval{alt}{text}\Default
+    Alternative short form.
+  %% extra
+  \propval{extra}{text}\Default
+    Extra information to be added in the list of acronyms.
+  %% foreign
+  \propval{foreign}{long form in foreign language}\Default
+    Can be useful when dealing with acronyms in foreign languages, see
+    section~\vref{sec:fore-lang-acronyms} for details.
+  %% long-post
+  \propval{long-post}{text}\Default
+    \meta{text} is appended to the long form of the acronym in the text but
+    not in the list of acronyms.
+  %% post
+  \propval{post}{text}\Default
+    \meta{text} is appended to the acronym in the text but not in the list of
+    acronyms.
+  %% single
+  \propval{single}{text}\Default={long}
+    If provided \meta{text} will be used instead of the long form if the
+    acronym is only used a single time \emph{and} the option
+    \option{single} has been set, see section~\vref{sec:single-appe-an}.
+  %% sort
+  \propval{sort}{text}\Default={short}
+    If used the acronym will be sorted according to this property instead of
+    its \ac{id}.
+  %% tag
+  \propval{tag}{csv list}\Default
+    The tag(s) of an acronym.
+  %% cite
+  \proplit-{cite}{\oarg{prenote}\oarg{postnote}\marg{citation keys}}\Default
+    A citation that is printed to the acronym according to an option explained
+    later.
+  %% before-citation
+  \propval{before-citation}{text}\Default
+    \meta{text} is prepended to the citation of the acronym when and where
+    the citation is printed.
+  %% index
+  \propval{index}{text}\Default
+    This property allows to overwrite the automatic index entry with an
+    arbitrary one.  See section~\vref{sec:indexing} for details.
+  %% index-sort
+  \propval{index-sort}{text}\Default={sort}
+    If you use the option \option{index} every occurrence of an acronym is
+    recorded to the index and sorted by its short form or (if set) by the
+    value of the \property{sort} property.  This property allows to set an
+    individual sorting option for the index.  See section~\vref{sec:indexing}
+    for details.
+\end{properties}
+
+\subsection{Properties related to plural and indefinite forms}\label{sec:prop-relat-plur}
+\begin{properties}
   %% short-plural
   \propval{short-plural}{text}\Default{s}
     The plural ending appended to the short form.
   %% short-plural-form
-  \propval{short-plural-form}{text}
-    The\sinceversion{2.0} plural short form of the acronym; replaces the short
-    form when used instead of appending the plural ending.
+  \propval{short-plural-form}{text}\Default
+    The plural short form of the acronym; replaces the short form when used
+    instead of appending the plural ending.
   %% long-plural
   \propval{long-plural}{text}\Default{s}
     The plural ending appended to the long form.
   %% long-plural-form
-  \propval{long-plural-form}{text}
+  \propval{long-plural-form}{text}\Default
     Plural long form of the acronym; replaces the long form when used
     instead of appending the plural ending.
    %% alt-plural
   \propval{alt-plural}{text}\Default{s}
-    The\sinceversion{2.0} plural ending appended to the alternative form.
+    The plural ending appended to the alternative form.
   %% alt-plural-form
-  \propval{alt-plural-form}{text}
-    The\sinceversion{2.0} plural alternative form of the acronym; replaces the
-    alternative form when used instead of appending the plural ending.
+  \propval{alt-plural-form}{text}\Default
+    The plural alternative form of the acronym; replaces the alternative form
+    when used instead of appending the plural ending.
   %% foreign-plural
   \propval{foreign-plural}{text}\Default{s}
-    The\sinceversion{2.9} plural ending appended to the foreign form.
+    The plural ending appended to the foreign form.
   %% foreign-plural-form
-  \propval{foreign-plural-form}{text}
-    Plural\sinceversion{2.9} foreign form of the acronym; replaces the
-    foreign form when used instead of appending the plural ending.
-  %% list
-  \propval{list}{text}
-    If specified this will be written in the list as description instead of
-    the long form.
+  \propval{foreign-plural-form}{text}\Default
+    Plural foreign form of the acronym; replaces the foreign form when used
+    instead of appending the plural ending.
   %% short-indefinite
   \propval{short-indefinite}{text}\Default{a}
     Indefinite article for the short form.
@@ -256,1885 +481,1913 @@
   %% long-indefinite
   \propval{long-indefinite}{text}\Default{a}
     Indefinite article for the long form.
-  %% long-pre
-  \propval{long-pre}{text}
-    \meta{text} is prepended to the long form in the text but not in the list
-    of acronyms.
-  %% long-post
-  \propval{long-post}{text}
-    \meta{text} is appended to the long form in the text but not in the list
-    of acronyms.
-  %% long-post
-  \propval{post}{text}
-    \meta{text}\sinceversion{2.8} is appended to the acronym in the text but
-    not in the list of acronyms.
-  %% alt
-  \propval{alt}{text}
-    Alternative short form.
   %% alt-indefinite
   \propval{alt-indefinite}{text}\Default{a}
     Indefinite article for the alternative form.
-  %% extra
-  \propval{extra}{text}
-    Extra information to be added in the list of acronyms.
-  %% foreign
-  \propval{foreign}{original long form}
-    Can be useful when dealing with acronyms in foreign languages, see
-    section~\vref{ssec:foreign} for details.
-  %% foreign-lang
-  \propval{foreign-lang}{language}
-    \sinceversion{2.3}The \pkg{babel}~\cite{pkg:babel} or
-    \pkg{polyglossia}~\cite{pkg:polyglossia} language of the foreign form.
-    This language is used to wrap the entry with
-    \cs*{foreignlanguage}\marg{language} if either \pkg{babel} or
-    \pkg{polyglossia} is loaded.  You'll need to take care that the
-    corresponding language is loaded by \pkg{babel} or \pkg{polyglossia}.
-  %% single
-  \propval{single}{text}
-    \sinceversion{2.3}If provided \meta{text} will be used instead of the long
-    form if the acronym is only used a single time \emph{and} the option
-    \keyis{single}{true} is active.
-  %% sort
-  \propval{sort}{text}
-    If used the acronym will be sorted according to this key instead of its
-    \acs{id}.
-  %% class
-  \propval{class}{csv list}
-    The\changedversion{2.4} class(es) the acronym belongs to.
-  %% cite
-  \proplit-{cite}{\oarg{prenote}\oarg{postnote}\marg{citation keys}}
-    A citation that is printed to the acronym according to an option explained
-    later.
-  %% before-citation
-  \propval{before-citation}{code}
-    \meta{code}\sinceversion{2.11} is inserted directly before \property{cite}
-    and \emph{ony when} \property{cite} is used.
-  %% after-citation
-  \propval{after-citation}{code}
-    \meta{code}\sinceversion{2.11} is inserted directly after \property{cite}
-    and \emph{ony when} \property{cite} is used.
+\end{properties}
+
+\subsection{Properties related to formatting}\label{sec:prop-relat-form}
+\begin{properties}
+  \propval{format}{code}\Default
+    The format used for both short and long form of the acronym.
   %% short-format
-  \propval{short-format}{\TeX{} code}
+  \propval{short-format}{code}\Default={format}
     The format used for the short form of the acronym.
   %% long-format
-  \propval{long-format}{\TeX{} code}
+  \propval{long-format}{code}\Default={format}
     The format used for the long form of the acronym.
-  %% short-format
-  \propval{alt-format}{\TeX{} code}
-    The\sinceversion{2.10} format used for the alternative form of the
-    acronym. If this is not given the short format will be used.
   %% first-long-format
-  \propval{first-long-format}{\TeX{} code}
-    The format used for the first long form of the acronym as set with \cs{ac},
-    \cs{acf} or \cs{acflike} and their uppercase, plural and indefinite forms.
+  \propval{first-long-format}{code}\Default={long-format}
+    The format used for the first appearance of the long form of the acronym.
+  %% alt-format
+  \propval{alt-format}{code}\Default={short-format}
+    The format used for the alternative form of the acronym. If this is not
+    given the short format will be used.
+  %% extra-format
+  \propval{extra-format}{code}\Default
+    The format used for the additional information of the acronym.
+  %% foreign-format
+  \propval{foreign-format}{code}\Default
+    The format used for the foreign form of the acronym.
   %% single-format
-  \propval{single-format}{\TeX{} code}
-    \sinceversion{2.3}The format used for the acronym if the acronym is only
-    used a single time.
+  \propval{single-format}{code}\Default={long-format}
+    The format used for the acronym if the acronym is only used a single
+    time.
+  %% list-format
+  \propval{list-format}{code}\Default={long-format}
+    The format used for the long form of the acronym in the list if the list
+    template supports it. All pre-defined list templates \emph{do} support
+    it.
   %% first-style
-  \propchoice{first-style}{default,empty,square,short,long,reversed,footnote,sidenote,%
-    footnote-reversed,sidenote-reversed}
-    \sinceversion{2.3}The style of the first appearance of the acronym, see
-    also section~\ref{sec:opti-regard-acronyms}.
+  \propchoice{first-style}{long-short,short-long,short,long,footnote}\Default
+    The style of the first appearance of the acronym, see also
+    section~\vref{sec:first-or-full}.
+  %% single-style
+  \propchoice{single-style}{long-short,short-long,short,long,footnote}\Default
+    The style of a single appearance of the acronym, see also
+    section~\vref{sec:single-appe-an}.
+\end{properties}
+
+\subsection{Properties related to the created \acs*{pdf} file}\label{sec:prop-relat-creat}
+\begin{properties}
   %% pdfstring
-  \proplit-{pdfstring}{\Marg{\meta{pdfstring}/\meta{plural ending}}}
-    \changedversion{2.4b}Used as \acs{pdf} string replacement in bookmarks
-    when used together with the \pkg{hyperref} package.  The appended plural
-    ending is optional.  If you leave it (\emph{and} the \code{/}) the default
-    ending is used.  \meta{text} is expanded before it is saved.
-  %% accsupp
-  \propval{accsupp}{text}
-    Sets the \code{ActualText} key as presented by the \pkg{accsupp} package
-    for the acronym.
-  %% tooltip
-  \propval{tooltip}{text}
-    \sinceversion{2.1}Sets the tooltip description for an acronym.  For
-    actually getting tooltips you also need an appropriate setting of the
-    \option{tooltip-cmd} option or to set the package option
-    \option{tooltip}.
-  %% index-sort
-  \propval{index-sort}{text}
-    If you use the package option \option{index} every occurrence of an
-    acronym is recorded to the index and sorted by its \acs{id} or (if set) by
-    the value of the \property{sort} property.  This key allows to set an
-    individual sorting option for the index.  See section~\vref{ssec:index}
-    for details.
-  %% index
-  \propval{index}{text}
-    This key allows to overwrite the automatic index entry with an arbitrary
-    one.  See section~\vref{ssec:index} for details.
- %% index-cmd
-  \propval{index-cmd}{control sequence}
-    This key let's you set an individual index creating command for this
-    acronym.  It should be a command that takes one mandatory argument.  See
-    section~\vref{ssec:index} for details. 
+  \propval{pdfstring}{pdfstring}\Default={short}
+    Used as \acs{pdf} string replacement in bookmarks when used together with
+    the \pkg{hyperref}~\cite{pkg:hyperref} or the \pkg{bookmark}
+    package~\cite{pkg:bookmark}.
+  %% pdfcomment
+  \propval{pdfcomment}{text}
+    Sets a tooltip description for an acronym.  For actually getting
+    tooltips you also need an appropriate setting of the options
+    \option{pdfcomment/cmd} and \option{pdfcomment/use}, see also
+    section~\vref{sec:pdf-comments}.
+  %% short-acc
+  \propval{short-acc}{text}\Default={short}
+    Sets the \code{ActualText} property as presented by the \pkg{accsupp}
+    package for the short form of the acronym.
+  %% long-acc
+  \propval{long-acc}{text}\Default={long}
+    Sets the \code{ActualText} property as presented by the \pkg{accsupp}
+    package for the long form of the acronym.
+  %% alt-acc
+  \propval{alt-acc}{text}\Default={alt}
+    Sets the \code{ActualText} property as presented by the \pkg{accsupp}
+    package for the alternative short form of the acronym.
+  %% foreign-acc
+  \propval{foreign-acc}{text}\Default={foreign}
+    Sets the \code{ActualText} property as presented by the \pkg{accsupp}
+    package for the foreign form of the acronym.
+  %% extra-acc
+  \propval{extra-acc}{text}\Default={extra}
+    Sets the \code{ActualText} property as presented by the \pkg{accsupp}
+    package for the extra information of the acronym.
+  %% single-acc
+  \propval{single-acc}{text}\Default={long-acc}
+    Sets the \code{ActualText} property as presented by the \pkg{accsupp}
+    package for a single appearance of the acronym.
+  %% list-acc
+  \propval{list-acc}{text}\Default={list}
+    Sets the \code{ActualText} property as presented by the \pkg{accsupp}
+    package for the appearance in the list of acronyms.
 \end{properties}
 
-\begin{bewareofthedog}
-  In its simplest form an acronym needs a short and a long form.  Please note
-  that both keys \emph{must} be set and that the \property{short} property
-  \emph{must} always be the \emph{first} property that is set.
-\end{bewareofthedog}
+\subsection{Futher properties}\label{sec:futher-properties}
+\begin{properties}
+  %% list
+  \propval{list}{text}\Default={long}
+    If specified this will be written in the list as description instead of
+    the long form if the corresponding list template supports it.
+  %% foreign-babel
+  \propval{foreign-babel}{language}\Default
+    The \pkg{babel}~\cite{pkg:babel} or
+    \pkg{polyglossia}~\cite{pkg:polyglossia} language of the foreign form.
+    This language is used to wrap the entry with
+    \cs*{foreignlanguage}\marg{language} if either \pkg{babel} or
+    \pkg{polyglossia} is loaded.  You'll need to take care that the
+    corresponding language is loaded by \pkg{babel} or \pkg{polyglossia}.
+  %% foreign-locale
+  \propval{foreign-locale}{language}\Default
+    The language name that is output when the option
+    \module{locale}\code{/}\option{display} is used.  If this property is not
+    set then the appropriate value might be derived from
+    \property{foreign-babel}. See section~\vref{sec:fore-lang-acronyms} for
+    details.
+\end{properties}
 
-\begin{sourcecode}
-  % preamble:
-  \DeclareAcronym{test}{
-    short = ST ,
-    long  = Some Test
-  }
-\end{sourcecode}
-This creates the acronym ``\acs{test}'' with the \acs{id} ``test'' and the
-long form ``\acl{test}.''
+\section{Using acronyms}\label{sec:using-acronyms}
+There are a number of commands to use acronyms with. Their names always follow
+the same pattern which should make their usage intuitive immediately.
 
-The \property{short-format} key allows you to choose a specific format for the
-short form of an acronym:
+All of these commands have a starred form which means \enquote{don't count
+  this as usage}. All of these commands also have an optional argument that
+allows to set options for that usage only.
+\begin{commands}
+  \command*{acrocommand}[\sarg\oarg{options}\marg{id}]
+    This is the general syntax of all of the commands listed below.  The star
+    and the optional argument is left way for the sake of readability.
+    \emph{A command \cs*{acrocommand} does not actually exist.}
+  \command{ac}[\marg{id}\quad\cs{Ac}\marg{id}\quad\cs{acp}\marg{id}\quad
+    \cs{Acp}\marg{id}\quad\cs{iac}\marg{id}\quad\cs{Iac}\marg{id}]
+    \cs{ac} prints the acronym \meta{id}, the first time with full description
+    and every subsequent use only the abbreviated form. \cs{Ac} does the same
+    but uppercases the first letter -- this may be needed at the beginning of
+    a sentence.  The commands \cs{acp} and \cs{Acp}, resp., print the
+    corresponding plural forms.  The commands \cs{iac} and \cs{Iac}, resp.,
+    print indefinite forms.
+  \command{acs}[\marg{id}\quad\cs{Acs}\marg{id}\quad\cs{acsp}\marg{id}\quad
+    \cs{Acsp}\marg{id}\quad\cs{iacs}\marg{id}\quad\cs{Iacs}\marg{id}]
+    \cs{acs} prints the short form of the acronym \meta{id}. \cs{Acs} does the
+    same but uppercases the first letter. The commands \cs{acsp} and
+    \cs{Acsp}, resp., print the corresponding plural forms. The commands
+    \cs{iacs} and \cs{Iacs}, resp., print indefinite forms.
+  \command{acl}[\marg{id}\quad\cs{Acl}\marg{id}\quad\cs{aclp}\marg{id}\quad
+    \cs{Aclp}\marg{id}\quad\cs{iacl}\marg{id}\quad\cs{Iacl}\marg{id}]
+    \cs{acl} prints the long form of the acronym \meta{id}. \cs{Acl} does the
+    same but uppercases the first letter. The commands \cs{aclp} and
+    \cs{Aclp}, resp., print the corresponding plural forms. The commands
+    \cs{iacl} and \cs{Iacl}, resp., print indefinite forms.
+  \command{aca}[\marg{id}\quad\cs{Aca}\marg{id}\quad\cs{acap}\marg{id}\quad
+    \cs{Acap}\marg{id}\quad\cs{iaca}\marg{id}\quad\cs{Iaca}\marg{id}]
+    \cs{aca} prints the alternative short form of the acronym \meta{id}.
+    \cs{Aca} does the same but uppercases the first letter. The commands
+    \cs{acap} and \cs{Acap}, resp., print the corresponding plural forms. The
+    commands \cs{iaca} and \cs{Iaca}, resp., print indefinite forms.
+  \command{acf}[\marg{id}\quad\cs{Acf}\marg{id}\quad\cs{acfp}\marg{id}\quad
+    \cs{Acfp}\marg{id}\quad\cs{iacf}\marg{id}\quad\cs{Iacf}\marg{id}]
+    \cs{acf} prints the full form of the acronym \meta{id}. \cs{Acf} does the
+    same but uppercases the first letter. The commands \cs{acfp} and
+    \cs{Acfp}, resp., print the corresponding plural forms. The commands
+    \cs{iacf} and \cs{Iacf}, resp., print indefinite forms.
+\end{commands}
+
+The usage should be clear. Let's assume you have defined an acronym
+\acs*{ufo}\label{ufo} like this:
 \begin{sourcecode}
-  % preamble:
-  \DeclareAcronym{ot}{
-    short        = ot ,
-    long         = Other Test ,
-    short-format = \scshape
+  \DeclareAcronym{ufo}{
+    short = UFO ,
+    long = unidentified flying object ,
+    foreign = unbekanntes Flugobjekt ,
+    foreign-plural-form = unbekannte Flugobjekte ,
+    foreign-babel = ngerman ,
+    long-indefinite = an
   }
 \end{sourcecode}
-The short form now looks like this: \acs{ot}.
+Then typical outputs look like this:
+\begin{example}
+  \ac{ufo} \\
+  \iac{ufo} \\
+  \iacl{ufo} \\
+  \Iacf{ufo} \\
+  \acfp{ufo}
+\end{example}
 
-The \property{cite} key needs a bit explaining.  It expects arguments like the
-standard \cs*{cite} command, \latin{i.e.}, two optional arguments setting the
-\meta{prenote} and \meta{postnote} and one mandatory argument setting the
-citation key.
+\section{Alternative short forms}\label{sec:altern-short-forms}
+Sometimes expressions have two different short forms. And example might be
+\acs*{jpg} which also often is \aca*{jpg}. This is what the property
+\property{alt} is there for.
+\begin{properties}
+  \propval{alt}{text}
+    Alternative short form.
+\end{properties}
+Let's define \acs*{jpg}:
 \begin{sourcecode}
-  % preamble:
-  \DeclareAcronym{ny}{
-    short        = NY ,
-    short-plural = ,
-    long         = New York ,
-    long-plural  = ,
-    cite         = {NewYork} 
+  \DeclareAcronym{jpg}{
+    short = JPEG ,
+    sort  = jpeg ,
+    alt   = JPG ,
+    long  = Joint Photographic Experts Group
   }
 \end{sourcecode}
+And let's see how to use it:
+\begin{example}
+  \ac{jpg} \\
+  \ac{jpg} \\
+  \aca{jpg}
+\end{example}
+As you can see the full form shows both short forms of the acronym. This could
+be changed by altering the template for the full form, see
+section~\vref{sec:templates} and section~\vref{sec:first-or-full}.  The
+alternative form is also printed in the list of acronyms, see
+section~\vref{sec:acronyms}.  This can also be changed by altering the
+template for the list, again see section~\ref{sec:templates}.
 
-\begin{sourcecode}[sourcecode-options={style=cnltx-bibtex}]
-  % bib file for use with biber/biblatex:
-  @online{NewYork,
-    author  = {Wikipedia},
-    title   = {New York City},
-    urldate = {2012-09-27},
-    url     = {http://en.wikipedia.org/wiki/New_York_City},
-    year    = {2012}
-  }
-\end{sourcecode}
-The first appearance now looks as follows\footnote{The appearance of the
-  citation of course depends on the citation style you're using.}: \acf{ny}.
+\section{The first or full appearance}\label{sec:first-or-full}
+If an acronym is used for the first time with \cs{ac} (after any number of
+usages with the starred forms of the usage commands listed in
+section~\vref{sec:using-acronyms}) or if an acronym is used \cs{acf}, then the
+first or full appearance of the acronym is printed\footnote{This usually
+  requires at least two \LaTeX\ runs until it is stable.}.
 
-\subsection{Logging of Acronyms}
-When you activate \acro's option\sinceversion{2.5} \option{log} \acro' writes
-information about the acronyms it defines to the log file.
+The first or full appearance of an acronym is determined by this option:
 \begin{options}
-  \keychoice{log}{\default{true},false,silent,verbose}\Default{false}
-    When set to \code{true}/\code{silent} \acro{} writes the main properties
-    of an acronym to the log file.  When set to \code{verbose} \acro' writes
-    \emph{all}  properties of an acronym to the log file.
+  \keychoice{first-style}{long-short,short-long,short,long,footnote}\Default{long-short}
+    The style of the first appearance of the acronym. This options sets the
+    appearance for all acronyms.  Available options in reality are the names
+    of all defined templates of the type \code{acronym}. All pre-defined
+    templates can be found in section~\vref{sec:pre-defin-templ}.
 \end{options}
+It might be desirable to set the first appearance of an acronym
+individually. This is possible by setting the corresponding property:
+\begin{properties}
+  \propchoice{first-style}{long-short,short-long,short,long,footnote}\Default
+    The style of the first appearance of the acronym.
+\end{properties}
+Let's again look at an example:
+\begin{example}[side-by-side]
+  \acf[first-style=long-short]{cd} \\
+  \acf[first-style=short-long]{cd} \\
+  \acf[first-style=footnote]{cd} \\
+  \acf[first-style=long]{cd} \\
+  \acf[first-style=short]{cd}
+\end{example}
+This also demonstrates the use of the optional argument.
 
-This is an example of the logging info with \keyis{log}{true} or
-\keyis{log}{silent}.
+An example of an abbreviation that should have \code{long} as first appearance
+might be \enquote{\acs*{etc}}, defined like this
 \begin{sourcecode}
-  =================================================
-  | Package acro Info -- defining new acronym:
-  |   ID = {jpg}
-  |   short = {JPEG}
-  |   long = {Joint Photographic Experts Group}
-  |   alt = {JPG}
-  |   sort = {jpeg}
-  |   class = {}
-  |   list = {}
-  |   extra = {}
-  |   foreign = {}
-  |   pdfstring = {}
-  |   cite = {}
-  =================================================
+  \DeclareAcronym{etc}{
+    short = etc\acdot ,
+    long = et cetera ,
+    format = \textit ,
+    first-style = long ,
+    plural = 
+  }
 \end{sourcecode}
-
-\subsection{Using the Acronyms -- the Commands}\label{sec:using-acronyms-comm}
-Acronyms are used with one of the following commands:
-\begin{commands}
-  %%
-  \command{ac}[\sarg\marg{id}]
-    basic command; the first output is different from subsequent ones.
-  \command{Ac}[\sarg\marg{id}]
-    same as \cs{ac} but capitalizes the first letter.  Obeys the option
-    \option{uppercase-short}.
-  %%
-  \command{acs}[\sarg\marg{id}]
-    \h{s}hort form; the actual acronym.
-  \command{Acs}[\sarg\marg{id}]
-    same\sinceversion{2.10} as \cs{acs} but capitalizes the first letter.
-  %%
-  \command{acl}[\sarg\marg{id}]
-    \h{l}ong form; the meaning of the acronym.
-  \command{Acl}[\sarg\marg{id}] 
-    same as \cs{acl} but capitalizes first letter.
-  %%
-  \command{aca}[\sarg\marg{id}]
-    \h{a}lternative short form as specified in the \property{alt} property of
-    \cs{DeclareAcronym}; if it hasn't been specified this is identical to
-    \cs{acs}.
-  \command{Aca}[\sarg\marg{id}]
-    same\sinceversion{2.10} as \cs{aca} but capitalizes the first letter.
-  %%
-  \command{acf}[\sarg\marg{id}]
-    first form; output like the first time \cs{ac} is output.
-  \command{Acf}[\sarg\marg{id}]
-    same as \cs{acf} but capitalizes first letter.  Obeys the option
-    \option{uppercase-short}.
-  %%
-  \command{acp}[\sarg\marg{id}]
-    \h{p}lural form of \cs{ac};
-  \command{Acp}[\sarg\marg{id}]
-    same as \cs{acp} but capitalizes first letter.  Obeys the option
-    \option{uppercase-short}.
-  %%
-  \command{acsp}[\sarg\marg{id}]
-    plural form of \cs{acs};
-  \command{Acsp}[\sarg\marg{id}]
-    same\sinceversion{2.10} as \cs{acsp} but capitalizes the first letter.
-  %%
-  \command{aclp}[\sarg\marg{id}]
-    plural form of \cs{acl};
-  \command{Aclp}[\sarg\marg{id}]
-    same as \cs{aclp} but capitalizes first letter.
-  %%
-  \command{acap}[\sarg\marg{id}]
-    plural form of \cs{aca};
-  \command{Acap}[\sarg\marg{id}]
-    same\sinceversion{2.10} as \cs{acap} but capitalizes the first letter.
-  %%
-  \command{acfp}[\sarg\marg{id}]
-    plural form of \cs{acf};
-  \command{Acfp}[\sarg\marg{id}]
-    same as \cs{acfp} but capitalizes first letter of the long form.  Obeys
-    the option \option{uppercase-short}.
-\end{commands}
-If an acronym is used the first time with \cs{ac} its output is different from
-subsequent uses.  To be clear on this: the first time!  If the acronym has
-been used with \emph{any} of the output commands before it is \emph{not} the
-first time any more.
-
-If you use the starred variant an acronym will not be marked as used.  This
-proves useful if an acronym is typeset in a section title, for example, since
-then the appearance in the table of contents won't mark it as used.
-
+and output like this:
 \begin{example}[side-by-side]
-  % preamble:
-  % \DeclareAcronym{cd}{
-  %   short        = cd ,
-  %   long         = Compact Disc ,
-  %   short-format = \scshape
-  % }
-  first time: \ac{cd} \\
-  second time: \ac{cd} \\
-  short: \acs{cd} \\
-  alternative: \aca{cd} \\
-  first again: \acf{cd} \\
-  long: \acl{cd} \\
-  short plural: \acsp{cd} \\
-  long plural: \aclp{cd}
+  \ac{etc}, \ac{etc} \ac{etc}.
 \end{example}
+The command \cs{acdot} is explained in section~\vref{sec:trailing-tokens}.
+Basically it checks if a dot follows and outputs a dot if not.
 
-\subsection{Plural Forms}
-If an acronym is defined in the standard way \acro\ uses an `s' that's appended
-to both the short and the long form when one of the plural commands is used.
-However, that is not always the best solution.  For one thing not all acronyms
-may have a plural form.  Second, the plural form especially of the long forms
-may be formed differently.  And third, other languages can have other plural
-endings.
+\section{Single appearances of an acronym}\label{sec:single-appe-an}
+If an acronym is used only once (not counting usages with the starred forms of
+the usage commands listed in section~\vref{sec:using-acronyms}), then the
+single appearance of the acronym is printed\footnote{This usually requires at
+  least two \LaTeX\ runs until it is stable.}.
 
-For these reasons \cs{DeclareAcronym} can get the following keys:
+The single appearance of an acronym is determined by this option:
+\begin{options}
+  \keychoice{single}{\default{true},false,\meta{number}}\Default{false}
+    This option determines wether a single appearance of an acronym counts as
+    \emph{usage}. It might be desirable in such cases that an acronym is
+    simply printed as long form and not added to the list of acronym.  This is
+    what this option does.  With \meta{number} the minimal number of usages
+    can be given that needs to be exceeded.  \keyis{single}{1} is the same as
+    \keyis{single}{true}.
+  \keychoice{single-style}{long-short,short-long,short,long,footnote}\Default{long}
+    The style of the single appearance of an acronym.  Can be used to
+    determine how a single appearance is printed if the option \option{single}
+    has been set. This option sets the appearance for all acronyms.
+    Available options in reality are the names of all defined templates of the
+    type \code{acronym}. All pre-defined templates can be found in
+    section~\vref{sec:pre-defin-templ}.
+\end{options}
+
+If you like you can also set the single appearance of an acronym individually:
 \begin{properties}
-  \propval{short-plural}{text}\Default{s}
-    The plural ending of the short form.
-  \propval{long-plural}{text}\Default{s}
-    The plural ending of the long form.
-  \propval{long-plural-form}{text}
-    An alternative plural form for the long form.
+  \propval{single}{text}\Default={long}
+    If provided \meta{text} will be used instead of the long form if the
+    acronym is only used a single time \emph{and} the option
+    \option{single} has been set.
+  \propval{single-format}{code}\Default={long-format}
+    The format used for the acronym if the acronym is only used a single
+    time.
+  \propchoice{single-style}{long-short,short-long,short,long,footnote}\Default
+    The style of the single appearance of the acronym.
 \end{properties}
-These keys are optional.  If they're not used, the default setting is
-\code{s}.  If you use \property{long-plural-form} the long form will be
-replaced by the specified plural form when necessary.
-
-Suppose we define the following acronyms:
+Let's again look at an example. The acronym \acs*{png} is defined as follows:
 \begin{sourcecode}
-  \DeclareAcronym{cd}{
-    short        = cd ,
-    long         = Compact Disc ,
-    short-format = \scshape
+  \DeclareAcronym{png}{
+    short = PNG ,
+    long  = Portable Network Graphics ,
+    first-style = short-long ,
+    single-style = short
   }
-  \DeclareAcronym{ny}{
-    short        = NY ,
-    short-plural = ,
-    long         = New York ,
-    long-plural  =
-  }
-  \DeclareAcronym{sw}{
-    short       = SW ,
-    long        = Sammelwerk ,
-    long-plural = e
-  }
-  \DeclareAcronym{MP}{
-    short            = MP ,
-    long             = Member of Parliament ,
-    long-plural-form = Members of Parliament
-  }
 \end{sourcecode}
-These acronyms now have the following plural appearances:
+And it is used only once in this manual\footnote{You will find it in the list
+  of acronyms in section~\ref{sec:acronyms} nonetheless as this document does
+  \keyis{list/display}{all}.}:
 \begin{example}[side-by-side]
-  \acsp{cd}, \aclp{cd} \\
-  \acsp{ny}, \aclp{ny} \\
-  \acsp{sw}, \aclp{sw} \\
-  \acsp{MP}, \aclp{MP}
-\end{example}
+  \ac{png}
+\end{example}  
+Please be aware that \cs{acf} would still print the full form, of course.
 
-In the default setting the format of the long or short form is not extended to
-the plural ending which might look strange if you choose bold weight as
-format, for example.  In this case you can tell \acro\ to extend the format.
+\section{Printing the list}\label{sec:printing-list}
+\subsection{The main command and its options}\label{sec:main-list}
+The main idea is simple: just place
+\begin{commands}
+  \command{printacronyms}[\oarg{options}]
+    where you want the list to appear.  It may require several (most times
+    two) \LaTeX\ runs for it to stabilize so look out for any warnings
+    from \acro\ requiring to re-run.
+\end{commands}
+The options controlling the list are these:
 \begin{options}
-  \keybool{format-include-endings}\Default{false}
-    Tell\sinceversion{2.8} \acro\ to use the format of the base form for the
-    endings, too.
-\end{options}
-For a more general view on endings please read section
-\vref{sec:about-plural-forms}.
+  \keychoice{template}{description,table,longtable,lof,toc}%
+    \Module{list}\Default{description}
+    Choose the template to create the list with.  See more on this in
+    sections~\vref{sec:templates} and~\vref{sec:examples}.
+  \keybool{sort}\Module{list}\Default{true}
+    Decide wether to sort the list of acronyms alphabetically or to print it
+    in order of definition.
+  \keychoice{display}{all,used}\Module{list}\Default{used}
+    Decide wether to print only the acronyms actually used in the document or
+    all acronyms which have been declared in the preamble.
+  \keyval{exclude}{csv list of tags}\Module{list}\Default
+    Set a list of tags to exclude from the list.  Only acronyms not
+    belonging to one of these tags will be included.
+  \keyval{include}{csv list of tags}\Module{list}\Default
+    Set a list of tags to include in  the list.  Only acronyms belonging to
+    one of these tags will be included.
+  \keychoice{heading}{none,section,section*,chapter,chapter*}\Module{list}
+    Choose the heading template for the list of acronyms.
 
-\subsection{Alternative Short Forms}
-For some acronyms it might be useful to have alternative forms.  For this
-\cs{DeclareAcronym} has another key:
-\begin{properties}
-  \propval{alt}{text}
-    Alternative short form.
-\end{properties}
-\begin{example}
-  % preamble:
-  % \DeclareAcronym{jpg}{
-  %   short = JPEG ,
-  %   sort  = jpeg ,
-  %   alt   = JPG ,
-  %   long  = Joint Photographic Experts Group
-  % }
-  default: \acs{jpg} \\
-  alt.: \aca{jpg}
-\end{example}
-The alternative form uses the same plural ending as the default short form and
-is formatted in the same way.
+    This only has an effect if the list template supports it.  All pre-defined
+    templates \emph{do} support it.
+  \keyval{name}{text}\Module{list}\Default{\cs{acrotranslate}\Marg{list-name}}
+    Overwrites the text which is used in the heading.
 
-\subsection{Extra Information for the List Entry}
-Of course you can print a list of acronyms where their meaning is explained.
-Sometimes it can be useful to add additional information there.  This is done
-with another key to \cs{DeclareAcronym}:
-\begin{properties}
-  \propval{extra}{text}
-    Additional information for the list of acronyms.
-\end{properties}
-These information will only be displayed in the list.  See
-section~\vref{sec:print_lists} for the impact of the following example.
+    This only has an effect if the list template supports heading templates
+    \emph{and} the heading templates support it.  All pre-defined heading
+    templates \emph{do} support this.
+  \keyval{preamble}{text}\Module{list}\Default
+    Set a preamble to be placed between heading and actual list.
 
-\begin{example}
-  % preamble:
-  % \DeclareAcronym{nato}{
-  %   short        = nato ,
-  %   long         = North Atlantic Treaty Organization ,
-  %   extra        = \textit{deutsch}: Organisation des Nordatlantikvertrags ,
-  %   short-format = \scshape
-  % }
-  The \ac{nato} is an intergovernmental military alliance based on the
-  North Atlantic Treaty which was signed on 4~April 1949. \ac{nato}
-  headquarters are in Brussels, Belgium, one of the 28 member states
-  across North America and Europe, the newest of which, Albania and
-  Croatia, joined in April 2009.
-\end{example}
+    This only has an effect if the list template supports it.  All pre-defined
+    templates \emph{do} support it.
+  \keybool{display}\Module{list,locale}\Default{false}
+    This options determines wether the language of the foreign form is printed
+    or not.
 
-\subsection{Foreign Language Acronyms}\label{ssec:foreign}
-I repeatedly read the wish for being able to add translations to acronyms when
-the acronyms stem from another language than the document language,
-\latin{i.e.}, something like the following in a German document:
-\begin{example}[side-by-side]
-  \ac{ecu}\\
-  \ac{ecu}
-\end{example}
-That's why I decided to add the following properties:
-\begin{properties}
-  \propval{foreign}{original long form}
-    A description for an acronym originating in another language than the
-    document language.
-  \propval{foreign-lang}{language}
-    \sinceversion{2.3}The \pkg{babel}~\cite{pkg:babel} or
-    \pkg{polyglossia}~\cite{pkg:polyglossia} language of the foreign form.
-    This language is used to wrap the entry with
-    \cs*{foreignlanguage}\marg{language}.
-\end{properties}
+    This only has an effect if the list template supports foreign forms.  All
+    pre-defined templates \emph{do} support them.
+\end{options}
 
-Here is the definition of the above mentioned \ac{ecu} acronym:
+All these options can be set with \cs{acsetup} globally or locally as options
+to \cs{printacronyms}. In the latter case omit the leading
+\module{list}:
 \begin{sourcecode}
-  \DeclareAcronym{ecu}{
-    short   = ECU ,
-    long    = Steuerger\"at ,
-    foreign = Electronic Control Unit ,
-    foreign-lang = english
-  }
+  \acsetup{list/display=all,list/exclude=units}
+  or
+  \printacronyms[display=all,exclude=units]
 \end{sourcecode}
-As you have seen this adds the \property{foreign} entry to the first
-appearance of an acronym.  It is also added in parentheses to the list of
-acronyms after the \property{long} entry.  Actually the entry there is the
-argument to the following command:
-\begin{commands}
-  \command{acroenparen}[\marg{argument}]
-    Places \meta{argument} in parentheses: \cs{acroenparen}\Marg{example}:
-    \acroenparen{example}.  See page~\pageref{key:list-foreign-format} for a
-    way to customize this other than redefining it.
-\end{commands}
 
-\section{Additional Commands and Possibilities}
-\subsection{Indefinite Forms}
+\subsection{Add page numbers to the list}\label{sec:page-numbers}
+If you want to include the page numbers where the acronyms have been used in
+the list of acronym you can use these options:
+\begin{options}
+  \keychoice{display}{first,all,none}\Module{pages}\Default{none}
+    Decide wether to include page numbers in the list of acroynms and wether
+    to add the first page or every page.  When you choose \code{first} and
+    have \pkg{hyperref} loaded you will also get a backlink to that page.
+  \keybool{use}\Module{pages,seq}\Default{true}
+    Turns a two-page range into \meta{num}\,f.\ (\latin{sequens}) and a
+    three-page range into \meta{num}\,ff.\ (\latin{sequentes}) when set to
+    \code{true}.
+  \keyval{pre}{code}\Module{pages,seq}\Default{\cs*{,}}
+    \meta{code} is inserted between the page number and the sequens or
+    sequentes symbol.
+  \keyval{threshold}{num}\Module{pages,seq}\Default{3}
+    The threshold for a page range to be turned into \latin{sequentes}.  A
+    page range above the threshold is still typeset as a range:
+    \meta{num1}--\meta{num2}.
+  \keyval{fill}{code}\Module{pages}\Default{\cs*{dotfill}}
+    This is the code that is placed between acronym description and actual
+    page numbers.
+  \keybool{name}\Module{pages}\Default{false}
+    If set to true the page numbers are preceded with p.\ or pp.
+\end{options}
 
-Unlike many other languages\footnote{Let's better say: unlike the other
-  languages where I know at least the basics.} in English the indefinite
-article is not determined by the grammatical case, gender or number but by the
-pronounciation of the following word.  This means that the short and the long
-form of an acronym can have different indefinite articles.  For these cases
-\acro\ offers the following keys:
+\subsection{Filter lists using tags}\label{sec:lists-tags}
+With the property \property{tag} you can assign one or more tags to an
+acronym.  These tags can be used to filter the list of acronyms.
 \begin{properties}
-  \propval{short-indefinite}{article}\Default{a}
-    Indefinite article for the short form.
-  \propval{alt-indefinite}{article}\Default{a}
-    Indefinite article for the alternative form.
-  \propval{long-indefinite}{article}\Default{a}
-    Indefinite article for the long form.
+  %% tag
+  \propval{tag}{csv list}\Default
+    The tag(s) of an acronym.
 \end{properties}
-For every lowercase singular command two alternatives exist, preceded by
-\code{i} and \code{I}, respectively, which output the lowercase and uppercase
-version of the corresponding indefinite article.
-
+\begin{options}
+  \keyval{exclude}{csv list of tags}\Module{list}\Default
+    Set a list of tags to exclude from the list.  Only acronyms not
+    belonging to one of these tags will be included.
+  \keyval{include}{csv list of tags}\Module{list}\Default
+    Set a list of tags to include in  the list.  Only acronyms belonging to
+    one of these tags will be included.
+\end{options}
+  
+Let's look at an example. This manual declares these two acronyms with the tag
+\code{city}:
+\begin{sourcecode}
+  \DeclareAcronym{la}{
+    short = LA ,
+    long = Los Angeles,
+    plural = ,
+    tag = city
+  }
+  \DeclareAcronym{ny}{
+    short = NY ,
+    long = New York ,
+    plural = ,
+    tag = city
+  }
+\end{sourcecode}
+We can now use this to either print a list \emph{without} these acronyms by
+saying
+\begin{sourcecode}
+  \printacronyms[exclude=city]
+\end{sourcecode}
+or print a list \emph{with only} these acronyms with
 \begin{example}
-  % preamble:
-  % \DeclareAcronym{ufo}{
-  %   short           = UFO ,
-  %   long            = unidentified flying object ,
-  %   long-indefinite = an
-  % }
-  \Iac{ufo}; \iacs{ufo}; \iacl{ufo}
+  \printacronyms[include=city,heading=none]
 \end{example}
+\begin{bewareofthedog}
+  If you use both \option{exclude} and \option{include} and list a tag in both
+  \option{exclude} takes precedence over \option{include}.
+  \begin{sourcecode}
+  \printacronyms[exclude={a,b},include={b,c}]
+  \end{sourcecode}
+  would only print acronyms with tag \code{c}.
+\end{bewareofthedog}
 
-\subsection{Uppercasing}
+\subsection{Local lists}\label{sec:local-lists}
+Maybe you like a list of acronyms for each chapter in a book which only lists
+the acronyms used within this chapter.  You need to do three things: set
+\begin{options}
+  \keybool{use}\Module{barriers}\Default{false}
+    this option to \code{true}, place
+\end{options}
 \begin{commands}
-  \command{acfirstupper}[\marg{token list}]
-     This command uppercases the first token in \meta{token list}.  The
-     command is less powerful than \cs{makefirstuc} that is provided by the
-     \pkg{mfirstuc} package~\cite{pkg:mfirstuc} but it is expandable.  Obvious
-     downsides are for example that it does not uppercase accented letters.
+  \command{acbarrier}
+    before a new chapter starts (this is not necessary for the first chapter),
+    and use \cs{printacronyms} with the option
 \end{commands}
-The following options control the behaviour of the uppercasing commands:
 \begin{options}
-  \keyval{uc-cmd}{control sequence}\Default{\cs{acfirstupper}}
-    The command that is used to capitalize the first word in the \cs{Ac} and
-    the like commands.  You can change it to another one like for example
-    \cs*{makefirstuc}\footnote{from the \pkg{mfirstuc} package} or
-    \cs*{MakeTextUppercase}\footnote{from the \pkg*{textcase} package}.
-  %%
-  \keybool{uppercase-short}\Default{true}
-    If\sinceversion{2.10} set to \code{true} commands like \cs{Ac} or \cs{Acp}
-    will uppercase the first letter of the short form.  Commands like \cs{Acs}
-    or \cs{Acsp} will uppercase the short form in any case.
+  \keybool{local}\Module{list}\Default{false}
+    or set this option once in the preamble with \cs{acsetup} so it is applied
+    to every list.
 \end{options}
+Please read more on barriers in section~\vref{sec:barriers}.
+\begin{bewareofthedog}
+  Please don't use page numbers together with local lists for the time being.
+  If an acronym appears in more than one list both lists would contain the
+  \emph{same} page numbers anstead of only the ones local to barriers.
 
-\subsection{Simulating the First Appearance}\label{sec:simul-first-appe}
-Users told me\footnote{Well -- one, to be precise ;)} that there are cases
-when it might be useful to have the the acronym typeset according to the
-\option{first-style} option (or \property{first-style} property) but with
-another text than the long form.  For such cases \acro\ offers the following
-commands.
-\begin{commands}
-  \command{acflike}[\sarg\marg{id}\marg{instead of long form}]
-    Write some alternative long form for acronym with \acs{id} \meta{id} as if
-    it were the first time the acronym was used.
-  \command{acfplike}[\sarg\marg{id}\marg{instead of long form}]
-    Plural form of \cs{acflike}.
-\end{commands}
+  For the similar reasons please also don't use \option{make-links} together
+  with local lists.
 
-\begin{example}[side-by-side]
-  \acsetup{first-style=footnote}
-  \acflike{ny}{the big apple}
-\end{example}
+  This \emph{might} be resolved on day.
+\end{bewareofthedog}
 
-The plural ending in \cs{acfplike} is only appended to the short form.  It
-makes no sense to append it to the text that is inserted manually anyway.
-Note that whatever text you're inserting might be gobbled depending on the
-\option{first-style} you're using.
+\section{Formatting}\label{sec:formatting}
+\acro\ has a number of options and parameters which can be used to influence
+the formatting of acronyms.
+\begin{options}
+  \keyval{format}{code}\Default
+    Sets the format for both the short and the long form.
+  \keyval{short}{code}\Module{format}\Default
+    Sets the format for the short form.
+  \keyval{long}{code}\Module{format}\Default
+    Sets the format for the long form.
+  \keyval{first-long}{code}\Module{format}\Default
+    Sets the format for the first appearance of the long form.
+  \keyval{alt}{code}\Module{format}\Default
+    Sets the format for the alternative form.
+  \keyval{extra}{code}\Module{format}\Default
+    Sets the format for the extra information.
+  \keyval{foreign}{code}\Module{format}\Default
+    Sets the format for the foreign form.
+  \keyval{list}{code}\Module{format}\Default
+    Sets the format for the long form in the list form.
+\end{options}
+While this options influence the formatting of the acronyms globally you can
+also give each acronym its own formatting individually:
+\begin{properties}
+  \propval{format}{code}\Default
+    The format used for both short and long form of the acronym.
+  %% short-format
+  \propval{short-format}{code}\Default={format}
+    The format used for the short form of the acronym.
+  %% long-format
+  \propval{long-format}{code}\Default={format}
+    The format used for the long form of the acronym.
+  %% first-long-format
+  \propval{first-long-format}{code}\Default={long-format}
+    The format used for the first appearance of the long form of the acronym.
+  %% alt-format
+  \propval{alt-format}{code}\Default={short-format}
+    The format used for the alternative form of the acronym. If this is not
+    given the short format will be used.
+  %% extra-format
+  \propval{extra-format}{code}\Default
+    The format used for the additional information of the acronym.
+  %% foreign-format
+  \propval{foreign-format}{code}\Default
+    The format used for the foreign form of the acronym.
+  %% single-format
+  \propval{single-format}{code}\Default={long-format}
+    The format used for the acronym if the acronym is only used a single
+    time.
+  %% list-format
+  \propval{list-format}{code}\Default={long-format}
+    The format used for the long form of the acronym in the list if the list
+    template supports it. All pre-defined list templates \emph{do} support
+    it.
+  %% first-style
+  \propchoice{first-style}{long-short,short-long,short,long,footnote}\Default
+    The style of the first appearance of the acronym, see also
+    section~\vref{sec:first-or-full}.
+  %% single-style
+  \propchoice{single-style}{long-short,short-long,short,long,footnote}\Default
+    The style of a single appearance of the acronym, see also
+    section~\vref{sec:single-appe-an}.
+\end{properties}
+Per default the individual formatting instructions are \emph{additive} to the
+global ones.  This can be changed through the option
+\begin{options}
+  \keybool{replace}\Module{format}\Default{false}
+    With this option active local options will \emph{replace} the global ones.
+\end{options}
 
-\subsection{Fetching the Single Appearance}
-There\sinceversion{2.3} are macros that fetch the \emph{single} appearance of
-an acronym even if it has been used more than once and the \option{single}
-option is active.
-\begin{commands}
-  \command{acsingle}[\sarg\marg{id}]
-    Write acronym as if it were used only a single time.
-  \command{Acsingle}[\sarg\marg{id}]
-    Uppercase form of \cs{acsingle}.
-  \command{acpsingle}[\sarg\marg{id}]
-    Plural\sinceversion{2.11} form of \cs{acsingle}.
-  \command{Acsingle}[\sarg\marg{id}]
-    Plural\sinceversion{2.11} form of \cs{Acsingle}.
-\end{commands}
-
-\begin{example}[side-by-side]
-  \acsingle{ny}
+Let's see an example:
+\begin{sourcecode}
+  \DeclareAcronym{pdf}{
+    short = pdf ,
+    long = Portable Document Format ,
+    short-format = \scshape
+  }
+\end{sourcecode}
+\begin{example}
+  \acsetup{format = \itshape}
+  \acf{pdf} \par
+  \acsetup{format/replace=true}
+  \acf{pdf}
 \end{example}
 
-\subsection{Using Classes}
-The acronyms of \acro\ can be divided into different classes.  This doesn't
-change the output but allows different acronym lists, see
-section~\vref{sec:print_lists}.  For this \cs{DeclareAcronym} has an additional
-key:
+\section{Plural forms and other endings}\label{sec:plural-forms-other}
+\subsection{The plural ending and the plural form}\label{sec:plural-ending-form}
+Not in all languages plural forms are as easy as always appending an
+\enquote{s}.  Not even English.  Sometimes there's other endings
+instead\footnote{German is full of such examples.}.  This is why \acro\ has
+quite a number of different properties related to plural forms or endings:
 \begin{properties}
-  \propval{class}{csv list}
-    Associated\changedversion{2.4} class(es) for an acronym.
+  %% short-plural
+  \propval{short-plural}{text}\Default{s}
+    The plural ending appended to the short form.
+  %% short-plural-form
+  \propval{short-plural-form}{text}\Default
+    The plural short form of the acronym; replaces the short form when used
+    instead of appending the plural ending.
+  %% long-plural
+  \propval{long-plural}{text}\Default{s}
+    The plural ending appended to the long form.
+  %% long-plural-form
+  \propval{long-plural-form}{text}\Default
+    Plural long form of the acronym; replaces the long form when used
+    instead of appending the plural ending.
+   %% alt-plural
+  \propval{alt-plural}{text}\Default{s}
+    The plural ending appended to the alternative form.
+  %% alt-plural-form
+  \propval{alt-plural-form}{text}\Default
+    The plural alternative form of the acronym; replaces the alternative form
+    when used instead of appending the plural ending.
+  %% foreign-plural
+  \propval{foreign-plural}{text}\Default{s}
+    The plural ending appended to the foreign form.
+  %% foreign-plural-form
+  \propval{foreign-plural-form}{text}\Default
+    Plural foreign form of the acronym; replaces the foreign form when used
+    instead of appending the plural ending.  
 \end{properties}
-
-This might be useful if you can and want to divide your acronyms into
-different types, technical and grammatical ones, say, that shall be listed in
-different lists.  Since every acronym can get a list of associated classes
-those classes can effectively be used like tags for filtering acronyms.
-
+There are two options which allow to change the default values for the whole
+document:
+\begin{options}
+  \keyval{short-plural-ending}{text}\Default{s}
+    Defines the plural ending for the short forms to be \meta{text}.
+  \keyval{long-plural-ending}{text}\Default{s}
+    Defines the plural ending for the long forms to be \meta{text}.
+\end{options}
+Now let's see two simple examples demonstrating the two different kinds of plural
+settings:
+\begin{sourcecode}
+  \DeclareAcronym{sw}{
+    short = SW ,
+    long = Sammelwerk ,
+    long-plural = e
+  }
+  \DeclareAcronym{MP}{
+    short = MP ,
+    long  = Member of Parliament ,
+    plural-form = Members of Parliament
+  }
+\end{sourcecode}
+The first one has another plural ending than the usual \enquote{s}. The second
+one has a different plural form altogether because appending an \enquote{s}
+would give a wrong form:
 \begin{example}[side-by-side]
-  % preamble:
-  % \DeclareAcronym{la}{
-  %   short        = LA ,
-  %   short-plural = ,
-  %   long         = Los Angeles ,
-  %   long-plural  = ,
-  %   class        = city
-  % }
-  % \DeclareAcronym{ny}{
-  %   short        = NY ,
-  %   short-plural = ,
-  %   long         = New York ,
-  %   long-plural  = ,
-  %   class        = city ,
-  %   cite         = NewYork
-  % }
-  \acl{la} (\acs{la}) \\
-  \acl{ny} (\acs{ny})
+  \acfp{sw} \par
+  \acfp{MP}
 \end{example}
 
-\subsection{Reset or Mark as Used, Test if Acronym Has Been Used}
+\subsection{Other endings}\label{sec:other-endings}
+Besides plural endings there are other ones like the genitive case, for
+example.  This is why \acro\ generalized the concept.
+Section~\vref{sec:endings} explains in detail how to define and use additional
+endings.
 
-If you want for some reason to fool \acro\ into thinking that an acronym is
-used for the first time you can call one of these commands:
-\begin{commands}
-  \command{acreset}[\marg{comma separated list of ids}]
-    This will reset a used acronym such that the next use of \cs{ac} will
-    again print it as if it were used the first time.  This will \emph{not}
-    remove an acronym from being printed in the list if it actually \emph{has}
-    been used before.
-  \command{acresetall}
-    Reset all acronyms.
-  \command{acifused}[\marg{id}\marg{true}\marg{false}]
-    This command tests if the acronym with \ac{id} \meta{id} has already been
-    used and either puts \code{true} or \code{false} in the input stream.
-  \command{aciffirst}[\marg{true}\marg{false}]
-    To\sinceversion{2.8} be used inside of acronym definitions in order to
-    test if we are inside the first instance of the acronym or not.
-\end{commands}
+\section{Articles}
+\subsection{Indefinite forms}\label{sec:indefinite-forms}
+Indefinite forms can be a problem if the short and the long form of acronyms
+have different indefinite articles\footnote{This may very well be a language
+  specific issue.}.
 \begin{example}[side-by-side]
-  \acreset{ny}\ac{ny}
+  \acreset{ufo}%
+  a \ac{ufo} \par
+  an \ac{ufo}
 \end{example}
-Beware that both commands act \emph{globally}!  There are also commands that
-effectively do the opposite of \cs{acreset}, \latin{i.e.}, mark acronyms as
-used:
-\begin{commands}
-  \command{acuse}[\marg{comma separated list of ids}]
-    This has the same effect as if an acronym had been used twice, that is,
-    further uses of \cs{ac} will print the short form and the acronym will in
-    any case be printed in the list (as long as its class is not excluded).
-  \command{acuseall}
-    Mark all acronyms as used.
-\end{commands}
-Then there are two further commands related to using acronyms:
-\begin{commands}
-  \command{acswitchoff}
-    This\sinceversion{2.6} command is for patching in certain situations.  For
-    example some table environments like \env*{tabularx} or \env*{tabu} pass
-    their content two or more times for determining the width of the table
-    columns.  Those can be patched to add \cs{acswitchoff} to their trial
-    phase.
-  \command{acswitchon}
-    Effectively\sinceversion{2.6} the opposite of \cs{acswitchoff} -- this
-    command should probably never be needed.
-\end{commands}
+And what good would it be to use a package like \acro\ if you have to keep
+track of of and second uses, anyway?  This is why \acs{ufo} should be defined
+like we did on page~\pageref{ufo}.  We then can just use the dedicated
+commands and let them decide for us:
+\begin{example}[side-by-side]
+  \acreset{ufo}%
+  \iac{ufo} \par
+  \iac{ufo}
+\end{example}
+The commands which also output the indefinite article all start with an
+\enquote{i} and have all been described in section~\vref{sec:using-acronyms}
+already: \cs{iac}, \cs{Iac}, \cs{iacs}, \cs{Iacs}, \cs{iacl}, \cs{Iacl},
+\cs{iaca}, \cs{Iaca}, \cs{iacf}, and \cs{Iacf}.
 
-\subsection{\cs*{ac} and Friends in \acs*{pdf} Bookmarks, Accessibility
-  Support, Tooltips}
-\subsubsection{\acs*{pdf} Bookmarks}
-\acro's commands usually are not expandable which means they'd leave unallowed
-tokens in \acs{pdf} bookmarks.  \pkg{hyperref} offers \cs*{texorpdfstring} to
-circumvent that issue manually but that isn't really a nice solution.  What's
-the point of having macros to get output for you if you have to specify it
-manually after all?
+\subsection{Other articles}\label{sec:other-articles}
+There might be cases -- most likely depending on your language -- when you
+would like to have other articles behaving similar to the indefinite ones.
+Section~\ref{sec:articles} explains in detail how to define and use additional
+articles.
 
-That is why \acro\ offers a preliminary solution for this.  In a bookmark
-every \cs{ac} like command falls back to a simple text string typesetting what
-\cs{acs} would do (or \cs{acsp} for plural forms).  These text strings both
-can accessed manually and can be modified to an output reserved for \acs{pdf}
-bookmarks.
-
-\begin{commands}
-  \command{acpdfstring}[\marg{id}]
-    Access the text string used in \acs{pdf} bookmarks.
-  \command{acpdfstringplural}[\marg{id}]
-    Access the plural form of the text string used in \acs{pdf} bookmarks.
-\end{commands}
+\section{Foreign language acronyms}\label{sec:fore-lang-acronyms}
+Sometimes and in some fields more often than in others abbreviations are used
+that are derived from another language.  \acro\ provides a number of
+properties for such cases:
 \begin{properties}
-  \proplit-{pdfstring}{\Marg{\meta{pdfstring}/\meta{plural ending}}}
-    Key for \cs{DeclareAcronym} to declare a custom text string for \acs{pdf}
-    bookmarks.  The plural ending can be set optionally.
+  %% foreign
+  \propval{foreign}{long form in foreign language}\Default
+    Can be useful when dealing with acronyms in foreign languages, see
+    section~\vref{sec:fore-lang-acronyms} for details.
+  %% foreign-plural
+  \propval{foreign-plural}{text}\Default{s}
+    The plural ending appended to the foreign form.
+  %% foreign-plural-form
+  \propval{foreign-plural-form}{text}\Default
+    Plural foreign form of the acronym; replaces the foreign form when used
+    instead of appending the plural ending.
+  %% foreign-format
+  \propval{foreign-format}{code}\Default
+    The format used for the foreign form of the acronym.
+  %% foreign-babel
+  \propval{foreign-babel}{language}\Default
+    The \pkg{babel} or \pkg{polyglossia} language of the foreign form. This
+    language is used to wrap the entry with
+    \cs*{foreignlanguage}\marg{language} if either \pkg{babel} or
+    \pkg{polyglossia} is loaded.  You'll need to take care that the
+    corresponding language is loaded by \pkg{babel} or \pkg{polyglossia}.
+  %% foreign-locale
+  \propval{foreign-locale}{language}\Default
+    The language name that is output when the option
+    \module{locale}\code{/}\option{display} is used.  If this property is not
+    set then the appropriate value might be derived from
+    \property{foreign-babel}.
 \end{properties}
+There are also some options:
+\begin{options}
+  \keybool{display}\Module{locale}\Default{false}
+    This options determines wether the language of the foreign form is printed
+    or not when the full form of the acronym is printed.
+  \keybool{display}\Module{list,locale}\Default{false}
+    The same but for the list of acronyms.
+  \keyval{format}{code}\Module{locale}\Default{\cs*{em}\cs*{text\_titlecase\_first:n}}
+    Determines how said language is formatted when printed.  The last command
+    in \meta{code} may take a mandatory argument.
+\end{options}
 
-For example the \acs{pdf} acronym used in the title for this section is defined
-as follows:
+Let's say you are writing a German document and are using the abbreviation
+\acs*{ecu} for \acl*{ecu} which stems from the English \enquote{Electronic
+  Control Unit}.  Then you can define it as follows:
 \begin{sourcecode}
-  \DeclareAcronym{pdf}{
-    short     = pdf ,
-    long      = Portable Document Format ,
-    format    = \scshape ,
-    pdfstring = PDF ,
-    accsupp   = PDF
+  \DeclareAcronym{ecu}{
+    short   = ECU ,
+    long    = Steuergerät ,
+    foreign = Electronic Control Unit ,
+    foreign-babel = english ,
+    foreign-locale = englisch
   }
 \end{sourcecode}
+Now the abbreviation is introduced so that everyone understands the confusion:
+\begin{example}
+  \ac{ecu} \par
+  \acsetup{locale/display,locale/format=\emph}
+  \acf{ecu}
+\end{example}
 
-\subsubsection{Accessibility Support}
+The property \property{foreign-babel} is used for ensuring correct hyphenation
+as long as you use \pkg{babel} or \pkg{polyglossia} and load the corresponding
+language, too.  If you are writing your document in English then \acro\ is
+able to deduce the language used for the \enquote{locale} field by itself:
+\begin{sourcecode}
+  \DeclareAcronym{eg}{
+    short = e.g\acdot ,
+    long  = for example ,
+    foreign = exempli gratia ,
+    foreign-babel  = latin ,
+    short-format = \textit ,
+    foreign-format = \textit
+  }
+\end{sourcecode}
+\begin{example}
+  \acsetup{locale/display,first-style=short-long}
+  \acf{eg}
+\end{example}
 
-The last example also demonstrates the \property{accsupp} key.  The idea is to
-have something different visible in the \acs{pdf} file compared to what you
-get when you select and copy the corresponding string.  In the example visible
-string is a lowercase \code{pdf} in small caps while the string copied is an
-uppercase \code{PDF}.
+\section{Uppercasing}\label{sec:uppercasing}
 
-For this to work you need to use the \emph{package option} \option{accsupp},
-too, which will load the package \pkg{accsupp} if it isn't loaded by the user
-already.  Then the key \property{accsupp} will set the \code{ActualText}
-property of \cs*{BeginAccSupp}.  Please refer to \pkg{accsupp}'s documentation
-for details.  To see its effect copy \ac{pdf} and paste it into a text file.
-You should get uppercase letters instead of lowercase ones.
+Depending on the kind of abbreviations you have and depending on their
+definition and maybe also depending on your language the long and sometimes
+also the short forms need to start with an uppercase letter at the beginning
+of a sentence while it starts with a lowercase letter otherwise.
 
-\begin{properties}
-  \propval{accsupp}{text}
-    Key for \cs{DeclareAcronym} to set the \code{ActualText} property of
-    \cs*{BeginAccSupp} (see \pkg{accsupp}'s documentation for details) to be
-    used for an acronym.  It only has an effect when the package option
-    \option{accsupp} is used, too.
-\end{properties}
+For this \acro\ provides uppercase versions for all predefined acronym
+commands listed in section~\ref{sec:using-acronyms}.  The usage is
+self-explaining:
+\begin{example}
+  There was \iacl{ufo} hovering \dots \par
+  \Aclp{ufo} were hovering \dots
+\end{example}
+If you defined them with uppercase letters to begin with then these commands
+have no effect, of course.
+\begin{sourcecode}
+  \DeclareAcronym{ufo}{
+    short = UFO ,
+    long = Unidentified Flying Object
+  }
+\end{sourcecode}
+
+There are a number of options to control the uppercasing behavior:
 \begin{options}
-  \keybool{accsupp}\Default{false}
-    Activate \acro's accessibility support.
+  \opt{first}\Module{uppercase}
+    The default setting. Converts the first letter to uppercase.
+  \opt{title}\Module{uppercase}
+    This is just a synonym of \option{first}.
+  \opt{all}\Module{uppercase}
+    Converts \emph{all} letters to uppercase.
+  \opt{none}\Module{uppercase}
+    Converts \emph{all} letters to \emph{lowercase}
+  \keyval{cmd}{command}\Module{uppercase}
+    All of the above options just choose the right command using this option
+    internally. This means you can choose a different behavior altogether by
+    setting this option to something else.  For example you could use
+    \cs*{capitalisewords} from the package
+    \pkg{mfirstuc}~\cite{pkg:mfirstuc}. The command needs to have one
+    mandatory argument.
 \end{options}
 
-\subsubsection{Tooltips}
+There may be reasons to exclude short forms from being uppercased.  This can
+be controlled by this option:
+\begin{options}
+  \keybool{short}\Module{uppercase}\Default{true}
+    It allows you to disable the mechanism for the \property{short} and
+    \property{alt} properties.
+\end{options}
 
-The idea of a tooltip is to have some text shown when you hover with the
-mouse over the short form of an acronym.  This is only available in some
-\acs{pdf} viewers, though.  On possibility for such tooltips is loading the
-\pkg{pdfcomment} package~\cite{pkg:pdfcomment} and using its \cs*{pdftooltip}
-macro.
+\section{Citing and indexing}\label{sec:citing-indexing}
+\subsection{Citing}\label{sec:citing}
+Acronyms can be given cite keys.  This makes it possible to add a citation
+reference automatically when the acronym is used for the first time.
 
+Let's see an example first. \acs*{ny} has been defined like this:
+\begin{sourcecode}
+  \DeclareAcronym{ny}{
+    short = NY ,
+    long = New York ,
+    plural = ,
+    tag = city ,
+    cite = NewYork
+  }
+\end{sourcecode}
+The property \property{cite} will now trigger \acro\ to input
+\verbcode+\cite{NewYork}+ after the acronym:
+\begin{example}[side-by-side]
+  \ac{ny}
+\end{example}
+Depending on the citation style (and probably other factors, too) it might be
+desirable to add the citation rather inside the parentheses together with the
+short form of the acronym and even cited with a different command.  For cases
+like these \acro\ offers a number of options:\acuse{ny}
 \begin{options}
-  \keybool{tooltip}\Default{false}
-    This\sinceversion{2.1} options loads the \pkg{pdfcomment} package and sets
-    the command for creating tooltips to \cs*{pdftooltip}.
-  \keyval{tooltip-cmd}{control sequence}\Default{\cs*{@firstoftwo}}
-    This\sinceversion{2.1} allows users using another macro for tooltips --
-    maybe one provided by another package or some own macro.  It needs to be a
-    macro with two mandatory arguments, the first being the string typeset in
-    the \acs{pdf}, the second being the tooltip description text.
+  \keyval{cmd}{citation command}\Module{cite}\Default{\cs*{cite}}
+    Choose the command with which citations ar printed.
+  \keybool{group}\Module{cite}\Default{false}
+    Decide wether to group citations with the short form in the parentheses.
+    The template must support this.  \acro's pre-defined templates \emph{do}
+    support it.
+  \keychoice{display}{first,all,none}\Module{cite}\Default{first}
+    Decide wether to output the citation in the first/full usage only or
+    always or never.
+  \keyval{pre}{text}\Module{cite}\Default{\cs*{nobreakspace}}
+    Arbitrary code directly output before the citation.
+  \keyval{cmd}{citation command}\Module{cite,group}\Default{\cs*{cite}}
+    Choose the command with which grouped citations are printed.
+  \keyval{pre}{text}\Module{cite,group}\Default{,\textvisiblespace}
+    Arbitrary code directly output before the citation in the grouped case.
 \end{options}
 
-For using this with acronyms they have a property \property{tooltip} which can
-be used inside \cs{DeclareAcronym} for specifying the description text of the
-tooltip.  If the \option{tooltip} package option is used but the property is
-not set for an acronym then the \property{long} property is used instead.
+If for example you use \pkg{biblatex}'s \code{authoryear}
+style~\cite{pkg:biblatex} you might want to have settings like these:
+\begin{sourcecode}
+  \acsetup{
+    cite/group = true ,
+    cite/cmd = \parencite ,
+    cite/group/cmd = \cite
+  }
+\end{sourcecode}
+\begin{cnltxcode}
+\begin{lstlisting}[style=cnltx]
+  \acsetup{cite/display = all}
+  \acf{ny} \\
+  \ac{ny}
+\end{lstlisting}
+\tcblower
+  New York (NY, Wikipedia 2020) \\
+  NY (Wikipedia 2020)
+\end{cnltxcode}
 
-If an acronym is used inside of another acronym then the tooltips of the
-``inner'' acronyms are disabled.
+\subsection{Indexing}\label{sec:indexing}
+Maybe you want to add your acronyms to an index. In that case it is probably
+desirable to let \acro\ make this automatically.  In the simplest case just
+enable it:
+\begin{options}
+  \keybool{use}\Module{index}\Default{false}
+    Enable indexing.
+  \keyval{cmd}{index command}\Module{index}\Default{\cs*{index}}
+    Choose a command for indexing.
+  \keyval{disable}{code}\Module{index}\Default{\cs*{def}\cs*{@}\{\}}
+    Sometimes it is desirable to change the meaning of a command inside an
+    index entry.  For the entries created by \acro\ this can be achieved with
+    this option.
+  \opt{clear}\Module{index}
+    This option clears the disable list.
+\end{options}
+While these options set global behavior there are also properties to set them
+for an acronym individually.
+\begin{properties}
+  %% index
+  \propval{index}{text}\Default
+    This property allows to overwrite the automatic index entry with an
+    arbitrary one.
+  %% index-sort
+  \propval{index-sort}{text}\Default={sort}
+    If you use the option \option{index} every occurrence of an acronym is
+    recorded to the index and sorted by its short form or (if set) by the
+    value of the \property{sort} property.  This property allows to set an
+    individual sorting option for the index.
+  %% no-index
+  \propbool{no-index}\Default{true}
+    This property allows to exclude an acronym from being indexed.
+\end{properties}
+This manual is an example for the indexing feature.  Each acronym from
+section~\vref{sec:acronyms} that has been used in this manual is also listed
+in the manual.
 
-\subsection{Adding Acronyms to the Index}\label{ssec:index}
-\acro\ has the package option \option{index}.  If it is used an index entry
-will be recorded every time an \emph{unstarred} acronym command is used.  The
-index entry will be \code{\meta{id}@\meta{short}},
-\code{\meta{sort}@\meta{short}} if the \property{sort} property has been set,
-\code{\meta{index-sort}@\meta{short}} if the property \property{index-sort}
-has been set, or \meta{index} if the property \property{index} has been set
-for the specific acronym.  The short versions appearing there are formatted
-according to the chosen format of the corresponding acronym, of course.
-
-This document demonstrates the feature.  You can find every acronym that has
-been declared in the index.  In order to allow flexibility the indexing
-command can be chosen both globally via package option and individually for
-every acronym.  This would allow to add acronyms to a specific index if more
-than one index is used, for example with help of the \pkg*{imakeidx} package.
-
-I'm not yet convinced this is a feature many people if anyone needs and if
-they do if it is flexible enough.  If you have any thoughts on this I'd
-appreciate an email.
-
-\section{Printing the List}\label{sec:print_lists}
-Printing the whole list of acronyms is easy: just place \cs{printacronyms}
-where ever you want the list to be.
-\begin{commands}
-  \command{printacronyms}[\oarg{options}]
-    Print the list of acronyms.
-\end{commands}
-The commands takes a few options, namely the following ones:
+\section{Barriers}\label{sec:barriers}
+The main purpose of the concept of barriers is to be able to have \emph{local}
+lists of acronyms.  This concept does a little bit more than that, though,
+which should become clear from the following options:
 \begin{options}
-  \keyval{include-classes}{list of classes}
-    Takes a comma-separated list of the classes of acronyms that should be in
-    the list.
-  \keyval{exclude-classes}{list of classes}
-    Takes a comma-separated list of the classes of acronyms that should
-    \emph{not} be in the list.  \emph{Note that this list overwrites any
-      entries in \option{include-classes}!} If a class is both included and
-    excluded then the corresponding acronyms will not be added to the list.
-  \keyval{name}{name of the list}
-    sets the name for the list.
-  \keyval{heading}{sectioning command without leading backslash}%
-    \Default{section*}
-    Sets the sectioning command for the heading of the list.  A special value
-    is \code{none} which suppresses the heading. 
-  \keybool{sort}\Default{true}
-    Set sorting for this list only.
-  \keybool{local-to-barriers}\Default{false}
-    This\sinceversion{2.4} option can be used to create a list of only the
-    acronyms of the current \enquote{barrier group}, see
-    section~\ref{sec:divid-your-docum}.
+  \keybool{use}\Module{barriers}\Default{false}
+    Activate usage of barriers.  Otherwise the command \cs{acbarrier} just
+    does nothing except writing a warning in the log.
+  \keybool{reset}\Module{barriers}\Default{false}
+    When set to \code{true} the acronym usage is reset for all acronyms at a
+    barrier.  The first use of \cs{ac} after a barrier will again look like
+    the \cs{acf}.
+  \keybool{single}\Module{barriers}\Default{false}
+    When set to \code{true} a single usage of an acronym between two barriers
+    with \cs{ac} will look according to the chosen style as explained in
+    section~\vref{sec:single-appe-an}.  This option only has an effect when
+    the option \option{single} is used as well.
 \end{options}
-\begin{example}
-  \acsetup{extra-style=comma}
-  \printacronyms[exclude-classes=city]
- 
-  \printacronyms[include-classes=city,name={City Acronyms}]
-\end{example}
 
-You can see that the default layout is a \code{description} list with a
-\cs*{section}\sarg\ title.  Both can be changed, see
-section~\vref{sec:customization}.
-
-The command \cs{printacronyms} needs two \LaTeX{} runs.  This is a precaution
-to avoid error messages with a possibly empty list.  But since almost all
-documents need at least two runs and often are compiled much more often than
-that, this fact shouldn't cause too much inconvenience.
-
-\section{Options and Customization}\label{sec:customization}
-\subsection{General Options}
-There are a few options which change the general behaviour of \acro.
-\default{Underlined} values are used if no value is given. \acro's package
-options are best set onyl via the setup command:
+There are two natural barriers in a document: \beginenv*\Marg{document} and
+\endenv*\Marg{document}. You can add an arbitrary number of additional
+barriers with
 \begin{commands}
-  \command{acsetup}[\marg{options}]
-    Set up \acro.
+  \command{acbarrier}
+    For this command to have any effect you must set
+    \module{barriers}\code{/}\option{single} to \code{true}!
 \end{commands}
 \begin{bewareofthedog}
-  They \emph{might} work as package options to \cs*{usepackage} as well but
-  \emph{I do not recommend it} and will likely remove this in a future
-  version~3 of \acro.
+  It takes usually two or even three \LaTeX\ runs until acronym usages
+  between barriers are properly counted.
 \end{bewareofthedog}
 
-\begin{options}
-  \keychoice{messages}{silent,loud}\Default{loud}
-    Setting \keyis{messages}{silent} will turn all of \acro's error messages
-    into warnings and all of \acro's warnings into info messages.  Be sure to
-    check the log file carefully if you decide to set this option.
-  %%
-  \keybool{single}\Default{false}
-    If set to \code{true} an acronym that's used only once (with \cs{ac}) in a
-    document will only print the acronym in a specified form and will not be
-    printed in the list.
-  %%
-  \keybool{case-sensitive}\Default{true}
-    If\sinceversion{2.11} set to \code{true} the \meta{id} as used in
-    \cs{DeclareAcronym} or \cs{ac} is read \emph{case sensitive},
-    \latin{i.e.}, \code{id} would differ from \code{ID}.  This is \acro's
-    default behaviour.
+\section{Trailing tokens}\label{sec:trailing-tokens}
+\subsection{What is it about?}
+\acro\ has the possibility to look ahead for certain tokens and switch a
+boolean variable if it finds them.  Per default \acro\ knows about three
+tokens: the \enquote{\code{dot}} (\sym{.}), the \enquote{\code{dash}}
+(\sym{-}) and the \enquote{\code{babel-hyphen}} (\cs*{babelhyphen}).
 
-    If set to \code{true} \code{id} would be the same as \code{ID}.  This can
-    be useful when acronyms are used in page headings for example.
-  %%
-  \keychoice{single-form}{long,short,alt,first}\Default{long}
-    \sinceversion{2.0}Determines how a single appearance of an acronym is
-    printed if \keyis{single}{true} has been chosen.
-  %%
-  \keybool{hyperref}\Default{false}
-    If set to \code{true} the short forms of the acronyms will be linked to
-    their list entry.
-  %%
-  \keybool{label}\Default{false}
-    If set to \code{true} this option will place
-    \cs*{label}\Marg{\meta{prefix}\meta{id}} the first time the acronym with
-    \ac{id} \meta{id} is used. 
-  %%
-  \keyval{label-prefix}{text}\Default{ac:}
-    The prefix for the \cs*{label} that is placed when option
-    \keyis{label}{true} is used.
-  %%
-  \keybool{only-used}\Default{true}
-    This option is \code{true} as default.  It means that only acronyms that
-    are actually used in the document are printed in the list.  If
-    \code{false}, all acronyms defined with \cs{DeclareAcronym} will be
-    written to the list.
-  %%
-  \keychoice{mark-as-used}{first,any}\Default{any}
-    This option determines wether an acronym is mark as used when the
-    \emph{first} form is used the first time (with \cs{ac}, \cs{acf} or
-    \cs{acflike} and their uppercase, plural and indefinite forms) or when any
-    of the \cs{ac}-like commands is used.   
-  %%
-  \keybool{macros}\Default{false}
-    If set to \code{true} this option will create a macro \cs*{\meta{id}} for
-    each acronym as a shortcut for \cs{ac}\marg{id}.  Already existing macros
-    will \emph{not} be overwritten.
-  %%
-  \keybool{xspace}\Default{false}
-    If set to \code{true} this option will append \cs*{xspace} from the
-    \pkg*{xspace} package to the commands created with the \option{macros}
-    option.
-  %%
-  \keybool{strict}\Default{false}
-    If set to \code{true} and the option \keyis{macros}{true} is in effect
-    then already existing macros will be overwritten.
-  %%
-  \keybool{sort}\Default{true}
-    If set to \code{true} the acronym list will be sorted alphabetically.  The
-    entries are sorted by their \acs{id} ignoring upper and lower case.  This
-    option needs the experimental package \pkg{l3sort} (from the
-    \pkg{l3experimental} bundle) and can only be set in the preamble.
-    If set to \code{false} the acronyms are listed in order of their
-    declaration.
-  %%
-  \keybool{display-foreign}\Default{true}
-    When set to \code{false} any \property{foreign} property is ignored and
-    foreign forms are not displayed.
-  %%
-  \keychoice{cite}{\default{all},first,none}\Default{first}
-    \changedversion{2.4b}This option decides whether citations that are added
-    via \property{cite} are added to each first, every or no appearance of an
-    acronym.  If \code{first} is chosen, the option \keyis{single}{true} is
-    active and an acronym appears only once it still will get the citation.
-  %%
-  \keyval{cite-cmd}{control sequence}\Default{\cs*{cite}}
-    This option determines which command is used for the citation.  Each
-    citation command that takes the cite key as argument is valid, for example
-    \pkg*{biblatex}'s \cs*{footcite}.
-  %%
-  \keyval{cite-connect}{code}\Default{\cs*{nobreakspace}}
-    Depending on the citation command in use a space should be inserted before
-    the citation or maybe not (e.g.\ \cs*{footcite}\ldots).  This option
-    allows you to set this.  Actually it can be used to place arbitrary code
-    right before the citation.
-  %%
-  \keybool{group-citation}\Default{false}
-    \sinceversion{2.0}If set to true the short form (or the long form) and the
-    citation of an acronym will be printed together in parentheses when an
-    acronym is used the first time.
-  %%
-  \keyval{group-cite-cmd}{control sequence}\Default{\cs*{cite}}
-    \sinceversion{2.0}This option determines which command is used for the
-    citation when an acronym is used the first time \emph{and}
-    \keyis{group-citation}{true}.  Each citation command that takes the cite
-    key as argument is valid, for example \pkg*{biblatex}'s \cs*{footcite}.
-  %%
-  \keyval{group-cite-connect}{code}\Default{\code{,\cs*{nobreakspace}}}
-    \sinceversion{2.0}When \keyis{group-citation}{true} this is inserted
-    between the long/short form of the acronym and the citation within the
-    parentheses.
-  %%
-  \keybool{index}\Default{false}
-    If set to \code{true} an index entry will be recorded every time an
-    \emph{unstarred} acronym command is used for the corresponding acronym.
-  %%
-  \keyval{index-cmd}{control sequence}\Default{\cs*{index}}
-    Chooses the index command that is used when option \option{index} has been
-    set to \code{true}.
-  %%
-  \keybool{accsupp}\Default{false}
-    Activates the access support as provided by the \pkg{accsupp} package.
-  %%
-  \keybool{tooltip}\Default{false}
-    \sinceversion{2.1}Activates tooltip support for \acro\ using the
-    \pkg{pdfcomment} package.
-  %%
-  \keyval{tooltip-cmd}{control sequence}\Default{\cs*{@firstoftwo}}
-    \sinceversion{2.1}A macro taking two mandatory arguments, the first being
-    the short form of the acronym and the second being some tooltip
-    description.
-  %%
-  \keyval{uc-cmd}{control sequence}\Default{\cs{acfirstupper}}
-    The command that is used to capitalize the first word in the \cs{Ac} and
-    the like commands.  You can change it to another one like for example
-    \cs*{makefirstuc}\footnote{from the \pkg{mfirstuc} package} or
-    \cs*{MakeTextUppercase}\footnote{from the \pkg*{textcase} package}.
-  %%
-  \keybool{uppercase-short}\Default{true}
-    If\sinceversion{2.10} set to \code{true} commands like \cs{Ac} or \cs{Acp}
-    will uppercase the first letter of the short version.
-\end{options}
-
-\begin{example}
-  % with \acsetup{macros} activated:
-  we could have used these before: \nato, \ny
+Yeu have seen an example for this already:
+\begin{sourcecode}
+  \DeclareAcronym{etc}{
+    short = etc\acdot ,
+    long = et cetera ,
+    format = \textit ,
+    first-style = long ,
+    plural = 
+  }
+\end{sourcecode}
+The macro \cs{acdot} recognizes if a dot is directly following. It only prints
+a dot if it doesn't.
+\begin{example}[side-by-side]
+  \ac{etc} and \ac{etc}.
 \end{example}
 
-\subsection{Options Regarding Acronyms}\label{sec:opti-regard-acronyms}
-The options described in this section all influence the layout of one of the
-possible output forms of the acronyms.
-\begin{options}
-  %%
-  \keyval{short-format}{format}\Default
-    Sets a format for all short forms. For example
-    \keyis{short-format}{\cs*{scshape}} would print all short forms in small
-    caps.
-  %%
-  \keyval{long-format}{format}\Default
-    The same for the long forms.
-  %%
-  \keyval{foreign-format}{format}\Default
-    The format for the \property{foreign} entry when it appears as part of the
-    first appearance of an acronym.
-  %%
-  \keyval{single-format}{format}\Default
-    \sinceversion{2.3}%
-    The format for the acronym when it is used only once.  If not specified
-    the formatting according to \option{single-form} is used.
-  %%
-  \keyval{first-long-format}{format}\Default
-    The format for the long form on first usage (with \cs{ac}, \cs{acf} or
-    \cs{acflike} and their uppercase, plural and indefinite forms).
-  %%
-  \keyval{list-short-format}{format}\Default
-    An extra format for the short entries in the list.  If not used this is
-    the same as \option{short-format}.  Please be aware that a call of
-    \option{short-format} after this one will overwrite it again.
-  %%
-  \keyval{list-short-width}{dim}\Default{3em}
-    \sinceversion{2.1}This option controls the width reserved for the short
-    forms of the acronyms in the \code{lof} list style.
-  %%
-  \keyval{list-long-format}{format}\Default
-    An extra format for the long entries in the list.  If not used this is the
-    same as \option{long-format}.  Please be aware that a call of
-    \option{long-format} after this one will overwrite it again.
-  %%
-  \keyval{list-foreign-format}{format}\Default{\cs{acroenparen}}
-    \label{key:list-foreign-format}The format for the \property{foreign} entry
-    as it appears in the list.  This may be code that ends with a macro that
-    takes a mandatory argument.
-  %%
-  \keyval{extra-format}{format}\Default
-    The same for the extra information.
-  %%
-  \keychoice{first-style}{default,empty,square,short,long,reversed,footnote,sidenote,%
-    footnote-reversed,sidenote-reversed}\Default{default}
-    The basic style of the first appearance of an acronym.  The value
-    \code{sidenote} needs the command \cs*{sidenote} to be defined (for
-    example by the \pkg*{sidenotes} package).
-  %%
-  \keychoice{extra-style}{default,plain,comma,paren,bracket}\Default{default}
-    Defines the way the extra information is printed in the list.
-  %%
-  \keylit{plural-ending}{\meta{short}/\meta{long}}\Default{s/s}
-    \changedversion{2.4b}With this option the default plural ending can be
-    set.  The appended \meta{long} ending is optional.  If you leave it
-    (\emph{and} the \code{/}) the \meta{short} ending is used for both short
-    and long versions.
-\end{options}
- 
+Another example: let's say you're a German scientist, you have
+\begin{sourcecode}
+  \DeclareAcronym{PU}{
+    short = PU ,
+    long = Polyurethan ,
+    long-plural = e
+  }
+\end{sourcecode}
+and you use it the first time like this:
+\begin{sourcecode}
+  \ac{PU}-Hartschaum
+\end{sourcecode}
+then according to German orthography and typesetting rules this should be
+printed as
+\begin{center}
+  \enquote{Polyurethan(PU)-Hartschaum}
+\end{center}
+\ie, with \emph{no} space between long and short form.
 \begin{example}[side-by-side]
-  % (Keep in mind that we're in
-  % a minipage here!)
-  \acsetup{first-style=empty}
-  empty: \acf{ny} \\
-  \acsetup{first-style=footnote}
-  footnote: \acf{ny} \\
-  \acsetup{first-style=square}
-  square: \acf{ny} \\
-  \acsetup{first-style=short}
-  short: \acf{ny} \\
-  \acsetup{first-style=long}
-  long: \acf{ny} \\
-  \acsetup{first-style=reversed}
-  reversed: \acf{ny} \\
-  \acsetup{first-style = footnote-reversed}
-  footnote-reversed: \acf{ny}
+  \acf{PU}-Hartschaum
 \end{example}
 
-\subsection{Options Regarding the List}
-\begin{options}
-  %%
-  \keychoice{page-style}{none,plain,comma,paren}\Default{none}
-    If this option is set to a value other than \code{none} the page numbers
-    of the an acronym appeared on are printed in the list.  Please note that
-    this is an experimental feature and might fail in quite a number of cases.
-    If you notice anything please send me an email!
-  %%
-  \keychoice{pages}{all,first}\Default{all}
-    If the option \option{page-style} has any value other than \code{none}
-    this option determines wether all usages of the acronyms are listed or
-    only the first time.  Implicitly sets \keyis{label}{true}.
-  %%
-  \keyval{page-name}{page name}\Default{p.\cs*{@}\cs*{,}}
-    The ``name'' of the page label.  This is automatically translated to the
-    active language. However for the time being there are many translations
-    missing, yet.  Please notify me if you find your language missing.
-  %%
-  \keyval{pages-name}{page name plural}\Default{pp.\cs*{@}\cs*{,}}
-    The ``name'' of the page label when there are more than one page.  This is
-    automatically translated to the active language.  However for the time
-    being there are many translations missing, yet.  Please notify me if you
-    find your language missing. 
-  %%
-  \keybool{following-page}\Default{false}
-    If set to \code{true} a page range in the list of acronyms that consists
-    of two pages will be written by the first page and an appended
-    \code{f}. This depends on the option \option{next-page}. 
-  %%
-  \keybool{following-pages}\Default{false}
-    If set to \code{true} a page range in the list of acronyms that set
-    consists of more than two pages will be written by the first page and an
-    appended \code{ff}. This depends on the option \option{next-pages}.
-  %%
-  \keybool{following-pages*}\Default{false}
-    \sinceversion{2.5}If set to \code{true} this sets both options
-    \keyis{following-page}{true} and \keyis{following-pages}{true}.
-    \code{false} sets \keyis{following-page}{false} and
-    \keyis{following-pages}{false}.
-  %%
-  \keyval{next-page}{text}\Default{\cs*{,}f.\cs*{@}}
-    Appended to a page number when \option{following-page} is set to
-    \code{true} and the range is only 2 pages long.  This is automatically
-    translated to the active language.  However, for the time being there are
-    many translations missing, yet.  Please notify me if you find your
-    language missing.
-  %%
-  \keyval{next-pages}{text}\Default{\cs*{,}ff.\cs*{@}}
-    Appended to a page number when \option{following-pages} is set to
-    \code{true} and the range is more than 2 pages long.  This is
-    automatically translated to the active language.  However, for the time 
-    being there are many translations missing, yet.  Please notify me if you
-    find your language missing.
-  %%
-  \keychoice{list-style}{description,lof,longtable,extra-longtable,%
-    extra-longtable-rev,extra-tabular,extra-tabular-rev,tabular,toc}%
-    \Default{description}
-    \changedversion{2.2}Choose with which style the list of acronyms should be
-    typeset.  If you choose \meta{longtable}, \code{extra-longtable} or
-    \code{extra-longtable-rev} you have to load the
-    \pkg{longtable}~\cite{pkg:longtable} package in your preamble.  The values
-    \code{extra-\meta{something}} put the extra information in a column of it
-    own.  \emph{Be aware that per default \emph{all} \code{extra-table} styles
-      only use \code{l} columns.  Since acronym descriptions can easily get
-      longer that a line you should probably define your own style if you want
-      to use them.}  See section~\vref{sec:lists} for details.
-  %%
-  \keychoice{list-heading}{chapter,chapter*,section,section*,subsection,%
-    subsection*,subsubsection,subsubsection*,addchap,addsec,none}%
-  \Default{section*}
-    \changedversion{2.0}The heading type of the list. The last two only work
-    with a \KOMAScript{} class that also defines the appropriate command.  A
-    special value is \code{none} which suppresses the heading.
-  %%
-  \keyval{list-name}{list name}\Default{Acronyms}
-    The name of the list.  This is what's written in the list-heading.  This
-    is automatically translated to the active language.  However, for the time
-    being there are many translations missing, yet.  Please notify me if you
-    find your language missing.
-  %%
-  \keybool{list-caps}\Default{false}
-    Print the first letters of the long form capitalized.
-\end{options}
-
-\section{Trailing Tokens and Special Action}
-
-\acro\ has the possibility\sinceversion{2.0} to look ahead for certain tokens
-and switch a boolean if it finds them.  Per default \acro\ knows about three
-tokens: the \enquote{\code{dot}} (\code{.}), the \enquote{\code{dash}}
-(\code{-}) and the \enquote{\code{babel-hyphen}} (\cs*{babelhyphen}).
-
-A token is made known to \acro\ with the following macro:
-\begin{commands}
-  \command{AcroRegisterTrailing}[\meta{token}\marg{name}]
-    This registers the token \meta{token} so \acro\ looks if it follows
-    directly after an acronym macro.  \meta{name} is the internal name for
-    this token.
-\end{commands}
-The \acro\ package already registers the above mentioned tokens:
+This works because the template \code{long-short}\footnote{The template that
+  is used by default for the first appearance.} uses \cs{acspace} at the
+appropriate place and the manual setup does
 \begin{sourcecode}
-  \AcroRegisterTrailing . {dot}
-  \AcroRegisterTrailing - {dash}
-  \AcroRegisterTrailing \babelhyphen {babel-hyphen}
+  \acsetup{activate-trailing-tokens = dash}
 \end{sourcecode}
+\cs{acspace} looks ahead for a trailing dash and adds a space it it doesn't
+find it.
 
-If a token is registered it doesn't mean that \acro\ looks for it.  The token
-must first be activated for this:
+\subsection{How does it work?}
+Tokens to look for can be defined and activated through the following options:
 \begin{options}
-  \keyval{activate-trailing-tokens}{csv list of token names}
+  \keylit-{define}{\meta{token}\marg{name}}\Module{trailing}
+    Defines token \meta{name} and tells \acro\ look for \meta{token} if
+    \meta{name} is activated.
+  \keyval{activate}{csv list of token names}\Module{trailing}
     Tell \acro\ to look for trailing tokens.  This is done by giving a csv
     list of the internal \emph{names} of the tokens.  Per default only
     \code{dot} is activated.
-  \keyval{deactivate-trailing-tokens}{csv list of token names}
+  \keyval{deactivate}{csv list of token names}\Module{trailing}
     Tell \acro\ not to look for trailing tokens.  This is done by giving a csv
     list of the internal \emph{names} of the tokens.
 \end{options}
+The package itself does this:
+\begin{sourcecode}
+  \acsetup{
+    trailing/define   = . {dot} ,
+    trailing/define   = {, {comma}} ,
+    trailing/define   = - {dash}
+    trailing/define   = \babelhyphen {babel-hyphen} ,
+    trailing/activate = {dot,comma}
+  }
+\end{sourcecode}
 
-All of the above on its own does nothing visible. However: inside of an
-acronym, \ie, for example inside the long or the short form it can be tested
-for those trailing tokens:
+In order to make use of this mechanism there is the following command:
 \begin{commands}
-  \command{aciftrailing}[\marg{csv list of token
+  \expandable\command{aciftrailing}[\marg{csv list of token
     names}\marg{true}\marg{false}]
     Check if one of the tokens listed in \meta{csv list of token names} is
     following and either place \meta{true} or \meta{false} in the input
     stream.
 \end{commands}
-\acro\ uses this to define to further macros:
+This command is used to define the two commands you already know:
 \begin{commands}
-  \command{acdot} Inserts a \code{.} if no \code{dot} follows.
-  \command{acspace} Inserts a \cs*{space} if no \code{dash} or
+  \expandable\command{acdot} Inserts \cs{abbrdot} if no \code{dot} follows.
+  \expandable\command{acspace} Inserts a \cs*{space} if no \code{dash} or
     \code{babel-hyphen} follows.
+  \expandable\command{abbrdot} Inserts \sym{.}\cs*{@}
 \end{commands}
 The definitions are equivalent\footnote{Not \emph{quite}: \acro's definitions
   are engine protected.} to the following code:
 \begin{sourcecode}
-  \newcommand*\acdot{\aciftrailing{dot}{}{.\@}}
+  \newcommand*\acdot{\aciftrailing{dot}{}{\abbrdot}}
   \newcommand*\acspace{\aciftrailing{dash,babel-hyphen}{}{\space}}
 \end{sourcecode}
+You are of course free to redefine them according to your needs.
 
-This could be used to define an acronym as follows:
+\section{Using or resetting acronyms}\label{sec:using-or-resetting}
+Sometimes it is necessary to mark an acronym as used before it actually has
+been used or to mark an acronym as unused even though it \emph{has} been
+used.  You have already seen one of the commands which make it possible:
+\begin{commands}
+  \command{acuse}[\marg{csv list of acronym ids}]
+    Every acronym given in the list will be marked as used.
+  \command{acuseall}
+    Every acronym is marked as used.
+  \command{acreset}[\marg{csv list of acronym ids}]
+    Every acronym given in the list will be reset.
+  \command{acresetall}
+    Every acronym will be reset.
+\end{commands}
+
+\section{Bookmarks, backlinks and accessibility support}\label{sec:pdf-properties}
+\subsection{Backlinks}\label{sec:backlinks}
+When \acro\ is used together with the package
+\pkg{hyperref}~\cite{pkg:hyperref} then you can make use of the following
+option:
+\begin{options}
+  \keybool{make-links}\Default{false}
+    If this is activated then every short or alternative appearance of an
+    acronym will be linked to its description in the list of acronyms.
+\end{options}
+\begin{bewareofthedog}
+  This will fail miserably together with local lists if an acronym appears in
+  more than one list.  This \emph{might} be resolved on day.
+\end{bewareofthedog}
+
+\subsection{Bookmarks}\label{sec:bookmarks}
+Since bookmarks (which are created by the \pkg{hyperref} or the \pkg{bookmark}
+packages~\cite{pkg:bookmark}) can only contain simple text \acro\ simplifies
+the output of the acronym commands when they appear in a bookmark.  Although
+the output can be modified with a dedicated template-mechanism there is no
+user interface at the moment.  Contact me at \issues\ if you need it.
+
+Acronyms have the property \property{pdfstring}:
+\begin{properties}
+  %% pdfstring
+  \propval{pdfstring}{pdfstring}\Default={short}
+    Used as \acs{pdf} string replacement for the short form in bookmarks when
+    used together with the \pkg{hyperref}~\cite{pkg:hyperref} or the
+    \pkg{bookmark} package~\cite{pkg:bookmark}.
+\end{properties}
+
+This is for acronyms like
 \begin{sourcecode}
-  \DeclareAcronym{etc}{
-    short = {\textit{etc}\acdot} ,
-    long  = {\textit{et cetera}} ,
-    short-plural = , long-plural =
+  \DeclareAcronym{pdf}{
+    short = pdf ,
+    long = Portable Document Format ,
+    short-format = \scshape ,
+    pdfstring = PDF
   }
 \end{sourcecode}
-If now you somewhere use
+where the bookmark would write \enquote{pdf} instead of \enquote{\textsc{pdf}}
+if the property where not set.
+
+\subsection{\acs*{pdf} comments}\label{sec:pdf-comments}
+Some people like see comments in the \ac{pdf} when they're hovering with the
+mouse over the short form of an acronym.  This can be achieved.
+\begin{options}
+  \keybool{use}\Module{pdfcomments}\Default{false}
+    This enables the creation of \ac{pdf} comments.
+  \keyval{cmd}{code}\Module{pdfcomments}\Default{\cs*{pdftooltip}\Marg{\#1}\Marg{\#2}}
+    Chooses the command for actually creating the comment.  You must refer to
+    the printed output in the \ac{pdf} with \code{\#1} and to the comment with
+    \code{\#2}.  The default command \cs*{pdftooltip} is provided by the
+    package \pkg{pdfcomment}~\cite{pkg:pdfcomment}.  You must load it in order
+    to use it.
+\end{options}
+Only acronyms where the corresponding property has been set will get comments:  
+\begin{properties}
+  %% pdfcomment
+  \propval{pdfcomment}{text}
+    Sets a tooltip description for an acronym.
+\end{properties}
+
+\subsection{Accessibility support}\label{sec:access-supp}
+\acro\ supports the \pkg{accsupp} package~\cite{pkg:accsupp} when you
+\emph{also load \pkg{hyperref}}.  Then \acro\ uses
 \begin{sourcecode}
-  \ac{etc}.
+  \BeginAccSupp{ method = pdfstringdef ,  ActualText = {PDF} }
+    \textsc{pdf}%
+  \EndAccSupp{}%
 \end{sourcecode}
-there won't be two dots printed.
-
-The command \cs{acspace} is used already in the definition of the first
-appearance of a macro.  Let's say you're a German chemist and you have
+for an acronym defined like this:
 \begin{sourcecode}
-  \DeclareAcronym{PU}{
-    long = Polyurethan ,
-    long-plural = e
+  \DeclareAcronym{pdf}{
+    short = pdf ,
+    long = Portable Document Format ,
+    short-format = \scshape ,
+    pdfstring = PDF ,
+    short-acc = PDF
   }
 \end{sourcecode}
-and you use it the first time like this:
+Without accessibility support when a string like \enquote{\textsc{pdf}} is
+copied from the \ac{pdf} and pasted you get \enquote{pdf}.  If you don't care
+about that simply don't load \pkg{accsupp} and ignore this section.
+
+You have a few options to be able to manipulate what \acro\ does here but I
+recommend to stay with the default settings:
+\begin{options}
+  \keybool{use}\Module{accsupp}\Default{true}
+    When this is true and the package \pkg{accsupp} is loaded then
+    accessibility support is used.
+   \keyval{options}{text}\Module{accsupp}\Default
+    Additional option to be passed to \cs{BeginAccSupp}.  See the
+    \pkg{accsupp} manual for possible settings.
+  \keyval{method}{method}\Module{accsupp}\Default{pdfstringdef}
+    The method used by \cs{BeginAccSupp}.  See the
+    \pkg{accsupp} manual for possible values.
+\end{options}
+
+The \enquote{ActualText} that is used by \acro\ always defaults to the values
+of the acronym properties themselves.  You can choose these values
+individually by setting the corresponding properties:
+\begin{properties}
+  %% short-acc
+  \propval{short-acc}{text}\Default={short}
+    Sets the \code{ActualText} property as presented by the \pkg{accsupp}
+    package for the short form of the acronym.
+  %% long-acc
+  \propval{long-acc}{text}\Default={long}
+    Sets the \code{ActualText} property as presented by the \pkg{accsupp}
+    package for the long form of the acronym.
+  %% alt-acc
+  \propval{alt-acc}{text}\Default={alt}
+    Sets the \code{ActualText} property as presented by the \pkg{accsupp}
+    package for the alternative short form of the acronym.
+  %% foreign-acc
+  \propval{foreign-acc}{text}\Default={foreign}
+    Sets the \code{ActualText} property as presented by the \pkg{accsupp}
+    package for the foreign form of the acronym.
+  %% extra-acc
+  \propval{extra-acc}{text}\Default={extra}
+    Sets the \code{ActualText} property as presented by the \pkg{accsupp}
+    package for the extra information of the acronym.
+  %% single-acc
+  \propval{single-acc}{text}\Default={long-acc}
+    Sets the \code{ActualText} property as presented by the \pkg{accsupp}
+    package for a single appearance of the acronym.
+  %% list-acc
+  \propval{list-acc}{text}\Default={list}
+    Sets the \code{ActualText} property as presented by the \pkg{accsupp}
+    package for the appearance in the list of acronyms.
+\end{properties}
+
+Extra care has to be taken for plural forms as these can not be picked up
+automatically right now.  You have to explicitly set them for the
+accessibility support, too:
 \begin{sourcecode}
-  \ac{PU}-Hartschaum
+  \DeclareAcronym{ufo}{
+    short = UFO ,
+    long = unidentified flying object ,
+    foreign = unbekanntes Flugobjekt ,
+    foreign-plural-form = unbekannte Flugobjekte ,
+    foreign-acc-plural-form = unbekannte Flugobjekte ,
+    foreign-babel = ngerman ,
+    long-indefinite = an
+  }
 \end{sourcecode}
-then according to German orthography and typesetting rules this should be
-printed as
-\begin{center}
-  \enquote{Polyurethan(PU)-Hartschaum}
-\end{center}
-\ie, with \emph{no} space between long and short form.  This is exactly what
-happens it you say
-\begin{sourcecode}
-  \acsetup{activate-trailing-tokens = {dash,babel-hyphen}}
-\end{sourcecode}
-in the preamble.
 
-\section{About Page Ranges}
-If you enable the \option{page-style} option \acro\ adds page numbers to the list
-of acronyms.  In version~0.\versionstar{} it would add a page reference for an
-acronym in the list of acronyms that used \cs*{pageref} to refer to the first
-appearance of an acronym.  This is retained using \keyis{pages}{first}.
-Version~1.0 uses a different approach that doesn't use a label but instead
-will list \emph{all} pages an acronym appeared on.  With \pkg{hyperref} the
-pages are referenced using \cs*{hyperpage}.
+\section{Localisation}\label{sec:localisation}
+There are places when \acro\ uses text strings which depend on the language of
+the document.  In order to recognize the language from \pkg{babel} of
+\pkg{polyglossia} and print the strings in the correct language \acro\ uses
+the \pkg{translations}~\cite{pkg:translations}.
 
-There are some options that control how this list will be typeset, e.g.,
-\option{following-page}, \option{next-pages} or the option \option{page-style}
-itself.  It is important to mention that the page list will always take at
-least two compilation runs until changes in the options or the actual page
-numbers affect it.  This is due to the fact that the updated sequence is first
-written to the \code{aux} file and only read in during the next run.
-
-\section{Dividing Your Document Into Pieces -- Creating Local
-  Lists}\label{sec:divid-your-docum}
-
-\acro\sinceversion{2.4} introduces the concept of \emph{barriers} which can
-divide the document into parts. It is possible to create lists of only those
-acronyms used between two such barriers.
+If the language is detected incorrectly or you want \acro\ to use another
+language than it detects you can use the following option:
+\begin{options}
+  \keychoice{language}{auto,\meta{language}}\Default{auto}
+    The default setting \code{auto} lets \acro\ detect the language setting
+    automatically. Valid choices are all language names known to the package
+    \pkg{translations}. Mostly just type your language and it should work.
+\end{options}
+\acro\ only provides support for a handful of languages.  You can easily teach
+\acro\ your language -- see section~\vref{sec:translations} -- if it isn't
+supported, yet\footnote{If you like you can always open an issue at \issues\
+  and provide your translations so I can add them to \acro.}.
 \begin{commands}
-  \command{acbarrier}
-    Sets a barrier at the point of use in the document.  The begin and the end
-    of the document mark implicit barriers.
+  \expandable\command{acrotranslate}[\marg{key}]
+    This command fetches the translation of \meta{key} for the current
+    language.  It is meant for usage in template definitions.
 \end{commands}
-\begin{options}
-  \keybool{use-barriers}\Default{false}
-    \sinceversion{2.5}If you want to use barriers and local lists you have to
-    activate the feature first.  This should be set in the preamble in order
-    to work reliably.  Make sure to watch out for log file messages asking you
-    to rerun.
-  \keybool{reset-at-barriers}\Default{false}
-    If this option is set to \code{true} \cs{acbarrier} implicitly calls
-    \cs{acresetall}.
-  \keybool{local-to-barriers}\Default{false}
-    This option can \emph{only} be used as option to the \cs{printacronyms}
-    command. It then prints a list of only the acronyms of the current
-    \enquote{barrier group}.
-\end{options}
 
-\begin{example}
-  \acbarrier
-  \printacronyms[local-to-barriers]
-  \ac{ctan} and \ac{lppl}
-  \acbarrier
-\end{example}
+Available keywords and their English, French, and German translations are
+shown in table~\vref{tab:translations}.
 
-\section{Language Support}
-\acro\ detects if packages \pkg{babel}~\cite{pkg:babel} or
-\pkg{polyglossia}~\cite{pkg:babel} are being loaded and tries to adapt certain
-strings to match the chosen language.  However, due to my limited language
-knowledge only a few translations are provided.  I'll show how the English
-translations are defined so you can add the translations to your preamble if
-needed.  Even better would be you'd send me a short email to
-\mailto{contact at mychemistry.eu} with the appropriate translations for your
-language and I'll add them to \acro.
+\begin{table}
+  \centering
+  \begin{tabular}{llll}
+    \toprule
+      \bfseries Key & \bfseries English & \bfseries French & \bfseries German \\
+    \midrule
+      \translationtable
+    \bottomrule
+  \end{tabular}
+  \caption{Available translation keywords.}
+  \label{tab:translations}
+\end{table}
 
-\begin{sourcecode}
-  \DeclareTranslation{English}{acronym-list-name}{Acronyms}
-  \DeclareTranslation{English}{acronym-page-name}{p.}
-  \DeclareTranslation{English}{acronym-pages-name}{pp.}
-  \DeclareTranslation{English}{acronym-next-page}{f.}
-  \DeclareTranslation{English}{acronym-next-pages}{ff.}
-\end{sourcecode}
+\part{Extending \acro}\label{part:extending-acro}
+\section{Background}\label{sec:background}
+\subsection{Templates}
+One of the core ideas of \acro\ version~3.0 is the use of \emph{templates}
+which manage how different how anything is printed, from the output of \cs{ac}
+and friends to the list of acronyms.  \acro\ uses three types of templates:
+\begin{description}
+  \item[acronym] These templates can be used to define \emph{acronym
+      commands}, see section~\vref{sec:own-acronym-commands}.
+  \item[list] These templates are used by the \cs{printacronyms} command.
+  \item[heading]  These templates only make sense if a \emph{list} template
+    uses \cs{acroheading}.  This command makes use of them.
+\end{description}
 
-\section{hyperref Support}
-The option \keyis{hyperref}{true} adds internal links from all short (or
-alternative) forms to their respective list entries.  Of course this only
-works if you have loaded the \pkg{hyperref} package in your preamble.  You
-should use this option with care: if you don't use \cs{printacronyms} anywhere
-this option will result in loads of \pkg{hyperref} warnings.  Also printing
-several lists can result in warnings if don't clearly separate the lists into
-different classes.  If an acronym appears in more than one list there will
-also be more than one hypertarget for this acronym.
+How these templates are defined, which are available from the start and how
+they are used is explained in section~\vref{sec:templates}.
 
-Using \pkg{hyperref} will also add \cs*{hyperpage} to the page numbers in the
-list (provided they are displayed in the style chosen).  Like with an index
-the references will thus not point to the acronyms directly but to the page
-they're on.
+\subsection{Objects}
+\acro\ uses certain kinds of objects in some of its commands.  It is possible
+to defines own such objects:
+\begin{description}
+  \item[articles] Per default only the \enquote{indefinite} article is
+    defined. But it is possible to define and add other articles to \acro.
+    This is explained in section~\vref{sec:other-articles}.
+  \item[endings] Per default only the ending \enquote{plural} is defined. But
+    it is possible to define and add other endings to \acro.  This is
+    explained in section~\vref{sec:other-endings}.
+  \item[properties] You have already learned about properties.  It is possible
+    to define and add further acronym properties to \acro.  This is explained
+    in section~\vref{sec:new-properties}.
+  \item[translations] \acro\ uses localisation strings at a number of places.
+    It is possible to change these strings and add further strings.  This is
+    explained in section~\vref{sec:localisation}.
+\end{description}
 
-\section{Defining Own Acronym Macros}\label{sec:defining-own-acronym}
+\section{Templates}\label{sec:templates}
+\subsection{Pre-defined templates}\label{sec:pre-defin-templ}
+\subsubsection{Acronym templates}
+\begin{templates}
+  \tmpl{alt}
+    Display the alternative form of an acronym.
+  \tmpl{first}
+    This is a \emph{pseudo} template which always displays what is
+    set through the option \option{first-style} or the property
+    \property{first-style}.
+  \tmpl{footnote}
+    A template for the first appearance where the long form is printed in a
+    footnote.
+  \tmpl{long}
+    Display the long form of an acronym.
+  \tmpl{long-short}
+    A template for the first appearance where the long form is printed and the
+    short form follows in parentheses.
+  \tmpl{first}
+    This is a \emph{pseudo} template which always displays what is
+    set through the \option{single-style} or the property
+    \property{single-style}.
+  \tmpl{short}
+    Display the short form of an acronym.
+  \tmpl{short-long}
+    A template for the first appearance where the short form is printed and the
+    long form follows in parentheses.
+  \tmpl{show}
+    A template which writes all properties of an acronym into the log file.
+\end{templates}
 
-The commands\sinceversion{2.0} explained in
-section~\vref{sec:using-acronyms-comm} have all been defined with a dedicated
-command -- there is a family of dedicated commands, actually:
+\subsubsection{List templates}
+\begin{templates}
+  \tmpl{description}
+    The default list style which places the short form in the item of a
+    \env*{description} environment and adds the all the rest as description of
+    the item.
+  \tmpl{lof}
+    A style which mimicks the list of figures.  This style does not support
+    page ranges.
+  \tmpl{longtable}
+    A style that uses a \env*{longtable} environment for building the list.
+    This needs the \pkg{longtable} package~\cite{pkg:longtable} loaded.
+  \tmpl{longtabu}
+    A style that uses a \env*{longtabu} environment for building the
+    list. This needs the \pkg{longtable} package and the \pkg{tabu}
+    package~\cite{pkg:tabu} loaded.
+  \tmpl{tabular}
+    A style that uses a \env*{tabular} environment for building the list.
+    Since a \env*{tabular} cannot break across pages this is only suited for
+    short lists.
+  \tmpl{toc}
+    A style which mimicks the table of contents.  This style does not support
+    page ranges.
+\end{templates}
+
+\subsubsection{Header templates}
+\begin{templates}
+  \tmpl{addchap}
+    Only defined in a \KOMAScript\ class and if \cs*{chapter} is defined. Uses
+    \cs*{addchap} for the heading.
+  \tmpl{addsec}
+    Only defined in a \KOMAScript\ class. Uses \cs*{addsec} for the heading.
+  \tmpl{chapter}
+    Only defined if \cs*{chapter} is defined. Uses \cs*{chapter} for the heading.
+  \tmpl{chapter*}
+    Uses \cs*{chapter}\sarg\ for the heading.
+  \tmpl{none}
+    Displays nothing.
+  \tmpl{section}
+    Uses \cs*{section} for the heading.
+  \tmpl{section*}
+    Uses \cs*{section}\sarg* for the heading.
+\end{templates}
+
+\subsection{Defining new templates}\label{sec:defin-new-templ}
+For the definition of templates these commends are available:
 \begin{commands}
-  \command{NewAcroCommand}[\marg{cs}\marg{code}]
-    Defines a new \acro\ acronym command \meta{cs}.  This sets up the
-    necessary framework needed by acronym commands and defines \meta{cs} with
-    an optional star argument and a mandatory argument for the acronym id
-    using \pkg{xparse}'s \cs*{NewDocumentCommand}. Inside \meta{code} one can
-    refer to the \acs{id} \meta{id} with \code{\#1}.
-  \command{RenewAcroCommand}[\marg{cs}\marg{code}]
-    Defines a new \acro\ acronym command \meta{cs}.  This sets up the
-    necessary framework needed by acronym commands and defines \meta{cs} with
-    an optional star argument and a mandatory argument for the acronym id
-    using \pkg{xparse}'s \cs*{RenewDocumentCommand}. Inside \meta{code} one
-    can refer to the \acs{id} \meta{id} with \code{\#1}.
-  \command{DeclareAcroCommand}[\marg{cs}\marg{code}]
-    Defines a new \acro\ acronym command \meta{cs}.  This sets up the
-    necessary framework needed by acronym commands and defines \meta{cs} with
-    an optional star argument and a mandatory argument for the acronym id
-    using \pkg{xparse}'s \cs*{DeclareDocumentCommand}. Inside \meta{code} one
-    can refer to the \acs{id} \meta{id} with \code{\#1}.
-  \command{ProvideAcroCommand}[\marg{cs}\marg{code}]
-    Defines a new \acro\ acronym command \meta{cs}.  This sets up the
-    necessary framework needed by acronym commands and defines \meta{cs} with
-    an optional star argument and a mandatory argument for the acronym id
-    using \pkg{xparse}'s \cs*{ProvideDocumentCommand}. Inside \meta{code} one
-    can refer to the \acs{id} \meta{id} with \code{\#1}.
+  \command{NewAcroTemplate}[\oarg{type}\marg{name}\marg{code}]
+    This defines a template of type \meta{type} with the name \meta{name}
+    which inserts \meta{code} when used.  A template of type \meta{type} with
+    name \meta{name} must not exist.  The default type is \code{acronym}.
+  \command{RenewAcroTemplate}[\oarg{type}\marg{name}\marg{code}]
+    This re-defines a template of type \meta{type} woth the name \meta{name}
+    which inserts \meta{code} when used.  A template of type \meta{type} with
+    name \meta{name} must exist.  The default type is \code{acronym}.
 \end{commands}
 
-Inside these macros one can use a number of low-level expl3
-commands\footnote{Which is why you need to use them inside an expl3
-  programming environment.  This means in the preamble surround the
-  definitions with \cs*{ExplSyntaxOn} and \cs*{ExplSyntaxOff}.}.
+How to use these commands is best explained by examples of how the existing
+templates have been defined.  The following sections will show several
+examples for their usage.
 
-\paragraph{Acronym fetching commands}
+\subsection{Commands to be used in template definitions}
+
+\acro\ provides and uses a large number of commands that are meant to be used
+in temmplate definitions and that often are useless or will raise errors if
+used outside.  Depending on their purpose the commands can be used in
+different types of templates or only in certain types of templates.
+
+In the descriptions below a \expandablesymbol\ indicates a fully expandable
+command when used in an \cs*{edef}, \cs*{write} or in \cs*{expanded}.
+
+A \TF\ always refers to a \meta{true} and \meta{false} branch and indicates
+that \emph{three} commands exist: one exactly as described, one with only the
+\code{\textcolor{cs}{T}} and the \meta{true} branch, and one with only the
+\code{\textcolor{cs}{F}} and the \meta{false} branch.  So \cs{acroif\TF} means
+there is \cs*{acroifTF}, \cs*{acroifT}, and \cs*{acroifF}, where \cs*{acroifT}
+and \cs*{acroifF} each have an argument less than \cs*{acroifTF}.
+
+\subsubsection{Commands for common uses}
 \begin{commands}
-  \command*{acro_use:n}[ \marg{id}]
-    Fetches the acronym using either the first or the short form depending on
-    earlier uses.
-  \command*{acro_short:n}[ \marg{id}]
-    Fetches the short form of the acronym.
-  \command*{acro_long:n}[ \marg{id}]
-    Fetches the long form of the acronym.
-  \command*{acro_alt:n}[ \marg{id}]
-    Fetches the alternative short form of the acronym.
-  \command*{acro_foreign:n}[ \marg{id}]
-    Fetches the foreign property of the acronym if available.
-  \command*{acro_extra:n}[ \marg{id}]
-    Fetches the extra property of the acronym if available.
+  \expandable\command{acrolistname}
+    Expnads to whatever is currently set with
+    \module{list}\code{/}\option{name}.
+  \command{acrowrite}[\marg{property}]
+    Prints the property \meta{property} of the current acronym.  Depending on
+    the circumstances this prints the property together with an article or an
+    ending either in uppercase or lowercase form.  Default is the lowercase
+    form without ending or article. The actual outcome is determined by
+    switches which are explained in section~\vref{sec:own-acronym-commands}.
+  \command{acroformat}[\marg{type}\marg{text}]
+    This formats \meta{text} according to \meta{type} where \meta{type} has
+    either been set as property or as option from the \module{format} module.
+    Valid values are \code{short}, \code{long}, \code{alt}, \code{extra},
+    \code{foreign}, \code{list}, and \code{first-long}.
+  \command{acroshow}[\marg{property}]
+    For debugging puposes: writes the property \meta{property} of the current
+    acronym to the log file.
+  \command{acroif\TF}[\marg{property}\marg{true}\marg{false}]
+    Checks if the property \meta{property} has been set for the current
+    acronym and either leaves \meta{true} or \meta{false} in the input stream.
+  \command{acroifall\TF}[\marg{properties}\marg{true}\marg{false}]
+    Checks if all properties in the csv list \meta{properties} have been set
+    for the current acronym and either leaves \meta{true} or \meta{false} in
+    the input stream.
+  \command{acroifany\TF}[\marg{properties}\marg{true}\marg{false}]
+    Checks if any of the properties in the csv list \meta{properties} has been
+    set for the current acronym and either leaves \meta{true} or \meta{false}
+    in the input stream.
+  \command{acroiftag\TF}[\marg{tag}\marg{true}\marg{false}]
+    Checks if the current acronym has been given the tag \meta{tag} and either
+    leaves \meta{true} or \meta{false} in the input stream.
+  \command{AcroPropertiesMap}[\marg{code}]
+    Maps over all defined acronym properties.  Within \meta{code} you can
+    refer to the current property with \code{\#1}.
 \end{commands}
 
-\paragraph{Acronym setup commands}
+\subsubsection{Commands for usage in acronym templates}
 \begin{commands}
-  \command*{acro_first_upper:}
-    \acro\ setup command which tells the macros above that we want to
-    uppercase the first letter of the long version.  Should be used
-    \emph{before} one of the acronym fetching commands.
-  \command*{acro_plural:}
-    \acro\ setup command which tells the macros above that we want to use
-    plural forms. Should be used \emph{before} one of the acronym fetching
-    commands.
-  \command*{acro_indefinite:}
-    \acro\ setup command which tells the macros above that we want to add the
-    indefinite article.  Should be used \emph{before} one of the acronym
-    fetching commands.
-  \command*{acro_cite:}
-    \acro\ setup command which tells the macros above that we want to add the
-    citation in any case independent of the option \option{cite}.  Should be
-    used \emph{before} one of the acronym fetching commands.
-  \command*{acro_no_cite:}
-    \acro\ setup command which tells the macros above that we want to have no
-    citation independent of the option \option{cite}.  Should be used
-    \emph{before} one of the acronym fetching commands.
-  \command*{acro_index:}
-    \acro\ setup command which tells the macros above that we want to add an
-    index entry in any case independent of the option \option{index}.  Should
-    be used \emph{before} one of the acronym fetching commands.
-  \command*{acro_reset_specials:}
-    This\sinceversion{2.0b} macro is called implicitly by \cs{NewAcroCommand}
-    and \cs{NewPseudoAcroCommand}.  If you plan to define an \acro\ command by
-    yourself using \cs*{NewDocumentCommand} this should be the first macro
-    after \verbcode+\acro_begin:+.  It ensures that in nested acronyms the
-    inner acronyms don't inherit indefinite articles, uppercasing,
-    endings\ldots
+  \expandable\command{acroifused\TF}[\marg{true}\marg{false}]
+    Checks if the current acronym has been used before and either leaves
+    \meta{true} or \meta{false} in the input stream.
+  \command{acroiffirst\TF}[\marg{true}\marg{false}]
+    Checks if the current usage of the current acronym is the first time and
+    either leaves \meta{true} or \meta{false} in the input stream.
+  \command{acroifsingle\TF}[\marg{true}\marg{false}]
+    Checks if the current acronym is used a single time and either leaves
+    \meta{true} or \meta{false} in the input stream.
+  \command{acrogroupcite}
 \end{commands}
 
-\paragraph{Additional macros for further uses}
+\subsubsection{Commands for usage in list templates}
 \begin{commands}
-  \command*{acro_begin:}
-    When an acronym macro is defined \enquote{by hand}, \ie, \emph{not using
-    \cs{NewAcroCommand}} then this must be the first macro in the code.
-    \emph{Must have a matching \cs*{acro_end:}}.
-  \command*{acro_end:}
-    When an acronym macro is defined \enquote{by hand}, \ie, \emph{not using 
-    \cs{NewAcroCommand}} then this must be the last macro in the code.
-    \emph{Must have a matching \cs*{acro_begin:}}.
-  \command*{acro_check_and_mark_if:nn}[ \marg{boolean expression} \marg{id}]
-    Checks if the acronym with the \acs{id}  \meta{id} exists and marks it as
-    used when \meta{boolean} expression evaluates to \code{true}.  This macro
-    is used inside \cs{NewAcroCommand} and friends implicitly.
-  \command*{acro_check_acronym:nn}[ \marg{id} \Marg{true|false}]
-    Checks if the acronym with the \acs{id} \meta{id} exists and marks it as
-    used if \code{true} or doesn't.  This macro is used inside
-    \cs*{acro_check_and_mark_if:nn}.
-  \command*{acro_use_acronym:n}[ \Marg{true|false}]
-    Tell \cs*{acro_use:n} and similar commands wether to mark the acronym as
-    used or not.  This macro is used inside \cs*{acro_check_acronym:nn}.  If
-    this macro is used explicitly it should be used before \cs*{acro_use:n}
-    (or a similar command) otherwise it has no effect.  An acronym marked as
-    used cannot be unmarked.
-  \command*{acro_mark_as_used:n}[ \marg{id}]
-    Explicitly use the acronym with the \acs{id} \meta{id}.  This is the expl3
-    macro applied to all entries in \cs{acuse}.
-  \expandable\command*{acro_if_acronym_used:n}[\TF\ \marg{id} \marg{true}
-  \marg{false}]
-    The code-level version of \cs{acifused}.  This macro is expandable.
-  \command*{acro_for_all_acronyms_do:n}[ \marg{code}]
-    Loops over all acronyms known when the macro is used.  Inside of
-    \meta{code} you can refer to the \acs{id} \meta{id} of an acronym with
-    \verbcode+#1+.
-  \command*{acro_barrier:}
-    The code-level version of \cs{acbarrier}.
-  \command*{acro_switch_off:}
-    The\sinceversion{2.6} expl3 version of \cs{acswitchoff}.
-  \command*{acro_switch_on:}
-    The\sinceversion{2.6} expl3 version of \cs{acswitchon}.
-  \command*{acro_add_action:n}[ \marg{code}]
-    Adds\sinceversion{2.7} code to \cs*{acro_get:n}.  Inside of \meta{code}
-    you can refer to the \ac{id} of the acronym with \verbcode+#1+.
-    The \cs*{acro_get:n} command is called the first macro that is called by
-    \cs*{acro_use:n} which for example enables conditionals to test for
-    certain acronym properties.
-  \command*{acro_property_get:nn}[\TF\ \marg{id} \marg{property} \marg{true}
-    \marg{false}]
-    Fetches\changedversion{2.11} the property \meta{property} of the acronym
-    \meta{id} and stores it in a tokenlist variable
-    \cs*{l__acro_\meta{property}_tl} where all dashes in the property names
-    are replaced with underscores.  \meta{true} is placed in the input stream
-    if the property had been set, \meta{false} otherwise.
-  \command*{acro_property_get:nn}[\marg{id} \marg{property}]
-    Like\changedversion{2.11} \cs*{acro_property_get:nn}\TF, but without the
-    \meta{true} and \meta{false} arguments.
-  \command*{acro_property_if_set:nn}[\TF\ \marg{id} \marg{property} \marg{true}
-    \marg{false}]
-    Checks\changedversion{2.11} if the property \meta{property} of the acronym
-    \meta{id} is set and places \meta{true} is in the input stream if yes and
-    \meta{false} otherwise.
+  \expandable\command{acroifchapter\TF}[\marg{true}\marg{false}]
+    This just check if \cs*{chapter} is defined.  Used in the \template{toc}
+    template.
+  \expandable\command{acroifpages\TF}[\marg{true}\marg{false}]
+    This is \meta{true} if the option \module{pages}\code{/}\option{display}
+    is set, \emph{and} the current acronym is not single, \emph{and} has at
+    least one page number.  \meta{false} otherwise.
+  \command{acropages}[\marg{first}\marg{range}]
+    If \cs{acroifpages\TF} would be \meta{false} this would do nothing.
+    Otherwise, if \module{pages}\code{/}\option{display} is \code{first} it
+    prints the first page number, preceded by \meta{first} if
+    \module{pages}\code{/}\option{name} is true.  If
+    \module{pages}\code{/}\option{display} is \code{all} it prints the page
+    range, preceded by \meta{range} if \module{pages}\code{/}\option{name} is
+    true.
+  \command{acronopagerange}
+    This disables page ranges.  Used in the \template{toc} and \template{lof}
+    templates.
+  \command{acropagefill}
+    If \cs{acroifpages\TF} would be \meta{false} this would do
+    nothing. Otherwise it prints whatever is set by
+    \module{pages}\code{/}\option{fill}.
+  \command{acronymsmap}[\marg{code}]
+    Maps over the acronyms in order of appearance in the list.  Which acronyms
+    these are depends on settings.  They might only have certain tags, be ones
+    local to barriers, \dots \par
+    Within \meta{code} \code{\#1} refers to the current \ac{id} of the
+    acronym.  Also \cs{AcronymID} expands to the current \ac{id}.  The latter
+    is important for all the commands that check or print properties of
+    acronyms.
+  \command{acronymsmap\TF}[\marg{code}\marg{true}\marg{false}]
+    This does the same as \cs{acronymsmap} and also leaves \meta{true} in the
+    input stream if the list is not empty and \meta{false} otherwise.  This is
+    useful to trigger a rerun warning.
+  \command{AcronymTable}
+    This is an empty token list at the beginning of a list template.
+  \command{AcroAddRow}[\marg{code}]
+    Adds \meta{code} to the right of \cs{AcronymTable} and ensures that
+    \cs{AcronymID} has the correct global definition for this code.  With this
+    the code for the \template{tabular} template and other table templates can
+    be built in a comfortable way.
+  \command{AcroNeedPackage}[\marg{package}]
+    Checks if the package \meta{package} is loaded and throws an error
+    otherwise.
+  \command{AcroRerun}
+    Triggers \acro\ to throw an \enquote{empty list} rerun warning.
 \end{commands}
 
-\paragraph{Examples}
-The usage of above macros is best explained with a few examples.  The
-following definition is done by \acro:
+\subsection{New acronym templates}\label{sec:new-acronym-templ}
+
+Some templates are quite short and self-explaining:
 \begin{sourcecode}
-  \NewAcroCommand \ac { \acro_use:n {#1} }
+  \NewAcroTemplate{short}{\acrowrite{short}}
 \end{sourcecode}
-An equivalent definition for \cs{ac} would be
+
+Some are a little bit more elaborate:
 \begin{sourcecode}
-  \NewDocumentCommand \ac {sm}
-    {
-      \acro_begin:
-        \acro_reset_specials:
-        \acro_check_and_mark_if:nn {#1} {#2}
-        \acro_use:n {#2}
-      \acro_end:
-    }
+  \NewAcroTemplate{alt}{%
+    \acroifTF{alt}
+      {\acrowrite{alt}}
+      {\acrowrite{short}}%
+  }
 \end{sourcecode}
-which should explain what the actual framework is which \cs{NewAcroCommand}
-adds.
 
-Other definitions by \acro\ are for example the following ones:
+And some templates need to do a lot more:
 \begin{sourcecode}
-  \NewAcroCommand \Ac
-    {
-      \acro_first_upper:
-      \acro_use:n {#1}
-    }
-  \NewAcroCommand \iac
-    {
-      \acro_indefinite:
-      \acro_use:n {#1}
-    }
-  \NewAcroCommand \acp
-    {
-      \acro_plural:
-      \acro_use:n {#1}
-    }
-  \NewAcroCommand \Acp
-    {
-      \acro_plural:
-      \acro_first_upper:
-      \acro_use:n {#1}
-    }
-  \NewAcroCommand \Aclp
-    {
-      \acro_plural:
-      \acro_first_upper:
-      \acro_long:n {#1}
-    }
+  \NewAcroTemplate{long-short}{%
+    \acroiffirstTF{%
+      \acrowrite{long}%
+      \acspace(%
+        \acroifT{foreign}{\acrowrite{foreign}, }%
+        \acrowrite{short}%
+        \acroifT{alt}{ \acrotranslate{or} \acrowrite{alt}}%
+        \acrogroupcite
+      )%
+    }%
+    {\acrowrite{short}}%
+  }
 \end{sourcecode}
 
-\section{About Plural Forms, Possessive Forms and Similar Constructs -- the
-  Concept of Endings}\label{sec:about-plural-forms}
+\subsection{New list templates}\label{sec:new-list-templates}
+This section shows the definition of three templates: \template{description},
+\template{tabular}, and \template{toc}.
 
-\acro\ has a concept of \emph{endings}.  All of \acro's plural options are
-defined by saying
+First the \template{description} template:
 \begin{sourcecode}
-  \ProvideAcroEnding {plural} {s} {s}
+  \NewAcroTemplate[list]{description}{%
+    \acroheading
+    \acropreamble
+    \begin{description}
+      \acronymsmapF{%
+        \item[\acrowrite{short}\acroifT{alt}{/\acrowrite{alt}}]
+          \acrowrite{list}%
+          \acroifanyT{foreign,extra}{ (}%
+          \acroifT{foreign}{\acrowrite{foreign}\acroifT{extra}{, }}%
+          \acroifT{extra}{\acrowrite{extra}}%
+          \acroifanyT{foreign,extra}{)}%
+          \acropagefill
+          \acropages
+            {\acrotranslate{page}\nobreakspace}
+            {\acrotranslate{pages}\nobreakspace}%
+        }
+        {\item\AcroRerun}
+    \end{description}
+  }
 \end{sourcecode}
-The command's syntax and what it does is as follows:
-\begin{commands}
-  \command{ProvideAcroEnding}[\marg{name}\marg{short default}\marg{long default}]
-    This macro defines the options
-    \begin{itemize}
-      \item \option*{\meta{name}-ending},
-      \item \option*{short-\meta{name}-ending},
-      \item \option*{alt-\meta{name}-ending},
-      \item \option*{long-\meta{name}-ending} and
-      \item \option*{foreign-\meta{name}-ending}.
-    \end{itemize}
-    It also defines the acronym properties
-    \begin{itemize}
-      \item \property*{short-\meta{name}},
-      \item \property*{short-\meta{name}-form},
-      \item \property*{alt-\meta{name}},
-      \item \property*{alt-\meta{name}-form},
-      \item \property*{long-\meta{name}},
-      \item \property*{long-\meta{name}-form},
-      \item \property*{foreign-\meta{name}} and
-      \item \property*{foreign-\meta{name}-form}.
-    \end{itemize}
-    Additionally it defines a setup macro as
-    described in section~\vref{sec:defining-own-acronym},
-    \cs*{acro_\meta{name}:}.  If \meta{name} contains a \code{-} (dash) it is
-    replaced by \code{\_} before \cs*{acro_\meta{name}:} is built.  So if you
-    choose \code{my-name} the corresponding macro is named
-    \cs*{acro_my_name:}.  If you use any other non-letters you are on your
-    own. \changedversion{2.4b}If you use the command with the same \meta{name}
-    a second time the command only resets the defaults.
 
-    Note that you \emph{must use \cs{ProvideAcroEnding} before any acronym
-      definition}!
-\end{commands}
-
-This could be used together with the macros described in
-section~\vref{sec:defining-own-acronym} for adding support for possessive
-forms:
-\begin{example}
-  \ExplSyntaxOn
-  % this now only works because I've used the same already in the preamble so
-  % it does nothing here:
-  \ProvideAcroEnding {possessive} {'s} {'s}
-
-  \ProvideAcroCommand \acg
-    {
-      \acro_possessive:
-      \acro_use:n {#1}
+The following shows how to define templates using tome kind of table
+environment.  Special care is necessary due to the way \LaTeX\ tables work:
+first the table body is built and only then the table itself is printed:
+\begin{sourcecode}
+  \NewAcroTemplate[list]{tabular}{%
+    \AcroNeedPackage{array}%
+    \acronymsmapF{%
+      \AcroAddRow{
+        \acrowrite{short}%
+        \acroifT{alt}{/\acrowrite{alt}}
+        &
+        \acrowrite{list}%
+        \acroifanyT{foreign,extra}{ (}%
+        \acroifT{foreign}{\acrowrite{foreign}\acroifT{extra}{, }}%
+        \acroifT{extra}{\acrowrite{extra}}%
+        \acroifanyT{foreign,extra}{)}%
+        \acropagefill
+        \acropages
+          {\acrotranslate{page}\nobreakspace}
+          {\acrotranslate{pages}\nobreakspace}%
+        \tabularnewline
+      }%
     }
-  \ExplSyntaxOff
-  The \acg{cd} booklet says\ldots
-\end{example}
+    {\AcroRerun}%
+    \acroheading
+    \acropreamble
+    \par\noindent
+    \begin{tabular}{>{\bfseries}lp{.7\linewidth}}
+      \AcronymTable
+    \end{tabular}
+  }
+\end{sourcecode}
 
-Please note that different endings are cumulative which you probably want to
-avoid! Imagine a macro
 \begin{sourcecode}
-  \NewAcroCommand \acgp
-    {
-      \acro_possessive:
-      \acro_plural:
-      \acro_use:n {#1}
+  \NewAcroTemplate[list]{toc}{%
+    \acroheading
+    \acropreamble
+    \acronopagerange
+    \acronymsmapF{%
+      \contentsline{\acroifchapterTF{chapter}{section}}
+        {\acrowrite{short}\acroifT{alt}{/\acrowrite{alt}}}
+        {}{}%
+      \contentsline{\acroifchapterF{sub}section}
+        {
+          \acrowrite{list}%
+          \acroifT{foreign}{\acrowrite{foreign}\acroifT{extra}{, }}%
+          \acroifT{extra}{\acrowrite{extra}}%
+          \acroifanyT{foreign,extra}{)}%
+        }
+        {\acropages{}{}}
+        {}%
     }
+    {\AcroRerun}
+  }
 \end{sourcecode}
-This would give \enquote{\ac{cd}s's} instead of \enquote{\ac{cd}s'}.  To solve
-this you might want to consider
+
+\subsection{New heading templates}\label{sec:new-head-templ}
+
+\section{Endings}\label{sec:endings}
+Referring to section~\vref{sec:other-endings} this section explains how to
+define and use additional endings.
+\begin{commands}
+  \command{DeclareAcroEnding}[\marg{name}\marg{short default}\marg{long default}]
+    This command can be used to define properties and options analoguous to
+    the plural endings which have been defined this way:
+\end{commands}
 \begin{sourcecode}
-    \ProvideAcroEnding {possessive-singular} {'s} {'s}
-    \ProvideAcroEnding {possessive-plural}   {s'} {s'}
+  \DeclareAcroEnding{plural}{s}{s}
 \end{sourcecode}
+In general \cs{DeclareAcroEnding}\marg{foo}\marg{x}\marg{y} defines these
+options
+\begin{options}
+  \keyval*{short-\meta{foo}-ending}{value}\Default*{\meta{x}}
+  \keyval*{long-\meta{foo}-ending}{value}\Default*{\meta{y}}
+\end{options}
+and these properties
+\begin{properties}
+  \propval*{short-\meta{foo}}{value}\Default*{\meta{x}}
+  \propval*{short-\meta{foo}-form}{value}\Default*
+  \propval*{alt-\meta{foo}}{value}\Default*{\meta{x}}
+  \propval*{alt-\meta{foo}-form}{value}\Default*
+  \propval*{long-\meta{foo}}{value}\Default*{\meta{y}}
+  \propval*{long-\meta{foo}-form}{value}\Default*
+  \propval*{foreign-\meta{foo}}{value}\Default*{\meta{y}}
+  \propval*{foreign-\meta{foo}-form}{value}\Default*
+  \propval*{single-\meta{foo}}{value}\Default*{\meta{y}}
+  \propval*{single-\meta{foo}-form}{value}\Default*
+  \propval*{extra-\meta{foo}}{value}\Default*{\meta{y}}
+  \propval*{extra-\meta{foo}-form}{value}\Default*
+\end{properties}
+In addition another command is defined which is meant to be used in
+template definitions.
+\begin{commands}
+  \command*{acro\meta{foo}}
+    This command tells the template that the ending \meta{foo} should be
+    used.
+\end{commands}
+Section~\vref{sec:own-acronym-commands} has an example of how this can be used
+to define a possessive ending and commands that make use of them like this:
+\begin{example}[side-by-side]
+  \acfg{MP}
+\end{example}
 
-\section{More on Customization}\label{sec:more-custom}
-\subsection{Background Information}
-Several of \acro's objects are customized using templates.  For each of these
-objects it is possible to define own templates\footnote{This requires some
-knowledge of \pkg{xtemplate} and expl3.  Plans are to provide a documented
-interface for users of \acro{} in the future.}.  Possibly more interesting: it
-is easily possible to define further instances of an object using a certain
-template.  How this works is explained in the following sections. However, the
-basics are always the same.  There is a command
+\section{Articles}\label{sec:articles}
+Referring to section~\vref{sec:other-articles} this section explains how to
+define and use additional articles.
 \begin{commands}
-  \command*{DeclareAcro\meta{object
-      type}Style}[\marg{name}\marg{template}\marg{options}]
-    which allows to define a new style (\ie, instance) for the object
-    \meta{object type} using the template \marg{template}.
+  \command{DeclareAcroArticle}[\marg{name}\marg{default}]
+    This command can be used to define properties and options analoguous to
+    the indefnite article which have been defined this way:
 \end{commands}
+\begin{sourcecode}
+  \DeclareAcroArticle{indefinite}{a}
+\end{sourcecode}
+In general \cs{DeclareAcroArticle}\marg{foo}\marg{x} defines the
+option
+\begin{options}
+  \keyval*{\meta{foo}}{value}\Default*{\meta{x}}
+\end{options}
+and these properties
+\begin{properties}
+  \propval*{short-\meta{foo}}{value}\Default*{\meta{x}}
+  \propval*{alt-\meta{foo}}{value}\Default*{\meta{x}}
+  \propval*{long-\meta{foo}}{value}\Default*{\meta{x}}
+  \propval*{foreign-\meta{foo}}{value}\Default*{\meta{x}}
+  \propval*{single-\meta{foo}}{value}\Default*{\meta{x}}
+  \propval*{extra-\meta{foo}}{value}\Default*{\meta{x}}
+\end{properties}
+In addition another command is defined which is meant to be used in
+template definitions.
+\begin{commands}
+  \command*{acro\meta{foo}}
+    This command tells the template that the article \meta{foo} should be
+    used.
+\end{commands}
+Section~\vref{sec:own-acronym-commands} has an example of how this can be used
+to define definite articles and commands that make use of them like this:
+\begin{example}
+  \dacs{hadopi} \par
+  \dacl{hadopi}
+\end{example}
 
-\subsection{Lists}\label{sec:lists}
-\subsubsection{Own List Style}
-
-The different existing list styles are all built from four different
-templates, \code{list}, \code{list-of}, \code{table} and \code{extra-table}.
-Those templates are defined with the help of the \pkg{xtemplate}
-package (from~\cite{bnd:l3packages}).  Each of these templates has a few
-options which are described in table~\vref{tab:list-templates}.  New list
-styles now are defined via the following macro:
-
+\section{Translations}\label{sec:translations}
+For adding additional keywords, or for adding translations to existing
+keywords, or for changing existing translations \acro\ uses this command:
 \begin{commands}
-  \command{DeclareAcroListStyle}[\marg{name}\marg{template}\marg{options}]
-    Declares a new \acro\ list style \meta{name}.  \meta{name} will be the
-    value which can be chosen in the option \option{list-style}.
-    \meta{template} is the name of the template to be used by the style.
-    Available templates are listed in table~\ref{tab:list-templates}.
-    \meta{options} are the option settings for the corresponding template.
+  \command{DeclareAcroTranslation}[\marg{key}\marg{language=translation list}]
+    With this command new translations keywords can be added and translations
+    for existing keywords can be changed.
+  \command{AddAcroTranslations}[\marg{key}\marg{language=translation list}]
+    Basically the same but this time per language rather than per keyword.
 \end{commands}
-
-\begin{table}
-  \centering
-  \caption{Available List Templates and Their Options}\label{tab:list-templates}
-  \begin{tabular}{*{4}{>{\ttfamily}l}}
-    \toprule
-      \normalfont\bfseries Template & \normalfont\bfseries Option &
-      \normalfont\bfseries Option Type & \normalfont\bfseries Default \\
-    \midrule
-      list        & list        & tokenlist & description \\
-                  & foreign-sep & tokenlist & \cs*{space} \\
-                  & reverse     & boolean   & false \\
-                  & before      & tokenlist \\
-                  & after       & tokenlist \\
-    \midrule
-      list-of     & style       & tokenlist & toc \\
-                  & foreign-sep & tokenlist & \cs*{space} \\
-                  & reverse     & boolean   & false \\
-                  & before      & tokenlist \\
-                  & after       & tokenlist \\
-    \midrule
-      table       & table       & tokenlist & tabular \\
-                  & table-spec  & tokenlist & lp\{.7\cs*{linewidth}\} \\
-                  & foreign-sep & tokenlist & \cs*{space} \\
-                  & reverse     & boolean   & false \\
-                  & before      & tokenlist \\
-                  & after       & tokenlist \\
-    \midrule
-      extra-table & table       & tokenlist & tabular \\
-                  & table-spec  & tokenlist & llll \\
-                  & foreign-sep & tokenlist & \cs*{space} \\
-                  & reverse     & boolean   & false \\
-                  & before      & tokenlist \\
-                  & after       & tokenlist \\
-    \bottomrule
-  \end{tabular}
-\end{table}
-
-For defining new styles you need some information on what the different
-templates and options do:
-\begin{itemize}
-  \item The option \code{list} of the \code{list} template sets the list
-    environment.  This must be a classic \LaTeX\ list where items are listed
-    with \cs*{item}.  In those lists short entries will always be fed as
-    optional argument to \cs*{item}: \\
-    \code{\cs*{item}[\meta{short}]\meta{long}\meta{extra}\meta{page}}
-  \item The template \code{list-of} simulates a table of contents or a list of
-    figures.  This can be chosen by setting the option \code{style} to either
-    \code{toc} or \code{lof}.
-  \item The template \code{table} typesets the list in a table with two
-    columns: \\
-    \code{\meta{short} \& \meta{long}\meta{extra}\meta{page}
-      \cs*{tabularnewline}}
-  \item The template \code{extra-table} typesets the list in a table with four
-    columns: \\
-    \code{\meta{short} \& \meta{long} \& \meta{extra} \& \meta{page}
-      \cs*{tabularnewline}}
-  \item The option \code{foreign-sep} is the code inserted between long form
-    and foreign entry (if a foreign entry is present).
-  \item The options \code{before} and \code{after} are inserted directly
-    before and after the complete list.
-  \item The option \code{reverse} switches the place of \meta{long} with
-    \meta{extra}.
-  \item The option \code{table-spec} sets the column types for the table
-    templates.  It must correspond to the number of columns the corresponding
-    template uses.
-\end{itemize}
-
-As an example let's define a style \code{longtabu} which uses the corresponding
-table environment from the package \pkg{tabu}~\cite{pkg:tabu}:
-
+As an example this is how \acro\ declares translations for the \code{pages}
+keyword:
 \begin{sourcecode}
-  \usepackage{tabu,longtable}
-  \DeclareAcroListStyle{longtabu}{table}{
-    table = longtabu ,
-    table-spec = @{}>{\bfseries}lX@{}
+  \DeclareAcroTranslation{pages}{
+    Fallback   = pp\abbrdot ,
+    English    = pp\abbrdot ,
+    French     = pp\abbrdot ,
+    German     = S\abbrdot ,
+    Portuguese = pp\abbrdot
   }
-  \acsetup{list-style=longtabu}
 \end{sourcecode}
-
-As another example let's define a new list with the help of the \pkg{enumitem}
-package~\cite{pkg:enumitem}:
-
+Translations for a language could be added this way\footnote{\acro\ already
+  has the translations for Italian.}:
 \begin{sourcecode}
-  % preamble:
-  % \usepackage{enumitem}
-  \newlist{acronyms}{description}{1}
-  \newcommand*\addcolon[1]{#1:}
-  \setlist[acronyms]{
-    labelwidth = 3em,
-    leftmargin = 3.5em,
-    noitemsep,
-    itemindent = 0pt,
-    font=\addcolon}
-  \DeclareAcroListStyle{mystyle}{list}{ list = acronyms }
-  \acsetup{ list-style = mystyle }
+  \AddAcroTranslations{Italian}{
+    list-name = Acronimi ,
+    page      = p\abbrdot ,
+    pages     = pp\abbrdot ,
+    sequens   = s\abbrdot ,
+    sequentes = ss\abbrdot ,
+    also      = anche ,
+    and       = e ,
+    or        = o
+  }
 \end{sourcecode}
-This would look as follows:
-\newlist{acronyms}{description}{1}
-\newcommand*\addcolon[1]{#1:}
-\setlist[acronyms]{
-  labelwidth=3em,
-  leftmargin=3.5em,
-  noitemsep,
-  itemindent=0pt,
-  font=\addcolon}
-\DeclareAcroListStyle{mystyle}{list}{ list = acronyms }
-\acsetup{list-style=mystyle,hyperref=false}
-\printacronyms
+The existing keywords had been shown in table~\vref{tab:translations}.
 
-\subsubsection{Own List Heading Command}
+\section{Properties}\label{sec:new-properties}
+As you know from section~\ref{sec:decl-acronyms-other} \acro\ comes with
+quiute a number of predefined properties for the control of acronyms.
+However, there are cases when additional properties would be nice to have and
+to use. \acro\ provides this command:
+\begin{commands}
+  \command{DeclareAcroProperty}[\sarg\qarg\barg\uarg\marg{name}]
+    This defines the new property \meta{name}.  The command has four optional
+    arguments most of which you probably never need. \par
+    The optional star \sym{*} ensures that each acronym gets a \emph{unique}
+    value for the property. \par
+    The optional question mark \sym{?} creates a \emph{boolean} property.
+    That is a property that only can get the values \code{true} or
+    \code{false} and when it is used without value (not an empty value!) then
+    \code{true} is assumed. \par
+    The optional exclamation mark \sym{!} creates a \emph{mandatory}
+    property. An error if raised if an acronym does not set it. \par
+    The optional pipe \sym{|} creates a \emph{static} property which means
+    its value is written to an auxiliary file and read in again at begin
+    document.  Once set the value is the same throughout the document
+  \command{DeclareAcroPropertyAlias}[\sarg\qarg\barg\uarg\marg{name1}\marg{name2}]
+    This newly declares property \meta{name1} and makes it an alias of
+    property \meta{name2}.  This means that \meta{name1} gets the same value
+    that \meta{name2} has unless it is set explicitly.  Property \meta{name2}
+    must exist.
+  \command{MakeAcroPropertyAlias}[\marg{name1}\marg{name2}]
+    This makes property \meta{name1} and makes it an alias of property
+    \meta{name2}. Both properties must exist.
+\end{commands}
+Exmaples for defining and using new properties are shown in
+section~\ref{sec:examples}, \ac*{eg}, examples~\ref{example:texsx-505891}
+or~\ref{example:texsx-507726}.
 
-With the option \option{list-heading} you can choose which command prints the
-heading of the list.  If you need a different choice than what's already
-provided you can use the following command to define a new option:
+\section{Own acronym commands}\label{sec:own-acronym-commands}
+\subsection{Background}
+You can define own acronym commands or redefine the existing ones with
+commands similar to \cs*{NewDocumentCommand} from the \pkg{xparse}
+package~\cite{pkg:xparse}.
 \begin{commands}
-  \command{DeclareAcroListHeading}[\marg{name}\marg{control sequence}]
-    Defines a new value \meta{name} for the option \option{list-heading}.
-    \meta{control sequence} must be a control sequence which takes one
-    mandatory argument.
+  \command{NewAcroCommand}[\marg{command}\marg{arg. spec.}\marg{code}]
+    This creates the new command \meta{command} with the argument
+    specification\footnote{in the sense of an \pkg{xparse}
+      command.} \code{so\meta{arg. spec.}} and replacement text \meta{code}.
+    There are significant differences to \cs*{NewDocumentCommand}: the new
+    command always has two additional arguments: an optional star and an
+    optional argument for options.  You can ignore this fact in your
+    definition, though.  However, the command \emph{must} at least have one
+    argument \emph{and} the first argument \emph{must} refer to the \ac{id}.
+    Everything else is up to you. \par
+    The new command has the suiting framework to recognize trailing tokens,
+    count usage, index, and add a citation if necessary.
+  \command{RenewAcroCommand}[\marg{command}\marg{arg. spec.}\marg{code}]
+    Like \cs{NewAcroCommand} but redefines an existing command.
+  \command{UseAcroTemplate}[\oarg{type}\marg{name}\oarg{argument number}\meta{arguments}]
+    The argument \meta{type} defaults to \code{acronym} and \meta{argument
+      number} defaults to \code{1}.  The command must be followed by as many
+    mandatory arguments as you specify with \meta{argument number}.  All
+    predefined acronym templates use the first argument as \ac{id} so they
+    must use one argument.
 \end{commands}
-As an example here is how the value \code{section} is defined:
+Let's see an example. This is the definition of \cs{ac}:
 \begin{sourcecode}
-  \DeclareAcroListHeading{section}{\section}
+  \NewAcroCommand\ac{m}{\UseAcroTemplate{first}{#1}}
 \end{sourcecode}
+Equivalent definitions would be:
+\begin{sourcecode}
+  \NewAcroCommand\ac{m}{\UseAcroTemplate[acroynm]{first}{#1}}
+  \NewAcroCommand\ac{m}{\UseAcroTemplate[acroynm]{first}[1]{#1}}
+  \NewAcroCommand\ac{m}{\UseAcroTemplate{first}[1]{#1}}
+  \NewAcroCommand\ac{m}{\UseAcroTemplate{first}[2]{#1}{}}
+\end{sourcecode}
 
-\subsection{First Styles}
-The first styles define how an acronym is typeset when it is used for the
-first time.  It is set with the option \option{first-style}.  Legal values for
-this option are defined with the following command:
+There are a number of switch commands which determine a certain behavior.
+They tell the following template how to interpret certain conditionals and how
+to use \cs{acrowrite}.
 \begin{commands}
-  \command{DeclareAcroFirstStyle}[\marg{name}\marg{template}\marg{options}]
-    Declares a new \acro\ first style \meta{name}.  \meta{name} will be the
-    value which can be chosen in the option \option{first-style}.
-    \meta{template} is the name of the template to be used by the style.
-    Available templates are listed in table~\ref{tab:first-templates}.
-    \meta{options} are the option settings for the corresponding template.
+  \command{acrocite}
+    Tells \acro\ to output the citation.
+  \command{acrodonotuse}
+    Tells \acro\ to not count this as usage.
+  \command{acroplural}
+    Use plural form.
+  \command{acroindefinite}
+    Use indefinite article
+  \command{acroupper}
+    Use uppercase form.
+  \command{acrofull}
+    Use first or full form.
 \end{commands}
 
-Here are two examples of the already available styles and how they are
-defined:
+Here is an example that makes use of them:
 \begin{sourcecode}
-  \DeclareAcroFirstStyle{short}{inline}{
-    only-short = true ,
-    brackets   = false
+  \NewAcroCommand\Iacs{m}{%
+    \acroupper\acroindefinite\UseAcroTemplate{short}{#1}%
   }
-  \DeclareAcroFirstStyle{sidenote-reversed}{note}{
-    note-command = \sidenote{#1} ,
-    reversed     = true
-  }
 \end{sourcecode}
 
-\begin{table}[!h]
-  \centering
-  \caption{Available First Style Templates and Their Options}\label{tab:first-templates}
-  \begin{tabular}{*{4}{>{\ttfamily}l}}
-    \toprule
-      \normalfont\bfseries Template & \normalfont\bfseries Option &
-      \normalfont\bfseries Option Type & \normalfont\bfseries Default \\
-    \midrule
-      inline      & brackets      & boolean   & true \\
-                  & brackets-type & tokenlist & () \\
-                  & only-short    & boolean   & false \\
-                  & only-long     & boolean   & false \\
-                  & reversed      & boolean   & false \\
-                  & between       & tokenlist \\
-                  & foreign-sep   & tokenlist & ,\textasciitilde \\
-    \midrule
-      note        & use-note     & boolean   & true \\
-                  & note-command & function  & \cs*{footnote}\Marg{\#1} \\
-                  & reversed     & boolean   & false \\
-                  & foreign-sep  & tokenlist & ,\textasciitilde \\
-    \bottomrule
-  \end{tabular}
-\end{table}
-
-\subsection{Extra Styles}
-The extra styles define how the extra information of an acronym is typeset in
-the list.  It is set with the option \option{extra-style}.  Legal values for
-this option are defined with the following command:
-\begin{commands}
-  \command{DeclareAcroExtraStyle}[\marg{name}\marg{template}\marg{options}]
-    Declares a new \acro\ extra style \meta{name}.  \meta{name} will be the
-    value which can be chosen in the option \option{extra-style}.
-    \meta{template} is the name of the template to be used by the style.
-    Available templates are listed in table~\ref{tab:extra-templates}.
-    \meta{options} are the option settings for the corresponding template.
-\end{commands}
-
-Here are two examples of the already available styles and how they are
-defined:
+\subsection{Create commands for possessive endings}
+Let's say you want to add an ending for the genitive case.
+First you define the appropriate ending:
 \begin{sourcecode}
-  \DeclareAcroExtraStyle{default}{inline}{
-    brackets     = false ,
-    punct        = true ,
-    punct-symbol = .
+  \DeclareAcroEnding{possessive}{'s}{'s}
+\end{sourcecode}
+Then you define commands which make use of this ending:
+\begin{sourcecode}
+  \NewAcroCommand\acg{m}{\acropossessive\UseAcroTemplate{first}{#1}}
+  \NewAcroCommand\acsg{m}{\acropossessive\UseAcroTemplate{short}{#1}}
+  \NewAcroCommand\aclg{m}{\acropossessive\UseAcroTemplate{long}{#1}}
+  \NewAcroCommand\acfg{m}{%
+    \acrofull
+    \acropossessive
+    \UseAcroTemplate{first}{#1}%
   }
-  \DeclareAcroExtraStyle{paren}{inline}{
-    brackets     = true ,
-    punct        = true ,
-    punct-symbol =
+  \NewAcroCommand\iacsg{m}{%
+    \acroindefinite
+    \acropossessive
+    \UseAcroTemplate{short}{#1}%
   }
 \end{sourcecode}
+You maybe also define acronyms with corresponding properties\footnote{Bear
+  with me if this is incorrect: English is not my native language.}:
+\begin{sourcecode}
+  \DeclareAcronym{MP}{
+    short = MP ,
+    long  = Member of Parliament ,
+    plural-form = Members of Parliament ,
+    long-possessive-form = Member's of Parliament
+  }
+\end{sourcecode}
+Now you can use it like this:
+\begin{example}
+  This is the \acg{MP} first day at work after \dots
+\end{example}
 
-\begin{table}
-  \centering
-  \caption{Available Extra Style Templates and Their Options}\label{tab:extra-templates}
-  \begin{tabular}{*{4}{>{\ttfamily}l}}
-    \toprule
-      \normalfont\bfseries Template & \normalfont\bfseries Option &
-      \normalfont\bfseries Option Type & \normalfont\bfseries Default \\
-    \midrule
-      inline      & punct         & boolean   & true \\
-                  & punct-symbol  & tokenlist & , \\
-                  & brackets      & boolean   & true \\
-                  & brackets-type & tokenlist & () \\
-    \bottomrule
-  \end{tabular}
-\end{table}
-
-\subsection{Page Number Styles}
-The page number styles define how the page numbers where acronyms have been
-used are typeset in the list.  It is set with the option \option{page-style}.
-Legal values for this option are defined with the following command:
+\section{Own \acro\ style files}
+When you want to use your definitions regarding \acro\ repeatedly then it
+makes sense to put them in a file which you put somewhere in your local
+\LaTeX\ tree.  There are three options:
+\begin{enumerate}
+  \item Put them in a simple \code{.tex} file in \cs*{input} it.
+  \item Put in in a \code{.sty} file and include it with \cs*{usepackage}
+    \emph{after} \acro.
+  \item Create a style file following this pattern decribed below.
+\end{enumerate}
+\begin{center}
+  \code{acro.style.\meta{name}.code.tex}
+\end{center}
+This file should start with
+\begin{sourcecode}
+  \AcroStyle{name}
+\end{sourcecode}
+and input the file with \cs{acsetup} using the option
+\begin{options}
+  \keyval{load-style}{name}
+    This is more or less the same as if you'd use the package variant but
+    naturally ensures that you load it after \acro\ and in the future might
+    provide other bells and whistles, too.
+\end{options}
+The command
 \begin{commands}
-  \command{DeclareAcroPageStyle}[\marg{name}\marg{template}\marg{options}]
-    Declares a new \acro\ extra style \meta{name}.  \meta{name} will be the
-    value which can be chosen in the option \option{page-style}.
-    \meta{template} is the name of the template to be used by the style.
-    Available templates are listed in table~\ref{tab:page-templates}.
-    \meta{options} are the option settings for the corresponding template.
+  \command{AcroStyle}[\sarg\marg{style}\oarg{details}]
+    has an optional star which switches to expl3 syntax.  It also has an
+    optional argument \meta{details} with the same purpose and usage as
+    the one from \cs*{ProvidesPackage}. A typical usage would look like
 \end{commands}
-
-Here are two examples of the already available styles and how they are
-defined:
 \begin{sourcecode}
-  \DeclareAcroPageStyle{default}{inline}{
-    punct = true ,
-    punct-symbol = .
+  \AcroStyle{abbrev}[2020/04/21 abbreviations with acro (CN)]
+  \NewDocumentCommand\newabbreviation{mmm}{%
+    \DeclareAcronym{#1}{ short = #2 , #3 , class = abbrev , no-index }%
   }
-  \DeclareAcroPageStyle{paren}{inline}{
-    brackets=true ,
-    punct-symbol = ~
+  \NewDocumentCommand\printabbreviations{O{}}{%
+    \printacronyms[#1,include=abbrev]%
   }
 \end{sourcecode}
+  
+\clearpage
+\appendix
+\part{Appendix}\label{part:appendix}
 
-\begin{table}
-  \centering
-  \caption{Available Page Number Style Templates and Their
-    Options}\label{tab:page-templates}
-  \begin{tabular}{*{3}{>{\ttfamily}l}>{\ttfamily}p{.25\linewidth}}
-    \toprule
-      \normalfont\bfseries Template & \normalfont\bfseries Option &
-      \normalfont\bfseries Option Type & \normalfont\bfseries Default \\
-    \midrule
-      inline & display       & boolean   & true \\
-             & punct         & boolean   & false \\
-             & punct-symbol  & tokenlist & , \\
-             & brackets      & boolean   & false \\
-             & brackets-type & tokenlist & () \\
-             & space         & skip      & .333333em plus .166666em minus
-                                           .111111em \\
-    \bottomrule
-  \end{tabular}
-\end{table}
+\section{Examples}\label{sec:examples}
 
-\subsection{Configuration Files}
-If\sinceversion{2.2} you repeatedly have the same setup and definitions for
-\acro\ in your preamble\footnote{For example defining new endings, \acro{}
-  commands, list styles, \ldots} you might want to place those in a
-configuration file.  If \acro\ finds a file named \code{acro.cfg} present it
-inputs it at the end of the package.  The only thing to be aware of is that
-this file is input like a package which means that \code{@} is treated as a
-letter (category code~11).
+\listexamplefiles
 
-\appendix
+\printacronyms[
+  preamble = {\label{sec:acronyms}Below all abbreviations are listed which
+    have been defined for the manual.} ,
+  exclude = {exclude,glossary}
+]
 
-\acsetup{
-  list-style       = description ,
-  list-heading     = section ,
-  list-name        = All Acronyms Used in this Documentation ,
-  page-style       = comma ,
-  following-pages* = true ,
-  extra-style      = comma
-}
-
-\printacronyms
-
 \printbibliography
 
 \end{document}

Deleted: trunk/Master/texmf-dist/doc/latex/acro/acro.history
===================================================================
--- trunk/Master/texmf-dist/doc/latex/acro/acro.history	2020-04-29 21:21:14 UTC (rev 54936)
+++ trunk/Master/texmf-dist/doc/latex/acro/acro.history	2020-04-29 21:22:29 UTC (rev 54937)
@@ -1,286 +0,0 @@
---------------------------------------------------------------------------
-the ACRO package
-
-  Typeset Acronyms
-
---------------------------------------------------------------------------
-Clemens Niederberger
-Web:    https://bitbucket.org/cgnieder/acro/
-E-Mail: contact at mychemistry.eu
---------------------------------------------------------------------------
-Copyright 2011--2020 Clemens Niederberger
-
-This work may be distributed and/or modified under the
-conditions of the LaTeX Project Public License, either version 1.3
-of this license or (at your option) any later version.
-The latest version of this license is in
-  http://www.latex-project.org/lppl.txt
-and version 1.3 or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
-
-This work has the LPPL maintenance status `maintained'.
-
-The Current Maintainer of this work is Clemens Niederberger.
---------------------------------------------------------------------------
-The acro package consists of the files
-- acro.sty, acro.definitions.tex, acro.cfg
-- acro-manual.tex, acro-manual.pdf, acro-manual.cls
-- acro.history, README
---------------------------------------------------------------------------
-If you have any ideas, questions, suggestions or bugs to report, please
-feel free to contact me.
---------------------------------------------------------------------------
-2012/06/22 v0.1   - first public release
-2012/06/23 v0.1a  - bug fix, added `strict' and `macros' option and creation of
-                    shortcut macros
-                  - added capitalized version of long forms
-                  - added `sort' option
-2012/06/24 v0.1b  - added \Acf and \Acfp, added option `plural-ending'
-2012/06/24 v0.1c  - added excluded argument to \printacronyms
-2012/06/24 v0.2   - renamed \NewAcronym => \DeclareAcronym
-                    \AcronymFormat => \DeclareAcronymFormat
-2012/06/25 v0.2a  - new first-style's: `short' and `reversed'
-2012/06/25 v0.3   - new list formats: extra-tabular, extra-longtable,
-                    extra-tabular-rev, extra-longtable-rev
-                  - extra precaution when using \printacronyms to avoid errors.
-2012/06/27 v0.3a  - new option `list-caps', \Acp added
-2012/06/29 v0.3b  - extended the `text' template to the `acro-first' object
-                  - added `acro-first' instances `plain' and `plain-reversed'
-2012/07/16 v0.3c  - small adjustments to the documentation
-2012/07/23 v0.3d  - first CTAN version
-2012/07/24 v0.3e  - adapted to updated l3kernel
-2012/09/28 v0.4   - added means to add citations to acronyms
-2012/10/07 v0.4a  - new options: "uc-cmd", "list-long-format"
-                  - preliminary language support, needs package `translations'
-2012/11/30 v0.5   - added starred variants of the commands that won't mark an
-                    acronym as used
-                  - added \acreset{<id>}
-                  - added preliminary support for pdf strings: in pdf strings
-                    always the singular lowercase short version is inserted
-                    (the equivalent of \acs)
-2012/12/14 v0.6   - bug with not-colored links resolved
-                  - bug introduced with the last update (full expansion of the
-                    short entry) resolved
-                  - option `xspace' added
-2013/01/02 v0.6a  - \acuseall
-2013/01/16 v1.0   - new syntax of \DeclareAcronym
-                  - new option `version'
-                  - new `accsupp' acronym property
-                  - new `sort' acronym property
-                  - new syntax of \printacronyms
-                  - new default: `sort=true' 
-                  - new options `page-ranges', `next-page', `next-pages',
-                    `pages-name', `record-pages'
-                  - no automatic label placement for page number referencing
-                    any more
-2013/01/26 v1.1   - bug fix in the plural detection
-                  - new keys `long-pre' and `long-post'
-                  - new keys `index', `index-sort' and `index-cmd'
-                  - new options `index' and `index-cmd'
-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
-2013/04/04 v1.2a  - added Portuguese translations
-2013/05/06 v1.3   - protected internal commands where appropriate
-                  - new option `sort' to \printacronyms
-                  - renamed options `print-acronyms/header' and `list-header'
-                    into `print-acronyms/heading' and `list-heading'
-                  - fix: added missing group to \printacronyms
-                  - add key `foreign'
-                  - rewritten page-recording:
-                    * most importantly: record them at shipout; this is done
-                      when \acro at used@once or \acro at used@twice are written to
-                      the aux file
-                    * no restrictions regarding \pagenumbering
-                    * options `page-ranges' and `record-pages' are deprecated
-                    * new options `following-page' and `following-pages'
-                  - disable \@noitemerr in the list of acronyms: we don't need
-                    it there but there are occasions when it is annoying
-                  - cleaned the sty file, added a few more comments
-2013/05/09 v1.3a  - Bug fix: corrected wrong argument checking in \Ac, thanks
-                    to Michel Voßkuhle
-2013/05/30 v1.3b  - obey \if at filesw
-2013/06/16 v1.3c  - added \leavevmode to \acro_get:n
-2013/07/08 v1.3d  - corrected wrong call of \leavevmode in the list
-                    (list-type=list)
-2013/08/07 v1.3e  - bug fix in the list when testing for used acronyms
-                  - new commands \acifused, \acfirstupper
-2013/08/27 v1.4   - new property `list'
-2013/09/02 v1.4a  - bug fix: used acronyms are added to the list when the list
-                    is printed before the use
-                  - \DeclareAcronym may now be used after \begin{document}
-2013/09/24 v1.4b  - bug fix: only-used=false works again for only declared but
-                    unused acronyms (only if option single is not used)
-2013/11/04 v1.4c  - remove \hbox from the written short form
-                  - changed \__acro_make_link:nNN in a way that it doesn't box
-                    its when links are deactivated
-2013/11/22 v1.4d  - require `l3sort' independently from the `sort' option
-                    instead of at begin document in order to avoid conflicts
-                    with `babel' and `french'
-2013/12/18 v1.5   - new option `label=true|false' that
-                    places \label{<prefix>:<id>} the first time an acronym is
-                    used
-                  - new option `pages=first|all' that determines if in the list
-                    of acronyms all appearances are listed or only the first
-                    time; implicitly sets `label=true'
-2015/02/26 v1.6   - new `acro-title' instance `none'
-                  - change of expl3's tl uppercasing function (adapt to updates
-                    of l3kernel and friends
-                  - new package option `messages=silent|loud'
-                  - fix issue https://bitbucket.org/cgnieder/acro/issue/23/
-                  - fix issue https://bitbucket.org/cgnieder/acro/issue/24/
-                  - fix issue https://bitbucket.org/cgnieder/acro/issue/28/
-                  - drop support for version 0
-2015/04/08 v1.6a  - more generalized user command definitions, see
-                    http://tex.stackexchange.com/q/236362/ for an application
-2015/05/10 v1.6b  - \ProcessKeysPackageOptions ,
-                  - correct bug http://tex.stackexchange.com/q/236860/ :
-                    option `pages = first' works again
-2015/08/16 v2.0   - fix https://bitbucket.org/cgnieder/acro/issue/36
-                  - implement https://bitbucket.org/cgnieder/acro/issue/39
-                  - implement https://bitbucket.org/cgnieder/acro/issue/40
-                    (=> new option `group-cite-cmd')
-                  - add ideas for https://bitbucket.org/cgnieder/acro/issue/41
-                  - implement https://bitbucket.org/cgnieder/acro/issue/18
-                  - implement https://bitbucket.org/cgnieder/acro/issue/43
-                  - further generalization for defining user commands:
-                    \NewAcroCommand, \NewPseudoAcroCommand and siblings
-                  - bug fix in indefinite versions with first-upper
-                  - add `short-<ending>-form' equivalent to
-                    `long-<ending>-form'
-                    (https://bitbucket.org/cgnieder/acro/issue/44)
-                  - implement https://bitbucket.org/cgnieder/acro/issue/35
-                  - new option `single-form'
-2015/08/25 v2.0a  - fix https://bitbucket.org/cgnieder/acro/issue/38 and
-                    https://bitbucket.org/cgnieder/acro/issue/49
-2015/08/29 v2.0b  - fix https://bitbucket.org/cgnieder/acro/issue/44
-                  - fix https://bitbucket.org/cgnieder/acro/issue/45
-                  - implement https://bitbucket.org/cgnieder/acro/issue/42
-2015/09/05 v2.1   - add list object type `list-of' that prints the list like a
-                    toc or lof, new option `list-short-width',
-                  - 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*[]{}
-2016/01/07 v2.2a  - \prop_get:Nn => \prop_item:Nn
-2016/01/21 v2.2b  - fix issue #59
-2016/02/02 v2.2c  - fix issue #60
-2016/03/14 v2.3   - foreign-format may be a macro taking an argument
-                  - \Aca, \Acsingle
-                  - properties `single' and `single-format', option
-                    `single-format' => issue #62
-                  - property `first-style' => issue #61
-                  - fix issue #64: long-post entry is now added *after* the
-                    endings
-                  - property `foreign-lang'
-                  - fix issue #65
-2016/03/25 v2.4   - extend class mechanism: classes can be used like tags
-                  - add idea of `barriers' and list local to those barriers
-                    => new option `reset-at-barriers'
-                    => new option `local-to-barriers' for \printacronyms
-                    => new command \acbarrier
-2016/04/14 v2.4a  - if undefined acronym is used and `messages = silent' is
-                    active don't through error
-2016/05/03 v2.4b  - expand `pdfstring' property before saving => issue #69
-                  - \ProvideAcroEnding can be used twice – it then just sets
-                    the defaults
-                  - the option <ending>-ending has a new syntax:
-                    * <ending>-ending = <val> sets all endings to <val>
-                    * <ending>-ending = <val1>/<val2> sets short endings to
-                      <val1> and long endings to <val2>
-                  - a single appearance should be treated like a first
-                    appearance as far as citations are concerned
-2016/05/25 v2.5   - some of the entries added to the aux file need to be
-                    written \immediate in order to avoid this trap:
-                    http://tex.stackexchange.com/q/116001/
-                  - cleaner interface for first-style template definitions
-                  - new `acro-first' instances `footnote-reversed' and
-                    `sidenote-reversed'
-                  - new commands \DeclareAcroFirstStyle, \DeclareAcroExtraStyle
-                    and \DeclareAcroPageStyle
-                  - add warning `ending-before-acronyms' to options setting the
-                    defaults of an ending; this should avoid confusion
-                  - property declaration for acronyms should be handled by
-                    internal functions
-                  - improvements in the list template code
-                  - logging info when an acronym is declared
-                  - remove deprecated options
-                  - new option `use-barriers'
-                  - new option `following-pages*'
-                  - option `page-ref' replaced by option `page-style'
-2016/05/26 v2.5a  - bug fix: remove erroneous group in `<ending>-ending' option
-2016/05/30 v2.5b  - fix issue #72
-2016/07/20 v2.6   - \l__acro_use_acronyms_bool can be used to disable \ac
-                    e.g. in the trial phase of a table like `tabu'; interface:
-                    \acro_switch_off: and \acswitchoff
-                  - fix issue #79
-                  - fix issue #74
-                  - fix error: acronyms with same sort entry are not
-                    overwritten any more in the list of acronyms
-2016/08/13 v2.6a  - fix issues #80 and #81
-2016/08/13 v2.6b  - version stepped by accident
-2016/08/16 v2.6c  - really fixes issue #81
-2016/08/30 v2.6d  - fix issue #82
-2016/09/04 v2.6e  - fix issue in http://tex.stackexchange.com/q/270034/
-2017/01/22 v2.7   - rename \acro_get_property:nn into \__acro_get_property:nn
-                  - \acro_get_property:nn, \acro_get_property:nnTF,
-                    \acro_if_property:nnTF, retrieve property without error if
-                    not set
-                  - make \__acro_declare_property functions public
-                  - \acro_add_action:n (adds code to \acro_get:n)
-2017/02/09 v2.7a  - adapt to integration of l3sort into l3kernel
-2017/06/21 v2.7b  - fix issue #93
-2017/08/28 v2.7c  - fix issue #96
-2018/01/30 v2.8   - fix issue #94
-                  - document `format-include-endings', fix issue #99
-                  - new property `post'
-                  - \aciffirst
-                  - resolve issue #95
-2019/02/17 v2.9   - small redefinition of \acro_get_foreign:n which allows
-                    `foreign-sep' to be a &
-                  - fix issue #116
-                  - implemented issue #112
-2019/09/23 v2.10  - fix issue #120
-                  - fix isuue #128
-                  - fix issue #129
-                  - fix issue #131
-                  - new: \Acs \Acsp \Aca \Acap
-                  - new: `alt-format'
-                  - new: `uppercase-short'
-                  - a change to how usage is determined (see def. of
-                    \acro_is_used:nTF)
-2019/10/02 v2.10a - fix newly introduced issue #135
-2019/10/06 v2.10b - fix issue #137
-                  - clearer documentation of `uppercase-short'
-                  - set the default of `uppercase-short' to `true'
-2019/10/12 v2.10c - fix issue #139
-2019/12/30 v2.10d - fix issue #76
-                  - fix issue #141
-		  - fix issue #143
-2020/01/11 v2.11  - new commands \acpsingle and \Acpsingle
-                  - fix issues with optional arguments of the `cite' property
-		  - new properties `before-citation' and `after-citation'
-		  - new options `config-file-name' and `config-file-extension'
-		  - new option `case-sensitive'
-		  - rename the manual file and use a dedicated class for the
-                    manual
-		  - prefer lazy boolean evaluation when possible
-2020/01/16 v2.11a - adapt to new l3text module
-2020/01/24 v2.11b - fix issue #147
-2020/02/03 v2.11c - fix issue #76
-2020/03/07 v2.11c - fix issues #149 and #150

Deleted: trunk/Master/texmf-dist/doc/latex/acro/example_one.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/acro/example_one.tex	2020-04-29 21:21:14 UTC (rev 54936)
+++ trunk/Master/texmf-dist/doc/latex/acro/example_one.tex	2020-04-29 21:22:29 UTC (rev 54937)
@@ -1,89 +0,0 @@
-% arara: pdflatex
-% arara: pdflatex
-\documentclass{scrartcl}
-\usepackage[T1]{fontenc}
-\usepackage[ngerman]{babel}
-\usepackage{acro}
-\acsetup{
-  page-style  = paren , % Seitennummer in Klammern
-  extra-style = comma , % extra-Informationen mit Komma anhängen
-  only-used   = false   % für das Beispiel auch die nicht verwendeten in die Liste aufnehmen
-}
-
-\usepackage{longtable,siunitx}
-
-\DeclareAcronym{ecm}{
-  short = ECM ,
-  long  = Electro Chemical Machining ,
-  extra = Elektrochemisches Abtragen
-}
-\DeclareAcronym{adc}{
-  short = ADC ,
-  long  = Analog-to-Digital-Converter
-}
-\DeclareAcronym{edm}{
-  short = EDM ,
-  long  = Electro Discharge Machining
-}
-\DeclareAcronym{ecdm}{
-  short = ECDM ,
-  long  = Electro Chemical Discharge Machining ,
-  extra = Kombination aus \acs{ecm} und \acs{edm}
-}
-
-% "Acronyme" (tatsächlich physikalische Größen) einer speziellen Klasse:
-\DeclareAcronym{f}{
-  short = \ensuremath{f} ,
-  long  = Frequenz ,
-  extra = \si{\hertz} ,
-  class = physics
-}
-\DeclareAcronym{A}{
-  short = \ensuremath{A} ,
-  long  = Fläche ,
-  extra = \si{\metre^2} ,
-  class = physics
-}
-\DeclareAcronym{C}{
-  short = \ensuremath{C} ,
-  long  = Kapazität ,
-  extra = \si{\farad} ,
-  class = physics
-}
-\DeclareAcronym{F}{
-  short = \ensuremath{F} ,
-  long  = Kraft ,
-  extra = \si{\newton} ,
-  class = physics
-}
-
-\DeclareAcroListStyle{physics}{extra-table}{
-  table   = longtable ,
-  table-spec = @{}lll@{\extracolsep{\fill}}l@{} ,
-  reverse = true ,
-  before =
-    \setlength\LTleft{0pt}%
-    \setlength\LTright{0pt}%
-    \acsetup{
-      extra-style = plain ,
-      page-style = plain ,
-      pages = all
-    }%
-}
-
-\begin{document}
-
-erstes Mal: \ac{ecm}
-
-zweites Mal: \ac{ecm}
-
-\ac{F}
-
-% % alle außer der Klasse 'physics' auflisten:
-\printacronyms[exclude-classes=physics, name=Abkürzungsverzeichnis]
-
-% nur die Klasse 'physics' auflisten:
-\acsetup{list-style = physics}
-\printacronyms[include-classes=physics, name=Formelverzeichnis]
-
-\end{document}

Deleted: trunk/Master/texmf-dist/doc/latex/acro/example_two.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/acro/example_two.tex	2020-04-29 21:21:14 UTC (rev 54936)
+++ trunk/Master/texmf-dist/doc/latex/acro/example_two.tex	2020-04-29 21:22:29 UTC (rev 54937)
@@ -1,116 +0,0 @@
-% arara: pdflatex
-% arara: pdflatex
-% this file is an adapted version of acrotest.tex shipped out
-% with the `acronym' package
-\documentclass{article}
-\usepackage[T1]{fontenc}
-\usepackage[english]{babel}
-\usepackage[colorlinks]{hyperref}
-\usepackage{acro}
-
-\acsetup{
-  sort = true ,
-  page-style = comma ,
-  extra-style = paren ,
-  hyperref =true
-}
-
-\DeclareAcronym{CDMA}{
-  short            = CDMA ,
-  long             = Code Division Multiple Access ,
-  long-plural      = es
-}
-\DeclareAcronym{GSM}{
-  short            = GSM ,
-  long             = Global System for Mobile communication
-}
-\DeclareAcronym{NA}{
-  short            = {\ensuremath{N_{\mathrm{A}}}} ,
-  long             = Number of Avogadro ,
-  extra            = see \S\ref{Chem} ,
-  pdfstring        = NA
-}
-\DeclareAcronym{NAD+}{
-  short            = {NAD\textsuperscript{+}} ,
-  short-plural     = ,
-  long             = Nicotinamide Adenine Dinucleotide ,
-  pdfstring        = NAD+
-}
-\DeclareAcronym{NUA}{
-  short            = NUA ,
-  long             = Not Used Acronym
-}
-\DeclareAcronym{TDMA}{
-  short            = TDMA ,
-  long             = Time Division Multiple Access ,
-  long-plural      = es
-}
-\DeclareAcronym{UA}{
-  short            = UA ,
-  long             = Used Acronym
-}
-\DeclareAcronym{lox}{
-  short            = {\emph{LOX}} ,
-  long             = Liquid Oxygen ,
-  pdfstring        = LOX
-}
-\DeclareAcronym{lh2}{
-  short            = {\emph{LH\textsubscript{2}}} ,
-  long             = Liquid Hydrogen ,
-  pdfstring        = LH2
-}
-\DeclareAcronym{IC}{
-  short            = IC ,
-  long             = Integrated Circuit
-}
-\DeclareAcronym{BUT}{
-  short            = BUT ,
-  long             = Block Under Test ,
-  long-plural-form = Blocks Under Test
-}
-\begin{document}
-
-\section{Intro}
-In the early nineties, \acs{GSM} was deployed in many European
-countries. \ac{GSM} offered for the first time international
-roaming for mobile subscribers. The \acs{GSM}'s use of \ac{TDMA} as
-its communication standard was debated at length. And every now
-and then there are big discussion whether \ac{CDMA} should have
-been chosen over \ac{TDMA}.
-
-\section{Furthermore}
-\acresetall
-The reader could have forgotten all the nice acronyms, so we repeat the
-meaning again.
-
-If you want to know more about \acf{GSM}, \acf{TDMA}, \acf{CDMA}
-and other acronyms, just read a book about mobile communication. Just
-to mention it: There is another \ac{UA}, just for testing purposes!
-
-\begin{figure}[h]
-Figure
-\caption{A float also admits references like \ac{GSM} or \acf{CDMA}.}
-\end{figure}
-
-\subsection{Some chemistry and physics}
-\label{Chem}
-\ac{NAD+} is a major electron acceptor in the oxidation
-of fuel molecules. The reactive part of \ac{NAD+} is its nictinamide
-ring, a pyridine derivate.
-
-One mol consists of \acs{NA} atoms or molecules. There is a relation
-between the constant of Boltzmann and the \acl{NA}:
-\begin{equation}
-  k = R/\acs{NA}
-\end{equation}
-
-\acl{lox}/\acl{lh2} (\acs{lox}/\acs{lh2})
-
-\subsection{Some testing fundamentals}
-When testing \acp{IC}, one typically wants to identify functional
-blocks to be tested separately. The latter are commonly indicated as
-\acp{BUT}. To test a \ac{BUT} requires defining a testing strategy\dots
-
-\printacronyms
-
-\end{document}

Added: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.acflike.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.acflike.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.acflike.pdf	2020-04-29 21:21:14 UTC (rev 54936)
+++ trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.acflike.pdf	2020-04-29 21:22:29 UTC (rev 54937)

Property changes on: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.acflike.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.acflike.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.acflike.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.acflike.tex	2020-04-29 21:22:29 UTC (rev 54937)
@@ -0,0 +1,17 @@
+\documentclass{article}
+\usepackage[ngerman]{babel}
+\usepackage{acro}
+\acsetup{format/long=\itshape}
+
+\DeclareAcronym{cd}{short = CD, long = Compact Disc}
+
+\RenewAcroCommand\acflike{mm}{%
+  \acroformat{long}{#2} (\UseAcroTemplate{short}{#1})%
+}
+
+\begin{document}
+
+\ac{cd} \par
+\acflike{cd}{Rohling}
+
+\end{document}


Property changes on: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.acflike.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.basic.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.basic.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.basic.pdf	2020-04-29 21:21:14 UTC (rev 54936)
+++ trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.basic.pdf	2020-04-29 21:22:29 UTC (rev 54937)

Property changes on: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.basic.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.basic.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.basic.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.basic.tex	2020-04-29 21:22:29 UTC (rev 54937)
@@ -0,0 +1,113 @@
+% this file is an adapted version of acrotest.tex shipped out
+% with the `acronym' package
+\documentclass{article}
+\usepackage[T1]{fontenc}
+\usepackage[english]{babel}
+\usepackage[colorlinks]{hyperref}
+\usepackage[version=3]{acro}
+
+\acsetup{
+  make-links ,
+  pages / display = first ,
+  pages / fill    = {, }
+}
+
+\DeclareAcronym{CDMA}{
+  short            = CDMA ,
+  long             = Code Division Multiple Access ,
+  long-plural      = es
+}
+\DeclareAcronym{GSM}{
+  short            = GSM ,
+  long             = Global System for Mobile communication
+}
+\DeclareAcronym{NA}{
+  short            = {\ensuremath{N_{\mathrm{A}}}} ,
+  long             = Number of Avogadro ,
+  extra            = see \S\ref{Chem} ,
+  pdfstring        = NA
+}
+\DeclareAcronym{NAD+}{
+  short            = {NAD\textsuperscript{+}} ,
+  short-plural     = ,
+  long             = Nicotinamide Adenine Dinucleotide ,
+  pdfstring        = NAD+
+}
+\DeclareAcronym{NUA}{
+  short            = NUA ,
+  long             = Not Used Acronym
+}
+\DeclareAcronym{TDMA}{
+  short            = TDMA ,
+  long             = Time Division Multiple Access ,
+  long-plural      = es
+}
+\DeclareAcronym{UA}{
+  short            = UA ,
+  long             = Used Acronym
+}
+\DeclareAcronym{lox}{
+  short            = {\emph{LOX}} ,
+  long             = Liquid Oxygen ,
+  pdfstring        = LOX
+}
+\DeclareAcronym{lh2}{
+  short            = {\emph{LH\textsubscript{2}}} ,
+  long             = Liquid Hydrogen ,
+  pdfstring        = LH2
+}
+\DeclareAcronym{IC}{
+  short            = IC ,
+  long             = Integrated Circuit
+}
+\DeclareAcronym{BUT}{
+  short            = BUT ,
+  long             = Block Under Test ,
+  long-plural-form = Blocks Under Test
+}
+\begin{document}
+
+\section{Intro}
+In the early nineties, \acs{GSM} was deployed in many European
+countries. \ac{GSM} offered for the first time international
+roaming for mobile subscribers. The \acs{GSM}'s use of \ac{TDMA} as
+its communication standard was debated at length. And every now
+and then there are big discussion whether \ac{CDMA} should have
+been chosen over \ac{TDMA}.
+
+\section{Furthermore}
+\acresetall
+The reader could have forgotten all the nice acronyms, so we repeat the
+meaning again.
+
+If you want to know more about \acf{GSM}, \acf{TDMA}, \acf{CDMA}
+and other acronyms, just read a book about mobile communication. Just
+to mention it: There is another \ac{UA}, just for testing purposes!
+
+\begin{figure}[h]
+Figure
+\caption{A float also admits references like \ac{GSM} or \acf{CDMA}.}
+\end{figure}
+
+\subsection{Some chemistry and physics}
+\label{Chem}
+\ac{NAD+} is a major electron acceptor in the oxidation
+of fuel molecules. The reactive part of \ac{NAD+} is its nictinamide
+ring, a pyridine derivate.
+
+One mol consists of \acs{NA} atoms or molecules. There is a relation
+between the constant of Boltzmann and the \acl{NA}:
+\begin{equation}
+  k = R/\acs{NA}
+\end{equation}
+
+\acl{lox}/\acl{lh2} (\acs{lox}/\acs{lh2})
+
+\subsection{Some testing fundamentals}
+When testing \acp{IC}, one typically wants to identify functional
+blocks to be tested separately. The latter are commonly indicated as
+\acp{BUT}. To test a \ac{BUT} requires defining a testing strategy\dots
+
+\printacronyms
+
+\end{document}


Property changes on: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.basic.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-109.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-109.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-109.pdf	2020-04-29 21:21:14 UTC (rev 54936)
+++ trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-109.pdf	2020-04-29 21:22:29 UTC (rev 54937)

Property changes on: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-109.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-109.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-109.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-109.tex	2020-04-29 21:22:29 UTC (rev 54937)
@@ -0,0 +1,25 @@
+\documentclass{article}
+\usepackage[enable-debug]{expl3}
+\usepackage{hyperref}
+\usepackage[version=3]{acro}
+
+\acsetup{
+  pages/display=all ,
+  pages/seq=false
+}
+
+\DeclareAcronym{ny}{
+  short = NY ,
+  long = New York ,
+}
+
+\NewAcroCommand\aci{m}{}
+
+\begin{document}
+
+no\aci{ny}thing\newpage
+\ac{ny}
+
+\printacronyms
+
+\end{document}


Property changes on: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-109.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-111.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-111.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-111.pdf	2020-04-29 21:21:14 UTC (rev 54936)
+++ trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-111.pdf	2020-04-29 21:22:29 UTC (rev 54937)

Property changes on: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-111.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-111.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-111.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-111.tex	2020-04-29 21:22:29 UTC (rev 54937)
@@ -0,0 +1,27 @@
+\documentclass{article}
+\usepackage[T1]{fontenc}
+\usepackage[french]{babel}
+\usepackage[version=3]{acro}
+
+\DeclareAcroArticle{definite}{\nospace}
+
+\NewAcroCommand\dacs{m}{\acrodefinite\UseAcroTemplate{short}{#1}}
+\NewAcroCommand\Dacs{m}{\acroupper\acrodefinite\UseAcroTemplate{short}{#1}}
+\NewAcroCommand\dacl{m}{\acrodefinite\UseAcroTemplate{long}{#1}}
+\NewAcroCommand\Dacl{m}{\acroupper\acrodefinite\UseAcroTemplate{long}{#1}}
+
+\DeclareAcronym{hadopi}{
+  short = HADOPI ,
+  long = Haute Autorit\'{e} pour la diffusion des \oe uvres et la protection des
+    droits sur l’Internet ,
+  short-definite = l'\nospace ,
+  long-definite = la ,
+}
+
+\begin{document}
+
+\dacs{hadopi}
+
+\Dacl{hadopi}
+
+\end{document}


Property changes on: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-111.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-119.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-119.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-119.pdf	2020-04-29 21:21:14 UTC (rev 54936)
+++ trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-119.pdf	2020-04-29 21:22:29 UTC (rev 54937)

Property changes on: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-119.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-119.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-119.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-119.tex	2020-04-29 21:22:29 UTC (rev 54937)
@@ -0,0 +1,49 @@
+\documentclass{article}
+\usepackage[enable-debug]{expl3}
+
+\usepackage[version=3]{acro}
+
+\makeatletter
+\NewAcroTemplate[list]{external}{%
+  \if at filesw
+    \newwrite\acro at list
+    \immediate\openout\acro at list\jobname.ac\relax
+    \immediate\write\acro at list{\string\begin{description}}
+    \let\item\relax
+    \acronymsmapF{%
+      \immediate\write\acro at list{%
+        \space\space
+        \item[\acrofield{##1}{short}]
+        \acrofield{##1}{long}%
+        \acrofieldifTF{##1}{extra}{ (\acrofield{##1}{extra})}{}%
+      }%
+    }{\immediate\write\acro at list{\item}\AcroRerun}%
+    \immediate\write\acro at list{\string\end{description}}
+    \immediate\closeout\acro at list
+  \fi
+}
+\makeatother
+
+\DeclareAcronym{ny}{
+  short = NY ,
+  long = New York ,
+}
+
+\DeclareAcronym{la}{
+  short = LA ,
+  long = Los Angeles ,
+  extra = City of Angels
+}
+
+\DeclareAcronym{dc}{
+  short = D.C. ,
+  long = Washington D.C.
+}
+
+\begin{document}
+
+\acuseall
+\printacronyms[template=external]
+\null
+
+\end{document}


Property changes on: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-119.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-154.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-154.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-154.pdf	2020-04-29 21:21:14 UTC (rev 54936)
+++ trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-154.pdf	2020-04-29 21:22:29 UTC (rev 54937)

Property changes on: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-154.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-154.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-154.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-154.tex	2020-04-29 21:22:29 UTC (rev 54937)
@@ -0,0 +1,17 @@
+\documentclass{article}
+
+\usepackage[version=3]{acro}
+
+\RenewAcroCommand\ac{mo}{\UseAcroTemplate{first}{#1}\IfNoValueF{#2}{#2}}
+
+\DeclareAcronym{uc}{
+  short = UC ,
+  long = Universal Composability ,
+  cite = xxx
+}
+
+\begin{document}
+
+We use the \ac{uc}[ model] for\dots
+
+\end{document}


Property changes on: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.issue-154.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.possessive.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.possessive.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.possessive.pdf	2020-04-29 21:21:14 UTC (rev 54936)
+++ trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.possessive.pdf	2020-04-29 21:22:29 UTC (rev 54937)

Property changes on: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.possessive.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.possessive.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.possessive.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.possessive.tex	2020-04-29 21:22:29 UTC (rev 54937)
@@ -0,0 +1,36 @@
+\documentclass{article}
+
+\usepackage[version=3]{acro}
+
+\DeclareAcroEnding{possessive}{'s}{'s}
+
+\NewAcroCommand\acg{m}{\acropossessive\UseAcroTemplate{first}{#1}}
+\NewAcroCommand\acsg{m}{\acropossessive\UseAcroTemplate{short}{#1}}
+\NewAcroCommand\aclg{m}{\acropossessive\UseAcroTemplate{long}{#1}}
+\NewAcroCommand\acfg{m}{%
+  \acrofull
+  \acropossessive
+  \UseAcroTemplate{first}{#1}%
+}
+\NewAcroCommand\iacsg{m}{%
+  \acroindefinite
+  \acropossessive
+  \UseAcroTemplate{short}{#1}%
+}
+
+\DeclareAcronym{MP}{
+  short            = MP ,
+  long             = Member of Parliament ,
+  long-plural-form = Members of Parliament ,
+  long-possessive-form = Member's of Parliament
+}
+
+\begin{document}
+
+\acg{MP} \par
+\acsg{MP} \par
+\aclg{MP} \par
+\acfg{MP} \par
+\iacsg{MP} \par
+
+\end{document}


Property changes on: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.possessive.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.texsx-505891.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.texsx-505891.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.texsx-505891.pdf	2020-04-29 21:21:14 UTC (rev 54936)
+++ trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.texsx-505891.pdf	2020-04-29 21:22:29 UTC (rev 54937)

Property changes on: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.texsx-505891.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.texsx-505891.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.texsx-505891.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.texsx-505891.tex	2020-04-29 21:22:29 UTC (rev 54937)
@@ -0,0 +1,46 @@
+\documentclass{article}
+
+\usepackage[version=3]{acro}
+
+\DeclareAcroProperty{alt2}
+\DeclareAcroProperty{alt2-format}
+
+\RenewAcroTemplate[list]{description}{%
+  \acroheading
+  \acropreamble
+  \begin{description}
+    \acronymsmapF{
+      \item [%
+          \acrowrite{short}%
+          \acroifT{alt}{/\acrowrite{alt}}%
+          \acroifT{alt2}{/\acrowrite{alt2}}%
+        ]
+        \acrowrite{long}%
+        \acroifanyT{foreign,extra}{ (}%
+        \acroifT{foreign}{%
+          \acrowrite{foreign}%
+          \acroifT{foreign-short}{, \acrowrite{foreign-short}}%
+          \acroifT{extra}{, }%
+        }%
+        \acroifT{extra}{\acrowrite{extra}}%
+        \acroifanyT{foreign,extra}{)}%
+        \acroifpagesT{%
+          \acropagefill
+          \acropages
+            {\acrotranslate{page}\nobreakspace}%
+            {\acrotranslate{pages}\nobreakspace}%
+        }%
+    }
+    { \item \AcroRerun }
+  \end {description}
+}
+
+\DeclareAcronym{one}{ short = one , alt = two, alt2 = three, long = common description }
+\DeclareAcronym{four}{ short = four , long = another description }
+
+\begin{document}
+
+\printacronyms[display=all]
+
+\end{document}
+


Property changes on: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.texsx-505891.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.texsx-507726.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.texsx-507726.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.texsx-507726.pdf	2020-04-29 21:21:14 UTC (rev 54936)
+++ trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.texsx-507726.pdf	2020-04-29 21:22:29 UTC (rev 54937)

Property changes on: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.texsx-507726.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.texsx-507726.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.texsx-507726.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.texsx-507726.tex	2020-04-29 21:22:29 UTC (rev 54937)
@@ -0,0 +1,63 @@
+\documentclass{article}
+\usepackage[english,ngerman]{babel}
+\usepackage{csquotes}
+\usepackage[version=3]{acro}
+
+% issue #136
+\DeclareAcroProperty{foreign-short}
+
+\RenewAcroTemplate {long-short}{%
+  \acroiffirstTF{%
+    \acrowrite{long}\acspace
+    (%
+      \acrowrite{short}%
+      \acroifT{foreign}{, \acrowrite{foreign}}%
+      \acroifT{foreign-short}{, \acrowrite{foreign-short}}%
+      \acrogroupcite
+    )%
+  }
+  {\acrowrite{short}}%
+}
+
+\RenewAcroTemplate[list]{description}{%
+  \acroheading
+  \acropreamble
+  \begin{description}
+    \acronymsmapF{
+      \item [\acrowrite{short}\acroifT{alt}{/\acrowrite{alt}}]
+        \acrowrite{long}%
+        \acroifanyT{foreign,extra}{ (}%
+        \acroifT{foreign}{%
+          \acrowrite{foreign}%
+          \acroifT{foreign-short}{, \acrowrite{foreign-short}}%
+          \acroifT{extra}{, }%
+        }%
+        \acroifT{extra}{\acrowrite{extra}}%
+        \acroifanyT{foreign,extra}{)}%
+        \acroifpagesT{%
+          \acropagefill
+          \acropages
+            {\acrotranslate{page}\nobreakspace}%
+            {\acrotranslate{pages}\nobreakspace}%
+        }%
+    }
+    { \item \AcroRerun }
+  \end {description}
+}
+
+\DeclareAcronym{dsgvo}{
+  short = DSGVO,
+  long = {Datenschutz-Grundverordnung},
+  foreign = General Data Protection Regulation ,
+  foreign-short = GDPR, % new line
+  foreign-babel = english,
+  foreign-format = \enquote
+}
+
+\begin{document}
+
+\ac{dsgvo}
+
+\printacronyms
+
+\end{document}


Property changes on: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.texsx-507726.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.units.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.units.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.units.pdf	2020-04-29 21:21:14 UTC (rev 54936)
+++ trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.units.pdf	2020-04-29 21:22:29 UTC (rev 54937)

Property changes on: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.units.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.units.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.units.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.units.tex	2020-04-29 21:22:29 UTC (rev 54937)
@@ -0,0 +1,99 @@
+\documentclass{scrartcl}
+\usepackage[T1]{fontenc}
+\usepackage[ngerman]{babel}
+\usepackage[version=3]{acro}
+
+\acsetup{ list/display = all , pages/display = all}
+
+\usepackage{longtable,siunitx}
+
+\DeclareAcronym{ecm}{
+  short = ECM ,
+  long  = Electro Chemical Machining ,
+  extra = Elektrochemisches Abtragen
+}
+\DeclareAcronym{adc}{
+  short = ADC ,
+  long  = Analog-to-Digital-Converter
+}
+\DeclareAcronym{edm}{
+  short = EDM ,
+  long  = Electro Discharge Machining
+}
+\DeclareAcronym{ecdm}{
+  short = ECDM ,
+  long  = Electro Chemical Discharge Machining ,
+  extra = Kombination aus \acs*{ecm} und \acs*{edm}
+}
+
+\DeclareAcroProperty{unit}
+
+% "Acronyme" (tatsächlich physikalische Größen) einer speziellen Klasse:
+\DeclareAcronym{f}{
+  short = \ensuremath{f} ,
+  long  = Frequenz ,
+  unit  = \si{\hertz} ,
+  class = physics
+}
+\DeclareAcronym{A}{
+  short = \ensuremath{A} ,
+  long  = Fläche ,
+  unit  = \si{\metre^2} ,
+  class = physics
+}
+\DeclareAcronym{C}{
+  short = \ensuremath{C} ,
+  long  = Kapazität ,
+  unit  = \si{\farad} ,
+  class = physics
+}
+\DeclareAcronym{F}{
+  short = \ensuremath{F} ,
+  long  = Kraft ,
+  unit  = \si{\newton} ,
+  class = physics
+}
+
+\NewAcroTemplate[list]{physics}{%
+  \def\TableCode{}%
+  \acronymsmapT{%
+    \AcroPutRight\TableCode{%
+      \def\AcronymID{##1}%
+      \acrowrite{short}%
+      &
+      \def\AcronymID{##1}%
+      \acrowrite{unit}%
+      &
+      \def\AcronymID{##1}%
+      \acrowrite{long}%
+      &
+      \def\AcronymID{##1}%
+      \acroifpagesT{\acropages{S. }{S. }}%
+      \tabularnewline
+    }%
+  }%
+  \acroheading
+  \acropreamble
+  \par\noindent
+  \setlength\LTleft{0pt}%
+  \setlength\LTright{0pt}%
+  \begin{longtable}{@{}lll@{\extracolsep{\fill}}l@{}}
+    \TableCode
+  \end{longtable}
+}
+
+\begin{document}
+
+erstes Mal: \ac{ecm}
+
+zweites Mal: \ac{ecm}
+
+\ac{F}
+
+% % alle außer der Klasse 'physics' auflisten:
+\printacronyms[exclude=physics]%, name=Abkürzungsverzeichnis]
+
+% nur die Klasse 'physics' auflisten:
+\printacronyms[template=physics, include=physics]%, name=Formelverzeichnis]
+
+\end{document}


Property changes on: trunk/Master/texmf-dist/doc/latex/acro/examples/acro.example.units.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Deleted: trunk/Master/texmf-dist/tex/latex/acro/acro-manual.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/acro/acro-manual.cls	2020-04-29 21:21:14 UTC (rev 54936)
+++ trunk/Master/texmf-dist/tex/latex/acro/acro-manual.cls	2020-04-29 21:22:29 UTC (rev 54937)
@@ -1,391 +0,0 @@
-% --------------------------------------------------------------------------
-% the ACRO package
-% 
-%   Typeset Acronyms
-% 
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% Web:    https://bitbucket.org/cgnieder/acro/
-% E-Mail: contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% Copyright 2011--2020 Clemens Niederberger
-% 
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-%   http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-% 
-% This work has the LPPL maintenance status `maintained'.
-% 
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-% The acro package consists of the files
-% - acro.sty, acro.definitions.tex, acro.cfg
-% - acro-manual.tex, acro-manual.pdf, acro-manual.cls
-% - acro.history, README
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-\ProvidesClass{acro-manual}[2020/01/24]
-
-\LoadClass[load-preamble,add-index]{cnltx-doc}
-\RequirePackage{imakeidx}
-\RequirePackage[utf8]{inputenc}
-
-\usepackage{acro}
-\acsetup{
-  single       = true ,
-  accsupp      = true ,
-  index        = true ,
-  use-barriers = true ,
-  hyperref     = true ,
-  log          = true
-}
-
-\setcnltx{
-  package  = {acro} ,
-  info     = {Typeset Acronyms and other Abbreviations} ,
-  authors  = Clemens Niederberger ,
-  email    = contact at mychemistry.eu ,
-  url      = https://bitbucket.org/cgnieder/acro/ ,
-  abstract = {%
-    \acro\ allows you to define and use abbreviations in a simple way.
-    Abbreviations can be divided into different classes of abbreviations.
-    Lists of abbreviations can be created (also of separate classes of
-    abbreviations) and printed wherever you want the lists to appear.\par
-    \acro\ provides an option \option{single} which ignores abbreviations that
-    are used only once in the whole document.\par
-    As an experimental feature \acro\ also offers the option \option{sort} which
-    automatically sorts the list created by \cs{printacronyms}.\par
-    \acro\ also has the feature of creating \emph{local} lists
-  } ,
-  add-cmds = {
-    ac, Ac, aca, Aca, acap, Acap, acbarrier, acdot, acf, Acf, acflike, acg,
-      acfp, Acfp, acfplike, aciftrailing, acl, Acl, aclp, Aclp, acp, Acp,
-      acpsingle, Acpsingle, AcroRegisterTrailing, acs, Acs, acsingle,
-      Acsingle, acsp, Acsp, acspace, acreset, acresetall, acsetup,
-    DeclareAcroCommand, DeclareAcronym, DeclareAcroExtraStyle,
-      DeclareAcroFirstStyle, DeclareAcroListHeading, 
-      DeclareAcroListStyle, DeclareAcroPageStyle, DeclarePseudoAcroCommand,
-    iac, Iac, iaca, Iaca, iacs, Iacs, iacl, Iacl, iacf, Iacf, iacflike,
-      Iacflike,
-    NewAcroCommand, NewPseudoAcroCommand,
-    printacronyms,
-    ProvideAcroCommand, ProvideAcroEnding, ProvidePseudoAcroCommand,
-    RenewAcroCommand, RenewPseudoAcroCommand
-  } ,
-  add-silent-cmds = {
-    addcolon, DeclareInstance, babelhyphen, ExplSyntaxOff, ExplSyntaxOn, nato,
-    NewDocumentCommand, newlist, ny, setlist
-  } ,
-  index-setup = { level = \section , headers={\indexname}{\indexname} }
-}
-
-\colorlet{property}{blue}
-\newidxcmd\property{\code{\textcolor{property}{#1}}}[ (property)]
-\newrobustcmd*\prop{\@ifstar{\cnltx at prop@star}{\cnltx at prop@nostar}}
-
-\newrobustcmd*\cnltx at prop@star{%
-  \cnltx at ifdash
-    {\cnltx at prop@aux*\meta}
-    {\cnltx at prop@aux*\marg}%
-}
-\newrobustcmd*\cnltx at prop@nostar{%
-  \cnltx at ifdash
-    {\cnltx at prop@aux{}\meta}
-    {\cnltx at prop@aux{}\marg}%
-}
-\newcommand*\cnltx at prop@aux[4]{%
-  \code{\property#1{#3}\cnltx at isvalue#2{#4}}%
-}
-
-\newrobustcmd*\propis{%
-  \@ifstar
-    {\cnltx at propis*}
-    {\cnltx at propis{}}%
-}
-\newrobustcmd*\cnltx at propis[1]{%
-  \cnltx at ifdash
-    {\cnltx at prop@aux{#1}\@firstofone}
-    {\cnltx at prop@aux{#1}\Marg}%
-}
-\newrobustcmd*\choiceprop{%
-  \@ifstar
-    {\cnltx at choiceprop@star}
-    {\cnltx at choiceprop@nostar}%
-}
-\def\cnltx at choiceprop@star#1#2{%
-  \code{\property*{#1}\cnltx at isvalue\choices{#2}}}
-\def\cnltx at choiceprop@nostar#1#2{%
-  \code{\property{#1}\cnltx at isvalue\choices{#2}}}
-\newcommand*\boolprop{%
-  \@ifstar
-    {\cnltx at boolprop@star}
-    {\cnltx at boolprop@nostar}%
-}
-\def\cnltx at boolprop@star#1{\choiceprop*{#1}{\default{true},false}}
-\def\cnltx at boolprop@nostar#1{\choiceprop{#1}{\default{true},false}}
-
-\newenvironment{properties}
-  {%
-    \def\propert{\@cnltx at option@item\property}%
-    \def\propval{\@cnltx at option@item\prop}%
-    \def\proplit{\@cnltx at option@item\propis}%
-    \def\propchoice{\@cnltx at option@item\choiceprop}%
-    \def\propbool{\@cnltx at option@item\boolprop}%
-    \cnltxlist
-  }
-  {\endcnltxlist}
-
-\protected\def\@versionstar{\raisebox{-.25em}{*}}
-\newcommand\versionstar{\texorpdfstring{\@versionstar}{*}}
-
-\newcommand*\TF{\textcolor{red}{\uline{\code{\textcolor{cs}{\textit{TF}}}}}}
-
-\RequirePackage{fontawesome}
-\RequirePackage{datetime2}
-\DTMsetup{useregional=numeric,datesep=/}
-\newrobustcmd*\acro at add@version[2]{%
-  \csdef{ac at ver@#2}{%
-    \DTMdate{#1}%
-    \csgdef{ac at ver@#2used}{}%
-    \csdef{ac at ver@#2}{\DTMdate{#1}}%
-  }%
-}
-
-\newrobustcmd*\ac at date[1]{\ifcsdef{ac at ver@#1used}{}{ (\csuse{ac at ver@#1})}}
-\newrobustcmd*\ac at ifnew[1]{\ifcsstring{c_acro_version_tl}{#1}}
-\newrobustcmd*\ac at NEW{\faStarO\ New}
-
-\renewrobustcmd*\sinceversion[1]{%
-  \ac at ifnew{#1}%
-    {\cnltx at version@note{\textcolor{red}{\ac at NEW}}}%
-    {\cnltx at version@note{\GetTranslation{cnltx-introduced}~#1\ac at date{#1}}}%
-}
-\renewrobustcmd*\changedversion[1]{%
-  \cnltx at version@note{\GetTranslation{cnltx-changed}~#1\ac at date{#1}}%
-}
-
-\newnote*\sincechanged[2]{%
-  \GetTranslation{cnltx-introduced}~#1\ac at date{#1},
-  changed with version~#2\ac at date{#2}\ac at ifnew{#2}{ \ac at NEW}{}%
-}
-
-\RenewDocumentEnvironment{commands}{}
-  {%
-    \cnltx at set@catcode_{12}%
-    \let\command\cnltx at command
-    \cnltxlist
-  }
-  {\endcnltxlist}
-  
-\RequirePackage{tcolorbox,xsimverb}
-\tcbuselibrary{skins,breakable}
-\tcbset{enhanced,enhanced jigsaw}
-
-\newtcolorbox{bewareofthedog}{
-  colback  = white ,
-  colframe = red ,
-  underlay={%
-    \path[draw=none]
-      (interior.south west)
-      rectangle node[red]{\Huge\bfseries !}
-      ([xshift=-4mm]interior.north west);
-    }%
-}
-
-\newtcolorbox{cnltxcode}[1][]{
-  boxrule = 1pt ,
-  colback = cnltxbg ,
-  colframe = cnltx ,
-  arc = 5pt ,
-  beforeafter skip = .5\baselineskip ,%
-  #1%
-}
-
-\newcommand*\acroman at readoptions[1]{%
-  \catcode`\^^M=13
-  \acroman at read@options{#1}%
-}
-
-\begingroup
-\catcode`\^^M=13
-\gdef\acroman at read@options#1#2^^M{%
-  \endgroup
-  \ifblank{#2}{}{\acroman at read@options@#2}%
-  #1%
-  \XSIMfilewritestart*{\jobname.tmp}%
-}%
-\endgroup
-\def\acroman at read@options@[#1]{\pgfqkeys{/cnltx}{#1}}
-
-\RenewDocumentEnvironment{sourcecode}{}
-  {%
-    \begingroup
-    \acroman at readoptions{%
-      \setlength\cnltx at sidebysidewidth
-        {\dimexpr .45\columnwidth -\lst at xleftmargin -\lst at xrightmargin\relax}%
-      \expanded{%
-        \noexpand\lstset{
-          style=cnltx,
-          \ifboolexpe{ bool {cnltx at sidebyside} and not bool {cnltx at codeonly} }
-            {linewidth=\cnltx at sidebysidewidth,}{}%
-          \expandonce\cnltx at local@listings at options
-        }%
-      }%
-      \XSIMgobblechars{2}%
-    }%
-  }
-  {%
-    \XSIMfilewritestop
-    \cnltxcode[breakable]%
-    \lstinputlisting[style=cnltx]{\jobname.tmp}%
-    \endcnltxcode
-  }
-
-\RenewDocumentEnvironment{example}{}
-  {%
-    \begingroup
-    \acroman at readoptions{%
-      \setlength\cnltx at sidebysidewidth
-        {\dimexpr .45\columnwidth -\lst at xleftmargin -\lst at xrightmargin\relax}%
-      \expanded{%
-        \noexpand\lstset{
-          style=cnltx,
-          \ifboolexpe{ bool {cnltx at sidebyside} and not bool {cnltx at codeonly} }
-            {linewidth=\cnltx at sidebysidewidth,}{}%
-          \expandonce\cnltx at local@listings at options
-        }%
-      }%
-      \XSIMgobblechars{2}%
-    }%
-  }
-  {%
-    \XSIMfilewritestop
-    \ifbool{cnltx at sidebyside}
-      {%
-        \cnltxcode
-        \noindent
-        \minipage[c]{\cnltx at sidebysidewidth}%
-          \cnltx at pre@source at hook
-          \lstinputlisting[style=cnltx] {\jobname.tmp}%
-          \cnltx at after@source at hook
-        \endminipage\hfill
-        \minipage[c]{\cnltx at sidebysidewidth}%
-          \cnltx at pre@example at hook
-          \input {\jobname.tmp}%
-          \cnltx at after@example at hook
-        \endminipage
-      }
-      {%
-        \cnltxcode[breakable]%
-        \cnltx at pre@source at hook
-        \lstinputlisting{\jobname.tmp}%
-        \cnltx at after@source at hook
-        \tcblower
-        \cnltx at pre@example at hook
-        \input {\jobname.tmp}%
-        \cnltx at after@example at hook
-      }%
-    \endcnltxcode
-  }
-
-\RequirePackage[
-  backend=biber,
-  style=cnltx,
-  sortlocale=en_US,
-  indexing=cite]{biblatex}
-\RequirePackage{csquotes,varioref}
-\defbibheading{bibliography}{\section{References}}
-
-\RequirePackage[biblatex]{embrac}[2012/06/29]
-\ChangeEmph{[}[,.02em]{]}[.055em,-.08em]
-\ChangeEmph{(}[-.01em,.04em]{)}[.04em,-.05em]
-
-% additional packages:
-\RequirePackage{longtable,array,booktabs,enumitem,amssymb}
-
-\newcommand*\h[1]{\textcolor{cnltx}{\textbf{#1}}}
-\newcommand*\mailto[1]{\texttt{\href{mailto:#1}{#1}}}
-
-\ProvideAcroEnding {possessive} {'s} {'s}
-
-\acro at add@version{2012-06-22}{0.1}
-\acro at add@version{2012-06-23}{0.1a}
-\acro at add@version{2012-06-24}{0.1b}
-\acro at add@version{2012-06-24}{0.1c}
-\acro at add@version{2012-06-24}{0.2}
-\acro at add@version{2012-06-25}{0.2a}
-\acro at add@version{2012-06-25}{0.3}
-\acro at add@version{2012-06-27}{0.3a}
-\acro at add@version{2012-06-29}{0.3b}
-\acro at add@version{2012-07-16}{0.3c}
-\acro at add@version{2012-07-23}{0.3d}
-\acro at add@version{2012-07-24}{0.3e}
-\acro at add@version{2012-09-28}{0.4}
-\acro at add@version{2012-10-07}{0.4a}
-\acro at add@version{2012-11-30}{0.5}
-\acro at add@version{2012-12-14}{0.6}
-\acro at add@version{2013-01-02}{0.6a}
-\acro at add@version{2013-01-16}{1.0}
-\acro at add@version{2013-01-26}{1.1}
-\acro at add@version{2013-01-29}{1.1a}
-\acro at add@version{2013-02-09}{1.2}
-\acro at add@version{2013-04-04}{1.2a}
-\acro at add@version{2013-05-06}{1.3}
-\acro at add@version{2013-05-09}{1.3a}
-\acro at add@version{2013-05-30}{1.3b}
-\acro at add@version{2013-06-16}{1.3c}
-\acro at add@version{2013-07-08}{1.3d}
-\acro at add@version{2013-08-07}{1.3e}
-\acro at add@version{2013-08-27}{1.4}
-\acro at add@version{2013-09-02}{1.4a}
-\acro at add@version{2013-09-24}{1.4b}
-\acro at add@version{2013-11-04}{1.4c}
-\acro at add@version{2013-11-22}{1.4d}
-\acro at add@version{2013-12-18}{1.5}
-\acro at add@version{2015-02-26}{1.6}
-\acro at add@version{2015-04-08}{1.6a}
-\acro at add@version{2015-05-10}{1.6b}
-\acro at add@version{2015-08-16}{2.0}
-\acro at add@version{2015-08-25}{2.0a}
-\acro at add@version{2015-08-29}{2.0b}
-\acro at add@version{2015-09-05}{2.1}
-\acro at add@version{2015-10-03}{2.2}
-\acro at add@version{2016-01-07}{2.2a}
-\acro at add@version{2016-01-21}{2.2b}
-\acro at add@version{2016-02-02}{2.2c}
-\acro at add@version{2016-03-14}{2.3}
-\acro at add@version{2016-03-25}{2.4}
-\acro at add@version{2016-04-14}{2.4a}
-\acro at add@version{2016-05-03}{2.4b}
-\acro at add@version{2016-05-25}{2.5}
-\acro at add@version{2016-05-26}{2.5a}
-\acro at add@version{2016-05-30}{2.5b}
-\acro at add@version{2016-07-20}{2.6}
-\acro at add@version{2016-08-13}{2.6a}
-\acro at add@version{2016-08-13}{2.6b}
-\acro at add@version{2016-08-16}{2.6c}
-\acro at add@version{2016-08-30}{2.6d}
-\acro at add@version{2016-09-04}{2.6e}
-\acro at add@version{2017-01-22}{2.7}
-\acro at add@version{2017-02-09}{2.7a}
-\acro at add@version{2017-06-21}{2.7b}
-\acro at add@version{2017-08-28}{2.7c}
-\acro at add@version{2018-01-30}{2.8}
-\acro at add@version{2019-02-17}{2.9}
-\acro at add@version{2019-09-23}{2.10}
-\acro at add@version{2019-10-02}{2.10a}
-\acro at add@version{2019-10-06}{2.10b}
-\acro at add@version{2019-10-12}{2.10c}
-\acro at add@version{2019-12-30}{2.10d}
-\acro at add@version{2020-01-11}{2.11}
-\acro at add@version{2020-01-16}{2.11a}
-\acro at add@version{2020-01-24}{2.11b}
-\acro at add@version{2020-02-03}{2.11c}
-
-\endinput

Deleted: trunk/Master/texmf-dist/tex/latex/acro/acro.definitions.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/acro/acro.definitions.tex	2020-04-29 21:21:14 UTC (rev 54936)
+++ trunk/Master/texmf-dist/tex/latex/acro/acro.definitions.tex	2020-04-29 21:22:29 UTC (rev 54937)
@@ -1,581 +0,0 @@
-% --------------------------------------------------------------------------
-% the ACRO package
-% 
-%   Typeset Acronyms
-% 
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% Web:    https://bitbucket.org/cgnieder/acro/
-% E-Mail: contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% Copyright 2011--2020 Clemens Niederberger
-% 
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in
-%   http://www.latex-project.org/lppl.txt
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-% 
-% This work has the LPPL maintenance status `maintained'.
-% 
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-% The acro package consists of the files
-% - acro.sty, acro.definitions.tex, acro.cfg
-% - acro-manual.tex, acro-manual.pdf, acro-manual.cls
-% - acro.history, README
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-\ExplSyntaxOn
-
-% document commands:
-\NewDocumentCommand \DeclareAcronym {mm}
-  { \acro_declare_acronym:nn {#1} {#2} }
-
-\NewDocumentCommand \acsetup { m }
-  {
-    \tl_if_blank:nF {#1}
-      { \keys_set:nn {acro} {#1} }
-    \ignorespaces
-  }
-
-\NewDocumentCommand \ProvideAcroEnding {mmm}
-  { \acro_provide_ending:nnn {#1} {#2} {#3} }
-
-\NewDocumentCommand \AcroRegisterTrailing {mm}
-  { \acro_register_trailing_token:Nn #1 {#2} }
-
-\NewDocumentCommand \DeclareAcroTranslation {mm}
-  { \acro_declare_translation:nn {#1} {#2} }
-
-\DeclareExpandableDocumentCommand \acifused { m }
-  { \acro_if_acronym_used:nTF {#1} }
-
-\NewDocumentCommand \acresetall {}
-  { \acro_reset_all: }
-
-\NewDocumentCommand \acuseall {}
-  { \acro_mark_all_as_used: }
-
-\NewDocumentCommand \acreset { > { \SplitList {,} } m }
-  { \ProcessList {#1} { \acro_reset:n } \ignorespaces }
-
-\NewDocumentCommand \acuse { > { \SplitList {,} } m }
-  { \ProcessList {#1} { \acro_mark_as_used:n } \ignorespaces }
-
-\NewDocumentCommand \acfirstupper {m}
-  { \acro_first_upper_case:n {#1} }
-
-\NewExpandableDocumentCommand \aciffirst {+m+m}
-  { \bool_if:NTF \l__acro_first_instance_bool {#1} {#2} }
-
-\NewDocumentCommand \acdot   {} { \acro_dot: }
-\NewDocumentCommand \acspace {} { \acro_space: }
-
-\NewDocumentCommand \acbarrier {}
-  { \acro_barrier: }
-
-\NewDocumentCommand \acswitchoff {}
-  { \acro_switch_off: }
-
-\NewDocumentCommand \acswitchon {}
-  { \acro_switch_on: }
-
-\NewDocumentCommand \printacronyms { O{} }
-  { \acro_print_acronyms:n {#1} }
-
-% --------------------------------------------------------------------------
-% styles
-% #1: name
-% #2: template
-% #3: settings
-\NewDocumentCommand \DeclareAcroFirstStyle {mmm}
-  { \acro_declare_first_style:nnn {#1} {#2} {#3} }
-
-\NewDocumentCommand \DeclareAcroExtraStyle {mmm}
-  { \acro_declare_extra_style:nnn {#1} {#2} {#3} }
-
-\NewDocumentCommand \DeclareAcroPageStyle {mmm}
-  { \acro_declare_page_style:nnn {#1} {#2} {#3} }
-
-\NewDocumentCommand \DeclareAcroListHeading {mm}
-  { \acro_declare_list_heading:nn {#1} {#2} }
-
-\NewDocumentCommand \DeclareAcroListStyle {mmm}
-  { \acro_declare_list_style:nnn {#1} {#2} {#3} }
-
-% --------------------------------------------------------------------------
-% endings:
-\ProvideAcroEnding {plural} {s} {s}
-
-% --------------------------------------------------------------------------
-% use acronyms:
-% automatic:
-\NewAcroCommand \ac
-  { \acro_use:n {#1} }
-
-\NewAcroCommand \Ac
-  {
-    \acro_first_upper:
-    \acro_use:n {#1}
-  }
-
-\NewAcroCommand \iac
-  {
-    \acro_indefinite:
-    \acro_use:n {#1}
-  }
-
-\NewAcroCommand \Iac
-  {
-    \acro_first_upper:
-    \acro_indefinite:
-    \acro_use:n {#1}
-  }
-
-\NewAcroCommand \acp
-  {
-    \acro_plural:
-    \acro_use:n {#1}
-  }
-
-\NewAcroCommand \Acp
-  {
-    \acro_plural:
-    \acro_first_upper:
-    \acro_use:n {#1}
-  }
-
-\NewAcroCommand \acsingle
-  {
-    \acro_get:n {#1}
-    \acro_single:n {#1}
-  }
-
-\NewAcroCommand \acpsingle
-  {
-    \acro_get:n {#1}
-    \acro_plural:
-    \acro_single:n {#1}
-  }
-
-\NewAcroCommand \Acsingle
-  {
-    \acro_get:n {#1}
-    \acro_first_upper:
-    \acro_single:n {#1}
-  }
-
-\NewAcroCommand \Acpsingle
-  {
-    \acro_get:n {#1}
-    \acro_first_upper:
-    \acro_plural:
-    \acro_single:n {#1}
-  }
-
-% short:
-\NewAcroCommand \acs
-  { \acro_short:n {#1} }
-
-\NewAcroCommand \Acs
-  {
-    \acro_first_upper:
-    \acro_short:n {#1}
-  }
-
-\NewAcroCommand \iacs
-  {
-    \acro_indefinite:
-    \acro_short:n {#1}
-  }
-
-\NewAcroCommand \Iacs
-  {
-    \acro_first_upper:
-    \acro_indefinite:
-    \acro_short:n {#1}
-  }
-
-\NewAcroCommand \acsp
-  {
-    \acro_plural:
-    \acro_short:n {#1}
-  }
-
-\NewAcroCommand \Acsp
-  {
-    \acro_first_upper:
-    \acro_plural:
-    \acro_short:n {#1}
-  }
-
-% alt:
-\NewAcroCommand \aca
-  { \acro_alt:n {#1} }
-
-\NewAcroCommand \Aca
-  {
-    \acro_first_upper:
-    \acro_alt:n {#1}
-  }
-  
-\NewAcroCommand \iaca
-  {
-    \acro_indefinite:
-    \acro_alt:n {#1}
-  }
-
-\NewAcroCommand \Iaca
-  {
-    \acro_first_upper:
-    \acro_indefinite:
-    \acro_alt:n {#1}
-  }
-
-\NewAcroCommand \acap
-  {
-    \acro_plural:
-    \acro_alt:n {#1}
-  }
-
-\NewAcroCommand \Acap
-  {
-    \acro_first_upper:
-    \acro_plural:
-    \acro_alt:n {#1}
-  }
-
-% long:
-\NewAcroCommand \acl
-  { \acro_long:n {#1} }
-
-\NewAcroCommand \Acl
-  {
-    \acro_first_upper:
-    \acro_long:n {#1}
-  }
-
-\NewAcroCommand \iacl
-  {
-    \acro_indefinite:
-    \acro_long:n {#1}
-  }
-
-\NewAcroCommand \Iacl
-  {
-    \acro_first_upper:
-    \acro_indefinite:
-    \acro_long:n {#1}
-  }
-
-\NewAcroCommand \aclp
-  {
-    \acro_plural:
-    \acro_long:n {#1}
-  }
-
-\NewAcroCommand \Aclp
-  {
-    \acro_plural:
-    \acro_first_upper:
-    \acro_long:n {#1}
-  }
-
-% first:
-\NewAcroCommand \acf
-  { \acro_first:n {#1} }
-
-\NewAcroCommand \Acf
-  {
-    \acro_first_upper:
-    \acro_first:n {#1}
-  }
-
-\NewAcroCommand \iacf
-  {
-    \acro_indefinite:
-    \acro_first:n {#1}
-  }
-
-\NewAcroCommand \Iacf
-  {
-    \acro_first_upper:
-    \acro_indefinite:
-    \acro_first:n {#1}
-  }
-
-\NewAcroCommand \acfp
-  {
-    \acro_plural:
-    \acro_first:n {#1}
-  }
-
-\NewAcroCommand \Acfp
-  {
-    \acro_plural:
-    \acro_first_upper:
-    \acro_first:n {#1}
-  }
-
-% first-like:
-\NewPseudoAcroCommand \acflike
-  { \acro_first_like:nn {#1} {#2} }
-
-\NewPseudoAcroCommand \iacflike
-  {
-    \acro_indefinite:
-    \acro_first_like:nn {#1} {#2}
-  }
-
-\NewPseudoAcroCommand \Iacflike
-  {
-    \acro_first_upper:
-    \acro_indefinite:
-    \acro_first_like:nn {#1} {#2}
-  }
-
-\NewPseudoAcroCommand \acfplike
-  {
-    \acro_plural:
-    \acro_first_like:nn {#1} {#2}
-  }
-
-% --------------------------------------------------------------------------
-% first appearance styles:
-\DeclareAcroFirstStyle {default} {inline}
-  { }
-
-\DeclareAcroFirstStyle {reversed} {inline}
-  { reversed = true }
-
-\DeclareAcroFirstStyle {short} {inline}
-  {
-    only-short = true ,
-    brackets = false
-  }
-
-\DeclareAcroFirstStyle {long} {inline}
-  {
-    only-long = true ,
-    brackets = false
-  }
-
-\DeclareAcroFirstStyle {square} {inline}
-  { brackets-type = [] }
-
-\DeclareAcroFirstStyle {plain} {inline}
-  {
-    brackets = false ,
-    between = --
-  }
-
-\DeclareAcroFirstStyle {plain-reversed} {inline}
-  { 
-    brackets = false ,
-    between = -- ,
-    reversed = true
-  }
-
-\DeclareAcroFirstStyle {footnote} {note}
-  { }
-
-\DeclareAcroFirstStyle {footnote-reversed} {note}
-  { reversed = true }
-
-\DeclareAcroFirstStyle {sidenote} {note}
-  { note-command = \sidenote {#1} }
-
-\DeclareAcroFirstStyle {sidenote-reversed} {note}
-  {
-    note-command = \sidenote {#1} ,
-    reversed     = true
-  }
-
-\DeclareAcroFirstStyle {empty} {note}
-  { use-note = false }
-
-% --------------------------------------------------------------------------
-% extra info appearance styles:
-\DeclareAcroExtraStyle {default} {inline}
-  {
-    brackets     = false ,
-    punct        = true ,
-    punct-symbol = .
-  }
-
-\DeclareAcroExtraStyle {plain} {inline}
-  {
-    brackets     = false ,
-    punct        = true ,
-    punct-symbol =
-  }
-
-\DeclareAcroExtraStyle {paren} {inline}
-  {
-    brackets     = true ,
-    punct        = true ,
-    punct-symbol =
-  }
-
-\DeclareAcroExtraStyle {bracket} {inline}
-  {
-    brackets      = true ,
-    punct         = true ,
-    punct-symbol  = ,
-    brackets-type = []
-  }
-
-\DeclareAcroExtraStyle {comma} {inline}
-  {
-    punct         = true,
-    punct-symbol  = {,} ,
-    brackets      = false
-  }
-
-% --------------------------------------------------------------------------
-% page number appearance styles:
-\DeclareAcroPageStyle {default} {inline}
-  {
-    punct = true ,
-    punct-symbol = .
-  }
-  
-\DeclareAcroPageStyle {plain}   {inline}
-  { punct = false }
-
-\DeclareAcroPageStyle {comma}   {inline}
-  { punct = true }
-
-\DeclareAcroPageStyle {paren}   {inline}
-  {
-    brackets=true ,
-    punct-symbol = ~
-  }
-
-\DeclareAcroPageStyle {none}    {inline}
-  { display = false }
-
-% --------------------------------------------------------------------------
-% list heading styles:
-\DeclareAcroListHeading {part}           {\part}
-\DeclareAcroListHeading {part*}          {\part*}
-\DeclareAcroListHeading {chapter}        {\chapter}
-\DeclareAcroListHeading {chapter*}       {\chapter*}
-\DeclareAcroListHeading {addchap}        {\addchap}
-\DeclareAcroListHeading {section}        {\section}
-\DeclareAcroListHeading {section*}       {\section*}
-\DeclareAcroListHeading {addsec}         {\addsec}
-\DeclareAcroListHeading {subsection}     {\subsection}
-\DeclareAcroListHeading {subsection*}    {\subsection*}
-\DeclareAcroListHeading {subsubsection}  {\subsubsection}
-\DeclareAcroListHeading {subsubsection*} {\subsubsection*}
-\DeclareAcroListHeading {none}           {\use_none:n}
-
-% --------------------------------------------------------------------------
-% list styles:
-\DeclareAcroListStyle {description} {list}
-  { }
-
-\DeclareAcroListStyle {toc} {list-of}
-  { }
-
-\DeclareAcroListStyle {lof} {list-of}
-  { style = lof }
-
-\DeclareAcroListStyle {tabular} {table}
-  { table = tabular }
-
-\DeclareAcroListStyle {longtable} {table}
-  { table = longtable }
-
-\DeclareAcroListStyle {extra-tabular} {extra-table}
-  { table = tabular }
-
-\DeclareAcroListStyle {extra-longtable} {extra-table}
-  { table = longtable }
-
-\DeclareAcroListStyle {extra-tabular-rev} {extra-table}
-  {
-    table   = tabular ,
-    reverse = true
-  }
-
-\DeclareAcroListStyle {extra-longtable-rev} {extra-table}
-  {
-    table   = longtable ,
-    reverse = true
-  }
-
-% --------------------------------------------------------------------------
-% register some tokens to be checked for:
-\AcroRegisterTrailing . {dot}
-\AcroRegisterTrailing - {dash}
-\AcroRegisterTrailing \babelhyphen {babel-hyphen}
-
-\acsetup { activate-trailing-tokens = dot }
-
-% some user macros:
-\cs_new_protected:Npn \acro_dot:
-  { \acro_if_trailing_tokens:nF {dot} {.\@} }
-
-\cs_new_protected:Npn \acro_space:
-  { \acro_if_trailing_tokens:nF {dash,babel-hyphen} { \c_space_tl } }
-
-% --------------------------------------------------------------------------
-% translations:
-% list name
-\DeclareAcroTranslation {acronym-list-name}
-  {
-    Fallback   = Acronyms ,
-    English    = Acronyms ,
-    French     = Acronymes ,
-    German     = Abk\"urzungen ,
-    Italian    = Acronimi ,
-    Portuguese = Acr\'onimos ,
-    Spanish    = Siglas ,
-    Catalan    = Sigles ,
-    Turkish    = K\i saltmalar
-  }
-
-% page name
-\DeclareAcroTranslation {acronym-page-name}
-  {
-    Fallback   = p. ,
-    English    = p. ,
-    German     = S. ,
-    Portuguese = p.
-  }
-
-% pages name
-\DeclareAcroTranslation {acronym-pages-name}
-  {
-    Fallback   = pp. ,
-    English    = pp. ,
-    German     = S. ,
-    Portuguese = pp.
-  }
-
-% following page
-\DeclareAcroTranslation {acronym-next-page}
-  {
-    Fallback   = f. ,
-    English    = f. ,
-    German     = f. ,
-    Portuguese = s.
-  }
-
-% following pages
-\DeclareAcroTranslation {acronym-next-pages}
-  {
-    Fallback   = ff. ,
-    English    = ff. ,
-    German     = ff. ,
-    Portuguese = ss.
-  }
-
-\file_input_stop:

Modified: trunk/Master/texmf-dist/tex/latex/acro/acro.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/acro/acro.sty	2020-04-29 21:21:14 UTC (rev 54936)
+++ trunk/Master/texmf-dist/tex/latex/acro/acro.sty	2020-04-29 21:22:29 UTC (rev 54937)
@@ -5,7 +5,7 @@
 % 
 % --------------------------------------------------------------------------
 % Clemens Niederberger
-% Web:    https://bitbucket.org/cgnieder/acro/
+% Web:    https://github.com/cgnieder/acro/
 % E-Mail: contact at mychemistry.eu
 % --------------------------------------------------------------------------
 % Copyright 2011--2020 Clemens Niederberger
@@ -30,15 +30,15 @@
 % If you have any ideas, questions, suggestions or bugs to report, please
 % feel free to contact me.
 % --------------------------------------------------------------------------
-\RequirePackage{expl3,xparse,xtemplate,l3keys2e}
-\RequirePackage{etoolbox} % for the document hooks
-
+\RequirePackage{expl3,xparse,l3keys2e}
 \ExplSyntaxOn
 
-\tl_const:Nn \c_acro_date_tl                 {2020/03/07}
-\tl_const:Nn \c_acro_version_major_number_tl {2}
-\tl_const:Nn \c_acro_version_minor_number_tl {11}
-\tl_const:Nn \c_acro_version_subrelease_tl   {d}
+% setup package:
+\tl_const:Nn \c_acro_package_name_tl {acro}
+\tl_const:Nn \c_acro_date_tl {2020/04/29}
+\tl_const:Nn \c_acro_version_major_number_tl {3}
+\tl_const:Nn \c_acro_version_minor_number_tl {0}
+\tl_const:Nn \c_acro_version_subrelease_tl   {}
 \tl_const:Nx \c_acro_version_number_tl
   {
     \c_acro_version_major_number_tl .
@@ -49,3448 +49,4199 @@
     \c_acro_version_number_tl
     \c_acro_version_subrelease_tl
   }
-\tl_const:Nn \c_acro_info_tl {Typeset~ Acronyms}
+\tl_const:Nn \c_acro_info_tl {typeset~ acronyms~ and~ other~ abbreviations}
 
 \ProvidesExplPackage
-  {acro}
+  {\c_acro_package_name_tl}
   {\c_acro_date_tl}
   {\c_acro_version_tl}
   {\c_acro_info_tl}
 
 % --------------------------------------------------------------------------
-% warning and error messages:
-\msg_new:nnn {acro} {undefined}
-  {
-    You've~ requested~ acronym~ `#1'~ \msg_line_context: \ but~ you~
-    apparently~ haven't~ defined~ it,~ yet! \\
-    Maybe~ you've~ misspelled~ `#1'?
-  }
+% document hooks:
+\tl_new:N \g_acro_end_document_hook_tl
+\tl_new:N \g_acro_begin_document_hook_tl
 
-\msg_new:nnn {acro} {macro}
-  {
-    A~ macro~ with~ the~ csname~ `#1'~ already~ exists! \\
-    Unless~ you~ set~ acro's~ option~ `strict'~ I~ won't~ redefine~ it~
-    \msg_line_context: .
-  } 
+\AtBeginDocument { \tl_use:N \g_acro_begin_document_hook_tl }
+\AtEndDocument   { \tl_use:N \g_acro_end_document_hook_tl }
 
-\msg_new:nnn {acro} {replaced}
+\cs_new_protected:Npn \acro_at_begin_document:n #1
+  { \tl_gput_right:Nn \g_acro_begin_document_hook_tl {#1} }
+
+\cs_new_protected:Npn \acro_at_end_document:n #1
+  { \tl_gput_right:Nn \g_acro_end_document_hook_tl {#1} }
+
+% --------------------------------------------------------------------------
+% load-time messages:
+\msg_new:nnn {acro} {load-time-option}
   {
-    The~ #1~ `#2' ~you ~used~ \msg_line_context: \ is~ deprecated~ and~ has~
-    been~ replaced~ by~ `#3'. ~Since~ I~ will~ not~ guarantee~ that~ #1~ `#2'~
-    will~ be~ kept~ forever~ I~ strongly~ encourage~ you~ to~ switch!
+    `#1'~ is~ a~ load-time~ option! \\
+    You~ cannot~ set~ it~ with~ \token_to_str:N \acsetup ! \\
+    You~ need~ to~ use~ \token_to_str:N \usepackage [#1] {acro} .
   }
 
-\msg_new:nnn {acro} {deprecated}
+\msg_new:nnn {acro} {unknown-option}
   {
-    The~ #1~ `#2'~ you~ used~ \msg_line_context: \ is~ deprecated~and~ there~
-    is~ no~ replacement.~ Since~ I~ will~ not~ guarantee~ that~ #1~ `#2'~
-    will~ be~ kept~ forever~ I~ strongly~ encourage~ you~ to~ remove~ it~
-    from~ your~ document.
+    Unknown~ option~ `#1' \\
+    I~ dont'~ know~ the~ option~ `#1'.~ Please~ make~ sure~ there~ is~ no~
+    typo.~ Check~ the~ manual~ for~ help.
   }
 
-\msg_new:nnn {acro} {substitute-short}
+% --------------------------------------------------------------------------
+% re-compile mechanism:
+\bool_new:N \g__acro_rerun_bool
+\tl_new:N \g__acro_rerun_message_tl
+
+\tl_const:Nn \l__acro_rerun_general_tl
+  { Rerun~ to~ get~ `acro'~ synchronized. }
+
+\tl_const:Nn \l__acro_rerun_property_tl
   {
-    There~ is~ no~ short~ form~ set~ for~ acronym~ `#1'! \\
-    I~ am~ setting~ the~ short~ form~ equal~ to~ the~ ID~ `#1'. \\
-    If~ that~ is~ not~ what~ you~ want~ make~ sure~ to~ add~ an~ explicit~
-    short~ form.
+    Acronym~ properties~ may~ have~ changed.~ Rerun~ to~ get~ them~
+    synchronized.
   }
-\msg_new:nnn {acro} {ending-exists}
+
+\tl_const:Nn \l__acro_rerun_list_tl
   {
-    An~ ending~ with~ the~ name~ `#1'~ already~ exists! \\ \\
-    I~ am~ overwriting~ the~ defaults.
+    Empty~ acronym~ list.~ If~ you~ have~ used~ acronyms~ then~ re-compile~
+    to~ get~ the~ list~ filled.~ Otherwise~ remove~ \token_to_str:N
+    \printacronyms
   }
 
-\msg_new:nnn {acro} {ending-before-acronyms}
+\msg_new:nnn {acro} {rerun} { \use:c {l__acro_rerun_#1_tl} }
+
+\prg_new_conditional:Npnn \acro_if_rerun: {p,T,F,TF}
   {
-    You~ are~ using~ \token_to_str:N \ProvideAcroEnding \ after~ you've~
-    declared~ at~ least~ one~ acronym.~ This~ will~ lead~ to~ trouble! \\
-    Make~ sure~ to~ define~ endings~ before~ *any*~ acronym~ declarations!
+    \bool_if:NTF \g__acro_rerun_bool
+      { \prg_return_true: }
+      { \prg_return_false: }
   }
 
-\msg_new:nnn {acro} {no-alternative}
+\cs_new_protected:Npn \acro_rerun:n #1
   {
-    There~ is~ no~ alternative~ form~ for~ acronym~ `#1'! \\ \\
-    I~ am~ using~ the~ short~ form~ instead.
+    \bool_gset_true:N \g__acro_rerun_bool
+    \tl_map_inline:Nn \g__acro_rerun_message_tl
+      {
+        \tl_if_eq:nnT {##1} {#1}
+          { \tl_map_break:n { \use_none:nn } }
+      }
+    \use:n { \tl_gput_right:Nn \g__acro_rerun_message_tl {{#1}} }
   }
 
-\msg_new:nnn {acro} {unknown}
+\cs_new_protected:Npn \acro_do_rerun:
   {
-    You're~ trying~ to~ use~ the~ #1~ `#2'~ \msg_line_context: . \\
-    However,~ I~ do~ not~ know~ #1~ `#2'! \\
-    If~ this~ is~ no~ typo~ please~ contact~ the~ package~ author. \\ \\
-    I~ am~ going~ to~ use~ the~ #1~ `#3'~ instead.
+    \acro_if_rerun:T
+      {
+        \tl_map_inline:Nn \g__acro_rerun_message_tl
+          {
+            \str_case:nnTF {##1}
+              {
+                {property} { \msg_warning:nnn {acro} {rerun} {property} }
+                {list} { \msg_warning:nnn {acro} {rerun} {list} }
+                {general} { \msg_warning:nnn {acro} {rerun} {general} }
+              }
+              { \tl_map_break: }
+              { \msg_warning:nnn {acro} {rerun} {general} }
+          }
+      }
   }
-\msg_new:nnn {acro} {definitions-missing}
+
+% --------------------------------------------------------------------------
+% debugging mechanism:
+\bool_new:N \g__acro_debug_bool
+
+\prg_new_conditional:Npnn \acro_if_debug: {p,T,F,TF}
   {
-    I~ cannot~ find~ the~ file~ \c_acro_definition_file_name_tl
-    .\c_acro_definition_file_extension_tl !~ This~ file~ contains~ all~
-    essential~ user~ commands~ of~ acro~ and~ is~ a~ crucial~ part~ of~ the~
-    package!~ Please~ check~ your~ installation.
+    \bool_if:NTF \g__acro_debug_bool
+      { \prg_return_true: }
+      { \prg_return_false: }
   }
 
 % --------------------------------------------------------------------------
-% temporary variables
-\tl_new:N   \l__acro_tmpa_tl
-\tl_new:N   \l__acro_tmpb_tl
-\tl_new:N   \l__acro_tmpc_tl
-\prop_new:N \l__acro_tmpa_prop
-\prop_new:N \l__acro_tmpb_prop
-\seq_new:N  \l__acro_tmpa_seq
-\seq_new:N  \l__acro_tmpb_seq
-\int_new:N  \l__acro_tmpa_int
-\int_new:N  \l__acro_tmpb_int
-\int_new:N  \l__acro_tmpc_int
-\int_new:N  \l__acro_tmpd_int
+% check for stuff changed in the new version:
+\bool_new:N \g__acro_upgrade_bool
 
-% --------------------------------------------------------------------------
-% variants of kernel commands
-\cs_generate_variant:Nn \quark_if_no_value:nTF  {V}
-\cs_generate_variant:Nn \tl_put_right:Nn        {NV,Nv}
-\cs_generate_variant:Nn \tl_if_eq:nnT           {V}
-\cs_generate_variant:Nn \tl_if_eq:nnF           {V}
-\cs_generate_variant:Nn \seq_use:Nnnn           {c}
-\cs_generate_variant:Nn \seq_gset_split:Nnn     {c}
-\cs_generate_variant:Nn \seq_set_split:Nnn      {NnV}
-\cs_generate_variant:Nn \seq_if_in:NnT          {NV}
-\cs_generate_variant:Nn \seq_if_in:NnTF         {Ne}
-\cs_generate_variant:Nn \prop_put:Nnn           {NnV,cnx,cnv}
-\cs_generate_variant:Nn \prop_get:NnNTF         {cnc}
-\cs_generate_variant:Nn \prop_get:NnNF          {cn,cnc}
-\cs_generate_variant:Nn \prop_get:NnN           {cnc}
-\cs_generate_variant:Nn \cs_generate_variant:Nn {c}
-\cs_generate_variant:Nn \str_case:nn            {V}
+\prg_new_conditional:Npnn \acro_if_upgrade: {p,T,F,TF}
+  {
+    \bool_if:NTF \g__acro_upgrade_bool
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
 
 % --------------------------------------------------------------------------
-% variables:
-\bool_new:N      \l__acro_acc_supp_bool
-\bool_new:N      \l__acro_addto_index_bool
-\bool_new:N      \l__acro_capitalize_list_bool
-\bool_new:N      \g__acro_case_sensitive_bool
-\bool_new:N      \l__acro_citation_all_bool
-\bool_new:N      \l__acro_citation_first_bool
-\bool_set_true:N \l__acro_citation_first_bool
-\bool_new:N      \l__acro_create_macros_bool
-\bool_new:N      \l__acro_custom_alt_format_bool
-\bool_new:N      \l__acro_custom_long_format_bool
-\bool_new:N      \l__acro_custom_short_format_bool
-\bool_new:N      \l__acro_custom_foreign_format_bool
-\bool_new:N      \l__acro_extra_punct_bool
-\bool_new:N      \l__acro_extra_use_brackets_bool
-\bool_new:N      \g__acro_first_acronym_declared_bool
-\bool_new:N      \l__acro_first_instance_bool
-\bool_new:N      \l__acro_first_only_short_bool
-\bool_new:N      \l__acro_first_only_long_bool
-\bool_new:N      \l__acro_first_reversed_bool
-\bool_new:N      \l__acro_first_switched_bool
-\bool_new:N      \l__acro_first_use_brackets_bool
-\bool_new:N      \l__acro_first_upper_bool
-\bool_new:N      \l__acro_following_page_bool
-\bool_new:N      \l__acro_following_pages_bool
-\bool_new:N      \l__acro_foreign_bool
-\bool_set_true:N \l__acro_foreign_bool
-\bool_new:N      \l__acro_group_citation_bool
-\bool_new:N      \l__acro_hyperref_loaded_bool
-\bool_new:N      \l__acro_hyperref_use_bool
-\bool_new:N      \l__acro_include_endings_format_bool
-\bool_new:N      \l__acro_indefinite_bool
-\bool_new:N      \l__acro_in_list_bool
-\bool_new:N      \l__acro_is_included_bool
-\bool_new:N      \l__acro_is_excluded_bool
-\bool_new:N      \l__acro_list_all_pages_bool
-\bool_set_true:N \l__acro_list_all_pages_bool
-\bool_new:N      \l__acro_list_reverse_long_extra_bool
-\bool_new:N      \l__acro_log_acronyms_bool
-\bool_new:N      \l__acro_log_acronyms_verbose_bool
-\bool_new:N      \l__acro_mark_as_used_bool
-\bool_new:N      \g__acro_mark_first_as_used_bool
-\bool_new:N      \l__acro_override_list_format_bool
-\bool_new:N      \l__acro_page_brackets_bool
-\bool_new:N      \l__acro_page_display_bool
-\bool_new:N      \l__acro_page_punct_bool
-\bool_new:N      \l__acro_place_label_bool
-\bool_new:N      \l__acro_print_only_used_bool
-\bool_set_true:N \l__acro_print_only_used_bool
-\bool_new:N      \g__acro_rerun_bool
-\bool_new:N      \g__acro_reset_at_barrier_bool
-\bool_new:N      \l__acro_silence_bool
-\bool_new:N      \l__acro_single_use_bool
-\bool_new:N      \l__acro_sort_bool
-\bool_set_true:N \l__acro_sort_bool
-\bool_new:N      \l__acro_strict_bool
-\bool_new:N      \l__acro_trailing_tokens_bool
-\bool_new:N      \l__acro_tooltip_bool
-\bool_new:N      \l__acro_tooltip_inside_bool
-\bool_new:N      \l__acro_upper_indefinite_bool
-\bool_new:N      \l__acro_upper_short_bool
-\bool_new:N      \l__acro_use_acronyms_bool
-\bool_set_true:N \l__acro_use_acronyms_bool
-\bool_new:N      \l__acro_use_barrier_bool
-\bool_new:N      \g__acro_use_barriers_bool
-\bool_new:N      \l__acro_use_ending_form_bool
-\bool_new:N      \l__acro_use_note_bool
-\bool_new:N      \l__acro_xspace_bool
+% 
+\bool_new:N \g__acro_final_bool
 
-\str_new:N \l__acro_current_id_str
+\prg_new_conditional:Npnn \acro_if_final: {p,T,F,TF}
+  {
+    \bool_if:NTF \g__acro_final_bool
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
 
-\tl_new:N  \l__acro_list_entries_tl
-\tl_new:N  \l__acro_endings_tl
-\tl_new:N  \l__acro_trailing_tokens_tl
-\tl_new:N  \l__acro_included_classes_tl
-\tl_new:N  \l__acro_excluded_classes_tl
-\tl_new:N  \l__acro_ignore_tl
-\tl_new:N  \l__acro_default_indefinite_tl
-\tl_set:Nn \l__acro_default_indefinite_tl {a}
-\tl_new:N  \l__acro_foreign_sep_tl
-\tl_new:N  \l__acro_extra_instance_tl
-\tl_set:Nn \l__acro_extra_instance_tl {default}
-\tl_new:N  \l__acro_page_instance_tl
-\tl_set:Nn \l__acro_page_instance_tl  {none}
-\tl_new:N  \l__acro_page_name_tl
-\tl_new:N  \l__acro_pages_name_tl
-\tl_new:N  \l__acro_next_page_tl
-\tl_new:N  \l__acro_next_pages_tl
-\tl_new:N  \l__acro_list_instance_tl
-\tl_set:Nn \l__acro_list_instance_tl  {description}
-\tl_new:N  \l__acro_list_type_tl
-\tl_new:N  \l__acro_list_heading_cmd_tl
-\tl_set:Nn \l__acro_list_heading_cmd_tl {section*}
-\tl_new:N  \l__acro_list_name_tl
-\tl_new:N  \l__acro_list_before_tl
-\tl_new:N  \l__acro_list_after_tl
-\tl_new:N  \l__acro_custom_short_format_tl
-\tl_new:N  \l__acro_first_between_tl
-\tl_new:N  \l__acro_citation_connect_tl
-\tl_new:N  \l__acro_between_group_connect_citation_tl
-\tl_new:N  \l__acro_extra_brackets_tl
-\tl_new:N  \l__acro_extra_punct_tl
-\tl_new:N  \l__acro_first_brackets_tl
-\tl_new:N  \l__acro_page_punct_tl
-\tl_new:N  \l__acro_page_brackets_tl
-\tl_new:N  \l__acro_last_page_tl
-\tl_new:N  \l__acro_current_page_tl
-\tl_new:N  \l__acro_list_table_tl
-\tl_new:N  \l__acro_list_table_spec_tl
-\tl_new:N  \l__acro_acc_supp_tl
-\tl_new:N  \l__acro_acc_supp_options_tl
-\tl_new:N  \l__acro_label_prefix_tl
-\tl_set:Nn \l__acro_label_prefix_tl {ac:}
-\tl_new:N  \l__acro_index_short_tl
-\tl_new:N  \l__acro_first_instance_tl
-\tl_set:Nn \l__acro_first_instance_tl {default}
-\tl_new:N  \l__acro_short_tl
-\tl_new:N  \l__acro_short_format_tl
-\tl_new:N  \l__acro_list_short_format_tl
-\tl_new:N  \l__acro_alt_tl
-\tl_new:N  \l__acro_alt_format_tl
-\tl_new:N  \l__acro_long_tl
-\tl_new:N  \l__acro_long_format_tl
-\tl_new:N  \l__acro_list_long_format_tl
-\tl_new:N  \l__acro_single_form_tl
-\tl_set:Nn \l__acro_single_form_tl {long}
-\tl_new:N  \l__acro_extra_format_tl
-\tl_new:N  \l__acro_foreign_format_tl
-\tl_new:N  \l__acro_foreign_list_format_tl
-\tl_set:Nn \l__acro_foreign_list_format_tl { \acroenparen }
-\tl_new:N  \l__acro_index_format_tl
+% --------------------------------------------------------------------------
+% load-time options:
+% #1: message name
+\cs_new_protected:Npn \__acro_loadtime_error:n #1
+   { \msg_error:nnV {acro} {#1} \l_keys_key_str }
 
-\skip_new:N \l__acro_page_space_skip
+\cs_new_protected:Npn \__acro_loadtime_warning:n #1
+   { \msg_warning:nnV {acro} {#1} \l_keys_key_str }
 
-\dim_new:N  \l__acro_short_width_dim
-\dim_set:Nn \l__acro_short_width_dim {3em}
+\cs_generate_variant:Nn \msg_error:nnn {nnV}
+\cs_generate_variant:Nn \msg_warning:nnn {nnV}
 
-\int_new:N  \g__acro_barrier_int
+\int_new:N \g__acro_version_int
 
-\seq_new:N \l__acro_endings_seq
-\seq_new:N \l__acro_actions_seq
-\seq_new:N \g__acro_declared_acronyms_seq
+\keys_define:nn {acro/package}
+  {
+    debug       .bool_gset:N = \g__acro_debug_bool ,
+    debug       .initial:n   = false ,
+    upgrade     .bool_gset:N = \g__acro_upgrade_bool ,
+    upgrade     .initial:n   = true ,
+    final       .bool_set:N  = \g__acro_final_bool ,
+    final       .initial:n   = false ,
+    version     .choice: ,
+    version / 2 .code:n      = \int_set:Nn \g__acro_version_int {2} ,
+    version / 3 .code:n      = \int_set:Nn \g__acro_version_int {3} ,
+    version     .initial:n   = 3 ,
+    unknown     .code:n      = \__acro_loadtime_warning:n {unknown-option}
+  }
 
-\prop_new:N \l__acro_citation_prop
-\prop_new:N \l__acro_citation_pre_prop
-\prop_new:N \l__acro_citation_post_prop
-\prop_new:N \l__acro_pdfstring_alt_prop
-\prop_new:N \l__acro_pdfstring_short_prop
-\prop_new:N \g__acro_properties_prop
-\prop_new:N \l__acro_trailing_tokens_prop
-\prop_new:N \l__acro_trailing_actions_prop
-\prop_new:N \l__acro_list_styles_prop
-\prop_new:N \l__acro_list_headings_prop
-\prop_new:N \l__acro_first_styles_prop
-\prop_new:N \l__acro_extra_styles_prop
-\prop_new:N \l__acro_page_styles_prop
+\ProcessKeysPackageOptions {acro/package}
 
-% --------------------------------------------------------------------------
-% logging:
-\prg_new_conditional:Npnn \acro_if_log: {p,T,F,TF}
+\int_compare:nNnT \g__acro_version_int = 2
   {
-    \bool_if:NTF \l__acro_log_acronyms_bool
-      { \prg_return_true: }
-      { \prg_return_false: }
+    \RequirePackage {acro2}
+    \file_input_stop:
   }
 
-\keys_define:nn {acro}
+\keys_define:nn {acro/package}
   {
-    log           .choice: ,
-    log / true    .code:n    =
-      \bool_set_true:N \l__acro_log_acronyms_bool
-      \bool_set_false:N \l__acro_log_acronyms_verbose_bool ,
-    log / silent  .meta:n    = { log = true } ,
-    log / verbose .code:n    =
-      \bool_set_true:N \l__acro_log_acronyms_bool
-      \bool_set_true:N \l__acro_log_acronyms_verbose_bool ,
-    log / false   .code:n    =
-      \bool_set_false:N \l__acro_log_acronyms_bool
-      \bool_set_false:N \l__acro_log_acronyms_verbose_bool ,
-    log           .default:n = true ,
-    log           .initial:n = false
+    debug   .code:n = \__acro_loadtime_error:n {load-time-option} ,
+    upgrade .code:n = \__acro_loadtime_error:n {load-time-option} ,
+    final   .code:n = \__acro_loadtime_error:n {load-time-option}
   }
 
-\cs_new:Npn \__acro_write_log:nn #1#2 { \ \ \ #1 ~ = ~ {#2} }
-\cs_new:Npn \__acro_write_log_property:nnn #1#2#3
-  { \__acro_write_log:nn {#2} { \__acro_property_get:nn {#3} {#1} } }
+% ----------------------------------------------------------------------------
+% temporary variables:
+\tl_new:N \l__acro_tmpa_tl
+\tl_new:N \l__acro_tmpb_tl
+\tl_new:N \l__acro_tmpc_tl
 
-\cs_new:Npn \__acro_ending_log_entry:nn #1#2
+\str_new:N \l__acro_tmpa_str
+\str_new:N \l__acro_tmpb_str
+\str_new:N \l__acro_tmpc_str
+
+\bool_new:N \l__acro_tmpa_bool
+\bool_new:N \l__acro_tmpb_bool
+\bool_new:N \l__acro_tmpc_bool
+
+\seq_new:N \l__acro_tmpa_seq
+\seq_new:N \l__acro_tmpb_seq
+\seq_new:N \l__acro_tmpc_seq
+
+\int_new:N \l__acro_tmpa_int
+\int_new:N \l__acro_tmpb_int
+\int_new:N \l__acro_tmpc_int
+\int_new:N \l__acro_tmpd_int
+
+\clist_new:N \l__acro_tmpa_clist
+\clist_new:N \l__acro_tmpb_clist
+\clist_new:N \l__acro_tmpc_clist
+
+% ----------------------------------------------------------------------------
+% module mechanism:
+\msg_new:nnn {acro} {module-missing}
   {
-    | \\
-    | \__acro_write_log_property:nnn {#1} {short-#2} {short_#2} \\
-    | \__acro_write_log_property:nnn {#1} {short-#2-form} {short_#2_form} \\
-    | \__acro_write_log_property:nnn {#1} {long-#2} {long_#2} \\
-    | \__acro_write_log_property:nnn {#1} {long-#2-form} {long_#2_form} \\
-    | \__acro_write_log_property:nnn {#1} {alt-#2} {alt_#2} \\
-    | \__acro_write_log_property:nnn {#1} {alt-#2-form} {alt_#2_form} \\
-    | \__acro_write_log_property:nnn {#1} {foreign-#2} {foreign_#2} \\
-    | \__acro_write_log_property:nnn {#1} {foreign-#2-form} {foreign_#2_form} \\
+    You've~ requested~ the~ acro~ module~ `#1'~ but~ it~ appears~ to~
+    be~ missing~ on~ your~ system.~ Maybe~ you've~ misspelled~ the~ name?~
+    Loading~ the~ module~ will~ abort~ \msg_line_context:
   }
-  
-\msg_new:nnn {acro} {log-acronym-verbose}
+
+\msg_new:nnn {acro} {loading-module}
+  { Loading~ module~ `#1'~ ... }
+
+\msg_new:nnn {acro} {wrong-module-name}
+  { The~ module~ file~ name~ is~ `#2'~ but~ it~ provides~ module~ `#1'. }
+
+\msg_new:nnn {acro} {forbidden-module}
   {
-    ================================================= \\
-    | ~ \msg_info_text:n {acro}~ --~ defining~ new~ acronym: \\
-    | \__acro_write_log:nn {ID} {#1} \\
-    | \__acro_write_log_property:nnn {#1} {short} {short} \\
-    | \__acro_write_log_property:nnn {#1} {long} {long} \\
-    | \__acro_write_log_property:nnn {#1} {alt} {alt} \\
-    | \__acro_write_log_property:nnn {#1} {sort} {sort} \\
-    | \__acro_write_log_property:nnn {#1} {class} {class} \\
-    | \__acro_write_log_property:nnn {#1} {list} {list} \\
-    | \__acro_write_log_property:nnn {#1} {extra} {extra} \\
-    | \__acro_write_log_property:nnn {#1} {foreign} {foreign} \\
-    | \__acro_write_log_property:nnn {#1} {single} {single} \\
-    | \__acro_write_log_property:nnn {#1} {pdfstring} {pdfstring} \\
-    | \__acro_write_log_property:nnn {#1} {accsupp} {accsupp} \\
-    | \__acro_write_log_property:nnn {#1} {tooltip} {tooltip} \\
-    | \\
-    | \__acro_write_log_property:nnn {#1} {short-indefinite} {short_indefinite} \\
-    | \__acro_write_log_property:nnn {#1} {long-indefinite} {long_indefinite} \\
-    | \__acro_write_log_property:nnn {#1} {alt-indefinite} {alt_indefinite} \\
-    \seq_map_function:NN \l__acro_endings_seq \__acro_ending_log_entry:n
-    | \\
-    | \__acro_write_log_property:nnn {#1} {short-format} {short_format} \\
-    | \__acro_write_log_property:nnn {#1} {long-format} {long_format} \\
-    | \__acro_write_log_property:nnn {#1} {first-long-format} {first_long_format} \\
-    | \__acro_write_log_property:nnn {#1} {single-format} {single_format} \\
-    | \__acro_write_log_property:nnn {#1} {foreign-lang} {foreign_lang} \\    
-    | \\
-    | \__acro_write_log_property:nnn {#1} {cite} {citation} \\
-    | \__acro_write_log_property:nnn {#1} {before-citation} {before_citation} \\
-    | \__acro_write_log_property:nnn {#1} {after-citation} {after_citation} \\
-    | \__acro_write_log_property:nnn {#1} {index} {index} \\
-    | \__acro_write_log_property:nnn {#1} {index-sort} {index_sort} \\
-    | \\
-    | \__acro_write_log_property:nnn {#1} {long-pre} {long_pre} \\
-    | \__acro_write_log_property:nnn {#1} {long-post} {long_post} \\
-    | \__acro_write_log_property:nnn {#1} {post} {post} \\
-    | \__acro_write_log_property:nnn {#1} {index-cmd} {index_cmd} \\
-    | \__acro_write_log_property:nnn {#1} {first-style} {first_style} \\
-    =================================================
+    You've~ requested~ the~ acro~ module~ `modules'~ \msg_line_context: .~
+  This~ module~ is~ a~ pseudo~ module~ which~ may~ not~ be~ loaded~ through~
+  the~ module~ loading~ mechansim.
   }
 
-\msg_new:nnn {acro} {log-acronym-silent}
+% ----------------------------------------------------------------------------
+\cs_generate_variant:Nn \str_if_eq:nnF {xx}
+\cs_generate_variant:Nn \msg_error:nnnn {nnnx}
+
+\prg_new_conditional:Npnn \acro_package_if_loaded:n #1 {p,T,F,TF}
   {
-    ================================================= \\
-    | ~ \msg_info_text:n {acro}~ --~ defining~ new~ acronym: \\
-    | \__acro_write_log:nn {ID} {#1} \\
-    | \__acro_write_log_property:nnn {#1} {short} {short} \\
-    | \__acro_write_log_property:nnn {#1} {long} {long} \\
-    | \__acro_write_log_property:nnn {#1} {alt} {alt} \\
-    | \__acro_write_log_property:nnn {#1} {sort} {sort} \\
-    | \__acro_write_log_property:nnn {#1} {class} {class} \\
-    | \__acro_write_log_property:nnn {#1} {list} {list} \\
-    | \__acro_write_log_property:nnn {#1} {extra} {extra} \\
-    | \__acro_write_log_property:nnn {#1} {foreign} {foreign} \\
-    | \__acro_write_log_property:nnn {#1} {cite} {citation} \\
-    =================================================
+    \cs_if_exist:cTF {ver@#1.sty}
+      { \prg_return_true: }
+      { \prg_return_false: }
   }
-  
-\cs_new_protected:Npn \__acro_log_acronym:n #1
-  {
-    \bool_if:NT \l__acro_log_acronyms_bool
-      {
-        \cs_set:Npn \__acro_ending_log_entry:n ##1
-          { \__acro_ending_log_entry:nn {#1} {##1} }
-        \bool_if:NTF \l__acro_log_acronyms_verbose_bool
-          { \msg_log:nnn {acro} {log-acronym-verbose} {#1} }
-          { \msg_log:nnn {acro} {log-acronym-silent} {#1} }
-      }
-  }   
 
-% --------------------------------------------------------------------------
-% message macros:
-\cs_new:Npn \__acro_remove_backslash:N #1
-  { \exp_after:wN \use_none:n \token_to_str:N #1 }
+% ----------------------------------------------------------------------------
+% this is for external file modules called "styles":
+\tl_const:Nn \c__acro_module_extension_tl {code.tex}
+\tl_const:Nn \c__acro_module_prefix_tl    {acro}
 
-\cs_new_protected:Npn \acro_new_message_commands:Nnnn #1#2#3#4
+\tl_new:N \g__acro_modules_loaded_tl
+
+\cs_new_protected:Npn \acro_modules_load:n #1
+  { \clist_map_inline:nn {#1} { \acro_module_load:n {##1} } }
+
+\cs_new_protected:Npn \acro_module_load:n #1
   {
-    \clist_map_inline:nn {#2}
+    \tl_set:Nx \l_tmpa_tl { \tl_trim_spaces:n {#1} }
+    \str_if_eq:VnTF \l_tmpa_tl {modules}
+      { \msg_error:nn {acro} {forbidden-module} }
+      {  \__acro_module_load:V \l_tmpa_tl }
+  }
+
+\cs_new_protected:Npn \__acro_module_load:n #1
+  {
+    \acro_if_module_loaded:nF {#1}
       {
-        \cs_new_protected:cpn { \__acro_remove_backslash:N #1 ##1 }
+        \acro_module_if_exist:nTF {#1}
           {
-            \bool_if:NTF \l__acro_silence_bool
-              { \use:c { \__acro_remove_backslash:N #3 n##1 } {acro} }
-              { \use:c { \__acro_remove_backslash:N #4 n##1 } {acro} }
+            \__acro_module_hook_use:nn {#1} {before}
+            \msg_info:nnn {acro} {loading-module} {#1}
+            \@onefilewithoptions
+              {\c__acro_module_prefix_tl.#1}[][]
+              \c__acro_module_extension_tl
+            \__acro_module_hook_use:nn {#1} {after}
           }
+          { \msg_error:nnn {acro} {module-missing} {#1} }
       }
   }
+\cs_generate_variant:Nn \__acro_module_load:n {V}
 
-\acro_new_message_commands:Nnnn \acro_serious_message: {n,nn,nnn}
-  { \msg_warning: }
-  { \msg_error: }
+\prg_new_conditional:Npnn \acro_if_module_loaded:n #1 {p,T,F,TF}
+  {
+    \tl_if_in:NnTF \g__acro_modules_loaded_tl {#1}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
 
-\acro_new_message_commands:Nnnn \acro_harmless_message: {n,nn,nnn,nnnn}
-  { \msg_info: }
-  { \msg_warning: }
+\prg_new_conditional:Npnn \acro_module_if_exist:n #1 {p,T,F,TF}
+  {
+    \file_if_exist:nTF
+      {\c__acro_module_prefix_tl.#1.\c__acro_module_extension_tl}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
 
-\cs_new_protected:Npn \acro_option_deprecated:nn #1#2
+% --------------------------------------------------------------------------
+% module hooks:
+% #1: module
+% #2: code
+\cs_new_protected:Npn \acro_module_after:nn #1#2
   {
-    \tl_if_blank:nTF {#2}
-      { \acro_harmless_message:nnn  {deprecated} {option} {#1} }
-      { \acro_harmless_message:nnnn {replaced}   {option} {#1} {#2} }
+    \acro_if_module_loaded:nTF {#1}
+      {#2}
+      { \__acro_add_to_module_hook:nnn {#1} {after} {#2} }
   }
-\cs_new_protected:Npn \acro_option_deprecated:n #1
-  { \acro_option_deprecated:nn {#1} {} }
 
-\cs_new_protected:Npn \acro_command_deprecated:NN #1#2
+% #1: module
+% #2: code
+\cs_new_protected:Npn \acro_module_before:nn #1#2
   {
-    \tl_if_blank:nTF {#2}
+    % TODO: error in T case?
+    \acro_if_module_loaded:nF {#1}
+      { \__acro_add_to_module_hook:nnn {#1} {before} {#2} }
+  }
+
+% #1: module
+% #2: hook name
+% #3: code
+\cs_new_protected:Npn \__acro_add_to_module_hook:nnn #1#2#3
+  {
+    \acro_if_module_loaded:nF {#1}
       {
-        \acro_harmless_message:nnn {deprecated} {command}
-          { \token_to_str:N #1 }
+        \tl_if_exist:cF {g__acro_module_hook_#1_#2_tl}
+          { \tl_new:c {g__acro_module_hook_#1_#2_tl} }
+        \tl_gput_right:cn {g__acro_module_hook_#1_#2_tl} {#3}
       }
+  }
+
+% #1: module
+% #2: hook name
+\cs_new_protected:Npn \__acro_module_hook_use:nn #1#2
+  {
+    \tl_if_exist:cT {g__acro_module_hook_#1_#2_tl}
       {
-        \acro_harmless_message:nnnn {replaced} {command}
-          { \token_to_str:N #1 }
-          { \token_to_str:N #2 }
+        \tl_use:c {g__acro_module_hook_#1_#2_tl}
+        \tl_gclear:c {g__acro_module_hook_#1_#2_tl}
       }
   }
+\cs_generate_variant:Nn \__acro_module_hook_use:nn {V}
 
 % --------------------------------------------------------------------------
-% small commands for use at various places
-\cs_new:Npn \acro_no_break: { \tex_penalty:D 10000 \scan_stop: }
+\tl_new:N \l__acro_module_date_tl
+\tl_new:N \l__acro_module_version_tl
 
-\cs_new_protected:Npn \__acro_first_upper_case:n #1
-  { \text_titlecase_first:n {#1} }
-\cs_generate_variant:Nn \__acro_first_upper_case:n {x}
+\tl_set_eq:NN \l__acro_module_date_tl \c_acro_date_tl
+\tl_set_eq:NN \l__acro_module_version_tl \c_acro_version_tl
 
-\cs_new_eq:NN \acro_first_upper_case:n \__acro_first_upper_case:n
+\cs_new_protected:Npn \__acro_module:nn #1#2
+  {
+    \tl_gput_right:Nn \g__acro_modules_loaded_tl {{#1}}
+    \str_if_eq:xxF
+      {\c__acro_module_prefix_tl.#1.\c__acro_module_extension_tl}
+      {\@currname.\@currext}
+      {
+        \msg_error:nnnxx {acro} {wrong-module-name}
+          {#1}
+          {\@currname.\@currext}
+      }
+    \ProvidesFile
+      {\c__acro_module_prefix_tl.#1.\c__acro_module_extension_tl}
+      [
+        \l__acro_module_date_tl
+        \c_space_tl
+        v \l__acro_module_version_tl
+        \c_space_tl
+        acro~ style~ file~ `#1'~ (#2)
+      ]
+  }
 
 % --------------------------------------------------------------------------
-\tl_new:N \l_acro_config_file_name_tl
-\tl_new:N \l_acro_config_file_extension_tl
+% define internal acro modules:
+\tl_new:N \g_acro_module_tl
+\tl_new:N \g__acro_module_stop_tl
 
-\tl_set:Nn \l_acro_config_file_name_tl      {acro}
-\tl_set:Nn \l_acro_config_file_extension_tl {cfg}
+\cs_new_protected:Npn \acro_stop_module:n #1
+  { \tl_gput_right:Nn \g__acro_module_stop_tl {{#1}} }
 
-% options:
-\keys_define:nn {acro}
+% #1: name
+% #2: description
+\cs_new_protected:Npn \AcroModule #1#2
   {
-    messages          .choice: ,
-    messages / silent .code:n     =
-      \bool_set_true:N \l__acro_silence_bool ,
-    messages / loud .code:n       =
-      \bool_set_false:N \l__acro_silence_bool ,
-    messages          .value_required:n = true ,
-    config-file-name  .tl_set:N   = \l_acro_config_file_name_tl ,
-    config-file-name  .initial:n  = acro ,
-    config-file-extension .tl_set:N  = \l_acro_config_file_extension_tl ,
-    config-file-extension .initial:n = cfg ,
-    accsupp           .bool_set:N = \l__acro_acc_supp_bool ,
-    accsupp-options   .tl_set:N   = \l__acro_acc_supp_options_tl ,
-    tooltip           .bool_set:N = \l__acro_tooltip_bool ,
-    tooltip-cmd       .code:n     = \cs_set:Npn \__acro_tooltip_cmd:nn {#1} ,
-    tooltip-cmd       .value_required:n = true ,
-    macros            .bool_set:N = \l__acro_create_macros_bool ,
-    xspace            .bool_set:N = \l__acro_xspace_bool ,
-    % xspace            .code:n     = \acro_option_deprecated:nn {xspace} {} ,
-    strict            .bool_set:N = \l__acro_strict_bool ,
-    case-sensitive    .bool_set:N = \g__acro_case_sensitive_bool ,
-    case-sensitive    .initial:n  = true ,
-    sort              .bool_set:N = \l__acro_sort_bool ,
-    short-format      .code:n     =
-      \tl_set:Nn \l__acro_short_format_tl {#1}
-      \tl_set_eq:NN \l__acro_alt_format_tl \l__acro_short_format_tl
-      \tl_set:Nn \l__acro_list_short_format_tl {#1} ,
-    short-format      .value_required:n = true ,
-    alt-format        .tl_set:N   = \l__acro_alt_format_tl ,
-    alt-format        .value_required:n = true ,
-    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} ,
-    long-format       .value_required:n = true ,
-    first-long-format .code:n     =
-      \tl_set:Nn \l__acro_first_long_format_tl {#1} ,
-    first-long-format .value_required:n = true ,
-    single-format     .tl_set:N   = \l__acro_single_format_tl ,
-    single-format     .value_required:n = true ,
-    format-include-endings .bool_set:N = \l__acro_include_endings_format_bool ,
-    display-foreign   .bool_set:N = \l__acro_foreign_bool ,
-    foreign-format    .tl_set:N   = \l__acro_foreign_format_tl ,
-    foreign-format    .value_required:n = true ,
-    list-short-format .tl_set:N   = \l__acro_list_short_format_tl ,
-    list-short-format .value_required:n = true ,
-    list-short-width  .dim_set:N  = \l__acro_short_width_dim ,
-    list-short-width  .value_required:n = true ,
-    list-long-format  .tl_set:N   = \l__acro_list_long_format_tl ,
-    list-long-format  .value_required:n = true ,
-    list-foreign-format .tl_set:N = \l__acro_foreign_list_format_tl ,
-    list-foreign-format .value_required:n = true ,
-    override-list-format .bool_set:N = \l__acro_override_list_format_bool ,
-    override-list-format .initial:n  = true ,
-    extra-format      .tl_set:N   = \l__acro_extra_format_tl ,
-    extra-format      .value_required:n = true ,
-    single            .bool_set:N = \l__acro_single_use_bool ,
-    single-form       .tl_set:N   = \l__acro_single_form_tl ,
-    single-form       .value_required:n = true ,
-    first-style       .code:n     = \acro_set_first_style:n {#1} ,
-    first-style       .value_required:n = true ,
-    extra-style       .code:n     = \acro_set_extra_style:n {#1} ,
-    extra-style       .value_required:n = true ,
-    label             .bool_set:N = \l__acro_place_label_bool ,
-    label-prefix      .tl_set:N   = \l__acro_label_prefix_tl ,
-    label-prefix      .value_required:n = true ,
-    pages             .choice: ,
-    pages / all       .code:n     =
-      \bool_set_true:N \l__acro_list_all_pages_bool ,
-    pages / first     .code:n     =
-      \bool_set_true:N \l__acro_place_label_bool
-      \bool_set_false:N \l__acro_list_all_pages_bool ,
-    pages             .value_required:n = true ,
-    page-ref          .code:n     =
-      \acro_option_deprecated:nn {page-ref} {page-style}
-      \acro_set_page_style:n {#1} ,
-    page-style        .code:n     = \acro_set_page_style:n {#1} ,
-    page-style        .value_required:n = true ,
-    page-name         .tl_set:N   = \l__acro_page_name_tl ,
-    page-name         .value_required:n = true ,
-    pages-name        .tl_set:N   = \l__acro_pages_name_tl ,
-    pages-name        .value_required:n = true ,
-    following-page    .bool_set:N = \l__acro_following_page_bool ,
-    following-pages   .bool_set:N = \l__acro_following_pages_bool ,
-    following-pages*  .meta:n     =
-      { following-page = #1 , following-pages = #1 } ,
-    following-pages*  .default:n  = true ,
-    next-page         .tl_set:N   = \l__acro_next_page_tl ,
-    next-page         .value_required:n = true ,
-    next-pages        .tl_set:N   = \l__acro_next_pages_tl ,
-    next-pages        .value_required:n = true ,
-    list-style        .code:n     = \acro_set_list_style:n {#1} ,
-    list-style        .value_required:n = true ,
-    list-heading      .code:n     = \acro_set_list_heading:n {#1} ,
-    list-heading      .value_required:n = true ,
-    list-name         .tl_set:N   = \l__acro_list_name_tl ,
-    list-name         .value_required:n = true ,
-    hyperref          .bool_set:N = \l__acro_hyperref_use_bool ,
-    only-used         .bool_set:N = \l__acro_print_only_used_bool ,
-    mark-as-used      .choice: ,
-    mark-as-used / first .code:n  =
-      \bool_gset_true:N \g__acro_mark_first_as_used_bool ,
-    mark-as-used / any   .code:n  =
-      \bool_gset_false:N \g__acro_mark_first_as_used_bool ,
-    mark-as-used      .default:n  = any ,
-    list-caps         .bool_set:N = \l__acro_capitalize_list_bool ,
-    cite              .choice: ,
-    cite / all        .code:n     =
-      \bool_set_true:N \l__acro_citation_all_bool
-      \bool_set_true:N \l__acro_citation_first_bool ,
-    cite / none       .code:n     =
-      \bool_set_false:N \l__acro_citation_all_bool
-      \bool_set_false:N \l__acro_citation_first_bool ,
-    cite / first      .code:n     =
-      \bool_set_false:N \l__acro_citation_all_bool
-      \bool_set_true:N  \l__acro_citation_first_bool ,
-    cite              .default:n  = all ,
-    cite-cmd          .code:n     =
-      \cs_set:Npn \__acro_citation_cmd:w {#1} ,
-    cite-cmd          .value_required:n = true ,
-    group-cite-cmd    .code:n     =
-      \cs_set:Npn \__acro_group_citation_cmd:w {#1} ,
-    group-cite-cmd    .value_required:n = true ,
-    group-citation    .bool_set:N = \l__acro_group_citation_bool ,
-    cite-connect      .tl_set:N   = \l__acro_citation_connect_tl ,
-    cite-connect      .initial:n  = \nobreakspace ,
-    cite-connect      .value_required:n = true ,
-    group-cite-connect .tl_set:N = \l__acro_between_group_connect_citation_tl ,
-    group-cite-connect .initial:n = {,\nobreakspace} ,
-    group-cite-connect .value_required:n = true ,
-    index             .bool_set:N = \l__acro_addto_index_bool ,
-    index-cmd         .code:n     =
-      \cs_set:Npn \__acro_index_cmd:n {#1} ,
-    index-cmd         .value_required:n = true ,
-    uc-cmd            .code:n     =
-      \cs_set_eq:NN \__acro_first_upper_case:n #1 ,
-    uc-cmd            .value_required:n = true ,
-    uppercase-short   .bool_set:N = \l__acro_upper_short_bool ,
-    uppercase-short   .initial:n  = true
+    \msg_log:nnnn {acro} {loading-module} {#1} {#2}
+    \tl_gput_right:Nn \g__acro_modules_loaded_tl {{#1}}
+    \tl_gset:Nn \g_acro_module_tl {#1}
+    \__acro_module_hook_use:nn {#1} {before}
+    \tl_map_inline:Nn \g__acro_module_stop_tl
+      {
+        \str_if_eq:nnT {##1} {#1}
+          { \tl_map_break:n { \__acro_gobble_module:w } }
+      }
   }
 
-\AtBeginDocument
+\cs_new_protected:Npn \AcroModuleEnd
+  { \__acro_module_hook_use:Vn \g_acro_module_tl {after} }
+
+\cs_new_protected:Npn \__acro_gobble_module:w #1 \AcroModuleEnd {}
+
+\bool_lazy_or:nnT
+  { \acro_if_final_p: }
+  { !\acro_if_upgrade_p: }  
+  { \acro_stop_module:n {upgrade} }
+
+% --------------------------------------------------------------------------
+% style files
+\NewDocumentCommand \AcroStyle {smO{}}
   {
-    \bool_if:NTF \l__acro_xspace_bool
+    \__acro_module:nn {style.#2} {#3}
+    \IfBooleanT {#1} { \ExplSyntaxOn }
+  }
+
+\cs_new_protected:Npn \acro_style_load:n #1
+  { \clist_map_inline:nn {#1} { \acro_module_load:n {style.##1} } }
+
+\keys_define:nn {acro}
+  { load-style .code:n = \acro_style_load:n {#1} }
+
+% --------------------------------------------------------------------------
+\acro_if_debug:TF
+  {
+    \cs_new_protected:Npn \__acro_debug_start:n #1
       {
-        \@ifpackageloaded {xspace}
-          { }
-          { \RequirePackage {xspace} }
-        \cs_new_eq:NN \acro_xspace: \xspace
+        \iow_term:n {}
+        \iow_term:n {#1}
+        \acro_package_if_loaded:nT {l3benchmark} { \benchmark_tic: }
       }
-      { \cs_new:Npn \acro_xspace: {} }
+    \cs_new_protected:Npn \__acro_debug_stop:
+      { \acro_package_if_loaded:nT {l3benchmark} { \benchmark_toc: } }
   }
+  {
+    \cs_new_protected:Npn \__acro_debug_start:n #1 {}
+    \cs_new_protected:Npn \__acro_debug_stop: {}
+  }
+% --------------------------------------------------------------------------
+\AcroModule{base}{basic functionality of the package}
 
 % --------------------------------------------------------------------------
-% 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
+% variants of kernel functions:
+\cs_generate_variant:Nn \bool_lazy_any:nTF {e}
+\cs_generate_variant:Nn \bool_lazy_all:nTF {e}
+\cs_generate_variant:Nn \seq_gset_split:Nnn {cVx}
+\cs_generate_variant:Nn \seq_use:Nn {cV}
+\cs_generate_variant:Nn \seq_set_split:Nnn {Nnx}
+\cs_generate_variant:Nn \seq_if_in:NnTF {Ne}
+\cs_generate_variant:Nn \seq_if_in:NnF {ceF}
+\cs_generate_variant:Nn \seq_gremove_all:Nn {cV}
+\cs_generate_variant:Nn \seq_put_right:Nn {Ne}
+\cs_generate_variant:Nn \seq_gput_right:Nn {Ne,ce}
+\cs_generate_variant:Nn \seq_set_split:Nnn {Nne}
+\cs_generate_variant:Nn \clist_if_empty:nTF {e}
+\cs_generate_variant:Nn \clist_item:nn {e}
+\cs_generate_variant:Nn \int_set:Nn {Nx}
+\cs_generate_variant:Nn \tl_set:Nn {Ne}
+\cs_generate_variant:Nn \tl_remove_all:Nn {NV}
+\cs_generate_variant:Nn \tl_remove_once:Nn {NV}
+\cs_generate_variant:Nn \tl_if_in:NnF {NV}
+\cs_generate_variant:Nn \tl_put_right:Nn {Ne}
+\cs_generate_variant:Nn \clist_set:Nn {Ne}
+\cs_generate_variant:Nn \str_if_eq:nnT {x}
+\cs_generate_variant:Nn \str_fold_case:n {e}
+\cs_generate_variant:Nn \str_lowercase:n {e}
+\cs_generate_variant:Nn \msg_error:nnnnn {nnnxx}
+\cs_generate_variant:Nn \msg_warning:nn {nV}
+\cs_generate_variant:Nn \msg_error:nnnn {nne}
+\cs_generate_variant:Nn \prg_new_conditional:Npnn {c}
+\cs_generate_variant:Nn \file_get_mdfive_hash:nN {V}
+\cs_generate_variant:Nn \iow_open:Nn {NV}
+\cs_generate_variant:Nn \use_ii:nn {ne}
+\cs_generate_variant:Nn \keys_set:nn {nV}
 
-% 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}
+% --------------------------------------------------------------------------
+\prg_new_conditional:Npnn \acro_class_if_loaded:n #1 {p,T,F,TF}
+  {
+    \cs_if_exist:cTF {ver@#1.cls}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
 
-\cs_new_protected:Npn \acro_extra_instance:nn #1#2
-  { \UseInstance {acro-extra} {#1} {#2} }
-\cs_generate_variant:Nn \acro_extra_instance:nn {VV}
+\prg_new_conditional:Npnn \acro_if_komascript: {p,T,F,TF}
+  {
+    \cs_if_exist:NTF \KOMAClassName
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
 
-\cs_new_protected:Npn \acro_title_instance:nn #1#2
-  { \UseInstance {acro-title} {#1} {#2} }
-\cs_generate_variant:Nn \acro_title_instance:nn {VV}
+% --------------------------------------------------------------------------
+% attributes instead of property lists:
+\msg_new:nnn {acro} {attribute-not-set}
+  { The~ attribute~ `#1'~ is~ not~ set~ \msg_line_context: }
 
-% 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}
+\msg_new:nnn {acro} {attribute-defined}
+  { The~ attribute~ `#1'~ is~ already~ defined~ \msg_line_context: }
 
-\cs_new_protected:Npn \acro_first_instance:nn #1#2
+\msg_new:nnn {acro} {attribute-undefined}
+  { The~ attribute~ `#1'~ is~ not~ yet~ defined~ \msg_line_context: }
+
+\prg_new_conditional:Npnn \acro_attribute_if_exist:n #1 {p,T,F,TF}
   {
-    \acro_property_if_set:nnTF {#1} {first-style}
+    \cs_if_exist:cTF {____acro_attribute_main_ \tl_to_str:n {#1} :}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+% #1: attribute
+\cs_new_protected:Npn \acro_attribute_new:n #1
+  {
+    \acro_attribute_if_exist:nTF {#1}
+      { \msg_error:nnn {acro} {attribute-defined} {#1} }
+      { \cs_gset:cpx {____acro_attribute_main_ \tl_to_str:n {#1} :} {} }
+  }
+  
+% #1: attribute
+% #2: item
+% #3: value
+\cs_new_protected:Npn \acro_attribute_set:nnn #1#2#3
+  {
+    \acro_attribute_if_exist:nTF {#1}
       {
-        \tl_set_eq:NN
-          \l__acro_tmpa_tl
-          \l__acro_first_style_tl
+        \cs_gset:cpx
+          {____acro_attribute_ \tl_to_str:n {#1::#2} :}
+          { \exp_not:n { \exp_not:n {#3} } }
       }
+      { \msg_error:nnn {acro} {attribute-undefined} {#1} }
+  }
+\cs_generate_variant:Nn \acro_attribute_set:nnn {nnx,nne}
+
+% #1: attribute
+% #2: item
+\cs_new_protected:Npn \acro_attribute_unset:nn #1#2
+  { \cs_undefine:c {____acro_attribute_ \tl_to_str:n {#1::#2} :} }
+  
+% #1: attribute
+% #2: item
+\cs_new:Npn \acro_attribute_get:nn #1#2
+  {
+    \acro_attribute_if_exist:nTF {#1}
       {
-        \tl_set_eq:NN
-          \l__acro_tmpa_tl
-          \l__acro_first_instance_tl
+        \cs_if_exist:cTF {____acro_attribute_ \tl_to_str:n {#1::#2} :}
+          { \use:c {____acro_attribute_ \tl_to_str:n {#1::#2} :} }
+          {
+            \acro_if_debug:T
+              { \msg_expandable_error:nnn {acro} {attribute-not-set} {#1::#2} }
+          }
       }
-    \acro_if_defined:nT {#1}
+      { \msg_expandable_error:nnn {acro} {attribute-undefined} {#1} }
+  }
+\cs_generate_variant:Nn \acro_attribute_get:nn {ne}
+
+% #1: attribute
+% #2: item
+\prg_new_conditional:Npnn \acro_attribute_if_set:nn #1#2 {p,T,F,TF}
+  {
+    \acro_attribute_if_exist:nTF {#1}
       {
-        \use:x {
-          \UseInstance {acro-first}
-            { \exp_not:V \l__acro_tmpa_tl }
-            { \exp_not:n {#1} }
-            { \exp_not:n {#2} }
-          }
+        \cs_if_exist:cTF {____acro_attribute_ \tl_to_str:n {#1::#2} :}
+          { \prg_return_true: }
+          { \prg_return_false: }
       }
+      { \prg_return_false: }
   }
-\cs_generate_variant:Nn \acro_first_instance:nn {nV}
+\prg_generate_conditional_variant:Nnn \acro_attribute_if_set:nn {ne} {p,T,F,TF}
 
-% --------------------------------------------------------------------------
-% hyperref support
-\cs_new_eq:NN \acro_hyper_target:nn \use_ii:nn
-\cs_new_eq:NN \acro_hyper_link:nn   \use_ii:nn
+% #1: attribute
+% #2: item
+\prg_new_conditional:Npnn \__acro_if_attribute_eq:nnn #1#2#3 {p,T,F,TF}
+  {
+    \tl_if_eq:enTF
+      { \use:c {____acro_attribute_ \tl_to_str:n {#1::#2} :} }
+      {#3}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
 
-\cs_new_protected:Npn \acro_activate_hyperref_support:
+% #1: attribute
+% #2: item
+\cs_new_protected:Npn \acro_attribute_show:nn #1#2
   {
-    \bool_lazy_and:nnT
-      { \l__acro_hyperref_loaded_bool }
-      { \l__acro_hyperref_use_bool }
+    \acro_attribute_if_exist:nTF {#1}
       {
-        \sys_if_engine_xetex:TF
+        \iow_term:n {}
+        \iow_term:x
           {
-            \cs_set:Npn \acro_hyper_link:nn ##1##2
-              { \hyperlink {##1} { \XeTeXLinkBox {##2} } }
+            \c_space_tl \c_space_tl
+            \tl_to_str:n {#1::#2}
+            \c_space_tl \c_space_tl == \c_space_tl \c_space_tl
+            {\use:c {____acro_attribute_ \tl_to_str:n {#1::#2} :}}
           }
-          { \cs_set_eq:NN \acro_hyper_link:nn \hyperlink }
-        \cs_set:Npn \acro_hyper_target:nn ##1##2
-          { \raisebox {3ex} [0pt] { \hypertarget {##1} { } } ##2 }
+        \iow_term:n {}
       }
+      { \msg_error:nnn {acro} {attribute-undefined} {#1} }
   }
 
-% #1: id
-% #2: text
-\cs_new_protected:Npn \__acro_make_link:nn #1#2
+% ----------------------------------------------------------------------------
+% option setup:
+\cs_new_protected:Npn \acro_setup:n #1
+  { \keys_set:nn {acro} {#1} }
+
+% ----------------------------------------------------------------------------
+\AcroModuleEnd
+\AcroModule{interface}{definitions of user commands}
+
+% --------------------------------------------------------------------------
+% helper commands
+\NewDocumentCommand \AcroAddRow {+m}
   {
-    \bool_lazy_and:nnTF
-      { \l__acro_hyperref_use_bool }
-      { \l__acro_hyperref_loaded_bool }
+    \tl_put_right:Ne \AcronymTable
       {
-         \acro_hyper_link:nn {#1} { \phantom {#2} }
-         \acro_if_is_single:nTF {#1}
-           { \hbox_overlap_left:n {#2} }
-           { \acro_color_link:n { \hbox_overlap_left:n {#2} } }
-       }
-       {#2}
+        \exp_not:n { \tl_gset:Nn \AcronymID } { \AcronymID }
+        \exp_not:n {#1}
+      }
   }
 
-\cs_new:Npn \acro_color_link:n #1
+\NewDocumentCommand \AcroRerun {}
+  { \acro_rerun:n {list} }
+
+\NewDocumentCommand \AcroPropertiesMap {+m}
+  { \acro_properties_map:n {#1} }
+
+\NewDocumentCommand \AcroMap {m+m}
+  { \acro_list_map:nn {#1} {#2} }
+
+\NewDocumentCommand \AcroNeedPackage {m}
   {
-    \cs_if_exist:NTF \hypersetup
-      {
-        \ifHy at colorlinks
-          \exp_after:wN \use_i:nn
-        \else
-          \ifHy at ocgcolorlinks
-            \exp_after:wN \use_i:nn
-          \else
-            \exp_after:wN \exp_after:wN \exp_after:wN \use_ii:nn
-          \fi
-        \fi
-        { \textcolor { \@linkcolor } {#1} }
-        {#1}
-      }
-      {#1}
+    \acro_package_if_loaded:nF {m}
+      { \msg_error:nnen {acro} {package-needed} { \TemplateName } {#1} }
   }
 
-\AtBeginDocument{
-  \cs_if_exist:NF \textcolor { \cs_new_eq:NN \textcolor \use_ii:nn }
-}
+% --------------------------------------------------------------------------
+% general commands:
+\NewDocumentCommand \acsetup {+m}
+  { \acro_setup:n {#1} }
 
+\NewDocumentCommand \acroloadstyle {m}
+  { \acro_style_load:n {#1} }
+
+\NewExpandableDocumentCommand \acroifusedTF {m}
+  { \acro_boolean_property_if:nnTF {#1} {used} }
+
+\NewDocumentCommand \acuse {m}
+  { \acro_use:n {#1} }
+
+\NewDocumentCommand \acuseall {}
+  { \acro_use_all: }
+
+\NewDocumentCommand \acreset {m}
+  { \acro_reset:n {#1} }
+
+\NewDocumentCommand \acresetall {}
+  { \acro_reset_all: }
+
+\NewExpandableDocumentCommand \acsimple {mm}
+  { \acro_pdfstring_template:nn {#1} {#2} }
+
+\NewDocumentCommand \acbarrier {}
+  { \acro_barrier: }
+
+\NewDocumentCommand \acswitchoff {}
+  { \acro_switch_off: }
+
+\NewDocumentCommand \acswitchon {}
+  { \acro_switch_on: }
+
 % --------------------------------------------------------------------------
-% output style of the first time an acronym is used
+\NewDocumentCommand \DeclareAcroProperty {st?t!t|m}
+  { \acro_property_declare:nnnnn {#1} {#2} {#3} {#4} {#5} }
 
-% helper macros for the styles
-% #1: short|long
-% #2: id
-% #3: long
-\cs_new_protected:Npn \__acro_print_form_and_indefinite:nnn #1#2#3
+\NewDocumentCommand \DeclareAcroPropertyAlias {st?t!t|mm}
   {
+    \acro_property_declare:nnnnn {#1} {#2} {#3} {#4} {#5}
+    \acro_property_make_alias:nn {#5} {#6}
+  }
+
+\NewDocumentCommand \MakeAcroPropertyAlias {mm}
+  { \acro_property_make_alias:nn {#1} {#2} }
+
+\NewDocumentCommand \UseAcroTemplate {O{acronym}mO{1}}
+  { \acro_template_use:nnn {#3} {#1} {#2} }
+
+\NewDocumentCommand \NewAcroTemplate {O{acronym}m+m}
+  { \use:c {acro_#1_template_new:nn} {#2} {#3} }
+
+\NewDocumentCommand \RenewAcroTemplate {O{acronym}m+m}
+  { \use:c {acro_#1_template_renew:nn} {#2} {#3} }
+
+\NewDocumentCommand \DeclareAcronym {m+m}
+  { \acro_declare_acronym:nn {#1} {#2} }
+
+\NewDocumentCommand \DeclareAcroEnding {mmm}
+  { \acro_declare_ending:nnn {#1} {#2} {#3} }
+
+\NewDocumentCommand \DeclareAcroArticle {mm}
+  { \acro_article_declare:nn {#1} {#2} }
+
+\NewDocumentCommand \DeclareAcroTranslation {m+m}
+  { \acro_declare_translations:nn {#1} {#2} }
+
+\NewDocumentCommand \AddAcroTranslations {m+m}
+  { \acro_add_translations:nn {#1} {#2} }
+
+\NewExpandableDocumentCommand \acrotranslate {m}
+  { \acro_translate:n {#1} }
+
+\NewExpandableDocumentCommand \aciftrailing {}
+  { \acro_trailing_if_tokens:nTF }
+
+\NewDocumentCommand \acfootnote {m}
+  { \acro_footnote:n {#1} }
+
+\NewDocumentCommand \acgobbletrail {}
+  { \bool_gset_true:N \g__acro_gobble_trail_bool }
+
+\NewExpandableDocumentCommand \acdot   {} { \acro_dot: }
+\NewExpandableDocumentCommand \acspace {} { \acro_space: }
+\NewExpandableDocumentCommand \abbrdot {} { .\@ }
+
+\NewDocumentCommand \acroupper {} { \acro_upper: }
+\NewDocumentCommand \acrofull {} { \acro_first: }
+
+\NewDocumentCommand \printacronyms {o}
+  {
     \group_begin:
-      \acro_for_all_trailing_tokens_do:n
-        { \acro_deactivate_trailing_action:n {##1} }
-      \str_case:nn {#1}
-        {
-          {long} {
-            \bool_lazy_or:nnT
-              { \l__acro_first_only_long_bool }
-              {  !\l__acro_first_only_short_bool }
-              {
-                \acro_write_indefinite:nn {#2} {long}
-                \acro_write_expanded:nnn {#2} {first-long} {#3}
-              }
-          }
-          {short} {
-            \bool_lazy_or:nnT
-              { !\l__acro_first_only_long_bool }
-              { \l__acro_first_only_short_bool }
-              {
-                \acro_soft_upper:
-                \acro_write_indefinite:nn {#2} {short}
-                \acro_write_compact:nn {#2} {short}
-              }
-          }
-        }
+      \IfNoValueF {#1}
+        { \keys_set:nn {acro/list} {#1} }
+      \acro_list:
     \group_end:
   }
 
-\cs_new_protected:Npn \__acro_open_bracket:
+% --------------------------------------------------------------------------
+% commands for list templates
+\NewDocumentCommand \acroheading  {} { \acro_heading: }
+\NewDocumentCommand \acropreamble {} { \acro_preamble: }
+
+\NewExpandableDocumentCommand \acrolistname {}
+  { \tl_use:N \l__acro_list_name_tl }
+
+% --------------------------------------------------------------------------
+% cmmands for use in templates:
+\NewDocumentCommand \acronymsmapTF {+m+m+m}
   {
-    \bool_lazy_and:nnT
-      { !\l__acro_first_only_long_bool }
-      { !\l__acro_first_only_short_bool }
+    \acro_acronyms_map:nTF
       {
-        \acro_space:
-        \tl_if_blank:VF \l__acro_first_between_tl
-          {
-            \tl_use:N \l__acro_first_between_tl
-            \acro_space:
-          }
-        \bool_if:NT \l__acro_first_use_brackets_bool
-          { \tl_head:N \l__acro_first_brackets_tl }
+        \tl_set:Nn \AcronymID {##1}
+        #1
       }
+      {#2}
+      {#3}
   }
 
-\cs_new_protected:Npn \__acro_close_bracket:
+\NewDocumentCommand \acronymsmapT {+m+m}
+  { \acronymsmapTF {#1} {#2} {} }
+
+\NewDocumentCommand \acronymsmapF {+m+m}
+  { \acronymsmapTF {#1} {} {#2} }
+
+\NewDocumentCommand \acronymsmap {+m}
+  { \acronymsmapTF {#1} {} {} }
+
+\NewExpandableDocumentCommand \acrofield {mm}
+  { \acro_property_get:nn {#1} {#2} }
+
+\NewDocumentCommand \acroprintfield {mm}
   {
-    \bool_lazy_all:nT
+    \acro_property_if_eq:nnTF {#2} {list}
       {
-        { \l__acro_first_use_brackets_bool }
-        { !\l__acro_first_only_short_bool }
-        { !\l__acro_first_only_long_bool }
+        \bool_if:NT \l__acro_upper_list_bool { \acro_upper: }
+        \acro_write:en {#1} {#2}
       }
-      { \tl_tail:N \l__acro_first_brackets_tl }
+      { \acro_write:en {#1} {#2} }
   }
-  
-% #1: short|long
-% #2: id
-% #3: long
-\cs_new_protected:Npn \__acro_print_form:nnn #1#2#3
+
+\NewExpandableDocumentCommand \acrofieldifTF {+m+m+m+m}
+  { \acro_property_if_set:nnTF {#1} {#2} {#3} {#4} }
+
+\NewDocumentCommand \acroifanyfieldTF {mm+m+m}
+  { \acro_property_if_any:nnTF {#1} {#2} {#3} {#4} }
+
+\NewDocumentCommand \acroifallfieldsTF {mm+m+m}
+  { \acro_property_if_all:nnTF {#1} {#2} {#3} {#4} }
+
+\NewExpandableDocumentCommand \acroifpagefieldTF {m}
+  { \acro_if_pages:nTF {#1} }
+
+\NewDocumentCommand \acrowrite {m}
+  { \acroprintfield { \AcronymID } {#1} }
+
+\NewDocumentCommand \acroshow {m}
+  { \acro_property_show:en { \AcronymID } {#1} }
+
+\NewDocumentCommand \acrodonotuse {}
+  { \acro_use_false: }
+
+\NewDocumentCommand \acroformat {mm}
+  { \acro_format:enn { \AcronymID } {#1} {#2} }
+
+\NewDocumentCommand \acrogroupcite {}
   {
-    \str_case:nn {#1}
+    \bool_if:NT \l__acro_cite_group_bool
       {
-        {long} {
-          \bool_lazy_or:nnT
-            { \l__acro_first_only_long_bool }
-            { !\l__acro_first_only_short_bool }
-            {
-              \group_begin:
-                \bool_set_false:N \l__acro_first_upper_bool
-                \acro_write_expanded:nnn {#2} {first-long} {#3}
-              \group_end:
-            }
-        }
-        {short} {
-          \bool_lazy_or:nnT
-            { !\l__acro_first_only_long_bool }
-            { \l__acro_first_only_short_bool }
-            {
-              \group_begin:
-                \acro_soft_upper:
-                \acro_write_compact:nn {#2} {short}
-              \group_end:
-            }
-        }
+        \tl_set_eq:NN \l__acro_cite_pre_tl \l__acro_cite_between_tl
+        \cs_set_eq:NN \__acro_cite_cmd:w \__acro_cite_group_cmd:w
+        \acro_cite_if:neT { \l__acro_star_bool } { \AcronymID }
+          { \acro_cite:e { \AcronymID } }
       }
   }
 
-% #1: id
-\cs_new_protected:Npn \__acro_foreign_sep:n #1
+\NewDocumentCommand \acrocite {}
+  { \bool_set_true:N \l__acro_cite_always_bool }
+
+\NewDocumentCommand \acroifTF {m+m+m}
+  { \acro_property_if_set:enTF { \AcronymID } {#1} {#2} {#3} }
+\NewDocumentCommand \acroifT {m+m}
+  { \acro_property_if_set:enTF { \AcronymID } {#1} {#2} {} }
+\NewDocumentCommand \acroifF {m+m}
+  { \acro_property_if_set:enTF { \AcronymID } {#1} {} {#2} }
+
+\NewDocumentCommand \acroifanyTF {m+m+m}
+  { \acro_property_if_any:enTF { \AcronymID } {#1} {#2} {#3} }
+\NewDocumentCommand \acroifanyT {m+m}
+  { \acro_property_if_any:enTF { \AcronymID } {#1} {#2} {} }
+\NewDocumentCommand \acroifanyF {m+m}
+  { \acro_property_if_any:enTF { \AcronymID } {#1} {} {#2} }
+
+\NewDocumentCommand \acroifallTF {m+m+m}
+  { \acro_property_if_all:enTF { \AcronymID } {#1} {#2} {#3} }
+\NewDocumentCommand \acroifallT {m+m}
+  { \acro_property_if_all:enTF { \AcronymID } {#1} {#2} {} }
+\NewDocumentCommand \acroifallF {m+m}
+  { \acro_property_if_all:enTF { \AcronymID } {#1} {} {#2} }
+
+\NewDocumentCommand \acroifsingleTF {+m+m}
+  { \acro_if_single:eTF { \AcronymID } {#1} {#2} }
+\NewDocumentCommand \acroifsingleT {+m}
+  { \acro_if_single:eTF { \AcronymID } {#1} {} }
+\NewDocumentCommand \acroifsingleF {+m}
+  { \acro_if_single:eTF { \AcronymID } {} {#1} }
+
+\NewDocumentCommand \acroiffirstTF {+m+m}
+  { \acro_if_first:eTF { \AcronymID } {#1} {#2} }
+\NewDocumentCommand \acroiffirstT {+m}
+  { \acro_if_first:eTF { \AcronymID } {#1} {} }
+\NewDocumentCommand \acroiffirstF {+m}
+  { \acro_if_first:eTF { \AcronymID } {} {#1} }
+
+\NewDocumentCommand \acroiftagTF {m+m+m}
+  { \acro_if_tag:enTF { \AcronymID } {#1} {#2} {#3} }
+\NewDocumentCommand \acroiftagT {m+m}
+  { \acro_if_tag:enT { \AcronymID } {#1} {#2} }
+\NewDocumentCommand \acroiftagF {m+m}
+  { \acro_if_tag:enF { \AcronymID } {#1} {#2} }
+
+\NewDocumentCommand \acropages {mm}
+  { \acro_print_pages:enn { \AcronymID } {#1} {#2} }
+
+\NewDocumentCommand \acronopagerange {}
+  { \acro_no_page_ranges:e { \TemplateName } }
+
+\NewDocumentCommand \acropagefill {}
+  { \acro_if_pages:eT  { \AcronymID } { \tl_use:N \l__acro_pages_fill_tl } }
+
+\NewExpandableDocumentCommand \acroifpagesTF {}
+  { \acro_if_pages:eTF { \AcronymID } }
+
+\NewExpandableDocumentCommand \acroifpagesT {}
+  { \acro_if_pages:eT { \AcronymID } }
+
+\NewExpandableDocumentCommand \acroifpagesF {}
+  { \acro_if_pages:eF { \AcronymID } }
+
+\NewExpandableDocumentCommand \acroifchapterTF {}
+  { \cs_if_exist:NTF \chapter }
+
+\NewExpandableDocumentCommand \acroifchapterT {}
+  { \cs_if_exist:NT \chapter }
+
+\NewExpandableDocumentCommand \acroifchapterF {}
+  { \cs_if_exist:NF \chapter }
+
+% --------------------------------------------------------------------------
+\AcroModuleEnd
+\AcroModule{aux}{usage of auxiliary files}
+
+\cs_new_protected:Npn \ACRO #1 { \use:c {__acro_aux_#1:} }
+
+\cs_new_protected:Npn \__acro_auxlist_field_new:cpn #1
+  { \cs_new_protected:cpn {__acro_aux_#1:} }
+
+\cs_new_protected:Npn \acro_auxlist_to_aux:nn #1#2
+  { \acro_write_to_aux:x { \token_to_str:N \ACRO {#1} #2 } }
+
+\tl_const:Nx \c_acro_auxfile_tl { \c_sys_jobname_str .acr }
+
+\iow_new:N \l__acro_aux_file_iow
+\tl_new:N \g__acro_mdfive_hash_tl
+
+\acro_at_begin_document:n
   {
-    \bool_lazy_all:nT
+    \legacy_if:nT {@filesw}
       {
-        { \l__acro_foreign_bool }
-        { !\l__acro_first_only_short_bool }
-        { !\l__acro_first_only_long_bool }
+        \iow_now:Nx \@auxout
+          { \token_to_str:N \providecommand \token_to_str:N \ACRO [1] {} }
       }
-      { \acro_if_foreign:nT {#1} { \tl_use:N \l__acro_foreign_sep_tl } }
+    \file_get_mdfive_hash:VN
+      \c_acro_auxfile_tl
+      \g__acro_mdfive_hash_tl
+    \iow_open:NV \l__acro_aux_file_iow \c_acro_auxfile_tl
   }
-  
-% #1: id
-\cs_new_protected:Npn \__acro_print_foreign:n #1
+
+\cs_new_protected:Npn \acro_close_aux:
   {
-    \acro_if_foreign:nT {#1}
-      {
-        \bool_lazy_all:nT
-          {
-            { \l__acro_foreign_bool }
-            { !\l__acro_first_only_short_bool }
-            { !\l__acro_first_only_long_bool }
-          }
-          {
-            \acro_write_foreign:n {#1}
-            \acro_endings:nn {#1} {foreign}
-          }
-      }
+    \iow_close:N \l__acro_aux_file_iow
+    \file_get_mdfive_hash:VN
+      \c_acro_auxfile_tl
+      \l__acro_tmpa_tl
+    \tl_if_eq:NNF \g__acro_mdfive_hash_tl \l__acro_tmpa_tl
+      { \acro_rerun:n {general} }
+    \legacy_if:nT {@filesw}
+      { \iow_now:Nx \@auxout { \token_to_str:N \ACRO {readaux} } }
   }
 
-\cs_new_protected:Npn \__acro_print_citation:n #1
+\cs_new_protected:Npn \acro_write_to_aux:n #1
   {
-    \bool_if:NT \l__acro_group_citation_bool
-      { \acro_group_cite:n {#1} }
+    \legacy_if:nT {@filesw}
+      { \iow_now:Nn \l__acro_aux_file_iow {#1} }
   }
+\cs_generate_variant:Nn \acro_write_to_aux:n {x}
 
-\cs_new_protected:Npn \__acro_finalize_first:n #1
+\__acro_auxlist_field_new:cpn {readaux}
   {
-    \bool_if:NF \l__acro_group_citation_bool
-      { \acro_cite_if:Nn \l__acro_citation_first_bool {#1} }
-    \acro_index_if:Nn \l__acro_addto_index_bool {#1}
-    \acro_property_get:nnT {#1} {post}
-      { \tl_use:N \l__acro_post_tl }
+    \file_if_exist:nT { \c_sys_jobname_str .acr }
+      { \file_input:n { \c_sys_jobname_str .acr } }
   }
 
-% --------------------------------------------------------------------------
-% the `acro-first' object, templates, instances:
-% #1: id
-% #2: long
-\DeclareObjectType {acro-first} {2}
+% ----------------------------------------------------------------------------
+% list for recording values that need to be written to the aux file and
+% updated at begin document
 
-% template for inline appearance:
-\DeclareTemplateInterface {acro-first} {inline} {2}
+\str_new:N \l__acro_auxlist_split_str
+\keys_define:nn {acro}
   {
-    brackets      : boolean   = true  ,
-    brackets-type : tokenlist = ()    ,
-    only-short    : boolean   = false ,
-    only-long     : boolean   = false ,
-    reversed      : boolean   = false ,
-    between       : tokenlist         ,
-    foreign-sep   : tokenlist = {,~}
+    auxlist-split .code:n    = \str_set:Nn \l__acro_auxlist_split_str {#1} ,
+    auxlist-split .initial:n = ||
   }
-\DeclareTemplateCode {acro-first} {inline} {2}
-  {
-    brackets      = \l__acro_first_use_brackets_bool ,
-    brackets-type = \l__acro_first_brackets_tl       ,
-    only-short    = \l__acro_first_only_short_bool   ,
-    only-long     = \l__acro_first_only_long_bool    ,
-    reversed      = \l__acro_first_reversed_bool     ,
-    between       = \l__acro_first_between_tl        ,
-    foreign-sep   = \l__acro_foreign_sep_tl
-  }
-  {
-    \AssignTemplateKeys
-    \bool_set_true:N \l__acro_first_instance_bool
-    \bool_if:NTF \l__acro_first_reversed_bool
-      { % zuerst kurze Form, dann lange Form:
-        \__acro_print_form_and_indefinite:nnn {short} {#1} {#2}
-        \__acro_open_bracket:
-        \__acro_print_foreign:n {#1}
-        \__acro_foreign_sep:n {#1}
-        \__acro_print_form:nnn {long} {#1} {#2}
-        \__acro_print_citation:n {#1}
-        \__acro_close_bracket:
-        \__acro_finalize_first:n {#1}
-      }
-      { % zuerst lange Form, dann kurze Form:
-        \__acro_print_form_and_indefinite:nnn {long} {#1} {#2}
-        \__acro_open_bracket:
-        \__acro_print_foreign:n {#1}
-        \__acro_foreign_sep:n {#1}
-        \__acro_print_form:nnn {short} {#1} {#2}
-        \__acro_print_citation:n {#1}
-        \__acro_close_bracket:
-        \__acro_finalize_first:n {#1}
-      }
-  }
-  
-% template for footnotes, sidenotes, ...
-\cs_new:Npn \__acro_note_command:n #1 {#1}
-\DeclareTemplateInterface {acro-first} {note} {2}
-  {
-    use-note     : boolean    = true ,
-    note-command : function 1 = \footnote {#1} ,
-    foreign-sep  : tokenlist  = {,~} ,
-    reversed      : boolean   = false ,
-  }
 
-\DeclareTemplateCode {acro-first} {note} {2}
+% define list:
+% #1: name
+\cs_new_protected:Npn \__acro_auxlist_new:n #1
   {
-    use-note     = \l__acro_use_note_bool  ,
-    note-command = \__acro_note_command:n  ,
-    foreign-sep  = \l__acro_foreign_sep_tl ,
-    reversed     = \l__acro_first_reversed_bool
-  }
-  {
-    \AssignTemplateKeys
-    \bool_if:NTF \l__acro_first_reversed_bool
-      { % long in text and short in note
-        \__acro_print_form_and_indefinite:nnn {long} {#1} {#2}
-        \bool_if:NT \l__acro_use_note_bool
+    % entries collected during the run:
+    \seq_new:c {g__acro_auxlist_#1_seq}
+    % entries read from the auxfile:
+    \seq_new:c {g__acro_auxlist_recorded_#1_seq}
+    \acro_attribute_new:n {#1}
+    \__acro_auxlist_field_new:cpn {#1} ##1
+      {
+        \tl_if_blank:nF {##1}
           {
-            \__acro_note_command:n
-              {
-                \__acro_print_foreign:n {#1}
-                \__acro_foreign_sep:n {#1}
-                \__acro_print_form:nnn {short} {#1} {#2}
-                \__acro_print_citation:n {#1}
-                \__acro_finalize_first:n {#1}
-              }
+            \seq_gset_split:cVx {g__acro_auxlist_#1_seq}
+              \l__acro_auxlist_split_str
+              { \tl_to_str:n {##1} }
+            \seq_map_inline:cn {g__acro_auxlist_#1_seq}
+              { \acro_attribute_set:nnn {#1} {####1} {} }
           }
       }
-      { % short in text and long in note
-        \__acro_print_form_and_indefinite:nnn {short} {#1} {#2}
-        \bool_if:NT \l__acro_use_note_bool
+    \acro_at_begin_document:n
+      {
+        \seq_gclear:c {g__acro_auxlist_recorded_#1_seq}
+        \seq_set_eq:Nc \l__acro_tmpa_seq {g__acro_auxlist_#1_seq}
+        \seq_map_inline:Nn \l__acro_tmpa_seq
           {
-            \__acro_note_command:n
-              {
-                \__acro_print_foreign:n {#1}
-                \__acro_foreign_sep:n {#1}
-                \__acro_print_form:nnn {long} {#1} {#2}
-                \__acro_print_citation:n {#1}
-                \__acro_finalize_first:n {#1}
-              }
+            \str_set:Nn \l__acro_tmpa_str {##1}
+            \seq_gput_right:cV {g__acro_auxlist_recorded_#1_seq} \l__acro_tmpa_str
           }
+        \seq_gremove_duplicates:c {g__acro_auxlist_recorded_#1_seq}        
       }
   }
 
-% --------------------------------------------------------------------------
-% declare new first styles:
-\cs_new_protected:Npn \acro_declare_first_style:nnn #1#2#3
+% add to or remove from list:
+% #1: name
+% #2: entry
+\cs_new_protected:Npn \__acro_auxlist_add:nn #1#2
   {
-    \DeclareInstance {acro-first} {#1} {#2} {#3}
-    \prop_put:Nnn \l__acro_first_styles_prop  {#1} {#2}
+    \str_set:Nn \l__acro_tmpa_str {#2}
+    \acro_attribute_set:nnn {#1} {#2} {}
+    \seq_if_in:cVT {g__acro_auxlist_#1_seq} \l__acro_tmpa_str
+      { \seq_gremove_all:cV {g__acro_auxlist_#1_seq} \l__acro_tmpa_str }
+    \seq_gput_right:cV {g__acro_auxlist_#1_seq} \l__acro_tmpa_str
   }
+\cs_generate_variant:Nn \__acro_auxlist_add:nn {nx}
 
-% set a list style
-\cs_new_protected:Npn \acro_set_first_style:n #1
+% #1: name
+% #2: entry
+\cs_new_protected:Npn \__acro_auxlist_remove:nn #1#2
   {
-    \prop_if_in:NnTF \l__acro_first_styles_prop {#1}
-      { \__acro_set_first_style:n {#1} }
-      {
-        \msg_warning:nnnnn {acro} {unknown}
-          {first~ style}
-          {#1}
-          {default}
-        \__acro_set_first_style:n {default}
-      }
+    \str_set:Nn \l__acro_tmpa_str {#2}
+    \acro_attribute_if_set:nnT {#1} {#2}
+      { \acro_attribute_unset:nn {#1} {#2} }
+    \seq_if_in:cVT {g__acro_auxlist_#1_seq} \l__acro_tmpa_str
+      { \seq_gremove_all:cV {g__acro_auxlist_#1_seq} \l__acro_tmpa_str }
+    \seq_if_in:cVT {g__acro_auxlist_recorded#1_seq} \l__acro_tmpa_str
+      { \seq_gremove_all:cV {g__acro_auxlist_recorded_#1_seq} \l__acro_tmpa_str }
   }
+\cs_generate_variant:Nn \__acro_auxlist_remove:nn {nx}
 
-\cs_new_protected:Npn \__acro_set_first_style:n #1
+% check if in list:
+% #1: name
+% #2: entry
+\prg_new_conditional:Npnn \__acro_auxlist_if_in:nn #1#2 {p,T,F,TF}
   {
-    \tl_set:Nn \l__acro_first_instance_tl {#1}
-    \prop_get:NnN \l__acro_first_styles_prop {#1} \l__acro_tmpa_tl
+    \acro_attribute_if_set:nnTF {#1} {#2}
+      { \prg_return_true: }
+      { \prg_return_false: }
   }
+\prg_generate_conditional_variant:Nnn \__acro_auxlist_if_in:nn {nx} {T,TF}
 
-% --------------------------------------------------------------------------
-% formatting the extras information:
-\DeclareObjectType {acro-extra} {1}
+\bool_new:N \l__acro_auxlists_clear_bool
+\cs_new_protected:Npn \acro_auxlists_clear:
+  { \bool_set_true:N \l__acro_auxlists_clear_bool }
 
-\DeclareTemplateInterface {acro-extra} {inline} {1}
+% update list (should be used inside \acro_at_end_document:n):
+% #1: name
+\cs_new_protected:Npn \__acro_auxlist_update:n #1
   {
-    punct         : boolean   = false ,
-    punct-symbol  : tokenlist = {,}   ,
-    brackets      : boolean   = true  ,
-    brackets-type : tokenlist = ()
+    \seq_remove_duplicates:c {g__acro_auxlist_#1_seq}
+    \seq_remove_duplicates:c {g__acro_auxlist_recorded_#1_seq}
+    \str_set:Nx \l__acro_tmpa_str
+      { \seq_use:cn {g__acro_auxlist_#1_seq} {} }
+    \str_set:Nx \l__acro_tmpb_str
+      { \seq_use:cn {g__acro_auxlist_recorded_#1_seq} {} }
+    \str_if_eq:NNF \l__acro_tmpa_str \l__acro_tmpb_str
+      { \acro_rerun:n {property} }
+    \bool_if:NF \l__acro_auxlists_clear_bool
+      {
+        \acro_auxlist_to_aux:nn {#1}
+          { { \seq_use:cV {g__acro_auxlist_#1_seq} \l__acro_auxlist_split_str } }
+      }
   }
 
-\DeclareTemplateCode {acro-extra} {inline} {1}
-  {
-    punct         = \l__acro_extra_punct_bool        ,
-    punct-symbol  = \l__acro_extra_punct_tl          ,
-    brackets      = \l__acro_extra_use_brackets_bool ,
-    brackets-type = \l__acro_extra_brackets_tl
-  }
-  {
-    \AssignTemplateKeys
-    \bool_if:NT \l__acro_extra_punct_bool
-      { \tl_use:N \l__acro_extra_punct_tl \tl_use:N \c_space_tl }
-    \bool_if:NT \l__acro_extra_use_brackets_bool
-      { \tl_head:N \l__acro_extra_brackets_tl }
-    \acro_write_long:Vn \l__acro_extra_format_tl {#1}
-    \bool_if:NT \l__acro_extra_use_brackets_bool
-      { \tl_tail:N \l__acro_extra_brackets_tl }
-  }
+% loop over list:
+% #1: name
+% #2: code
+\cs_new_protected:Npn \__acro_auxlist_foreach_entry:nn #1#2
+  { \seq_map_inline:cn {g__acro_auxlist_recorded_#1_seq} {#2} }
 
-% declare new extra styles:
-\cs_new_protected:Npn \acro_declare_etxra_style:nnn #1#2#3
+\cs_new_protected:Npn \__acro_auxlist_foreach_new_entry:nn #1#2
+  { \seq_map_inline:cn {g__acro_auxlist_#1_seq} {#2} }
+
+% length of a list:
+% #1: name
+\cs_new:Npn \__acro_auxlist_count:n #1
+  { \seq_count:c {g__acro_auxlist_recorded_#1_seq} }
+
+% item of a list:
+% #1: name
+% #2: integer
+\cs_new:Npn \__acro_auxlist_item:nn #1#2
+  { \seq_item:cn {g__acro_auxlist_recorded_#1_seq} {#2} }
+
+% ----------------------------------------------------------------------------
+\AcroModuleEnd
+\AcroModule{properties}{properties of acronyms}
+
+% ----------------------------------------------------------------------------
+% messages:
+\msg_new:nnn {acro} {unknown-property}
   {
-    \DeclareInstance {acro-etxra} {#1} {#2} {#3}
-    \prop_put:Nnn \l__acro_etxra_styles_prop  {#1} {#2}
+    You~ tried~ to~ set~ the~ property~ `#1'~ \msg_line_context: . \\
+    This~ property~ does~ not~ exist.~ Check~ for~ a~ typo~ or~ \\
+    define~ the~ property~ yourself.
   }
 
-% set an extra style
-\cs_new_protected:Npn \acro_set_extra_style:n #1
+\msg_new:nnn {acro} {property-unique}
   {
-    \prop_if_in:NnTF \l__acro_extra_styles_prop {#1}
-      { \__acro_set_extra_style:n {#1} }
-      {
-        \msg_warning:nnnnn {acro} {unknown}
-          {extra~ style}
-          {#1}
-          {default}
-        \__acro_set_extra_style:n {default}
-      }
+    You~ tried~ to~ set~ the~ property~ `#1'~ \msg_line_context: . \\
+    This~ property~ has~ to~ have~ a~ unique~ value~ and~ thus~ \\
+    cannot~ be~ set~ to~ `#2'~ since~ this~ value~ is~ already~ talen.
   }
 
-\cs_new_protected:Npn \__acro_set_extra_style:n #1
+\msg_new:nnn {acro} {no-boolean-property}
   {
-    \tl_set:Nn \l__acro_extra_instance_tl {#1}
-    \prop_get:NnN \l__acro_extra_styles_prop {#1} \l__acro_tmpa_tl
+    You~ tried~ to~ check~ the~ boolean~ value~ of~ property~ `#1'~
+    \msg_line_context: . \\
+    However,~ property~ `#1'~ is~ not~ a~ boolean~ property!
   }
 
-\cs_new_protected:Npn \acro_declare_extra_style:nnn #1#2#3
+\msg_new:nnn {acro} {unbalanced-property-list}
   {
-    \DeclareInstance {acro-extra} {#1} {#2} {#3}
-    \prop_put:Nnn \l__acro_extra_styles_prop  {#1} {#2}
+    There~ is~ a~ mis-match~ in~ the~ property~ list: \\
+    `#1' \\
+    \msg_line_context:
   }
 
-% --------------------------------------------------------------------------
-% outputting the page numbers:
-\RequirePackage {zref-abspage}
-
-\cs_new_protected:Npn \__acro_create_page_records:n #1
+\msg_new:nnn {acro} {value-required}
   {
-    \seq_new:c { g__acro_#1_pages_seq }
-    \tl_new:c  { g__acro_#1_recorded_pages_tl }
+    The~ property~ `#2'~ for~ acroynm~ `#1'~ \msg_line_context: \
+    needs~ a~ (possibly~ empty)~ value!
   }
+  
 
-\cs_new_protected:Npn \acro_hyper_page:n #1 { \use:n {#1} }
+% ----------------------------------------------------------------------------
+% declare properties:
+\seq_new:N \l__acro_properties_seq
 
-\cs_new:Npn \acro_get_thepage:nnn #1#2#3 { \acro_hyper_page:n {#1} }
-\cs_new:Npn \acro_get_thepage_from:N #1
-  { \exp_after:wN \acro_get_thepage:nnn #1 }
+\cs_new_protected:Npn \acro_properties_map:n #1
+  { \seq_map_inline:Nn \l__acro_properties_seq {#1} }
 
-\cs_new:Npn \acro_get_page_number:nnn #1#2#3 {#2}
-\cs_new:Npn \acro_get_page_number_from:N #1
-  { \exp_after:wN \acro_get_page_number:nnn #1 }
+\acro_attribute_new:n {boolean}
+\acro_attribute_new:n {unique}
+\acro_attribute_new:n {mandatory}
+\acro_attribute_new:n {dynamic}
 
-\cs_new:Npn \acro_get_abspage:nnn #1#2#3 {#3}
-\cs_new:Npn \acro_get_abspage_from:N #1
-  { \exp_after:wN \acro_get_abspage:nnn #1 }
+% \seq_new:N \l__acro_mandatory_properties_seq
+\tl_new:N \l__acro_mandatory_properties_tl
 
-\cs_new:Npn \acro_page_range_comma: {}
-
-\cs_new_protected:Npn \acro_print_page_numbers:n #1
+% new property:
+% #1: boolean (true = unique)
+% #2: boolean (true = boolean)
+% #3: boolean (true = mandatory)
+% #4: boolean (true = static != dynamic)
+% #5: property name
+\cs_new_protected:Npn \acro_property_declare:nnnnn #1#2#3#4#5
   {
-    \seq_if_empty:cF {g__acro_#1_pages_seq}
+    \acro_property_if_exist:nF {#5}
       {
-        \bool_if:NTF \l__acro_list_all_pages_bool
+        \seq_put_right:Ne \l__acro_properties_seq { \tl_to_str:n {#5} }
+        \acro_attribute_new:n {property::#5}
+        \bool_if:nF {#4}
+          { \acro_attribute_set:nnn {dynamic} {#5} {true} }
+        \__acro_auxlist_new:n {#5}
+        \bool_if:nT {#3}
           {
-            % have the numbers changed?
-            \tl_set:Nx \l__acro_tmpa_tl
-              { \seq_use:cn {g__acro_#1_pages_seq} {|} }
-            \tl_if_eq:cNF {g__acro_#1_recorded_pages_tl} \l__acro_tmpa_tl
-              {
-                \@latex at warning@no at line
-                  {Rerun~to~get~page~numbers~of~acronym~#1~in~acronym~list~right}
-              }
-            \tl_clear:N \l__acro_write_pages_tl
-            \tl_clear:N \l__acro_last_page_tl
-            \tl_clear:N \l__acro_current_page_tl
-            \seq_set_eq:Nc \l__acro_tmpb_seq { g__acro_#1_pages_seq }
-            \seq_remove_duplicates:N \l__acro_tmpb_seq
-            \seq_clear:N \l__acro_tmpa_seq
-            \cs_set_protected:Npn \acro_page_range_comma:
-              { \cs_set:Npn \acro_page_range_comma: { ,~ } }
-            % get the numbers:
-            \int_compare:nNnTF { \seq_count:N \l__acro_tmpb_seq } = { 1 }
-              {
-                \tl_use:N \l__acro_page_name_tl
-                \seq_get_right:cN { g__acro_#1_pages_seq } \l__acro_tmpa_tl
-                \acro_get_thepage_from:N \l__acro_tmpa_tl
-              }
-              {
-                \tl_use:N \l__acro_pages_name_tl
-                \seq_map_inline:cn { g__acro_#1_pages_seq }
-                  {
-                    \tl_if_blank:VTF \l__acro_last_page_tl
-                      {% we're at the beginning
-                        \seq_put_right:Nn \l__acro_tmpa_seq {##1}
-                        \tl_set:Nn \l__acro_last_page_tl {##1}
-                      }
-                      {% we'at least at the second page
-                         % current page:
-                         \tl_set:Nn  \l__acro_current_page_tl {##1}
-                         % last page:
-                         \seq_get_right:NN \l__acro_tmpa_seq \l__acro_last_page_tl
-                         \tl_if_eq:NNTF \l__acro_current_page_tl \l__acro_last_page_tl
-                           {% there were more than one appearance on the current page
-                             \seq_put_right:Nn \l__acro_tmpa_seq {##1}
-                           }
-                           {% new page
-                             \acro_determine_page_ranges:NNn
-                               \l__acro_tmpa_seq
-                               \l__acro_write_pages_tl
-                               {##1}
-                           }
-                      }
-                  }
-                \seq_if_empty:NF \l__acro_tmpa_seq
-                  {
-                    \acro_determine_page_ranges:NNV
-                      \l__acro_tmpa_seq
-                      \l__acro_write_pages_tl
-                      \l__acro_current_page_tl
-                  }
-                \tl_use:N \l__acro_write_pages_tl
-                \tl_clear:N \l__acro_write_pages_tl
-              }
+            \acro_attribute_set:nnn {mandatory} {#5} {true}
+            % \seq_put_right:Nn \l__acro_mandatory_properties_seq {#5}
+            \tl_put_right:Nn \l__acro_mandatory_properties_tl {{#5}}
           }
+        \bool_if:nT {#2}
+          { \acro_attribute_set:nnn {boolean} {#5} {true} }
+        \bool_if:nT {#1}
           {
-            \tl_use:N \l__acro_page_name_tl
-            \pageref{\l__acro_label_prefix_tl #1}
+            \acro_attribute_set:nnn {unique} {#5} {true}
+            \seq_new:c {l__acro_unique_#5_seq}
           }
-      }
-    \seq_clear:N \l__acro_tmpa_seq
-    \seq_clear:N \l__acro_tmpb_seq
-  }
-
-\cs_new:Npn \acro_determine_page_ranges:NNn #1#2#3
-  {
-    \seq_remove_duplicates:N #1
-    % current page:
-    \int_set:Nn \l__acro_tmpa_int { \acro_get_abspage:nnn #3 }
-    \int_set:Nn \l__acro_tmpb_int { \acro_get_page_number:nnn #3 }
-    % last page:
-    \seq_get_right:NN #1 \l__acro_last_page_tl
-    \int_set:Nn \l__acro_tmpc_int
-      { \acro_get_abspage_from:N \l__acro_last_page_tl }
-    \int_set:Nn \l__acro_tmpd_int
-      { \acro_get_page_number_from:N \l__acro_last_page_tl }
-    \bool_lazy_and:nnTF
-      {
-        \int_compare_p:nNn
-          { \l__acro_tmpa_int - \l__acro_tmpc_int }
-           =
-          { \l__acro_tmpb_int - \l__acro_tmpd_int }
-      }
-      {
-        \int_compare_p:nNn
-        { \l__acro_tmpb_int - \l__acro_tmpd_int } = {1}
-      }
-      {% same kind of page numbering, one page ahead
-       % => possible range
-         \seq_put_right:Nn #1 {#3}
-      }
-      {% any possible range ended
-        \tl_put_right:Nn #2 { \acro_page_range_comma: }
-        \int_compare:nNnTF
-          { \seq_count:N #1 } > {2}
-          {% real range
-            \seq_get_left:NN #1 \l__acro_tmpa_tl
-            \tl_put_right:Nx #2 { \acro_get_thepage_from:N \l__acro_tmpa_tl }
-            \bool_if:NTF \l__acro_following_pages_bool
-              { \tl_put_right:Nn #2 { \l__acro_next_pages_tl } }
-              {
-                \tl_put_right:Nn #2 { -- }
-                \seq_get_right:NN #1 \l__acro_tmpa_tl
-                \tl_put_right:Nx #2 { \acro_get_thepage_from:N \l__acro_tmpa_tl }
-              }
-          }
+        \bool_if:nT {#4}
           {
-            \int_compare:nNnTF
-              { \seq_count:N #1 } = {2}
-              {% range of two pages
-                \seq_get_left:NN #1 \l__acro_tmpa_tl
-                \tl_put_right:Nx #2 { \acro_get_thepage_from:N \l__acro_tmpa_tl }
-                \bool_if:NTF \l__acro_following_page_bool
-                  { \tl_put_right:Nn #2 { \l__acro_next_page_tl } }
-                  {
-                    \tl_put_right:Nn #2 { ,~ }
-                    \seq_get_right:NN #1 \l__acro_tmpa_tl
-                    \tl_put_right:Nx #2 { \acro_get_thepage_from:N \l__acro_tmpa_tl }
-                  }
-              }
-              {% no range at all
-                \seq_get_right:NN #1 \l__acro_tmpa_tl
-                \tl_put_right:Nx #2 { \acro_get_thepage_from:N \l__acro_tmpa_tl }
-              }
+            \AtEndDocument { \__acro_auxlist_update:n {#5} }
+            \acro_at_begin_document:n { \__acro_property_set_from_auxlist:n {#5} }
           }
-        \seq_clear:N #1
-        \seq_put_right:Nn #1 {#3}
       }
   }
-\cs_generate_variant:Nn \acro_determine_page_ranges:NNn {NNV}
 
-% --------------------------------------------------------------------------
-\DeclareObjectType {acro-page-number} {1}
-
-\DeclareTemplateInterface {acro-page-number} {inline} {1}
+% ----------------------------------------------------------------------------
+% property conditionals:
+\prg_new_conditional:Npnn \acro_property_if_exist:n #1 {T,F,TF}
   {
-    display       : boolean   = true  ,
-    punct         : boolean   = false ,
-    punct-symbol  : tokenlist = {,}   ,
-    brackets      : boolean   = false ,
-    brackets-type : tokenlist = ()    ,
-    space         : skip      = .333333em plus .166666em minus .111111em
+    \acro_attribute_if_exist:nTF {property::#1}
+      { \prg_return_true: }
+      { \prg_return_false: }
   }
+\cs_generate_variant:Nn \acro_property_if_exist:nTF {x}
 
-\DeclareTemplateCode {acro-page-number} {inline} {1}
+% #1: id
+% #2: property
+\prg_new_conditional:Npnn \acro_property_if_set:nn #1#2 {p,T,F,TF}
   {
-    display       = \l__acro_page_display_bool  ,
-    punct         = \l__acro_page_punct_bool    ,
-    punct-symbol  = \l__acro_page_punct_tl      ,
-    brackets      = \l__acro_page_brackets_bool ,
-    brackets-type = \l__acro_page_brackets_tl   ,
-    space         = \l__acro_page_space_skip
+    \acro_attribute_if_set:neTF {#2} { \acro_case_insensitive:n {#1} }
+      { \prg_return_true: }
+      { \prg_return_false: }
   }
+\prg_generate_conditional_variant:Nnn \acro_property_if_set:nn
+  {nx,xx,nV,e,ne}
+  {p,T,F,TF}
+
+
+% #1: id
+% #2: properties
+\prg_new_protected_conditional:Npnn \acro_property_if_any:nn #1#2 {T,F,TF}
   {
-    \AssignTemplateKeys
-    \bool_if:NT \l__acro_page_display_bool
-      {
-        \bool_if:NT \l__acro_page_punct_bool
-          { \tl_use:N \l__acro_page_punct_tl }
-        % \tl_use:N \c_space_tl
-        \dim_compare:nNnF { \l__acro_page_space_skip } = { 0pt }
-          { \skip_horizontal:N \l__acro_page_space_skip }
-        \bool_if:NT \l__acro_page_brackets_bool
-          { \tl_head:N \l__acro_page_brackets_tl }
-        \acro_print_page_numbers:n {#1}
-        \bool_if:NT \l__acro_page_brackets_bool
-          { \tl_tail:N \l__acro_page_brackets_tl }
-      }
+    \seq_set_from_clist:Nn \l__acro_tmpa_seq {#2}
+    \seq_set_map:NNn \l__acro_tmpa_seq \l__acro_tmpa_seq
+      { { \exp_not:N \acro_property_if_set_p:nn {#1} {##1} } }
+    \bool_lazy_any:eTF
+      { \seq_use:Nn \l__acro_tmpa_seq {} }
+      { \prg_return_true: }
+      { \prg_return_false: }
   }
+\prg_generate_conditional_variant:Nnn \acro_property_if_any:nn {e} {TF}
 
-% declare new page styles:
-\cs_new_protected:Npn \acro_declare_page_style:nnn #1#2#3
+% #1: id
+% #2: properties
+\prg_new_protected_conditional:Npnn \acro_property_if_all:nn #1#2 {T,F,TF}
   {
-    \DeclareInstance {acro-page-number} {#1} {#2} {#3}
-    \prop_put:Nnn \l__acro_page_styles_prop  {#1} {#2}
+    \seq_set_from_clist:Nn \l__acro_tmpa_seq {#2}
+    \seq_set_map:NNn \l__acro_tmpa_seq \l__acro_tmpa_seq
+      { { \exp_not:N \acro_property_if_set_p:nn {#1} {##1} } }
+    \bool_lazy_all:eTF
+      { \seq_use:Nn \l__acro_tmpa_seq {} }
+      { \prg_return_true: }
+      { \prg_return_false: }
   }
+\prg_generate_conditional_variant:Nnn \acro_property_if_all:nn {e} {TF}
 
-% set a page style
-\cs_new_protected:Npn \acro_set_page_style:n #1
+\prg_new_conditional:Npnn \acro_property_if_eq:nn #1#2 {p,T,F,TF}
   {
-    \prop_if_in:NnTF \l__acro_page_styles_prop {#1}
-      { \__acro_set_page_style:n {#1} }
-      {
-        \msg_warning:nnnnn {acro} {unknown}
-          {page~ style}
-          {#1}
-          {none}
-        \__acro_set_page_style:n {none}
-      }
+    \str_if_eq:nnTF {#1} {#2}
+      { \prg_return_true: }
+      { \prg_return_false: }
   }
 
-\cs_new_protected:Npn \__acro_set_page_style:n #1
+\prg_new_conditional:Npnn \acro_property_if_mandatory:n #1 {p,T,F,TF}
   {
-    \tl_set:Nn \l__acro_page_instance_tl {#1}
-    \prop_get:NnN \l__acro_page_styles_prop {#1} \l__acro_tmpa_tl
+    \acro_attribute_if_set:nnTF {mandatory} {#1}
+      { \prg_return_true: }
+      { \prg_return_false: }
   }
+\cs_generate_variant:Nn \acro_property_if_mandatory:nF {V}
 
-% --------------------------------------------------------------------------
-% the title of the list:
-\cs_new:Npn \acro_list_title_format:n #1 {#1}
+\cs_new_protected:Npn \acro_property_foreach_mandatory:n #1
+  { \tl_map_inline:Nn \l__acro_mandatory_properties_tl {#1} }
 
-\DeclareObjectType {acro-title} {1}
+\prg_new_conditional:Npnn \acro_property_if_boolean:n #1 {p,T,F,TF}
+  {
+    \acro_attribute_if_set:nnTF {boolean} {#1}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
 
-\DeclareTemplateInterface {acro-title} {sectioning} {1}
-  { name-format : function 1 = #1 }
-
-\DeclareTemplateCode {acro-title} {sectioning} {1}
-  { name-format = \acro_list_title_format:n }
+\prg_new_conditional:Npnn \acro_property_if_unique:n #1 {p,T,F,TF}
   {
-    \AssignTemplateKeys
-    \acro_list_title_format:n {#1}
+    \acro_attribute_if_set:nnTF {unique} {#1}
+      { \prg_return_true: }
+      { \prg_return_false: }
   }
 
-% set a list heading:
-\cs_new_protected:Npn \acro_set_list_heading:n #1
+% #1: property
+% #2: value
+\prg_new_protected_conditional:Npnn \acro_property_if_unique_value:nn #1#2 {T,F,TF}
   {
-    \prop_if_in:NnTF \l__acro_list_headings_prop {#1}
-      { \__acro_set_list_heading:n {#1} }
+    \acro_property_if_unique:nTF {#1}
       {
-        \msg_warning:nnnnn {acro} {unknown}
-          {list~ heading}
-          {#1}
-          {section*}
-        \__acro_set_list_heading:n {section*}
+        \seq_if_in:cnTF {l__acro_unique_#1_seq} {#2}
+          { \prg_return_true: }
+          { \prg_return_false: }
       }
+      { \prg_return_false: }
   }
 
-\cs_new_protected:Npn \__acro_set_list_heading:n #1
-  { \tl_set:Nn \l__acro_list_heading_cmd_tl {#1} }
-  
-\cs_new_protected:Npn \acro_declare_list_heading:nn #1#2
+% #1: id
+% #2: property
+\prg_new_conditional:Npnn \acro_property_get_if_set:nn #1#2 {T,F,TF}
   {
-    \prop_put:Nnn \l__acro_list_headings_prop {#1} {#2}
-    \DeclareInstance {acro-title} {#1} {sectioning}
-      { name-format = #2 {##1} }
+    \acro_property_if_set:nnTF {#1} {#2}
+      {
+        \acro_property_get:nn {#1} {#2}
+        \prg_return_true:
+      }
+      { \prg_return_false: }
   }
+\prg_generate_conditional_variant:Nnn \acro_property_if_set:nn {V} {TF}
 
-% --------------------------------------------------------------------------
-% typesetting the acronym list
-\DeclareObjectType {acro-list} {2}
-
 % #1: id
-% #2: excluded classes
-\prg_new_protected_conditional:Npnn \acro_if_is_excluded:nn #1#2 {T,F,TF}
+% #2: property
+\prg_new_conditional:Npnn \acro_boolean_property_if:nn #1#2 {p,T,F,TF}
   {
-    \bool_set_false:N \l__acro_is_excluded_bool
-    \tl_if_blank:nF {#2}
+    \acro_property_if_exist:nTF {#2}
       {
-        \acro_property_get:nnT {#1} {class}
+        \acro_property_if_boolean:nTF {#2}
           {
-            \seq_set_split:NnV \l__acro_tmpa_seq {,} \l__acro_class_tl
-            \clist_map_inline:nn {#2}
+            \acro_property_if_set:nnTF {#1} {#2}
               {
-                \seq_if_in:NnT \l__acro_tmpa_seq {##1}
-                  { \bool_set_true:N \l__acro_is_excluded_bool }
+                \bool_if:cTF
+                  {c_ \acro_property_get:nn {#1} {#2} _bool}
+                  { \prg_return_true: }
+                  { \prg_return_false: }
               }
+              { \prg_return_false: }
           }
+          { \prg_return_false: }
       }
-    \bool_if:NTF \l__acro_is_excluded_bool
-      { \prg_return_true: }
       { \prg_return_false: }
   }
+\cs_generate_variant:Nn \acro_boolean_property_if:nnTF {oo}
+\cs_generate_variant:Nn \acro_boolean_property_if:nnF  {nV}
 
+% ----------------------------------------------------------------------------
+% set properties:
 % #1: id
-% #2: included classes
-\prg_new_protected_conditional:Npnn \acro_if_is_included:nn #1#2 {T,F,TF}
+% #2: property
+% #3: value
+\cs_new_protected:Npn \acro_property_set:nnn #1#2#3
   {
-    \bool_set_false:N \l__acro_is_included_bool
-    \tl_if_blank:nTF {#2}
-      { \bool_set_true:N \l__acro_is_included_bool }
+    \acro_property_if_exist:nTF {#2}
       {
-        \acro_property_get:nnT {#1} {class}
+        \acro_property_if_set:nnTF {#1} {#2}
           {
-            \seq_set_split:NnV \l__acro_tmpa_seq {,} \l__acro_class_tl
-            \clist_map_inline:nn {#2}
+            \acro_property_if_unique:nTF {#2}
               {
-                \seq_if_in:NnT \l__acro_tmpa_seq {##1}
-                  { \bool_set_true:N \l__acro_is_included_bool }
+                \acro_property_if_unique_value:nnTF {#2} {#3}
+                  { \__acro_unique_property_set:nnn {#1} {#2} {#3} }
+                  { \msg_warning:nnnn {acro} {property-unique} {#2} {#3} }
               }
+              {
+                \acro_property_if_boolean:nTF {#2}
+                  { \__acro_boolean_property_set:nnn {#1} {#2} {#3} }
+                  { \__acro_property_set:nnn {#1} {#2} {#3} }
+              }
           }
+          {
+            \acro_property_if_boolean:nTF {#2}
+              { \__acro_boolean_property_set:nnn {#1} {#2} {#3} }
+              {
+                \acro_property_if_unique:nTF {#2}
+                  { \__acro_unique_property_set:nnn {#1} {#2} {#3} }
+                  { \__acro_property_set:nnn {#1} {#2} {#3} }
+              }
+          }
       }
-    \bool_if:NTF \l__acro_is_included_bool
-      { \prg_return_true: }
-      { \prg_return_false: }
+      { \msg_error:nnn {acro} {unknown-property} {#2} }  
   }
+\cs_generate_variant:Nn \acro_property_set:nnn {nnV,nxx,nnx,e,nne,nnv}
 
 % #1: id
-\cs_new_protected:Npn \__acro_list_entry_short:n #1
+% #2: property
+% #3: value
+\cs_new_protected:Npn \__acro_boolean_property_set:nnn #1#2#3
   {
-    \group_begin:
-      \acro_get:n {#1}
-      \acro_hyper_target:nn
-        {#1}
-        {
-          \acro_acc_supp:nn
-            {#1}
-            {
-              \bool_lazy_and:nnTF
-                { \l__acro_custom_short_format_bool }
-                { \l__acro_override_list_format_bool }
-                { \l__acro_custom_short_format_tl }
-                { \l__acro_list_short_format_tl }
-              { \__acro_property_get:nn {short} {#1} }
-            }
-        }
-    \group_end:
+    \str_case_e:nnTF { \str_lowercase:n {#3} }
+      {
+        {} {}
+        {true} {}
+      }
+      { \__acro_property_set:nnn {#1} {#2} {true} }
+      { \__acro_property_set:nnn {#1} {#2} {false} }
   }
 
 % #1: id
-\cs_new_protected:Npn \__acro_list_entry_long:n #1
+% #2: property
+% #3: value
+\cs_new_protected:Npn \__acro_unique_property_set:nnn #1#2#3
+  { \__acro_property_set:nnn {#1} {#2} {#3} }
+
+% #1: id
+% #2: property
+\cs_new_protected:Npn \__acro_property_unset:nn #1#2
   {
-    \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_if_in:NnTF \l__acro_list_prop {#1}
-            { \__acro_property_get:nn {list} {#1} }
-            { \__acro_property_get:nn {long} {#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}
+    \__acro_property_remove_from_auxlist:nn {#1} {#2}
+    \acro_attribute_unset:nn {#2} {#1}
   }
 
 % #1: id
-\cs_new_protected:Npn \__acro_list_entry_extra:n #1
+% #2: property
+\cs_new_protected:Npn \acro_property_unset:nn #1#2
   {
-    \acro_property_get:nnT {#1} {extra}
-      {
-        \acro_extra_instance:VV
-          \l__acro_extra_instance_tl
-          \l__acro_extra_tl
-      }
+    \acro_property_if_exist:nTF {#2}
+      { \__acro_property_unset:nn {#1} {#2} }
+      { \msg_error:nnn {acro} {unknown-property} {#2} }
   }
+\cs_generate_variant:Nn \acro_property_unset:nn {nx,nV}
 
 % #1: id
-\cs_new_protected:Npn \__acro_list_entry_page:n #1
+% #2: property
+% #3: value
+\cs_new_protected:Npn \__acro_property_set:nnn #1#2#3
   {
-    \cs_if_exist:cT {acro@#1 at once}
-      {
-        \acro_page_number_instance:Vn
-          \l__acro_page_instance_tl
-          {#1}
-      }
+    \__acro_property_remove_from_auxlist:nn {#1} {#2}
+    % now we can safely add the property to the list:
+    \__acro_auxlist_add:nn {#2} {#1=={#3}}
+    \acro_attribute_set:nnn {#2} {#1} {#3}
   }
-  
-% macro for retrieval of items in the list:
-% #1: property
-% #2: id
-\cs_new_protected:Npn \acro_list_entry:nn #1#2
+\cs_generate_variant:Nn \__acro_property_set:nnn {VnV,nne}
+
+\tl_set:Nx \l__acro_tmpa_tl { \cs_to_str:N \{ }
+\tl_set:Nx \l__acro_tmpb_tl { \cs_to_str:N \} }
+\use:x
   {
-    \str_case:nnF {#1}
-      {
-        {short} { \__acro_list_entry_short:n {#2} }
-        {long}  { \__acro_list_entry_long:n {#2} }
-        {extra} { \__acro_list_entry_extra:n {#2} }
-        {page}  { \__acro_list_entry_page:n {#2} }
-      }
-      { \__acro_property_get:nn {#1} {#2} }
+    \cs_new_protected:Npn
+    \exp_not:N \__acro_property_extract_auxlist_entry:NNww
+    ##1##2##3 == \l__acro_tmpa_tl ##4 \l__acro_tmpb_tl
+    \exp_not:N \q_stop
   }
+  {
+    \str_set:Nn #1 {#3}
+    \str_set:Nn #2 {#4}
+  }
 
-% this macro may/should 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_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' -- this macro should be used in
-% the template code for retrieving the list
-  
 % #1: id
-% #2: included classes
-% #3: excluded classes
-\prg_new_protected_conditional:Npnn \acro_if_entry:nnn #1#2#3 {T,F,TF}
+% #2: property
+\cs_new_protected:Npn \__acro_property_remove_from_auxlist:nn #1#2
   {
-    \bool_lazy_or:nnTF
+    % make sure we change the entry if it has been recorded previously:
+    \__acro_auxlist_foreach_entry:nn {#2}
       {
-        \bool_lazy_and_p:nn
-          { !\l__acro_single_use_bool }
-          { !\l__acro_print_only_used_bool }
-      }
-      {
-        \bool_lazy_and_p:nn
-          { \bool_if_p:c {g__acro_#1_in_list_bool} }
+        \__acro_property_extract_auxlist_entry:NNww
+          \l__acro_tmpa_str \l__acro_tmpb_str ##1 \q_stop
+        \str_if_eq:xnT { \l__acro_tmpa_str } {#1}
           {
-            \bool_lazy_or_p:nn
-              {
-                \bool_lazy_and_p:nn
-                  { \l__acro_single_use_bool }
-                  { \cs_if_exist_p:c {acro@#1 at twice} }
-              }
-              {
-                \bool_lazy_all_p:n
-                  {
-                    { !\l__acro_single_use_bool }
-                    { \cs_if_exist_p:c {acro@#1 at once} }
-                    { \l__acro_print_only_used_bool }
-                  }
-              }
+            \__acro_auxlist_remove:nx {#2}
+              { #1 == {\l__acro_tmpb_str} }
           }
       }
+    % make sure we change the entry if it has been set during the current run:
+    \__acro_auxlist_foreach_new_entry:nn {#2}
       {
-        \acro_if_is_excluded:nnTF {#1} {#3}
-          { \prg_return_false: }
+        \__acro_property_extract_auxlist_entry:NNww
+          \l__acro_tmpa_str \l__acro_tmpb_str ##1 \q_stop
+        \str_if_eq:xnT { \l__acro_tmpa_str } {#1}
           {
-            \acro_if_is_included:nnTF {#1} {#2}
-              {
-                \bool_lazy_and:nnTF
-                  { \g__acro_use_barriers_bool }
-                  { \l__acro_use_barrier_bool }
-                  {
-                    \acro_if_in_barrier:nxTF {#1}
-                      { \int_use:N \g__acro_barrier_int }
-                      { \prg_return_true: }
-                      { \prg_return_false: }
-                  }
-                  { \prg_return_true: }
-              }
-              { \prg_return_false: }
+            \__acro_auxlist_remove:nx {#2}
+              { #1 == {\l__acro_tmpb_str} }
           }
       }
-      { \prg_return_false: }
   }
 
-% this macro is used in templates for fetching all items to be printed; it
-% collects all entries in a tl which then is used where needed
-%
-% #1: tl containing the entries
-% #2: included classes
-% #3: excluded classes
-\cs_new_protected:Npn \acro_build_list_entries:Nnn #1#2#3
+% #1: property
+\cs_new_protected:Npn \__acro_property_set_from_auxlist:n #1
   {
-    \tl_clear:N #1
-    \acro_for_all_acronyms_do:n
-      {% ##1: id; ##2: short form
-        \group_begin:
-          \acro_get:n {##1}
-          \acro_if_entry:nnnT {##1} {#2} {#3}
-            {
-              \tl_gput_right:Nn #1
-                {
-                  \acro_print_list_entry:nnnn
-                    { \acro_list_entry:nn {short} {##1} }
-                    { \acro_list_entry:nn {long} {##1} }
-                    { \acro_list_entry:nn {extra} {##1} }
-                    { \acro_list_entry:nn {page} {##1} }
-                }
-            }
-        \group_end:  
+    \__acro_auxlist_foreach_entry:nn {#1}
+      {
+        \__acro_property_extract_auxlist_entry:NNww
+          \l__acro_tmpa_str \l__acro_tmpb_str ##1 \q_stop
+        \tl_set_rescan:Nnx \l__acro_tmpa_tl {} { \l__acro_tmpb_str }
+        \__acro_property_set:VnV \l__acro_tmpa_str {#1} \l__acro_tmpa_tl
       }
   }
 
-% this macro is used in templates for fetching all items to be printed:
-\cs_new_protected:Npn \acro_list_items:nn #1#2
+% set properties:
+% #1: id
+% #2: csv list of properties
+\cs_new_protected:Npn \acro_properties_set:nn #1#2
   {
-    \acro_build_list_entries:Nnn \l__acro_list_entries_tl {#1} {#2}
-    \tl_use:N \l__acro_list_entries_tl
+    \cs_set_protected:Npn \__acro_parse_property:nn ##1##2
+      { \acro_property_set:nnn {#1} {##1} {##2} }
+    \cs_set_protected:Npn \__acro_parse_property:n ##1
+      {
+        \acro_property_if_boolean:nTF {##1}
+          { \acro_property_set:nnn {#1} {##1} {true} }
+          { \msg_error:nnnn {acro} {value-required} {#1} {##1} }
+      }
+    \keyval_parse:NNn
+      \__acro_parse_property:n
+      \__acro_parse_property:nn
+      {#2}
   }
-  
-% --------------------------------------------------------------------------
-% declare templates for the list:
-% `list' template:
-\DeclareTemplateInterface {acro-list} {list} {2}
-  {
-    foreign-sep : tokenlist = {~} ,
-    list        : tokenlist = {description} ,
-    reverse     : boolean   = false ,
-    before      : tokenlist = ,
-    after       : tokenlist =
-  }
+\cs_generate_variant:Nn \acro_properties_set:nnn {nnx,nxx,nV,nVx}
 
-\DeclareTemplateCode {acro-list} {list} {2}
+% ----------------------------------------------------------------------------
+% inspect properties:
+\cs_new_protected:Npn \acro_property_show:nn #1#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:
-    \bool_if:NTF \l__acro_list_reverse_long_extra_bool
+    \acro_property_if_set:nnT {#1} {#2}
       {
-        \cs_set_protected:Npn \acro_print_list_entry:nnnn ##1##2##3##4
-          { \item [##1] ##3 ##2 ##4 }
+        \iow_term:x
+          {
+            \c_space_tl \c_space_tl
+            \tl_to_str:n {#2}
+            \c_space_tl \c_space_tl => \c_space_tl \c_space_tl
+            { \acro_property_get:nn {#1} {#2} }
+          }
       }
-      {
-        \cs_set_protected:Npn \acro_print_list_entry:nnnn ##1##2##3##4
-          { \item [##1] ##2 ##3 ##4 }
-      }
-    \use:x
-      {
-        \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
-      }
   }
+\cs_generate_variant:Nn \acro_property_show:nn {e}
 
-% `list-of' template:
-\DeclareTemplateInterface {acro-list} {list-of} {2}
+% ----------------------------------------------------------------------------
+% alias properties:
+\tl_new:N \g__acro_property_aliases_tl
+
+% #1: property
+\prg_new_conditional:Npnn \acro_property_if_alias:n #1 {p,T,F,TF}
   {
-    foreign-sep : tokenlist = {~} ,
-    style       : tokenlist = {toc} ,
-    reverse     : boolean   = false ,
-    before      : tokenlist = ,
-    after       : tokenlist =
+    \tl_map_tokens:Nn \g__acro_property_aliases_tl
+      { \__acro_property_if_alias:nn {#1} }
+    \use_ii:nn
+      { \prg_return_true: }
+      { \prg_return_false: }
   }
 
-\DeclareTemplateCode {acro-list} {list-of} {2}
+% #1: tl
+% #2: tl
+\cs_new:Npn \__acro_property_if_alias:nn #1#2
   {
-    foreign-sep = \l__acro_foreign_sep_tl ,
-    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
+    \str_if_eq:nnT {#1} {#2}
+      { \tl_map_break:n { \use_ii:nnn } }
   }
+
+% #1: property
+\cs_new:Npn \acro_property_alias:n #1
+  { \acro_attribute_get:nn {#1} {alias} }
+\cs_generate_variant:Nn \acro_property_alias:n {e}
+
+% #1: property
+% #2: alias of
+\cs_new_protected:Npn \acro_property_make_alias:nn #1#2
   {
-    \AssignTemplateKeys
-    \bool_set_true:N \l__acro_in_list_bool
-    \tl_if_eq:VnT \l__acro_page_instance_tl {none}
-      { \tl_set:Nn \l__acro_page_instance_tl {plain} }
-    \tl_set:Nn \l__acro_page_name_tl {}
-    \tl_set:Nn \l__acro_pages_name_tl {}
-    \acro_activate_hyperref_support:
-    \str_case:Vn \l__acro_list_of_style
+    \acro_property_if_alias:nF {#1}
       {
-        {toc}
-        { % similar to the table of contents
-          \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
-                {
-                  \cs_set_protected:Npn \acro_print_list_entry:nnnn ##1##2##3##4
-                    {
-                      \contentsline{chapter}{##1}{}{}
-                      \contentsline{section}{##2##3}{##4}{}
-                    } 
-                }
-                {
-                  \cs_set_protected:Npn \acro_print_list_entry:nnnn ##1##2##3##4
-                    {
-                      \contentsline{section}{##1}{}{}
-                      \contentsline{subsection}{##2##3}{##4}{}
-                    }
-                }
-            }
-        }
-        {lof}
-        { % similar to the list of figures
-          \cs_set_protected:Npn \l at acro
-            { \@dottedtocline {1} {1.5em} {\l__acro_short_width_dim} }
-          \bool_if:NTF \l__acro_list_reverse_long_extra_bool
-            {
-              \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}{} }
-            }
-        }
+        \acro_attribute_set:nnn {#1} {alias} {#2}
+        \tl_gput_right:Nn \g__acro_property_aliases_tl {{#1}}
       }
-    \use:x
-      {
-        \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
-      }
   }
-  
-% `table' template:
-\DeclareTemplateInterface {acro-list} {table} {2}
-  {
-    table       : tokenlist = tabular ,
-    table-spec  : tokenlist = lp{.7\linewidth} ,
-    foreign-sep : tokenlist = {~} ,
-    reverse     : boolean   = false ,
-    before      : tokenlist = ,
-    after       : tokenlist = 
-  }
 
-\DeclareTemplateCode {acro-list} {table} {2}
+% #1: id
+% #2: alias property
+\cs_new_protected:Npn \acro_property_set_alias:nn #1#2
   {
-    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:
-    \bool_if:NTF \l__acro_list_reverse_long_extra_bool
+    \acro_property_if_set:nnF {#1} {#2}
       {
-        \cs_set_protected:Npn \acro_print_list_entry:nnnn ##1##2##3##4
-          { ##1 & ##3 ##2 ##4 \tabularnewline }
+        \acro_property_if_set:neT {#1} { \acro_property_alias:n {#2} }
+          { 
+            \__acro_property_set:nne {#1} {#2}
+              { \acro_property_get:ne {#1} { \acro_property_alias:n {#2} } }
+          }
       }
-      {
-        \cs_set_protected:Npn \acro_print_list_entry:nnnn ##1##2##3##4
-          { ##1 & ##2 ##3 ##4 \tabularnewline }
-      }
-    \acro_build_list_entries:Nnn \l__acro_list_entries_tl {#1} {#2}
-    \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:V \l__acro_list_entries_tl
-        \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} {2}
+% #1: id
+\cs_new_protected:Npn \acro_property_set_aliases:n #1
   {
-    table       : tokenlist = tabular ,
-    table-spec  : tokenlist = llll ,
-    foreign-sep : tokenlist = {~} ,
-    reverse     : boolean   = false ,
-    before      : tokenlist = ,
-    after       : tokenlist = 
+    \tl_map_inline:Nn \g__acro_property_aliases_tl
+      { \acro_property_set_alias:nn {#1} {##1} }
   }
 
-\DeclareTemplateCode {acro-list} {extra-table} {2}
+% ----------------------------------------------------------------------------
+% retrieve properties:
+% #1: id
+% #2: property
+\cs_new:Npn \acro_property_get:nn #1#2
+  {  \acro_attribute_get:ne {#2} { \acro_case_insensitive:n {#1} } }
+\cs_generate_variant:Nn \acro_property_get:nn {nx,ne,V}
+
+% ----------------------------------------------------------------------------
+\AcroModuleEnd
+% ----------------------------------------------------------------------------
+% the ACRO package - acronyms module
+% 
+%   Typeset Acronyms
+% 
+% --------------------------------------------------------------------------
+% Clemens Niederberger
+% Web:    https://github.com/cgnieder/acro/
+% E-Mail: contact at mychemistry.eu
+% --------------------------------------------------------------------------
+% Copyright 2011--2020 Clemens Niederberger
+% 
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+%   http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+% 
+% This work has the LPPL maintenance status `maintained'.
+% 
+% The Current Maintainer of this work is Clemens Niederberger.
+% --------------------------------------------------------------------------
+% If you have any ideas, questions, suggestions or bugs to report, please
+% feel free to contact me.
+% --------------------------------------------------------------------------
+\AcroModule{acronyms}{define acronyms}
+
+% --------------------------------------------------------------------------
+\msg_new:nnn {acro} {undefined}
   {
-    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
+    You've~ requested~ acronym~ `#1'~ \msg_line_context: \ but~ you~
+    apparently~ haven't~ defined~ it,~ yet! \\
+    Maybe~ you've~ misspelled~ `#1'?
   }
+
+\msg_new:nnn {acro} {mandatory}
   {
-    \AssignTemplateKeys
-    \acro_activate_hyperref_support:
-    \bool_if:NTF \l__acro_list_reverse_long_extra_bool
-      {
-        \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_entry:nnnn ##1##2##3##4
-          { ##1 & ##2 & ##3 & ##4 \tabularnewline }
-      }
-    \acro_build_list_entries:Nnn \l__acro_list_entries_tl {#1} {#2}
-    \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:V \l__acro_list_entries_tl
-        \exp_not:N \end { \exp_not:V \l__acro_list_table_tl }
-        \exp_not:V \l__acro_list_after_tl
-      }
+    You~ forgot~ to~ set~ the~ mandatory~ property~ `#2'~ for~ acronym~
+    `#1'~ \msg_line_context:
   }
 
 % --------------------------------------------------------------------------
-% declare new list styles:
-\cs_new_protected:Npn \acro_declare_list_style:nnn #1#2#3
-  {
-    \DeclareInstance {acro-list} {#1} {#2} {#3}
-    \prop_put:Nnn \l__acro_list_styles_prop  {#1} {#2}
-  }
+% short and long list:
+\tl_new:N \l__acro_short_tl
+\tl_new:N \l__acro_long_tl
 
-% set a list style
-\cs_new_protected:Npn \acro_set_list_style:n #1
+\cs_new_protected:Npn \acro_list_add:nn #1#2
   {
-    \prop_if_in:NnTF \l__acro_list_styles_prop {#1}
-      { \__acro_set_list_style:n {#1} }
+    \clist_map_inline:nn {#2}
       {
-        \msg_warning:nnnnn {acro} {unknown}
-          {list~ style}
-          {#1}
-          {description}
-        \__acro_set_list_style:n {description}
+        \tl_put_right:cn {l__acro_#1_tl} {{##1}}
+        \cs_set:cpn {____acro_#1::##1____:} {}
       }
   }
 
-\cs_new_protected:Npn \__acro_set_list_style:n #1
+\cs_new_protected:Npn \acro_list_map:nn #1#2
+  { \tl_map_inline:cn {l__acro_#1_tl} {#2} }
+
+\prg_new_conditional:Npnn \acro_if_short:n #1 {p,T,F,TF}
   {
-    \tl_set:Nn \l__acro_list_instance_tl {#1}
-    \prop_get:NnN \l__acro_list_styles_prop {#1} \l__acro_list_type_tl
+    \cs_if_exist:cTF {____acro_short::#1____:}
+      { \prg_return_true: }
+      { \prg_return_false: }
   }
 
-% --------------------------------------------------------------------------
-% case insensitivity of the ID:
-\cs_new:Npn \acro_case_insensitive:n #1
+\prg_new_conditional:Npnn \acro_if_long:n #1 {p,T,F,TF}
   {
-    \bool_if:NTF \g__acro_case_sensitive_bool
-      { \tl_to_str:n {#1} }
-      { \str_lowercase:n {#1} }
+    \cs_if_exist:cTF {____acro_long::#1____:}
+      { \prg_return_true: }
+      { \prg_return_false: }
   }
 
-\cs_new_protected:Npn \acro_protected_case_insensitive:n #1
-  { \acro_case_insensitive:n {#1} }
+% --------------------------------------------------------------------------
+% define necessary properties:
+% short and long properties:
+\acro_list_add:nn {short} {short,alt}
+\acro_list_add:nn {long}  {long,foreign,single,extra,list}
 
-\cs_new:Npn \acro_case_insensitive:Nn #1#2
-  { \exp_args:Ne #1 { \acro_case_insensitive:n {#2} } }
+% meta information:
+\DeclareAcroProperty*!{id}
+\DeclareAcroProperty ?{used}
+\DeclareAcroProperty |{usage}
+\DeclareAcroProperty |{pages}
+\DeclareAcroProperty |{barriers}
+\DeclareAcroProperty* {label}
 
-\cs_new:Npn \acro_case_insensitive:Nnn #1#2#3
-  { \exp_args:Ne #1 { \acro_case_insensitive:n {#2} } {#3} }
+% main properties:
+\DeclareAcroProperty !{short}
+\DeclareAcroProperty  {alt}
+\DeclareAcroProperty !{long}
 
-\cs_new_protected:Npn \acro_case_insensitive_command:Nnnn #1#2#3#4
-  { \exp_args:Nnnx #1 {#2} {#3} { \acro_case_insensitive:n {#4} } }
-\cs_generate_variant:Nn \acro_case_insensitive_command:Nnnn {c}
+% sorting, indexing, ... :
+\DeclareAcroPropertyAlias {sort} {short}
+\DeclareAcroProperty {index}
+\DeclareAcroProperty?{no-index}
+\DeclareAcroPropertyAlias {index-sort} {sort}
+\DeclareAcroProperty {index-cmd}
+\DeclareAcroProperty {tag}
+\DeclareAcroProperty {cite}
+\DeclareAcroProperty {before-citation}
+\DeclareAcroPropertyAlias {pdfstring} {short}
+\DeclareAcroProperty {pdfcomment}
 
+% locale:
+\DeclareAcroProperty {foreign}
+\DeclareAcroProperty {foreign-babel}
+\DeclareAcroProperty {foreign-locale}
+
+% additional properties:
+\DeclareAcroPropertyAlias {single} {long}
+\DeclareAcroPropertyAlias {list} {long}
+\DeclareAcroPropertyAlias {first-long} {long}
+\DeclareAcroProperty {extra}
+\DeclareAcroProperty {post}
+\DeclareAcroProperty {long-post}
+\DeclareAcroProperty {first-style}
+\DeclareAcroProperty {single-style}
+
+% formatting:
+\DeclareAcroProperty {format}
+\DeclareAcroPropertyAlias {short-format} {format}
+\DeclareAcroProperty {alt-format}
+\DeclareAcroPropertyAlias {long-format}  {format}
+\DeclareAcroPropertyAlias {first-long-format} {long-format}
+\DeclareAcroProperty {foreign-format}
+\DeclareAcroProperty {single-format}
+\DeclareAcroProperty {list-format}
+\DeclareAcroProperty {extra-format}
+
+% Accessibility:
+\acro_list_map:nn {short}
+  {
+    \DeclareAcroPropertyAlias {#1-acc} {#1}
+    \acro_list_add:nn {short} {#1-acc}
+  }
+
+\DeclareAcroPropertyAlias {single-acc} {long-acc}
+\acro_list_map:nn {long}
+  {
+    \DeclareAcroPropertyAlias {#1-acc} {#1}
+    \acro_list_add:nn {long} {#1-acc}
+  }
+
 % --------------------------------------------------------------------------
-% automatic typesetting, the internals of \ac:
-% #1: id
+% use id as short entry:
+\bool_new:N \g__acro_use_id_bool
 
-\cs_new_protected:Npn \acro_soft_upper:
+\keys_define:nn {acro}
   {
-    \bool_if:NF \l__acro_upper_short_bool
-      { \bool_set_false:N \l__acro_first_upper_bool }
+    use-id-as-short         .choice: ,
+    use-id-as-short / true  .code:n =
+      \bool_gset_true:N \g__acro_use_id_bool ,
+    use-id-as-short / false .code:n =
+      \bool_gset_false:N \g__acro_use_id_bool ,
+    use-id-as-short         .default:n = true
   }
 
-\cs_new_protected:Npn \acro_use:n #1
+% --------------------------------------------------------------------------
+% declaration of acronyms:
+\seq_new:N \g__acro_acronyms_seq
+
+\tl_new:N \l__acro_first_style_tl
+
+\acro_attribute_new:n {acronyms}
+
+\keys_define:nn {acro}
   {
-    % get the acronym and the plural settings:
-    \acro_get:n {#1}
-    \acro_is_used:nTF {#1}
+    first-style .tl_set:N  = \l__acro_first_style_tl ,
+    first-style .initial:n = long-short
+  }
+
+\cs_new_protected:Npn \acro_declare_acronym:nn #1#2
+  { \acro_case_insensitive:Nn \__acro_declare_acronym:nn {#1} {#2} }
+
+% #1: id
+% #2: properties
+\cs_new_protected:Npn \__acro_declare_acronym:nn #1#2
+  {
+    \int_new:c {g__acro_#1_int}
+    \seq_new:c {g__acro_#1_pages_seq}
+    \seq_new:c {g__acro_#1_barriers_seq}
+    \acro_at_begin_document:n
       {
-        \acro_soft_upper:
-        % this is not the first time
-        \acro_write_indefinite:nn {#1} {short}
-        \acro_write_compact:nn {#1} {short}
-        \acro_after:n {#1}
+        \intarray_new:cn
+          {g__acro_#1_barriers_intarray}
+          { \g_acro_barrier_total_int }
       }
+    \seq_gput_right:Nn \g__acro_acronyms_seq {#1}
+    \acro_attribute_set:nnn {acronyms} {#1} {}
+    % set defaults:
+    \__acro_set_article_defaults:n {#1}
+    % set user input:
+    \acro_properties_set:nn {#1} {#2}
+    % set defaults which must not be overwritten:
+    \acro_property_set:nnn {#1} {usage} {0}
+    \bool_lazy_and:nnT
+      { \g__acro_use_id_bool }
+      { !\acro_property_if_set_p:nn {#1} {short} }
+      { \acro_property_set:nnn {#1} {short} {#1} }
+    \acro_property_set:nnn {#1} {id} {#1}
+    \acro_property_set_aliases:n {#1}
+    % check mandatory properties:
+    \acro_property_foreach_mandatory:n
       {
-        % this is the first time
-        \bool_gset_true:c { g__acro_#1_first_use_bool }
-        \acro_if_is_single:nTF {#1}
-          { \acro_single:n {#1} }
-          { \acro_first_instance:nV {#1} \l__acro_long_tl }
+        \acro_property_if_set:nnF {#1} {##1}
+          { \msg_error:nnnn {acro} {mandatory} {#1} {##1} }
       }
+    % set endings:
+    \acro_set_endings:n {#1}
+    \acro_at_end_document:n
+      {
+        \acro_property_set:nnx {#1} {usage} { \int_use:c {g__acro_#1_int} }
+        \acro_set_barriers:n {#1}
+      }
   }
 
-% single appearances:
-\cs_new_protected:Npn \acro_single:n #1
+\prg_new_conditional:Npnn \acro_if_defined:n #1 {p,T,F,TF}
   {
-    \acro_cite:
-    \acro_single_form:nV {#1} \l__acro_single_form_tl
-    \acro_after:n {#1}
+    \acro_attribute_if_set:neTF {acronyms}
+      { \acro_case_insensitive:n {#1} }
+      { \prg_return_true: }
+      { \prg_return_false: }
   }
 
-% #1: ID
-% #2: long|first|<other>
-\cs_new_protected:Npn \acro_single_form:nn #1#2
+\cs_new_protected:Npn \acro_check_definition:n #1
   {
-    \acro_write_indefinite:nn {#1} {#2}
-    \str_case:nnF {#2}
+    \acro_if_defined:nF {#1}
+      { \msg_error:nnn {acro} {undefined} {#1} }
+  }
+
+% --------------------------------------------------------------------------
+% use and reset:
+\bool_new:N \l__acro_use_bool
+\bool_set_true:N \l__acro_use_bool
+
+\cs_new_protected:Npn \acro_use_false:
+  { \bool_set_false:N \l__acro_use_bool }
+
+\cs_new_protected:Npn \__acro_use:n #1
+  {
+    \bool_if:NT \l__acro_use_bool
       {
-        {long} {
-          \tl_if_blank:VT \l__acro_single_format_tl
-            {
-              \bool_if:NTF \l__acro_custom_long_format_bool
-                {
-                  \tl_set_eq:NN
-                    \l__acro_single_format_tl
-                    \l__acro_custom_long_format_tl
-                }
-                {
-                  \tl_set_eq:NN
-                    \l__acro_single_format_tl
-                    \l__acro_long_format_tl
-                }
-            }
-          \tl_if_blank:VT \l__acro_single_tl
-            { \tl_set_eq:NN \l__acro_single_tl \l__acro_long_tl }
-          % BUG: should that be \acro_write_expanded:nn ?
-          % \acro_write_expanded:nnn {#1} {#2} {\l__acro_single_tl}
-          \acro_write_long:VV \l__acro_single_format_tl \l__acro_single_tl
-          \acro_endings:nn {#1} {single}
-          \l__acro_long_post_tl
-        }
-        {first} {
-          \tl_if_blank:VF \l__acro_single_format_tl
-            {
-              \tl_set_eq:NN
-                \l__acro_first_long_format_tl
-                \l__acro_single_format_tl
-            }
-          \tl_if_blank:VT \l__acro_single_tl
-            { \tl_set_eq:NN \l__acro_single_tl \l__acro_long_tl }
-          \acro_first_instance:nV {#1} \l__acro_single_tl
-        }
+        \acro_property_set:nnn {#1} {used} {true}
+        \acro_step:n {#1}
       }
-      { % other (e.g. short)
-        \acro_soft_upper:
-        \tl_if_blank:VF \l__acro_single_tl
-          { \tl_set_eq:cN {l__acro_#2_tl} \l__acro_single_tl }
-        \tl_if_blank:VF \l__acro_single_format_tl
-          { \tl_set_eq:cN {l__acro_#2_format_tl} \l__acro_single_format_tl }
-        \acro_write_compact:nn {#1} {#2}
-      }
   }
-\cs_generate_variant:Nn \acro_single_form:nn {nV}
 
-\prg_new_conditional:Npnn \acro_if_is_single:n #1 { p,T,TF }
+\cs_new_protected:Npn \acro_use:n #1
+  { \clist_map_inline:nn {#1} { \__acro_use:n {#1} } }
+\cs_generate_variant:Nn \acro_use:n {e}
+
+\cs_new_protected:Npn \acro_use_all:
+  { \seq_map_inline:Nn \g__acro_acronyms_seq { \__acro_use:n {##1} } }
+
+\cs_new_protected:Npn \__acro_reset:n #1
   {
-    \bool_lazy_or:nnTF
-      { !\l__acro_single_use_bool }
-      { \cs_if_exist_p:c {acro@#1 at twice} }
-      { \prg_return_false: }
-      { \prg_return_true: }
+    \acro_property_set:nnn {#1} {used} {false}
+    \int_gzero:c {g__acro_ \acro_case_insensitive:n {#1} _int}
+    \int_compare:nNnF
+      { \acro_property_get:nn {#1} {usage} } > 0
+      { \acro_property_set:nnn {#1} {usage} {0} }
   }
 
-\cs_new_protected:Npn \acro_use_acronym:n #1
-  { \use:c {bool_set_#1:N} \l__acro_mark_as_used_bool }
+\cs_new_protected:Npn \acro_reset:n #1
+  { \clist_map_inline:nn {#1} { \__acro_reset:n {##1} } }
 
+\cs_new_protected:Npn \acro_reset_all:
+  { \seq_map_inline:Nn \g__acro_acronyms_seq { \__acro_reset:n {##1} } }
+
+\cs_new_protected:Npn \acro_switch_off:
+  { \bool_set_false:N \l__acro_use_bool }
+
+\cs_new_protected:Npn \acro_switch_on:
+  { \bool_set_true:N \l__acro_use_bool }
+
 % --------------------------------------------------------------------------
-% some helpers we'll need more often:
-\prg_new_conditional:Npnn \acro_if_defined:n #1 {p,T,F,TF}
+% check for tags:
+% #1: id
+% #2: tag
+\prg_new_protected_conditional:Npnn \acro_tag_if:nn #1#2 {T,F,TF}
   {
-    \seq_if_in:NeTF \g__acro_declared_acronyms_seq
-      { \acro_case_insensitive:n {#1} }
+    \clist_set:Ne \l__acro_tmpa_clist { \acro_property_get:nn {#1} {tag} }
+    \clist_if_in:NnTF \l__acro_tmpa_clist {#2}
       { \prg_return_true: }
       { \prg_return_false: }
   }
+\prg_generate_conditional_variant:Nnn \acro_tag_if:nn {en} {T,F,TF}
 
-\cs_new_protected:Npn \acro_defined:n #1
+% --------------------------------------------------------------------------
+\AcroModuleEnd
+\AcroModule{formatting}{formatting of acronyms}
+% --------------------------------------------------------------------------
+% formatting:
+\bool_new:N \l__acro_format_replace_bool
+
+% sets the format from the global option:
+% #1: property
+\cs_new:Npn \__acro_global_format:n #1
   {
-    \acro_if_defined:nF {#1}
-      { \acro_serious_message:nn {undefined} {#1} }
+    \acro_property_if_alias:nTF {#1}
+      {
+        \tl_if_empty:cTF {l__acro_format_ #1 _tl}
+          { \__acro_use_global_format:n { \acro_property_alias:n {#1} } }
+          { \__acro_use_global_format:n {#1} }
+      }
+      { \__acro_use_global_format:n {#1} }
   }
 
-% expandably gets property but doesn't transform property name -- internal
-% name is needed
 % #1: property
-% #2: id
-\cs_new:Npn \__acro_property_get:nn #1#2
-  { \prop_item:cn {l__acro_#1_prop} {#2} }
+\cs_new:Npn \__acro_use_global_format:n #1
+  {
+    \tl_if_exist:cT {l__acro_format_ #1 _tl}
+      { \tl_use:c {l__acro_format_ #1 _tl} }
+  }
 
 % #1: id
 % #2: property
-% #3: set case
-% #4: not set case
-\prg_new_protected_conditional:Npnn \acro_property_get:nn #1#2 {T,F,TF}
+% #3: insert if false
+\cs_new:Npn \__acro_property_format:nnF #1#2#3
   {
-    \tl_set:Nn \l__acro_tmpa_tl {#2}
-    \tl_replace_all:Nnn \l__acro_tmpa_tl {-} {_}
-    \prop_get:cncTF
-      {l__acro_ \l__acro_tmpa_tl _prop}
-      {#1}
-      {l__acro_ \l__acro_tmpa_tl _tl}
-      { \prg_return_true: }
+    \acro_property_if_set:nnTF {#1} {#2-format}
+      { \acro_property_get:nn {#1} {#2-format} }
+      {
+        \acro_if_format_alias:nnTF {#1} {#2}
+          {
+            \acro_property_get:nn {#1}
+              { \acro_property_alias:n {#2} -format }
+          }
+          {#3}
+      }
+  }
+
+% #1: id
+% #1: property
+\prg_new_conditional:Npnn \acro_if_format_alias:nn #1#2 {TF}
+  {
+    \acro_property_if_alias:nTF {#2}
+      {
+        \acro_property_if_set:nnTF {#1}
+          { \acro_property_alias:n {#2} -format }
+          { \prg_return_true: }
+          { \prg_return_false: }
+      }
       { \prg_return_false: }
   }
 
-\cs_new_protected:Npn \acro_property_get:nn #1#2
-  { \acro_property_get:nnTF {#1} {#2} {} {} }
-\cs_generate_variant:Nn \acro_property_get:nn {V}
+% #1: id
+% #1: property
+\cs_new:Npn \__acro_property_format:nn #1#2
+  { \__acro_property_format:nnF {#1} {#2} {} }
 
-% within this command one can refer to the current id with `#1'
-\cs_new_protected:Npn \acro_add_action:n #1
-  { \seq_put_right:Nn \l__acro_actions_seq {#1} }
+% sets the individual format:
+% #1: id
+% #2: property
+% #3: text
+\cs_new:Npn \acro_format:nnn #1#2#3
+  {
+    {
+      \bool_if:NTF \l__acro_format_replace_bool
+        {
+          \__acro_property_format:nnF {#1} {#2}
+            { \__acro_global_format:n {#2} }
+          {#3}
+        }
+        {
+          \__acro_global_format:n {#2}
+            {
+              \__acro_property_format:nn {#1} {#2}
+              {#3}
+            }
+        }
+    }
+  }
+\cs_generate_variant:Nn \acro_format:nnn {e}
 
-\cs_new_protected:Npn \__acro_get_actions:n #1
+% #1: property:
+\cs_new_protected:Npn \acro_new_format:n #1
   {
-    \seq_map_inline:Nn \l__acro_actions_seq
+    \tl_new:c {l__acro_format_#1_tl}
+    \keys_define:nn {acro/format}
       {
-        \cs_set:Npn \__acro_action:n ####1 {##1}
-        \__acro_action:n {#1}
+        #1 .tl_set:c  = l__acro_format_#1_tl ,
+        #1 .initial:n =
       }
   }
 
-\cs_new_protected:Npn \acro_get:n #1
+\acro_new_format:n {short}
+\acro_new_format:n {long}
+\acro_new_format:n {alt}
+\acro_new_format:n {extra}
+\acro_new_format:n {foreign}
+\acro_new_format:n {list}
+\acro_new_format:n {first-long}
+
+\keys_define:nn {acro}
   {
-    \bool_if:NF \l__acro_in_list_bool { \leavevmode }
-    \acro_activate_hyperref_support:
-    % short:
-    \acro_property_get:nn {#1} {short}
-    % alt:
-    \acro_property_get:nnF {#1} {alt}
-      { \tl_set_eq:NN \l__acro_alt_tl \l__acro_short_tl }
-    % long:
-    \acro_property_get:nn {#1} {long}
-    % foreign:
-    \acro_property_get:nn {#1} {foreign}
-    % foreign-lang:
-    \acro_property_get:nn {#1} {foreign-lang}
-    % extra:
-    \acro_property_get:nn {#1} {extra}
-    % single:
-    \acro_property_get:nn {#1} {single}
-    % first-style:
-    \acro_property_get:nn {#1} {first-style}
-    % formatting
-    \acro_property_get:nnTF {#1} {long-format}      
+    format .meta:n = { format/short = #1 , format/long = #1 } ,
+    format / replace .bool_set:N = \l__acro_format_replace_bool ,
+    format / replace .initial:n  = false
+  }
+
+% ----------------------------------------------------------------------------
+\AcroModuleEnd
+\AcroModule{ppfixes}{pre- and postfixes to acronyms}
+% --------------------------------------------------------------------------
+% articles
+\bool_new:N \l__acro_article_bool
+\tl_new:N \g__acro_articles_tl
+
+% #1: name
+% #2: default
+\cs_new_protected:Npn \acro_article_declare:nn #1#2
+  {
+    \tl_gput_right:Nn \g__acro_articles_tl {{#1}}
+    \acro_property_declare:nnnnn
+      { \c_false_bool } { \c_false_bool } { \c_false_bool } { \c_false_bool }
+      {#1}
+    \acro_list_map:nn {short}
       {
-        \tl_set_eq:NN \l__acro_custom_long_format_tl \l__acro_long_format_tl
-        \bool_set_true:N  \l__acro_custom_long_format_bool
+        \DeclareAcroPropertyAlias {##1-#1} {#1}
+        \str_if_in:nnF {##1} {-acc}
+          { \DeclareAcroPropertyAlias {##1-acc-#1} {##1-#1} }
       }
-      { \bool_set_false:N \l__acro_custom_long_format_bool }
-    \acro_property_get:nn {#1} {first-long-format}
-    \acro_property_get:nnTF {#1} {format}
+    \acro_list_map:nn {long}
       {
-        \tl_set_eq:NN \l__acro_custom_short_format_tl \l__acro_format_tl
-        \bool_set_true:N \l__acro_custom_short_format_bool
+        \DeclareAcroPropertyAlias {##1-#1} {#1}
+        \str_if_in:nnF {##1} {acc}
+          { \DeclareAcroPropertyAlias {##1-acc-#1} {##1-#1} }
       }
-      { \bool_set_false:N \l__acro_custom_short_format_bool }
-    \acro_property_get:nnTF {#1} {alt-format}
+    \bool_new:c {l__acro_article_#1_bool}
+    \tl_new:c {l__acro_article_#1_tl}
+    \exp_args:Nc \NewDocumentCommand {acro#1} {} { \use:c {acro_#1:} }
+    \cs_new_protected:cpn {acro_#1:}
       {
-        \tl_set_eq:NN \l__acro_custom_alt_format_tl \l__acro_alt_format_tl
-        \bool_set_true:N \l__acro_custom_alt_format_bool
+        \bool_if:NF \l__acro_article_bool
+          {
+            \bool_set_true:c {l__acro_article_#1_bool}
+            \bool_set_true:N \l__acro_article_bool
+          }
       }
-      { \bool_set_false:N \l__acro_custom_alt_format_bool }
-    \acro_property_get:nnTF {#1} {foreign-format}
+    \keys_define:nn {acro}
       {
-        \tl_set_eq:NN \l__acro_custom_foreign_format_tl \l__acro_foreign_format_tl
-        \bool_set_true:N \l__acro_custom_foreign_format_bool
+        #1 .tl_set:c  = {l__acro_article_#1_tl} ,
+        #1 .initial:n = #2
       }
-      { \bool_set_false:N \l__acro_custom_foreign_format_bool }
-    \acro_property_get:nn {#1} {single-format}
-    \acro_for_endings_do:n
-      {
-        \bool_if:cT {l__acro_##1_bool}
-          { \__acro_set_ending_for:nnn {##1} {#1} {long} }
-      }
-    \acro_property_get:nnF {#1} {long-post}
-      { \tl_clear:N \l__acro_long_post_tl }
-    \acro_property_get:nnT {#1} {long-pre}
-      { \tl_put_left:NV \l__acro_long_tl \l__acro_long_pre_tl }
-    \__acro_get_actions:n {#1}
   }
 
+% #1: id
+\cs_new_protected:Npn \__acro_set_article_defaults:n #1
+  {
+    \tl_map_tokens:Nn \g__acro_articles_tl
+      { \__acro_default_article:nn {#1} }
+  }
+
+% #1: id
+% #2: article
+\cs_new_protected:Npn \__acro_default_article:nn #1#2
+  { \acro_property_set:nnv {#1} {#2} {l__acro_article_#2_tl} }
+
 % --------------------------------------------------------------------------
-% plural endings and similar concepts:
+% mechanism for endings:
+\tl_new:N \l__acro_endings_tl
 
-\cs_new_protected:Npn \acro_for_endings_do:n #1
-  { \seq_map_inline:Nn \l__acro_endings_seq {#1} }
+\bool_new:N \l__acro_ending_bool
 
-% #1: ending
-% #2: ID
-\cs_new_protected:Npn \__acro_set_ending:nn #1#2
+\acro_attribute_new:n {short:endings}
+\acro_attribute_new:n {long:endings}
+
+\cs_new_protected:Npn \__acro_declare_ending_properties:n #1
   {
-    \bool_if:cT {l__acro_#1_bool}
-      {
-        \__acro_set_ending_for:nnn {#1} {#2} {short}
-        \__acro_set_ending_for:nnn {#1} {#2} {alt}
-        \__acro_set_ending_for:nnn {#1} {#2} {long}
-        \__acro_set_ending_for:nnn {#1} {#2} {foreign} % XXX
-      }
+    \acro_property_declare:nnnnn
+      { \c_false_bool } { \c_false_bool } { \c_false_bool } { \c_false_bool }
+      {#1}
+    \acro_property_declare:nnnnn
+      { \c_false_bool } { \c_false_bool } { \c_false_bool } { \c_false_bool }
+      {#1-form}
   }
 
-% this does nothing if a non-existent ending (#1) or non-existent form (#3) is
-% input
 % #1: ending
-% #2: id
-% #3: short|alt|long|foreign
-\cs_new_protected:Npn \__acro_set_ending_for:nnn #1#2#3
+% #2: short default
+% #3: long default
+\cs_new_protected:Npn \acro_declare_ending:nnn #1#2#3
   {
-    \acro_if_ending_form_exist:nnT {#1} {#3}
+    \bool_new:c {l__acro_ending_#1_bool}
+    \exp_args:Nc \NewDocumentCommand {acro#1} {} { \use:c {acro_#1:} }
+    \cs_new_protected:cpn {acro_#1:}
       {
-        \bool_if:cTF
-          { c_ \prop_item:cn {l__acro_#3_#1_form_prop} {#2} _bool }
-          { \prop_get:cnc {l__acro_#3_#1_prop} {#2} {l__acro_#3_tl}  }
-          { \prop_get:cnc {l__acro_#3_#1_prop} {#2} {l__acro_#3_#1_tl} }
+        \bool_if:NF \l__acro_ending_bool
+          {
+            \bool_set_true:c {l__acro_ending_#1_bool}
+            \bool_set_true:N \l__acro_ending_bool
+          }
       }
+    \prg_new_conditional:cpnn {acro_if_#1:} {p,T,F,TF}
+      {
+        \bool_if:cTF {l__acro_ending_#1_bool}
+          { \prg_return_true: }
+          { \prg_return_false: }
+      }
+    \tl_put_right:Nn \l__acro_endings_tl {{#1}}
+    \keys_define:nn {acro}
+      {
+        short-#1-ending .code:n =
+          \acro_attribute_set:nnn {short:endings} {#1} {##1} ,
+        short-#1-ending .initial:n = #2 ,
+        long-#1-ending .code:n =
+          \acro_attribute_set:nnn {long:endings} {#1} {##1} ,
+        long-#1-ending .initial:n = #3
+      }
+    \__acro_declare_ending_properties:n {#1}% plural + plural-form
+    \acro_list_map:nn {short}
+      {
+        % short-plural + short-plural-form
+        \__acro_declare_ending_properties:n {##1-#1}
+        % short-plural = plural
+        \acro_property_make_alias:nn {##1-#1} {#1}
+      }
+    \acro_list_map:nn {long}
+      {
+        % long-plural + long-plural-form
+        \__acro_declare_ending_properties:n {##1-#1}
+        % long-plural = plural
+        \acro_property_make_alias:nn {##1-#1} {#1}
+        % long-plural-form = plural-form
+        \acro_property_make_alias:nn {##1-#1-form} {#1-form}
+      }
   }
 
-\cs_new_protected:Npn \__acro_set_endings:n #1
+% #1: id
+% #2: short|long
+\cs_new_protected:Npn \__acro_set_endings:nn #1#2
   {
-    \acro_for_endings_do:n
-      { \__acro_set_ending:nn {##1} {#1} }
+    \acro_list_map:nn {#2}
+      {
+         \tl_map_inline:Nn \l__acro_endings_tl
+           { \__acro_set_ending:nnnn {#1} {#2} {##1} {####1} }
+      }
   }
 
 % #1: id
-% #2: short|alt|…
-\cs_new_protected:Npn \acro_get_ending_form:nn #1#2
+% #2: short|long
+% #3: property
+% #4: ending
+\cs_new_protected:Npn \__acro_set_ending:nnnn #1#2#3#4
   {
-    \acro_for_endings_do:n
+    \acro_property_if_set:nnF {#1} {#3-#4-form}
       {
-        \acro_if_ending_form_exist:nnT {##1} {#2}
+        \acro_property_if_set:nnF {#1} {#3-#4}
           {
-            \bool_lazy_and:nnT
-              { \use:c {l__acro_##1_bool} }
-              { \use:c { c_ \prop_item:cn {l__acro_#2_##1_form_prop} {#1} _bool } }
-              { \prop_get:cncF {l__acro_#2_##1_prop} {#1} {l__acro_#2_tl} {} }
+            \__acro_property_set:nne {#1} {#3-#4}
+              { \acro_attribute_get:nn {#2:endings} {#4} }
           }
       }
   }
 
 % #1: id
-% #2: short|alt|…
-\cs_new_protected:Npn \acro_endings:nn #1#2
+\cs_new_protected:Npn \acro_set_endings:n #1
   {
-    \group_begin:
-      \str_if_eq:nnTF {#2} {single}
-        {
-          \keys_set:nn {acro}
-            { long-format= \l__acro_single_format_tl }
-          \__acro_endings:nn {#1} {long}
-        }
-        { \__acro_endings:nn {#1} {#2} }
-    \group_end:
+    \__acro_set_endings:nn {#1} {short}
+    \__acro_set_endings:nn {#1} {long}
   }
 
-\cs_new_protected:Npn \__acro_endings:nn #1#2
+% ----------------------------------------------------------------------------
+\AcroModuleEnd
+\AcroModule{tools}{tools for treating different aspects}
+
+% ----------------------------------------------------------------------------
+\bool_new:N \l__acro_label_bool
+\tl_new:N \l_acro_label_prefix_tl
+
+\keys_define:nn {acro}
   {
-    \acro_for_endings_do:n
+    labels       .bool_set:N = \l__acro_label_bool ,
+    labels       .initial:n  = false ,
+    label-prefix .tl_set:N   = \l_acro_label_prefix_tl ,
+    label-prefix .initial:n  = ac:
+  }
+
+% --------------------------------------------------------------------------
+% check for first usage:
+\bool_new:N \l__acro_first_bool
+
+\cs_new_protected:Npn \acro_first:
+  { \bool_set_true:N \l__acro_first_bool }
+
+\prg_new_conditional:Npnn \acro_if_first:n #1 {p,T,F,TF}
+  {
+    \bool_if:NTF \l__acro_first_bool
+      { \prg_return_true: }
       {
-        \__acro_set_ending_for:nnn {##1} {#1} {#2}
-        \bool_if:cT {l__acro_##1_bool}
-          { \__acro_ending_format:nn {#2} { \tl_use:c {l__acro_#2_##1_tl} } }
+        \acro_boolean_property_if:nnTF {#1} {used}
+          { \prg_return_false: }
+          { \prg_return_true: }
       }
   }
+\prg_generate_conditional_variant:Nnn \acro_if_first:n {e,V} {T,F,TF}
 
-% #1: long|short|alt
-% #2: string
-\cs_new_protected:Npn \__acro_ending_format:nn #1#2
+% --------------------------------------------------------------------------
+% check for single usage:
+\int_new:N \l__acro_minimal_usage_int
+
+% #1: id
+\cs_new_protected:Npn \acro_step:n #1
+  { \int_gincr:c {g__acro_ \acro_case_insensitive:n {#1} _int} }
+\cs_generate_variant:Nn \acro_step:n {e}
+
+% #1: id
+\prg_new_conditional:Npnn \acro_if_single:n #1 {p,T,F,TF}
   {
-    \bool_if:NTF \l__acro_include_endings_format_bool
+    \int_compare:nNnTF
       {
-        \str_case:nn {#1}
-          {
-            {long}
-            {
-              \bool_if:NTF \l__acro_custom_long_format_bool
-                { \l__acro_custom_long_format_tl }
-                {
-                  \bool_if:NTF \l__acro_first_instance_bool
-                    { \l__acro_first_long_format_tl }
-                    { \l__acro_long_format_tl }
-                }
-            }
-            {short}
-            {
-              \bool_if:NTF \l__acro_custom_short_format_bool
-                { \l__acro_custom_short_format_tl }
-                { \l__acro_short_format_tl }
-            }
-            {alt}
-            {
-              \bool_if:NTF \l__acro_custom_alt_format_bool
-                { \l__acro_custom_alt_format_tl }
-                { \l__acro_alt_format_tl }
-            }
-            {foreign}
-            {
-              \bool_if:NTF \l__acro_custom_foreign_format_bool
-                { \l__acro_custom_foreign_format_tl }
-                { \l__acro_foreign_format_tl }
-            }
-          }
+        \bool_if:NTF \l__acro_usage_local_bool
+          { \acro_barrier_usage:n {#1} }
+          { \acro_property_get:nn {#1} {usage} }
       }
-      { \use:n }
-      {#2}
+      > \l__acro_minimal_usage_int
+      { \prg_return_false: }
+      { \prg_return_true: }
   }
-  
-\prg_new_conditional:Npnn \acro_if_ending_exist:n #1 {p,T,F,TF}
+\prg_generate_conditional_variant:Nnn \acro_if_single:n {e,V} {p,TF}
+
+\bool_new:N \l__acro_use_only_first_bool
+\tl_new:N \l__acro_single_tl
+
+\keys_define:nn {acro}
   {
-    \seq_if_in:NnTF \l__acro_endings_seq {#1}
-      { \prg_return_true: }
-      { \prg_return_false: }
+    single         .code:n    =
+      \str_case:nnF {#1}
+        {
+          {} { \int_set:Nn \l__acro_minimal_usage_int {1} }
+          {true} { \int_set:Nn \l__acro_minimal_usage_int {1} }
+          {false} { \int_set:Nn \l__acro_minimal_usage_int {0} }
+        }
+        { \int_set:Nn \l__acro_minimal_usage_int {#1} } ,
+    minimal-usage  .meta:n    = { single = #1 } ,
+    single         .initial:n = 0 ,
+    single-style   .tl_set:N   = \l__acro_single_tl ,
+    single-style   .initial:n  = long ,
+    use-only-first .bool_set:N = \l__acro_use_only_first_bool ,
+    use-only-first .initial:n  = false
   }
 
-% #1: ending
-% #2: short|alt|…
-\prg_new_conditional:Npnn \acro_if_ending_form_exist:nn #1#2 {p,T,F,TF}
+% --------------------------------------------------------------------------
+% uppercasing the first letter:
+\bool_new:N \l__acro_upper_bool
+\bool_new:N \l__acro_upper_short_bool
+\bool_new:N \l__acro_upper_list_bool
+
+\cs_new:Npn \__acro_upper_case:n #1 {}
+\cs_new:Npn \__acro_list_upper_case:n #1 {}
+
+\cs_new_protected:Npn \acro_soft_upper:
   {
-    \cs_if_exist:cTF {l__acro_#2_#1_prop}
-      { \prg_return_true: }
-      { \prg_return_false: }
+    \bool_if:NF \l__acro_upper_short_bool
+      { \bool_set_false:N \l__acro_upper_bool }
   }
-  
-% #1: name
-% #2: default short
-% #3: default long
-\cs_new_protected:Npn \acro_provide_ending:nnn #1#2#3
+
+\cs_new_protected:Npn \acro_upper:
   {
-    \acro_if_ending_exist:nTF {#1}
-      {
-        \acro_harmless_message:nn {ending-exists} {#1}
-        % short variables
-        \acro_set_ending_variables:nnn {short} {#1} {#2}
-        % alt variables
-        \acro_set_ending_variables:nnn {alt} {#1} {#2}
-        % long variables
-        \acro_set_ending_variables:nnn {long} {#1} {#3}
-        % foreign variables % XXX
-        \acro_set_ending_variables:nnn {foreign} {#1} {#3}
-      }
-      {
-        % registering:
-        \bool_if:NT \g__acro_first_acronym_declared_bool
-          { \acro_serious_message:n {ending-before-acronyms} }
-        \seq_put_right:Nn \l__acro_endings_seq {#1}
-        \bool_new:c {l__acro_#1_bool}
-        % short variables
-        \acro_define_and_set_ending_variables:nnn {short} {#1} {#2}
-        % alt variables
-        \acro_define_and_set_ending_variables:nnn {alt} {#1} {#2}
-        % long variables
-        \acro_define_and_set_ending_variables:nnn {long} {#1} {#3}
-        % foreign variables % XXX
-        \acro_define_and_set_ending_variables:nnn {foreign} {#1} {#3}
-        % define setup command:
-        \tl_set:Nn \l__acro_tmpa_tl {#1}
-        \tl_replace_all:Nnn \l__acro_tmpa_tl {-} {_}
-        \cs_new_protected:cpn {acro_ \l__acro_tmpa_tl :}
-          { \bool_set_true:c {l__acro_#1_bool} }
-        % acronym properties:
-        % short-<ending>:
-        \acro_declare_property:nnn {short_#1} {short-#1}
-          {
-            \prop_put:cnn {l__acro_short_#1_form_prop} {##1} {false}
-            \prop_put:cnx {l__acro_pdfstring_short_#1_prop}
-              {##1} { \prop_item:Nn \l__acro_short_prop {##1} \exp_not:n {##2} }
-          }
-        % short-<ending>-form:
-        \acro_declare_property_generic:nnn {short_#1_form} {short-#1-form}
-          {
-            \__acro_property_check:nn {##1} {short-#1-form}
-            \prop_put:cnn {l__acro_short_#1_form_prop} {##1} {true}
-            \prop_put:cnn {l__acro_short_#1_prop} {##1} {##2}
-            \prop_put:cnn {l__acro_pdfstring_short_#1_prop} {##1} {##2}
-          }
-        % alt-<ending>:
-        \acro_declare_property:nnn {alt_#1} {alt-#1}
-          {
-            \prop_put:cnn {l__acro_alt_#1_form_prop} {##1} {false}
-            \prop_put:cnx {l__acro_pdfstring_alt_#1_prop}
-              {##1} { \prop_item:Nn \l__acro_alt_prop {##1} \exp_not:n {##2} }
-          }
-        % alt-<ending>-form:
-        \acro_declare_property_generic:nnn {alt_#1_form} {alt-#1-form}
-          {
-            \__acro_property_check:nn {##1} {alt-#1-form}
-            \prop_put:cnn {l__acro_alt_#1_form_prop} {##1} {true}
-            \prop_put:cnn {l__acro_alt_#1_prop} {##1} {##2}
-            \prop_put:cnn {l__acro_pdfstring_alt_#1_prop} {##1} {##2}
-          }
-        % long-<ending>:
-        \acro_declare_property:nnn {long_#1} {long-#1}
-          { \prop_put:cnn {l__acro_long_#1_form_prop} {##1} {false} }
-        % long-<ending>-form:
-        \acro_declare_property_generic:nnn {long_#1_form} {long-#1-form}
-          {
-            \__acro_property_check:nn {##1} {long-#1-form}
-            \prop_put:cnn {l__acro_long_#1_form_prop} {##1} {true}
-            \prop_put:cnn {l__acro_long_#1_prop} {##1} {##2}
-          }
-        % foreign-<ending>: % XXX
-        \acro_declare_property:nnn {foreign_#1} {foreign-#1}
-          { \prop_put:cnn {l__acro_foreign_#1_form_prop} {##1} {false} }
-        % foreign-<ending>-form: % XXX
-        \acro_declare_property_generic:nnn {foreign_#1_form} {foreign-#1-form}
-          {
-            \__acro_property_check:nn {##1} {foreign-#1-form}
-            \prop_put:cnn {l__acro_foreign_#1_form_prop} {##1} {true}
-            \prop_put:cnn {l__acro_foreign_#1_prop} {##1} {##2}
-          }
-        % options:
-        %   short-<ending>-ending
-        %   alt-<ending>-ending
-        %   long-<ending>-ending
-        %   foreign-<ending>-ending % XXX
-        %   <ending>-ending
-        \keys_define:nn {acro}
-          {
-            short-#1-ending .code:n =
-              \bool_if:NT \g__acro_first_acronym_declared_bool
-                { \acro_serious_message:n {ending-before-acronyms} }
-              \tl_set:cn {l__acro_default_short_#1_tl} {##1} ,
-            alt-#1-ending   .code:n =
-              \bool_if:NT \g__acro_first_acronym_declared_bool
-                { \acro_serious_message:n {ending-before-acronyms} }
-              \tl_set:cn {l__acro_default_alt_#1_tl} {##1} ,
-            long-#1-ending  .code:n =
-              \bool_if:NT \g__acro_first_acronym_declared_bool
-                { \acro_serious_message:n {ending-before-acronyms} }
-                \tl_set:cn {l__acro_default_long_#1_tl} {##1} ,
-            foreign-#1-ending .code:n =
-              \bool_if:NT \g__acro_first_acronym_declared_bool
-                { \acro_serious_message:n {ending-before-acronyms} }
-              \tl_set:cn {l__acro_default_foreign_#1_tl} {##1} ,
-            #1-ending       .code:n   =
-              \bool_if:NT \g__acro_first_acronym_declared_bool
-                { \acro_serious_message:n {ending-before-acronyms} }
-              \__acro_read_ending_settings:nww {#1} ##1// \acro_stop:
-          }
-        % pdfstrings:
-        % TODO: add long forms:
-        \prop_new:c {l__acro_pdfstring_short_#1_prop}
-        \cs_new:cpn {acro_pdf_string_short_#1:n} ##1
-          {
-            \acro_if_star_gobble:nTF {##1}
-              { \use:e { \prop_item:cn {l__acro_pdfstring_short_#1_prop} } }
-              { \use:e {\prop_item:cn {l__acro_pdfstring_short_#1_prop} {##1} } }
-          }
-        \cs_new:cpn {acpdfstring#1} { \use:c {acro_pdf_string_short_#1:n} }
-        \prop_new:c {l__acro_pdfstring_alt_#1_prop}
-        \cs_new:cpn {acro_pdf_string_alt_#1:n} ##1
-          {
-            \acro_if_star_gobble:nTF {##1}
-              { \prop_item:cn {l__acro_pdfstring_alt_#1_prop} }
-              { \prop_item:cn {l__acro_pdfstring_alt_#1_prop} {##1} }
-          }
-        \cs_new:cpn {acpdfstringalt#1} { \use:c {acro_pdf_string_alt_#1:n} }
-      }
+    \bool_if:NT \l__acro_article_bool
+      { \bool_set_false:N \l__acro_article_bool }
+    \bool_set_true:N \l__acro_upper_bool
   }
 
-% #1: short|alt|long
-% #2: ending name
-% #3: default ending
-\cs_new_protected:Npn \acro_define_and_set_ending_variables:nnn #1#2#3
+\cs_new:Npn \__acro_upper:n #1
   {
-    \acro_define_ending_variables:nn {#1} {#2}
-    \acro_set_ending_variables:nnn {#1} {#2} {#3}
+    \bool_if:NTF \l__acro_upper_bool
+      { \__acro_upper_case:n {#1} }
+      {#1}
   }
+\cs_generate_variant:Nn \__acro_upper:n {e}
 
-% #1: short|alt|long
-% #2: ending name
-\cs_new_protected:Npn \acro_define_ending_variables:nn #1#2
+\keys_define:nn {acro/uppercase}
   {
-    \prop_new:c {l__acro_#1_#2_prop}
-    \prop_new:c {l__acro_#1_#2_form_prop}
-    \tl_new:c   {l__acro_#1_#2_tl}
-    \tl_new:c   {l__acro_default_#1_#2_tl}
+    cmd   .cs_set:Np  = \__acro_upper_case:n ,
+    cmd   .value_required:n = true ,
+    first .meta:n     = { cmd = \text_titlecase_first:n } ,
+    first .value_forbidden:n = true ,
+    all   .meta:n     = { cmd = \text_uppercase:n } ,
+    all   .value_forbidden:n = true ,
+    none  .meta:n     = { cmd = \text_lowercase:n } ,
+    none  .value_forbidden:n = true ,
+    title .meta:n     = { first } ,
+    title .value_forbidden:n = true ,
+    short .bool_set:N = \l__acro_upper_short_bool ,
+    short .initial:n  = true ,
+    list  .bool_set:N = \l__acro_upper_list_bool ,
+    list  .initial:n  = false
   }
 
-% #1: short|alt|long
-% #2: ending name
-% #3: default ending
-\cs_new_protected:Npn \acro_set_ending_variables:nnn #1#2#3
-  { \tl_set:cn  {l__acro_default_#1_#2_tl} {#3} }
+\keys_define:nn {acro/list/uppercase}
+  {
+    cmd   .cs_set:Np  = \__acro_list_upper_case:n ,
+    cmd   .value_required:n = true ,
+    first .meta:n     = { cmd = \text_titlecase_first:n } ,
+    first .value_forbidden:n = true ,
+    all   .meta:n     = { cmd = \text_uppercase:n } ,
+    all   .value_forbidden:n = true ,
+    none  .meta:n     = { cmd = \text_lowercase:n } ,
+    none  .value_forbidden:n = true ,
+    title .meta:n     = { first } ,
+    title .value_forbidden:n = true ,
+  }
 
-% #1: ending name
-% #2: short (and long if #4 is blank)
-% #3: long
-\cs_new_protected:Npn \__acro_read_ending_settings:nww #1#2/#3/#4 \acro_stop:
+\keys_set:nn {acro} { list/uppercase/first , uppercase/first }
+
+% --------------------------------------------------------------------------
+% citing:
+\bool_new:N \l__acro_cite_bool
+\bool_new:N \l__acro_cite_always_bool
+\bool_new:N \l__acro_cite_group_bool
+\bool_new:N \g__acro_cited_bool
+
+\tl_new:N \l__acro_cite_pre_tl
+\tl_new:N \l__acro_cite_between_tl
+
+% #1: id
+\cs_new_protected:Npn \__acro_cite:n #1
   {
-    \acro_set_ending_variables:nnn {short} {#1} {#2}
-    \acro_set_ending_variables:nnn {alt} {#1} {#2}
-    \tl_if_blank:nTF {#4}
+    \use:e
       {
-        \acro_set_ending_variables:nnn {long} {#1} {#3}
-        \acro_set_ending_variables:nnn {foreign} {#1} {#3}
+        \__acro_cite:w
+        \acro_property_get:nn {#1} {cite}
       }
+      [\q_no_value]
+      [\q_no_value]
+      \scan_stop:
+    \acro_stop:
+  }
+\cs_generate_variant:Nn \__acro_cite:n {e}
+
+% #1: boolean, true if starred
+% #2: id
+\prg_new_conditional:Npnn \acro_cite_if:nn #1#2 {T,F,TF}
+  {
+    \bool_lazy_all:nTF
       {
-        \acro_set_ending_variables:nnn {long} {#1} {#2}
-        \acro_set_ending_variables:nnn {foreign} {#1} {#2}
+        { \l__acro_cite_bool }
+        { \l__acro_use_bool }
+        { !#1 }
       }
+      {
+        \bool_lazy_or:nnTF
+          { \l__acro_cite_always_bool }
+          { \acro_if_first_p:n {#2} }
+          { \prg_return_true: }
+          { \prg_return_false: }
+      }
+      { \prg_return_false: }
   }
+\prg_generate_conditional_variant:Nnn \acro_cite_if:nn {ne} {T}
 
-% --------------------------------------------------------------------------
-% enable us to know if the acronym is used only once and provide a different
-% style for that:
-\prg_new_protected_conditional:Npnn \acro_is_used:n #1 { T,F,TF }
+% #1: cite key
+\cs_new_protected:Npn \acro_cite:n #1
   {
-    \acro_record_barrier:n {#1}
-    \bool_lazy_and:nnTF
-      { \bool_if_p:c {g__acro_#1_used_bool} }
+    \acro_property_if_set:nnT {#1} {cite}
       {
-        \bool_lazy_or_p:nn
-          {
-            \bool_lazy_and_p:nn
-              { \bool_if_p:c {g__acro_#1_first_use_bool} }
-              { \g__acro_mark_first_as_used_bool }
-          }
-          { !\g__acro_mark_first_as_used_bool }
+        \acro_property_get:nn {#1} {before-citation}
+        \l__acro_cite_pre_tl
+        \__acro_cite:n {#1}
+        \bool_gset_true:N \g__acro_cited_bool
       }
+  }
+\cs_generate_variant:Nn \acro_cite:n {e}
+
+\cs_new_protected:Npn \__acro_cite:w #1[#2]#3[#4]#5#6 \acro_stop:
+  {
+    % no options: #1: key, #6 is blank
+    % 1 option:   #3: key, #2: option, #4: \q_no_value
+    % 2 options:  #5: property, #2: first option, #4: second option
+    \tl_if_blank:nTF {#6}
+      { \__acro_cite_cmd:w {#1} }
       {
-        \bool_if:NTF \l__acro_mark_as_used_bool
-          {
-            \__acro_aux_file:Nxxxx \acro at used@twice
-              {#1}
-              { \thepage }
-              { \arabic {page} }
-              { \arabic {abspage} }
-          }
-          { \__acro_aux_file:Nxxxx \acro at used@twice {#1} {} {} {} }
-        \prg_return_true:
+        \quark_if_no_value:nTF {#4}
+          { \__acro_cite_cmd:w [{#2}] {#3}}
+          { \__acro_cite_cmd:w [{#2}] [{#4}] {#5} }
       }
+  }
+
+\cs_new_protected:Npn \__acro_cite_cmd:w {}
+\cs_new_protected:Npn \__acro_cite_group_cmd:w {}
+
+\keys_define:nn {acro/cite}
+  {
+    cmd           .cs_set:Np  = \__acro_cite_cmd:w ,
+    cmd           .initial:n  = \cite ,
+    cmd           .value_required:n = true ,
+    group         .code:n     =
+      \str_case:nnTF {#1}
+        { {true} {} {false} {} }
+        { \use:c {bool_set_#1:N} \l__acro_cite_group_bool }
+        { \msg_error:nnn {kernel} {boolean-values-only} {group} } ,
+    group         .initial:n  = false ,
+    display       .choice: ,
+    display/all   .code:n     =
+      \bool_set_true:N \l__acro_cite_bool
+      \bool_set_true:N \l__acro_cite_always_bool ,
+    display/first .code:n     =
+      \bool_set_true:N \l__acro_cite_bool
+      \bool_set_false:N \l__acro_cite_always_bool ,
+    display/none  .code:n     = \bool_set_false:N \l__acro_cite_bool ,
+    display       .initial:n  = first ,
+    pre           .tl_set:N   = \l__acro_cite_pre_tl ,
+    pre           .initial:n  = \nobreakspace ,
+    group / pre   .tl_set:N   = \l__acro_cite_between_tl ,
+    group / pre   .initial:n  = {,~} ,
+    group / cmd   .cs_set:Np  = \__acro_cite_group_cmd:w ,
+    group / cmd   .initial:n  = \cite
+  }
+
+% --------------------------------------------------------------------------
+% indexing
+\bool_new:N \l__acro_index_bool
+\tl_new:N \l_acro_index_disable_tl
+
+\cs_new_protected:Npn   \__acro_index:n {}
+\cs_generate_variant:Nn \__acro_index:n {e}
+
+% #1: id
+\cs_new_protected:Npn \acro_index:n #1
+  {
+    \bool_lazy_and:nnT
+      { \l__acro_index_bool }
+      { !\acro_boolean_property_if_p:nn {#1} {no-index} }
       {
-        \bool_if:NTF \l__acro_mark_as_used_bool
-          {
-            \__acro_aux_file:Nxxxx \acro at used@once
-              {#1}
-              { \thepage }
-              { \arabic {page} }
-              { \arabic {abspage} }
-            \bool_lazy_and:nnT
-              { !\bool_if_p:c {g__acro_#1_label_bool} }
-              { \l__acro_place_label_bool }
-              {
-                \bool_gset_true:c { g__acro_#1_label_bool }
-                \label{\l__acro_label_prefix_tl #1}
-              }
-            \bool_gset_true:c { g__acro_#1_used_bool }
-          }
-          {}
-          % I can't remember why I want an empty first use case for starred
-          % acronyms…
-          % { \__acro_aux_file:Nxxxx \acro at used@once {#1} {} {} {} }
-        \prg_return_false:
+        \group_begin:
+          \acro_trailing_map:n
+            { \bool_set_false:c {l__acro_trailing_##1_bool} }
+          \l_acro_index_disable_tl
+          \acro_property_if_set:nnT {#1} {index-cmd}
+            {
+              \exp_args:NNe
+              \cs_set:Npn \__acro_index:n
+                { \acro_property_get:nn {#1} {index-cmd} }
+            }
+          \acro_property_if_set:nnTF {#1} {index}
+            { \__acro_index:e { \acro_property_get:nn {#1} {index} } }
+            {
+              \__acro_index:e
+                {
+                  \acro_property_get:nn {#1} {index-sort} @
+                  \acro_format:nnn
+                    {#1}
+                    {short}
+                    { \acro_property_get:nn {#1} {short} }
+                }
+            }
+        \group_end:
       }
   }
 
-\cs_new:Npn \acro_is_used:n #1
-  { \acro_is_used:nTF {#1} { } { } }
+\keys_define:nn {acro/index}
+  {
+    use     .bool_set:N = \l__acro_index_bool ,
+    use     .initial:n  = false ,
+    cmd     .cs_set:Np  = \__acro_index:n ,
+    cmd     .initial:n  = \index ,
+    cmd     .value_required:n  = true ,
+    disable .code:n     = \tl_put_right:Nn \l_acro_index_disable_tl {#1} ,
+    disable .value_required:n  = true ,
+    clear   .code:n     = \tl_clear:N \l_acro_index_disable_tl ,
+    clear   .value_forbidden:n = true
+  }
 
-\cs_new_protected:Npn \__acro_aux_file:Nnnnn #1#2#3#4#5
-  { \iow_shipout:Nn \@auxout { #1 {#2} {#3} {#4} {#5} } }
-\cs_generate_variant:Nn \__acro_aux_file:Nnnnn {Nxxxx}
-  
-\cs_new_protected:Npn \__acro_aux_file_now:n #1
-  { \iow_now:Nn \@auxout {#1} }
-\cs_generate_variant:Nn \__acro_aux_file_now:n {x}
+\keys_set:nn {acro/index} { disable = \def\@{} }
 
 % --------------------------------------------------------------------------
-% the commands for the auxiliary file:
-\cs_new_protected:Npn \acro at used@once #1#2#3#4
+% looking for trailing tokens and define action
+\bool_new:N \l__acro_trailing_tokens_bool
+\tl_new:N \l__acro_trailing_tokens_tl
+\tl_new:N \g__acro_trailing_tokens_tl
+\acro_attribute_new:n {trailing:token}
+\acro_attribute_new:n {trailing:action}
+
+\cs_new_protected:Npn \acro_trailing_action_new:n #1
+  { \bool_new:c {l__acro_trailing_#1_bool} }
+
+\cs_new_protected:Npn \acro_trailing_action_activate:n #1
+  { \bool_set_true:c {l__acro_trailing_#1_bool} }
+
+\cs_new_protected:Npn \acro_trailing_action_deactivate:n #1
+  { \bool_set_false:c {l__acro_trailing_#1_bool} }
+
+% register a new token but don't activate its action:
+% #1: token
+% #2: action
+\cs_new_protected:Npn \acro_trailing_token_register:Nn #1#2
   {
-    \cs_gset_nopar:cpn {acro@#1 at once} {#1}
-    \bool_gset_true:c {g__acro_#1_in_list_bool}
-    \tl_if_empty:nF {#2#3#4}
+    \tl_gput_right:Nn \g__acro_trailing_tokens_tl {{#2}}
+    \acro_attribute_set:nnn {trailing:token} {#2} {#1}
+    \acro_attribute_set:nnn {trailing:action} {#1}
+      { \acro_trailing_action_activate:n {#2} }
+    \acro_trailing_action_new:n {#2}
+  }
+
+% maps over actions
+\cs_new_protected:Npn \acro_trailing_map:n #1
+  { \tl_map_inline:Nn \g__acro_trailing_tokens_tl {#1} }
+
+% activate a token:
+% #1: action
+\cs_new_protected:Npn \acro_trailing_token_activate:n #1
+  {
+    \tl_set:Ne \l__acro_tmpa_tl { \acro_attribute_get:nn {trailing:token} {#1} }
+    \tl_if_blank:VF \l__acro_tmpa_tl
       {
-        % \bool_gset_true:c { g__acro_#1_used_bool }
-        \seq_gput_right:cn {g__acro_#1_pages_seq} { {#2}{#3}{#4} }
+        \tl_remove_all:NV \l__acro_trailing_tokens_tl \l__acro_tmpa_tl
+        \tl_put_right:NV \l__acro_trailing_tokens_tl \l__acro_tmpa_tl
       }
   }
-\cs_new_protected:Npn \acro at used@twice #1#2#3#4
+
+% deactivate a token:
+% #1: action
+\cs_new_protected:Npn \acro_trailing_token_deactivate:n #1
   {
-    \cs_gset_nopar:cpn {acro@#1 at twice} {#1}
-    \tl_if_empty:nF {#2#3#4}
-      { \seq_gput_right:cn {g__acro_#1_pages_seq} { {#2}{#3}{#4} } }
+    \tl_set:Ne \l__acro_tmpa_tl { \acro_attribute_get:nn {trailing:token} {#1} }
+    \tl_if_blank:VF \l__acro_tmpa_tl
+      { \tl_remove_once:NV \l__acro_trailing_tokens_tl \l__acro_tmpa_tl }
   }
 
-\cs_new_protected:Npn \acro at pages #1#2
-  { \tl_gset:cn {g__acro_#1_recorded_pages_tl} {#2} }
+% #1: action
+\prg_new_conditional:Npnn \acro_trailing_if_token:n #1 {p,T,F,TF}
+  {
+    \bool_if:cTF {l__acro_trailing_#1_bool}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
 
-\cs_new_protected:Npn \acro at rerun@check
+% #1: csv list of actions
+\prg_new_conditional:Npnn \acro_trailing_if_tokens:n #1 {T,F,TF}
   {
-    \bool_if:NT \g__acro_rerun_bool
+    \clist_map_function:nN {#1} \__acro_trailing_if_tokens:n
+    \use_ii:nn
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+% #1: action
+\cs_new:Npn \__acro_trailing_if_tokens:n #1
+  {
+    \bool_if:cT {l__acro_trailing_#1_bool}
+      { \clist_map_break:n { \use_ii:nnn  } }
+  }
+
+\cs_new_protected:Npn \__acro_trailing_check:N #1
+  {
+    \tl_map_inline:Nn \l__acro_trailing_tokens_tl
       {
-        \@latex at warning@no at line
-          {Acronyms~ may~ have~ changed.~ Please~ rerun~ LaTeX}
+        \token_if_eq_meaning:NNT #1 ##1
+          { \acro_attribute_get:nn {trailing:action} {##1} }
       }
   }
 
-\AtEndDocument
+\cs_new_protected:Npn \acro_begin:
   {
-    \bool_gset_false:N \g__acro_rerun_bool
-    \cs_gset_protected:Npn \acro at used@once #1#2#3#4
+    \group_begin:
+    \__acro_check_after_end:w
+  }
+
+\cs_new_protected:Npn \__acro_check_after_end:w #1 \acro_end:
+  {
+    \cs_set:Npn \__acro_execute:
       {
-        \tl_set:Nn \l__acro_tmpa_tl {#1}
-        \tl_if_eq:cNF {acro@#1 at once} \l__acro_tmpa_tl
-          { \bool_gset_true:N \g__acro_rerun_bool }
+        \__acro_trailing_check:N \l_peek_token
+        #1
+        \acro_end: % this will end the group opened by \acro_begin:
       }
-    \cs_gset_protected:Npn \acro at used@twice #1#2#3#4
-      {
-        \tl_set:Nn \l__acro_tmpa_tl {#1}
-        \tl_if_eq:cNF {acro@#1 at twice} \l__acro_tmpa_tl
-          { \bool_gset_true:N \g__acro_rerun_bool }
-      }
-    \acro_for_all_acronyms_do:n
-      {
-        \seq_if_empty:cF {g__acro_#1_pages_seq}
-          {
-            \__acro_aux_file_now:x
-              {
-                \acro at pages {#1}
-                  { \seq_use:cn {g__acro_#1_pages_seq} {|} } ^^J
-                \acro at barriers {#1}
-                  { \seq_use:cn {g__acro_#1_barriers_seq} {,} }
-              }
-          }
-        \acro_check_barriers:n {#1}
-      }
-    \__acro_aux_file_now:n { \acro at rerun@check }
+    \peek_after:Nw \__acro_execute:
   }
 
-% if `acro' is deactivated prevent unnecessary errors from aux file:
-\if at filesw
-\AtBeginDocument
+\bool_new:N \g__acro_gobble_trail_bool
+
+\cs_new_protected:Npn \acro_end:
   {
-    \__acro_aux_file_now:n
+    \bool_if:NT \g__acro_gobble_trail_bool
       {
-        \providecommand \acro at used@once [4] {} ^^J
-        \providecommand \acro at used@twice [4] {} ^^J
-        \providecommand \acro at pages [2] {} ^^J
-        \providecommand \acro at rerun@check {} ^^J
-        \providecommand \acro at print@list {} ^^J
-        \providecommand \acro at barriers [2] {}
+        \bool_gset_false:N \g__acro_gobble_trail_bool
+        \use_i:nn
       }
+    \group_end:
   }
-\fi
 
-% --------------------------------------------------------------------------
-% #1: short|alt|long
-% #2: string to be typeset
-\cs_new_protected:Npn \__acro_typeset:nn #1#2
+% register some tokens to be checked for:
+\acro_trailing_token_register:Nn . {dot}
+\acro_trailing_token_register:Nn , {comma}
+\acro_trailing_token_register:Nn - {dash}
+\acro_trailing_token_register:Nn \babelhyphen {babel-hyphen}
+
+\tl_new:N \l__acro_fnpct_check_tl
+
+\cs_new_protected:Npn \acro_footnote:n #1
   {
-    \mode_if_horizontal:F { \leavevmode }
-    \group_begin:
-      \use:x
-        {
-          \bool_if:cTF {l__acro_custom_#1_format_bool}
-            { \exp_not:v {l__acro_custom_#1_format_tl} }
-            { \exp_not:v {l__acro_#1_format_tl} }
-            {#2}
-        }
-    \group_end:
+    \tl_set:Ne \l__acro_fnpct_check_tl { \l__acro_fnpct_check_tl }
+    \exp_last_unbraced:Nno
+    \footnote {#1}
+    \l__acro_fnpct_check_tl
   }
 
-% typeset the short form:
-% #1: ID
-% #2: short form
-\cs_new_protected:Npn \acro_write_short:nn #1#2
+% options for activating actions:
+\keys_define:nn {acro/trailing}
   {
-    \__acro_make_link:nn {#1}
+    activate    .code:n    =
+      \clist_map_inline:nn {#1} { \acro_trailing_token_activate:n {##1} } ,
+    activate    .initial:n = {dot,comma} ,
+    deactivate  .code:n    =
+      \clist_map_inline:nn {#1} { \acro_trailing_token_deactivate:n {##1} } ,
+    register    .code:n    = \acro_trailing_token_register:Nn #1 ,
+    fnpct-check .tl_set:N  = \l__acro_fnpct_check_tl ,
+    fnpct-check .initial:n =
+      \aciftrailing {dot}   { . \acgobbletrail } {}
+      \aciftrailing {comma} { , \acgobbletrail } {}
+  }
+
+% some user macros:
+\cs_new:Npn \acro_dot:
+  { \acro_trailing_if_token:nF {dot} {.\@} }
+
+\cs_new:Npn \acro_space:
+  { \acro_trailing_if_tokens:nF {dash,babel-hyphen} { \c_space_tl } }
+
+% ----------------------------------------------------------------------------
+% sorting the list:
+% the following code is an adaption of expl3 code used for \str_if_eq:NN(TF)
+\sys_if_engine_luatex:TF
+  {
+    \cs_new_protected:Npn \__acro_strcmp:nn #1#2
       {
-        \__acro_typeset:nn {short}
+        \lua_now:e
           {
-            \bool_if:NTF \l__acro_first_upper_bool
-              { \exp_not:N \__acro_first_upper_case:n { \exp_not:n {#2} } }
-              { \exp_not:n {#2} }
+            l3kernel.strcmp
+              (
+                " \__acro_escape_x:n {#1} " ,
+                " \__acro_escape_x:n {#2} "
+              )
           }
       }
+    \cs_new:Npn \__acro_escape_x:n #1
+      {
+        \lua_escape:e
+          { \tex_detokenize:D \use:e { {#1} } }
+      }
   }
-\cs_generate_variant:Nn \acro_write_short:nn {nV,nv}
+  { \cs_new_eq:NN \__acro_strcmp:nn \tex_strcmp:D }
 
-% typeset the alternative form:
-% #1: ID
-% #2: alt form
-\cs_new_protected:Npn \acro_write_alt:nn #1#2
+\cs_new_protected:Npn \acro_list_sort:
   {
-    \__acro_make_link:nn {#1}
+    \seq_sort:Nn \g__acro_list_seq
       {
-        \__acro_typeset:nn {alt}
+        \int_compare:nNnTF
           {
-            \bool_lazy_and:nnTF
-              { \l__acro_first_upper_bool }
-              { \l__acro_upper_short_bool }
-              { \exp_not:N \__acro_first_upper_case:n { \exp_not:n {#2} } }
-              { \exp_not:n {#2} }
-          }
+            \__acro_strcmp:nn
+              { \str_fold_case:e { \acro_property_get:nn {##1} {sort} } }
+              { \str_fold_case:e { \acro_property_get:nn {##2} {sort} } }
+          } = {-1}
+          { \sort_return_same: }
+          { \sort_return_swapped: }
       }
   }
-\cs_generate_variant:Nn \acro_write_alt:nn {nV,nv}
 
-% typeset a long form:
-%   TODO: rethink the formatting mechanism
-%   right now a custom format gets applied additionally to the global one
-%   although before it
-% #1: format
-% #2: long form
-\cs_new_protected:Npn \acro_write_long:nn #1#2
+% --------------------------------------------------------------------------
+% barriers:
+\int_new:N \g_acro_barrier_int
+\int_new:N \g_acro_barrier_total_int
+\bool_new:N \l__acro_barriers_bool
+\bool_new:N \l__acro_barriers_reset_bool
+\bool_new:N \l__acro_usage_local_bool
+
+\msg_new:nnn {acro} {barriers}
   {
-    \__acro_typeset:nn {long}
-      {
-        \exp_not:n {#1}
-        {
-          \bool_if:NTF \l__acro_first_upper_bool
-            { \exp_not:N \__acro_first_upper_case:n { \exp_not:n {#2} } }
-            { \exp_not:n {#2} }
-        }
-      }
+    You~ seem~ to~ be~ using~ barriers~ but~ haven't~ set~ `barriers/use~ =~
+    true',~ yet!
   }
-\cs_generate_variant:Nn \acro_write_long:nn {VV,Vo,Vf,V,v,vv}
 
-\prg_new_conditional:Npnn \acro_if_foreign:n #1 {T,F,TF}
+\__acro_auxlist_field_new:cpn {total-barriers} #1
+  { \int_gset:Nn \g_acro_barrier_total_int {#1} }
+
+\acro_at_begin_document:n
+  { \int_gset:Nn \g_acro_barrier_int {1} }
+
+\acro_at_end_document:n
   {
-    \bool_lazy_and:nnTF
-      { \l__acro_foreign_bool }
-      { \prop_if_in_p:Nn \l__acro_foreign_prop {#1} }
-      { \prg_return_true: }
-      { \prg_return_false: }
+    \acro_auxlist_to_aux:nn
+      {total-barriers}
+      { { \int_use:N \g_acro_barrier_int } }
   }
 
-\cs_new_protected:Npn \acro_foreign_language:nn #1#2 {}
-\AtBeginDocument{
-  \cs_if_exist:NTF \foreignlanguage
-    {
-      \cs_set_protected:Npn \acro_foreign_language:nn #1#2
-        {
-          \tl_if_blank:nTF {#1}
-            {#2}
-            { \foreignlanguage {#1} {#2} }
-        }
-    }
-    {
-      \cs_set_protected:Npn \acro_foreign_language:nn #1#2
-        { \use_ii:nn {#1} {#2} }
-    }
-}
-\cs_generate_variant:Nn \acro_foreign_language:nn {VV}
+\cs_new_protected:Npn \acro_barrier:
+  {
+    \int_gincr:N \g_acro_barrier_int
+    \bool_if:NT \l__acro_barriers_reset_bool
+      { \acro_reset_all: }
+    \bool_if:NF \l__acro_barriers_bool
+      { \msg_warning:nnn {acro} {barriers} }
+  }
 
-\cs_new_protected:Npn \acro_write_foreign:n #1
+% #1: id
+\cs_new_protected:Npn \acro_record_barrier:n #1
   {
-    \acro_if_foreign:nT {#1}
+    \bool_if:NT \l__acro_barriers_bool
       {
-        \acro_property_get:nnT {#1} {foreign}
+        \int_compare:nNnTF
+          { \intarray_count:c {g__acro_#1_barriers_intarray} } > 0
           {
-            \group_begin:
-              \__acro_endings:nn {#1} {foreign}
-              \tl_use:N \l__acro_foreign_format_tl
+            \intarray_gset:cnn {g__acro_#1_barriers_intarray}
+              { \int_use:N \g_acro_barrier_int }
               {
-                \acro_foreign_language:VV
-                  \l__acro_foreign_lang_tl
-                  \l__acro_foreign_tl
+                \intarray_item:cn {g__acro_#1_barriers_intarray}
+                  { \int_use:N \g_acro_barrier_int }
+                +1
               }
-            \group_end:
           }
+          { \acro_rerun:n {barriers} }
       }
   }
 
-\cs_new:Npn \acroenparen #1 { (#1) }
-
-\cs_new_protected:Npn \acro_get_foreign:n #1
+% #1: id
+\cs_new:Npn \acro_barrier_usage:n #1
   {
-    \acro_property_get:nnT {#1} {foreign}
+    \clist_if_empty:eTF { \acro_property_get:nn {#1} {barriers} }
+      {0}
       {
-        \tl_use:N \l__acro_foreign_sep_tl
-        \group_begin:
-          \tl_use:N \l__acro_foreign_list_format_tl
-          {
-            \acro_foreign_language:VV
-              \l__acro_foreign_lang_tl
-              \l__acro_foreign_tl
-          }
-        \group_end:
+        \clist_item:en
+          { \acro_property_get:nn {#1} {barriers} }
+          { \g_acro_barrier_int }
       }
   }
 
-% --------------------------------------------------------------------------
 % #1: id
-% #2: short|alt
-\cs_set_protected:Npn \acro_write_compact:nn #1#2
+\cs_new_protected:Npn \acro_set_barriers:n #1
   {
-    \acro_get_ending_form:nn {#1} {#2}
-    \acro_acc_supp:nn
-      {#1}
+    \bool_if:NT \l__acro_barriers_bool
       {
-        \acro_write_tooltip:nnV
-          {#1}
+        \int_compare:nNnTF
+          { \intarray_count:c {g__acro_#1_barriers_intarray} } = 0
+          { \acro_rerun:n {barriers} }
           {
-            \use:c {acro_write_#2:nv} {#1} {l__acro_#2_tl}
-            \acro_endings:nn {#1} {#2}
+            \int_zero:N \l__acro_tmpa_int
+            \int_do_while:nNnn
+              \l__acro_tmpa_int < { \intarray_count:c {g__acro_#1_barriers_intarray} }
+              {
+                \int_incr:N \l__acro_tmpa_int
+                \seq_gput_right:ce {g__acro_#1_barriers_seq}
+                  {
+                    \intarray_item:cn {g__acro_#1_barriers_intarray}
+                      { \l__acro_tmpa_int }
+                  }
+              }
+            \acro_property_set:nnx {#1} {barriers}
+              { \seq_use:cn {g__acro_#1_barriers_seq} {,} }
           }
-          \l__acro_long_tl
       }
   }
 
-% TODO: get rid of argument #3?
-% #1: ID
-% #2: long|first-long|list-long|extra
-% #3: long form
-\cs_new_protected:Npn \acro_write_expanded:nnn #1#2#3
+\keys_define:nn {acro/barriers}
   {
-    \tl_set:Nn \l__acro_tmpa_tl {#2}
-    \tl_replace_all:Nnn \l__acro_tmpa_tl {-} {_}
-    \acro_write_long:vn {l__acro_ \l__acro_tmpa_tl _format_tl} {#3}
-    \acro_endings:nn {#1} {long}
-    \tl_if_in:nnT {#2} {long}
-      { \l__acro_long_post_tl }
+    use    .bool_set:N = \l__acro_barriers_bool ,
+    use    .initial:n  = false ,
+    reset  .bool_set:N = \l__acro_barriers_reset_bool ,
+    reset  .initial:n  = false ,
+    single .bool_set:N = \l__acro_usage_local_bool ,
+    single .initial:n  = false
   }
-\cs_generate_variant:Nn \acro_write_expanded:nnn {nnV}
 
-% #1: ID
-% #2: long|first-long|list-long|extra
-\cs_new_protected:Npn \acro_write_expanded:nn #1#2
+% ----------------------------------------------------------------------------
+\AcroModuleEnd
+\AcroModule{commands}{frameworks for user commands}
+
+% --------------------------------------------------------------------------
+% case insensitivity of the ID:
+\bool_new:N \g__acro_case_sensitive_bool
+
+\cs_new:Npn \acro_case_insensitive:n #1
   {
-    \tl_set:Nn \l__acro_tmpa_tl {#2}
-    \tl_replace_all:Nnn \l__acro_tmpa_tl {-} {_}
-    \acro_write_long:vv
-      {l__acro_ \l__acro_tmpa_tl _format_tl}
-      {l__acro_ \l__acro_tmpa_tl _tl}
-    \acro_endings:nn {#1} {long}
-    \tl_if_in:nnT {#2} {long}
-      { \l__acro_long_post_tl }
+    \bool_if:NTF \g__acro_case_sensitive_bool
+      { \tl_to_str:n {#1} }
+      { \str_lowercase:n {#1} }
   }
 
+\cs_new_protected:Npn \acro_protected_case_insensitive:n #1
+  { \acro_case_insensitive:n {#1} }
+
+\cs_new:Npn \acro_case_insensitive:Nn #1#2
+  { \exp_args:Ne #1 { \acro_case_insensitive:n {#2} } }
+
+\keys_define:nn {acro}
+  {
+    case-sensitive .bool_set:N = \g__acro_case_sensitive_bool ,
+    case-sensitive .initial:n  = true ,
+  }
+
+% ----------------------------------------------------------------------------
+% typeset endings and ending forms:
+\bool_new:N \l__acro_include_endings_bool
+
 % #1: id
-\cs_new_protected:Npn \acro_after:n #1
+% #2: property
+% #3: ending
+\cs_new:Npn \__acro_get_ending:nnn #1#2#3
   {
-    \acro_cite_if:Nn \l__acro_citation_all_bool {#1}
-    \acro_index_if:Nn \l__acro_addto_index_bool {#1}
-    \acro_property_get:nnT {#1} {post}
-      { \tl_use:N \l__acro_post_tl }
+    \use:c {acro_if_#3:T}
+      { \acro_property_get:nn {#1} {#2-#3} }
   }
 
-\cs_new_protected:Npn \acro_check_single:n #1
+% #1: id
+% #2: property
+\cs_new:Npn \__acro_ending:nn #1#2
   {
-    \acro_if_is_single:nT {#1}
-      { \cs_set_eq:NN \acro_hyper_link:nn \use_ii:nn }
+    \tl_map_tokens:Nn \l__acro_endings_tl
+      { \__acro_get_ending:nnn {#1} {#2} }
   }
 
-% --------------------------------------------------------------------------
 % #1: id
-\cs_new_protected:Npn \acro_before:n #1
+% #2: property
+% #3: ending
+\cs_new:Npn \__acro_get_ending_form:nnn #1#2#3
   {
-    \acro_get:n {#1}
-    \acro_is_used:n {#1}
-    \acro_check_single:n {#1}
+    \acro_property_if_set:nnT {#1} {#2-#3-form}
+      {
+        \use:c {acro_if_#3:T}
+          {
+            \acro_property_get:nn {#1} {#2-#3-form}
+            \tl_map_break:n { \use_ii:nnn }
+          }
+      }
   }
 
-% the standard internals:
 % #1: id
-\cs_new_protected:Npn \acro_short:n #1
+% #2: property
+\cs_new:Npn \acro_ending_form:nnTF #1#2#3#4
   {
-    \acro_before:n {#1}
-    \acro_write_indefinite:nn {#1} {short}
-    \acro_write_compact:nn {#1} {short}
-    \acro_after:n {#1}
+    \tl_map_tokens:Nn \l__acro_endings_tl
+      { \__acro_get_ending_form:nnn {#1} {#2} }
+    \use_ii:nn {#3} {#4}
   }
 
-% get alternative entry:
 % #1: id
-\cs_new_protected:Npn \acro_alt:n #1
+% #2: property
+\cs_new:Npn \acro_ending_form:nnT #1#2#3
+  { \acro_ending_form:nnTF {#1} {#2} {#3} {} }
+
+% #1: id
+% #2: property
+\cs_new:Npn \acro_ending_form:nnF #1#2#3
+  { \acro_ending_form:nnTF {#1} {#2} {} {#3} }
+
+% #1: id
+% #2: property
+\cs_new:Npn \acro_ending_form:nn #1#2
+  { \acro_ending_form:nnTF {#1} {#2} {} {} }
+
+% #1: id
+% #2: property
+% #3: ending
+\cs_new:Npn \__acro_check_ending_form:nnn #1#2#3
   {
-    \acro_before:n {#1}
-    \acro_alt_error:n {#1}
-    \acro_write_indefinite:nn {#1} {alt}
-    \acro_write_compact:nn {#1} {alt}
-    \acro_after:n {#1}
+    \acro_property_if_set:nnT {#1} {#2-#3-form}
+      { \use:c {acro_if_#3:T} { \tl_map_break:n { \use_ii:nnn } } }
   }
 
-% get long entry:
 % #1: id
-\cs_new_protected:Npn \acro_long:n #1
+% #2: property
+\cs_new:Npn \acro_if_ending_form:nnTF #1#2#3#4
   {
-    \acro_before:n {#1}
-    \acro_write_indefinite:nn {#1} {long}
-    \acro_write_expanded:nn {#1} {long}
-    \acro_after:n {#1}
+    \tl_map_tokens:Nn \l__acro_endings_tl
+      { \__acro_check_ending_form:nnn {#1} {#2} }
+    \use_ii:nn {#3} {#4}
   }
 
-% get foreign entry:
 % #1: id
-\cs_new_protected:Npn \acro_foreign:n #1
+% #2: property
+\cs_new:Npn \acro_if_ending_form:nnT #1#2#3
+  { \acro_if_ending_form:nnTF {#1} {#2} {#3} {} }
+
+% #1: id
+% #2: property
+\cs_new:Npn \acro_if_ending_form:nnF #1#2#3
+  { \acro_if_ending_form:nnTF {#1} {#2} {} {#3} }
+
+% --------------------------------------------------------------------------
+% typeset acronyms:
+% #1: id
+% #2: property
+\cs_new:Npn \__acro_article:nn #1#2
   {
-    \acro_get:n {#1}
-    \tl_if_blank:VF \l__acro_foreign_tl
+    \bool_if:NT \l__acro_article_bool
       {
-        \acro_is_used:n {#1}
-        \acro_check_single:n {#1}
-        \acro_write_long:VV \l__acro_foreign_format_tl \l__acro_foreign_tl
-        \acro_after:n {#1}
+        \tl_map_tokens:Nn \g__acro_articles_tl
+          { \__acro_article:nnn {#1} {#2} }
       }
   }
 
-% get extra entry:
 % #1: id
-\cs_new_protected:Npn \acro_extra:n #1
+% #2: property
+% #3: article
+\cs_new:Npn \__acro_article:nnn #1#2#3
   {
-    \acro_get:n {#1}
-    \tl_if_blank:VF \l__acro_extra_tl
+    \bool_if:cT {l__acro_article_#3_bool}
       {
-        \acro_is_used:n {#1}
-        \acro_check_single:n {#1}
-        \acro_write_long:VV \l__acro_extra_format_tl \l__acro_extra_tl
-        \acro_after:n {#1}
+        \tl_map_break:n
+          { \acro_property_get:nn {#1} {#2-#3} \exp_stop_f: }
       }
   }
 
-% output like the first time:
 % #1: id
-\cs_new_protected:Npn \acro_first:n #1
+% #2: property
+\cs_new_protected:Npn \__acro_write:nn #1#2
   {
-    \bool_gset_true:c {g__acro_#1_first_use_bool}
-    \acro_before:n {#1}
-    \acro_first_instance:nV {#1} \l__acro_long_tl
+    \acro_property_if_exist:nTF {#2-acc}
+      {
+        \__acro_accsupp:ee
+          { \__acro_write_acronym:nn {#1} {#2-acc} }
+          { \__acro_write_acronym:nn {#1} {#2} }
+      }
+      { \__acro_write_acronym:nn {#1} {#2} }
   }
 
-% output like the first time with own long version:
 % #1: id
-% #2: instead of long entry
-\cs_new_protected:Npn \acro_first_like:nn #1#2
+% #2: property
+\cs_new:Npn \__acro_write_acronym:nn #1#2
   {
-    \bool_gset_true:c {g__acro_#1_first_use_bool}
-    \acro_before:n {#1}
-    \acro_first_instance:nn {#1} {#2}
+    \bool_lazy_and:nnTF
+      { \acro_property_if_eq_p:nn {#2} {long} }
+      { \acro_if_first_p:n {#1} }
+      { \acro_format:nnn {#1} {first-#2} }
+      { \acro_format:nnn {#1} {#2} }
+      {
+        \__acro_upper:n
+          {
+            \__acro_article:nn {#1} {#2}
+            \acro_if_ending_form:nnTF {#1} {#2}
+              { \acro_ending_form:nn {#1} {#2} }
+              { \acro_property_get:nn {#1} {#2} }
+          }
+      }
   }
 
-% ----------------------------------------------------------------------------
-% citations:
-\cs_new:Npn \__acro_citation_cmd:w { \cite }
-\cs_new:Npn \__acro_group_citation_cmd:w { \cite }
+% #1: id
+% #2: property
+\cs_new_protected:Npn \acro_write:nn #1#2
+  {
+    \group_begin:
+      \acro_if_short:nT {#2} { \acro_soft_upper: }
+      \__acro_make_link:nnn {#1} {#2}
+        {
+          \acro_locale:nnn {#1} {#2}
+            {
+              \__acro_write:nn {#1} {#2}
+              \bool_if:NT \l__acro_include_endings_bool
+                {
+                  \acro_if_ending_form:nnF {#1} {#2}
+                    { \__acro_ending:nn {#1} {#2} }
+                }
+            }
+        }
+    \group_end:
+    \acro_if_ending_form:nnF {#1} {#2}
+      {
+        \bool_if:NF \l__acro_include_endings_bool
+          { \__acro_ending:nn {#1} {#2} }
+      }
+    \acro_property_if_eq:nnT {#2} {long}
+      { \acro_property_get:nn {#1} {long-post} }
+    \bool_set_false:N \l__acro_upper_bool
+    \bool_set_false:N \l__acro_article_bool
+  }
+\cs_generate_variant:Nn \acro_write:nn {e}
 
-% #1 pre
-% #2 post
-% #3 key
-\cs_new:Npn \__acro_cite:nnn #1#2#3
+\keys_define:nn {acro}
   {
-    \quark_if_no_value:nTF {#1}
-      { \__acro_citation_cmd:w {#3} }
+    include-endings .bool_set:N = \l__acro_include_endings_bool ,
+    include-endings .initial:n  = true
+  }
+
+
+% --------------------------------------------------------------------------
+% #1: boolean
+% #2: id
+\cs_new_protected:Npn \acro_finalize:nn #1#2
+  {
+    \bool_if:NF \g__acro_cited_bool
+      { \acro_cite_if:nnT {#1} {#2} { \acro_cite:n {#2} } }
+    \bool_gset_false:N \g__acro_cited_bool
+    \acro_property_if_set:nnT {#1} {post}
+      { \acro_property_get:nn {#2} {post} }
+    \bool_lazy_all:nT
       {
-        \quark_if_no_value:nTF {#2}
-          { \__acro_citation_cmd:w [#1] {#3} }
-          { \__acro_citation_cmd:w [#1] [#2] {#3} }
+        { \l__acro_label_bool }
+        { \l__acro_use_bool }
+        { !#1 }
       }
+      {
+        \acro_if_first:nT {#2}
+          {
+            \acro_property_if_set:nnF {#2} {label}
+              {
+                \acro_property_set:nnn {#2} {label} {#2}
+                \label { \l_acro_label_prefix_tl #2 }
+              }
+          }
+      }
+    \bool_lazy_and:nnT
+      { \l__acro_use_bool }
+      { !#1 }
+      {
+        \acro_use:n {#2}
+        \acro_record_page:n {#2}
+        \acro_record_barrier:n {#2}
+        \acro_index:n {#2}
+      }
   }
-\cs_generate_variant:Nn \__acro_cite:nnn {VVV}
+\cs_generate_variant:Nn \acro_finalize:nn {ne}
 
-\cs_new_protected:Npn \acro_cite:n #1
+% --------------------------------------------------------------------------
+% define acronym typesetting commands:
+\bool_new:N \l__acro_star_bool
+\tl_new:N \l__acro_options_tl
+
+\cs_new:Npn \__acro_remove_bs:N #1
+  { \exp_after:wN \use_none:n \token_to_str:N #1 }
+
+\tl_new:N \l__acro_begin_command_hook_tl
+\tl_new:N \l__acro_end_command_hook_tl
+
+% #1: csname
+% #2: xparse csname
+% #3: action
+\cs_set_protected:Npn \acro_new_definition_command:NNn #1#2#3
   {
-    \acro_property_get:nnT {#1} {before-citation}
-      { \acro_no_break: \l__acro_before_citation_tl  }
-    \prop_get:NnNT \l__acro_citation_prop {#1} \l__acro_tmpa_tl
+    % internal command for \NewAcroCommand
+    % ##1: csname
+    % ##2: arg spec
+    % ##3: code with arg numbers n=n+2
+    \cs_new_protected:cpn {acro_command_#3:Nnn} ##1##2##3
       {
-        \prop_get:NnN \l__acro_citation_pre_prop {#1} \l__acro_tmpb_tl
-        \prop_get:NnN \l__acro_citation_post_prop {#1} \l__acro_tmpc_tl
-        \acro_no_break:
-        \tl_use:N \l__acro_citation_connect_tl
-        \__acro_cite:VVV
-          \l__acro_tmpb_tl
-          \l__acro_tmpc_tl
-          \l__acro_tmpa_tl
+        \exp_args:Nc \DeclareDocumentCommand
+          { base \__acro_remove_bs:N ##1  } {##2}
+          {
+            \acro_begin:
+              \l__acro_begin_command_hook_tl
+              \cs_set:Npn \nospace { \exp:w \exp_end_continue_f:w }
+              \acro_check_definition:n {####1}
+              \bool_set_true:N \l__acro_use_bool
+              \keys_set:nV {acro} \l__acro_options_tl
+              \tl_set:Ne \AcronymID { \acro_case_insensitive:n {####1} }
+              \tl_set:Ne \l_acro_id_tl { \acro_case_insensitive:n {####1} }
+              ##3
+              \acro_finalize:ne
+                { \l__acro_star_bool }
+                { \acro_case_insensitive:n {####1} }
+              \l__acro_end_command_hook_tl
+            \acro_end:
+          }
+        \use:x
+          {
+            \exp_not:n { #2 ##1 {so} }
+              {
+                \exp_not:n
+                  {
+                    \mode_leave_vertical:
+                    \bool_set_false:N \l__acro_star_bool
+                    \tl_clear:N \l__acro_options_tl
+                    \IfBooleanT {####1} { \bool_set_true:N \l__acro_star_bool }
+                    \IfNoValueF {####2} { \tl_set:Nn \l__acro_options_tl {####2} }
+                   }
+                \exp_not:c { base \__acro_remove_bs:N ##1 }
+              }
+          }
       }
-    \acro_property_get:nnT {#1} {after-citation}
-      { \acro_no_break: \l__acro_after_citation_tl  }
+    % define \NewAcroCommand
+    \NewDocumentCommand #1 {mm+m}
+      { \use:c {acro_command_#3:Nnn} ##1 {##2} {##3} }
   }
 
-\cs_new_protected:Npn \acro_group_cite:n #1
+\acro_new_definition_command:NNn
+  \NewAcroCommand
+  \NewDocumentCommand
+  {new}
+
+\acro_new_definition_command:NNn
+  \RenewAcroCommand
+  \RenewDocumentCommand
+  {renew}
+
+\acro_new_definition_command:NNn
+  \DeclareAcroCommand
+  \DeclareDocumentCommand
+  {declare}
+
+\acro_new_definition_command:NNn
+  \ProvideAcroCommand
+  \ProvideDocumentCommand
+  {provide}
+
+\keys_define:nn {acro/commands}
   {
-    \group_begin:
-      \cs_set_eq:NN \__acro_citation_cmd:w \__acro_group_citation_cmd:w
-      \tl_set_eq:NN
-        \l__acro_citation_connect_tl
-        \l__acro_between_group_connect_citation_tl
-      \acro_cite_if:Nn \l__acro_citation_first_bool {#1}
-    \group_end:
+    begin .code:n =
+      \tl_put_right:Nn \l__acro_begin_command_hook_tl {#1} ,
+    end   .code:n =
+      \tl_put_right:Nn \l__acro_end_command_hook_tl {#1} ,
+    clear .choice: ,
+    clear / begin .code:n =
+      \tl_clear:N \l__acro_begin_command_hook_tl ,
+    clear / end   .code:n =
+      \tl_clear:N \l__acro_end_command_hook_tl ,
+    clear / all   .code:n =
+      \tl_clear:N \l__acro_begin_command_hook_tl
+      \tl_clear:N \l__acro_end_command_hook_tl
   }
 
-\cs_new_protected:Npn \acro_cite_if:Nn #1#2
-  { \bool_if:NT #1 { \acro_cite:n {#2} } }
+% --------------------------------------------------------------------------
+\AcroModuleEnd
+\AcroModule{templates}{templates for typesetting exercises}
 
+\msg_new:nnn {acro} {unknown-template}
+  {
+    The~ template~ `#1'~ (template~ type~ `#2')~ \msg_line_context: \
+    does~ not~ seem~ to~ be~ defined.
+  }
+
+\msg_new:nnn {acro} {template-type-exists}
+  { The~ template~ type~ `#1'~ already~ exists~ \msg_line_context: }
+
+\msg_new:nnn {acro} {package-needed}
+  {
+    The~ template~ `#1'~ needs~ the~ package~ `#2'~ loaded~
+    \msg_line_context:
+  }
+
 % ----------------------------------------------------------------------------
-% indexing:
-\cs_new_protected:Npn \acro_index_if:Nn #1#2
+\seq_new:N \l__acro_template_types_seq
+
+% #1: template type
+\cs_new_protected:Npn \acro_template_type_new:n #1
   {
-    \bool_lazy_and:nnT {#1} { \l__acro_mark_as_used_bool }
+    \seq_if_in:NnTF \l__acro_template_types_seq {#1}
+      { \msg_error:nnn {acro} {template-type-exists} {#1} }
       {
-        \prop_get:NnN \l__acro_index_cmd_prop  {#2} \l__acro_tmpa_tl
-        \prop_get:NnN \l__acro_index_sort_prop {#2} \l__acro_tmpb_tl
-        \prop_get:NnN \l__acro_index_prop      {#2} \l__acro_tmpc_tl
-        \__acro_index:VnVV
-          \l__acro_tmpa_tl
-          {#2}
-          \l__acro_tmpb_tl
-          \l__acro_tmpc_tl
+        \seq_put_right:Nn \l__acro_template_types_seq {#1}
+        \acro_attribute_new:n {template::#1}
       }
   }
 
-\cs_new:Npn \__acro_index_cmd:n { \index }
+% #1: template type
+% #2: template name
+% #3: code
+\cs_new_protected:Npn \__acro_template_add:nnn #1#2#3
+  {
+    \tl_new:c {l__acro_template_#1_#2_setup_tl}
+    \acro_attribute_set:nnn {template::#1} {#2} {#3}
+  }
 
-% #1: cmd
-% #2: key
-% #3: sort
-% #4: replace
-\cs_new_protected:Npn \__acro_index:nnnn #1#2#3#4
+% #1: template type
+% #2: template name
+% #3: code
+\cs_new_protected:Npn \__acro_template_change:nnn #1#2#3
   {
-    \prop_get:NnNF \l__acro_short_prop  {#2} \l__acro_index_short_tl {}
-    \prop_get:NnNF \l__acro_format_prop {#2} \l__acro_index_format_tl {}
-    \quark_if_no_value:VTF \l__acro_index_format_tl
-      { \tl_set:Nn \l__acro_tmpa_tl { \l__acro_short_format_tl \l__acro_index_short_tl } }
-      { \tl_set:Nn \l__acro_tmpa_tl { \l__acro_index_format_tl \l__acro_index_short_tl } }
-    \quark_if_no_value:nF {#1}
-      { \cs_set:Npn \__acro_index_cmd:n {#1} }
-    \quark_if_no_value:nTF {#4}
+    \acro_template_if_exist:nnTF {#1} {#2}
+      { \acro_attribute_set:nnn {template::#1} {#2} {#3} }
+      { \msg_error:nnnn {acro} {unknown-template} {#2} {#1} }
+  }
+
+% #1: template type
+% #2: template name
+\prg_new_conditional:Npnn \acro_template_if_exist:nn #1#2 {T,F,TF}
+  {
+    \acro_attribute_if_set:nnTF {template::#1} {#2}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+% #1: parameter number
+% #2: template type
+% #3: template name
+\cs_new_protected:Npn \__acro_template_get:nnn #1#2#3
+  {
+    \use:x
       {
-        \quark_if_no_value:nTF {#3}
-          { \__acro_index_cmd:n { #2 @ { \l__acro_tmpa_tl } } }
-          { \__acro_index_cmd:n { #3 @ { \l__acro_tmpa_tl } } }
+         \cs_set:cn { __acro_tmp: \prg_replicate:nn {#1} {n} }
+          { \acro_attribute_get:nn {template::#2} {#3} }
       }
-      { \__acro_index_cmd:n {#4} }
+    \use:c { __acro_tmp: \prg_replicate:nn {#1} {n} }
   }
-\cs_generate_variant:Nn \__acro_index:nnnn {VnVV}
 
-% ----------------------------------------------------------------------------
-% accessability support
-\cs_new_eq:NN \acro_acc_supp:nn \use_ii:nn
+% using templates:
+% setup up the next usage of `template name':
+% #1: template type
+% #2: template name
+% #3: setup code
+\cs_new_protected:Npn \acro_template_setup:nnn #1#2#3
+  { \tl_set:cn {l__acro_template_#1_#2_setup_tl} {#3} }
+\cs_generate_variant:Nn \acro_template_setup:nnn {nnV,nVn}
 
-\cs_new_protected:Npn \acro_get_acc_supp:nn #1#2
+% #1: template type
+% #2: template name
+\cs_new_protected:Npn \__acro_template_setup:nn #1#2
+  { \tl_use:c {l__acro_template_#1_#2_setup_tl} }
+
+% #1: template type
+% #2: template name
+\cs_new_protected:Npn \__acro_clear_template_setup:nn #1#2
+  { \tl_clear:c {l__acro_template_#1_#2_setup_tl} }
+
+% #1: template type
+% #2: template name
+\cs_new_protected:Npn \__acro_template_start:nn #1#2
   {
-    \prop_get:NnNF \l__acro_acc_supp_prop {#1} \l__acro_acc_supp_tl
-      { \prop_get:NnNF \l__acro_short_prop {#1} \l__acro_acc_supp_tl {} }
-    \acro_for_endings_do:n
+    \group_begin:
+      \__acro_template_setup:nn {#1} {#2}
+      \tl_clear_new:N \TemplateType
+      \tl_set:Nn \TemplateType {#1}
+      \tl_clear_new:N \TemplateName
+      \tl_set:Nn \TemplateName {#2}
+  }
+
+% #1: template type
+% #2: template name
+\cs_new_protected:Npn \__acro_template_stop:nn #1#2
+  { \group_end: \__acro_clear_template_setup:nn {#1} {#2} }
+
+% typesetting the first appearance of acronym: pseude template `first'
+
+% #1: parameter number
+% #2: template type
+% #3: template name
+\cs_new_protected:Npn \acro_template_use:nnn #1#2#3
+  {
+    \bool_set_false:N \l__acro_tmpa_bool
+    \bool_if:NT \l__acro_use_only_first_bool
       {
-        \bool_if:cT {l__acro_##1_bool}
+        \bool_if:NT \l__acro_use_bool
           {
-            \tl_put_right:Nv
-              \l__acro_acc_supp_tl
-              {l__acro_short_##1_tl}
+            \bool_set_true:N \l__acro_tmpa_bool
+            \bool_set_false:N \l__acro_use_bool
           }
       }
-    \acro_do_acc_supp:VVn
-      \l__acro_acc_supp_tl
-      \l__acro_acc_supp_options_tl
-      {#2}
+    \str_case:nnF {#3}
+      {
+        {first} {
+          \bool_if:NT \l__acro_tmpa_bool
+            { \bool_set_true:N \l__acro_use_bool }
+          \bool_lazy_and:nnTF
+            { !\l__acro_first_bool }
+            { \acro_if_single_p:V \l_acro_id_tl }
+            {
+              \acro_property_if_set:VnTF \l_acro_id_tl {single-style}
+                {
+                  \tl_set:Ne \l__acro_tmpa_tl
+                    { \acro_property_get:Vn \l_acro_id_tl {single-style} }
+                }
+                { \tl_set_eq:NN \l__acro_tmpa_tl \l__acro_single_tl }
+            }
+            {
+              \acro_if_first:VTF \l_acro_id_tl
+                {
+                  \acro_property_if_set:VnTF \l_acro_id_tl {first-style}
+                    {
+                      \tl_set:Ne \l__acro_tmpa_tl
+                        { \acro_property_get:Vn \l_acro_id_tl {first-style} }
+                    }
+                    { \tl_set_eq:NN \l__acro_tmpa_tl \l__acro_first_style_tl }
+                }
+                { \tl_set:Nn \l__acro_tmpa_tl {short} }
+            }
+        }
+        {single} {
+          \acro_property_if_set:VnTF \l_acro_id_tl {single-style}
+            {
+              \tl_set:Ne \l__acro_tmpa_tl
+                { \acro_property_get:Vn \l_acro_id_tl {single-style} }
+            }
+            { \tl_set_eq:NN \l__acro_tmpa_tl \l__acro_single_tl }
+        }
+      }
+      { \tl_set:Nn \l__acro_tmpa_tl {#3} }
+    \str_if_eq:VnT \l__acro_tmpa_tl {first}
+      {
+        \acro_property_if_set:VnTF \l_acro_id_tl {first-style}
+          {
+            \tl_set:Ne \l__acro_tmpa_tl
+              { \acro_property_get:Vn \l_acro_id_tl {first-style} }
+          }
+          { \tl_set_eq:NN \l__acro_tmpa_tl \l__acro_first_style_tl }
+      }
+    \__acro_template_use:nnV {#1} {#2} \l__acro_tmpa_tl
   }
+\cs_generate_variant:Nn \acro_template_use:nnn {nnV}
 
-\cs_new:Npn \acro_do_acc_supp:nnn #1#2#3
+\cs_new_protected:Npn \__acro_template_use:nnn #1#2#3
   {
-    \BeginAccSupp { ActualText = #1 , #2 }
-      #3
-    \EndAccSupp { }
+    \acro_template_if_exist:nnTF {#2} {#3}
+      { \__acro_template_get:nnn {#1} {#2} {#3} }
+      {
+        \msg_warning:nnnn {acro} {unknown-template} {#3} {#2}
+        \__acro_template_get:nnn {#1} {#2} {first}
+      }
   }
-\cs_generate_variant:Nn \acro_do_acc_supp:nnn {VV}
+\cs_generate_variant:Nn \__acro_template_use:nnn {nnx,nnV}
 
-\AtEndPreamble
+% ----------------------------------------------------------------------------
+% acronym templates:
+\acro_template_type_new:n {acronym}
+
+% #1: template name
+% #2: code
+\cs_new_protected:Npn \acro_acronym_template_new:nn #1#2
   {
-    \bool_if:NT \l__acro_acc_supp_bool
+    \__acro_template_add:nnn {acronym} {#1}
       {
-        \RequirePackage {accsupp}
-        \cs_set_eq:NN \acro_acc_supp:nn \acro_get_acc_supp:nn
+        \__acro_template_start:nn {acronym} {#1}
+        #2
+        \__acro_template_stop:nn {acronym} {#1}
       }
-    \bool_if:NT \l__acro_tooltip_bool
+  }
+
+% #1: template name
+% #2: code
+\cs_new_protected:Npn \acro_acronym_template_renew:nn #1#2
+  {
+    \__acro_template_change:nnn {acronym} {#1}
       {
-        \RequirePackage {pdfcomment}
-        \cs_if_eq:NNT \__acro_tooltip_cmd:nn \use_i:nn
-          { \cs_set:Npn \__acro_tooltip_cmd:nn { \pdftooltip } }
+        \__acro_template_start:nn {acronym} {#1}
+        #2
+        \__acro_template_stop:nn {acronym} {#1}
       }
   }
 
-% --------------------------------------------------------------------------
-% tooltips for acronyms
+% ----------------------------------------------------------------------------
+% heading templates:
+\acro_template_type_new:n {heading}
 
-% #1: id
-% #2: printed text
-% #3: tool tip text
-\cs_new_protected:Npn \acro_write_tooltip:nnn #1#2#3
+% #1: template name
+% #2: code
+\cs_new_protected:Npn \acro_heading_template_new:nn #1#2
   {
-    \acro_property_get:nnTF {#1} {tooltip}
-      { \__acro_check_tooltip:nV {#2} \l__acro_tooltip_tl }
-      { \__acro_check_tooltip:nn {#2} {#3} }
+    \__acro_template_add:nnn {heading} {#1}
+      {
+        \__acro_template_start:nn {heading} {#1}
+        #2
+        \__acro_template_stop:nn {heading} {#1}
+      }
   }
-\cs_generate_variant:Nn \acro_write_tooltip:nnn {nnV}
 
-% #1: printed text
-% #2: tool tip text
-\cs_new_protected:Npn \__acro_check_tooltip:nn #1#2
+% #1: template name
+% #2: code
+\cs_new_protected:Npn \acro_heading_template_renew:nn #1#2
   {
-    \bool_if:NTF \l__acro_tooltip_inside_bool
-      {#1}
+    \__acro_template_change:nnn {heading} {#1}
       {
-        \bool_set_true:N \l__acro_tooltip_inside_bool
-        \__acro_tooltip_cmd:nn {#1} {#2}
+        \__acro_template_start:nn {heading} {#1}
+        #2
+        \__acro_template_stop:nn {heading} {#1}
       }
   }
-\cs_generate_variant:Nn \__acro_check_tooltip:nn { nV }
 
-% use whatever command you like for creating tooltips here:
-% #1: printed text
-% #2: tool tip text
-\cs_new_eq:NN \__acro_tooltip_cmd:nn \use_i:nn
-  
-% --------------------------------------------------------------------------
-% indefinite articles:
+% ----------------------------------------------------------------------------
+% list templates:
+\acro_template_type_new:n {list}
 
-% #1: ID
-% #2: short|long|alt
-\cs_new_protected:Npn \acro_write_indefinite:nn #1#2
+% #1: template name
+% #2: code
+\cs_new_protected:Npn \acro_list_template_new:nn #1#2
   {
-    \bool_if:NT \l__acro_indefinite_bool
-      { \prop_item:cn {l__acro_#2_indefinite_prop} {#1} ~ }
-    \bool_if:NT \l__acro_upper_indefinite_bool
-      { %  \bool_set_true:N \l__acro_first_upper_bool
-         \__acro_first_upper_case:x
-           { \prop_item:cn {l__acro_#2_indefinite_prop} {#1} } ~
+    \__acro_template_add:nnn {list} {#1}
+      {
+        \__acro_template_start:nn {list} {#1}
+        \tl_clear_new:N \AcronymTable
+        #2
+        \__acro_template_stop:nn {list} {#1}
       }
   }
 
+% #1: template name
+% #2: code
+\cs_new_protected:Npn \acro_list_template_renew:nn #1#2
+  {
+    \__acro_template_change:nnn {list} {#1}
+      {
+        \__acro_template_start:nn {list} {#1}
+        \tl_clear_new:N \AcronymTable
+        #2
+        \__acro_template_stop:nn {list} {#1}
+      }
+  }
+
+% ----------------------------------------------------------------------------
+\AcroModuleEnd
+\AcroModule{list}{the list of acronyms}
 % --------------------------------------------------------------------------
-% experimental sorting feature:
+% list of acronyms:
+\bool_new:N \l__acro_list_display_all_bool
+\bool_new:N \l__acro_list_bool
+\bool_new:N \l__acro_list_local_bool
 
-% the following code is an adaption of expl3 code used for \str_if_eq:NN(TF)
-\sys_if_engine_luatex:TF
+\seq_new:N \g__acro_list_seq
+
+\tl_new:N \l__acro_list_tl
+
+\clist_new:N \l__acro_tag_include_clist
+\clist_new:N \l__acro_tag_exclude_clist
+
+\cs_new_protected:Npn \acro_list_choose_set:
   {
-    \tl_set:Nn \l__acro_tmpa_tl
+    \bool_if:NTF \l__acro_list_display_all_bool
+      { \seq_gset_eq:NN \g__acro_list_seq \g__acro_acronyms_seq }
       {
-        acro ~ = ~ acro ~ or ~ { ~ } ~
-        function ~ acro.strcmp ~ (A, B) ~
-          if ~ A ~ == ~ B ~ then ~
-            tex.write ("0") ~
-          elseif ~ A ~ < ~ B ~ then ~
-            tex.write ("-1") ~
-          else ~
-            tex.write ("1") ~
-          end ~
-        end
+        \seq_gclear:N \g__acro_list_seq
+        \seq_map_inline:Nn \g__acro_acronyms_seq
+          {
+            \acro_if_single:nF {##1}
+              { \seq_gput_right:Nn \g__acro_list_seq {##1} }
+          }
       }
-    \lua_now:e { \l__acro_tmpa_tl }
-    \cs_new_protected:Npn \acro_strcmp:nn #1#2
+  }
+
+% --------------------------------------------------------------------------
+% #1: filtered sequence
+% #2: sequence
+\cs_new_protected:Npn \__acro_list_filter:NN #1#2
+  {
+    \seq_clear:N #2
+    \seq_clear:N \l__acro_tmpc_seq
+    \bool_if:NF \l__acro_list_local_bool
+      { \bool_set_true:N \l__acro_tmpb_bool }
+    \seq_map_inline:Nn #1
       {
-        \lua_now:e
+        \__acro_check_tags:Nn \l__acro_tmpa_bool {##1}
+        \bool_lazy_and:nnT
+          { \l__acro_list_local_bool }
           {
-            acro.strcmp
-              (
-                " \__acro_escape_x:n {#1} " ,
-                " \__acro_escape_x:n {#2} "
-              )
+            \int_compare_p:nNn
+            { \intarray_count:c {g__acro_##1_barriers_intarray} } > 0
           }
+          {
+            \bool_set_false:N \l__acro_tmpb_bool
+            \int_compare:nNnT
+              { \acro_barrier_usage:n {##1} } > 0
+              { \bool_set_true:N \l__acro_tmpb_bool }
+          }
+        \bool_lazy_and:nnT { \l__acro_tmpa_bool } { \l__acro_tmpb_bool }
+          { \seq_put_right:Nn #2 {##1} }
       }
-    \cs_new:Npn \__acro_escape_x:n #1
-      {
-        \lua_escape:e
-          { \__kernel_tl_to_str:w \use:e { {#1} } }
-      }
   }
-  { \cs_new_eq:NN \acro_strcmp:nn \tex_strcmp:D }
 
-\AtBeginDocument
+% #1: boolean
+% #2: id
+\cs_new_protected:Npn \__acro_check_tags:Nn #1#2
   {
-    \bool_if:NT \l__acro_sort_bool
-      {
-        \cs_new_protected:Npn \acro_sort_prop:NN #1#2
+    \bool_set_false:N #1
+    % get tags for acronym:
+    \clist_set:Ne \l__acro_tmpa_clist
+      { \acro_property_get:nn {#2} {tag} }
+    \clist_if_empty:NTF \l__acro_tmpa_clist
+      {% acronym does not have (a) tag(s)
+        \clist_if_empty:NT \l__acro_tag_include_clist
+          { \bool_set_true:N #1 }
+      }
+      {% acronym has (a) tag(s)
+        \clist_if_empty:NTF \l__acro_tag_include_clist
+          { \bool_set_true:N #1 }
           {
-            \seq_clear:N  \l__acro_tmpa_seq
-            \prop_clear:N \l__acro_tmpa_prop
-            \prop_clear:N \l__acro_tmpb_prop
-            \prop_map_inline:Nn #2
+            \clist_map_inline:Nn \l__acro_tmpa_clist
               {
-                \seq_put_right:Nn \l__acro_tmpa_seq {##2}
-                \prop_put:Nnn \l__acro_tmpa_prop {##1} {##2}
-              }
-            \seq_sort:Nn \l__acro_tmpa_seq
-              {
-                \int_compare:nTF
-                  {
-                    \acro_strcmp:nn
-                      { \str_fold_case:n {##1} }
-                      { \str_fold_case:n {##2} }
-                        = -1
+                \clist_if_in:NnT \l__acro_tag_include_clist {##1}
+                  {% acronym is included
+                    \bool_set_true:N #1
+                    \clist_map_break:
                   }
-                  { \sort_return_same: }
-                  { \sort_return_swapped: }
               }
-            \seq_map_inline:Nn \l__acro_tmpa_seq
+          }
+        \bool_if:NT #1
+          {% we only need to check if acronym is included:
+            \clist_if_empty:NF \l__acro_tag_exclude_clist
               {
-                \prop_map_inline:Nn \l__acro_tmpa_prop
+                \clist_map_inline:Nn \l__acro_tmpa_clist
                   {
-                    \str_if_eq:nnT {##1} {####2}
-                      {
-                        \prop_get:NnN #1 {####1} \l__acro_tmpa_tl
-                        \prop_put:NnV \l__acro_tmpb_prop {####1}
-                          \l__acro_tmpa_tl
+                    \clist_if_in:NnT \l__acro_tag_exclude_clist {##1}
+                      {% acronym is excluded
+                        \bool_set_false:N #1
+                        \clist_map_break:
                       }
                   }
               }
-            \prop_set_eq:NN #1 \l__acro_tmpb_prop
           }
       }
   }
 
 % --------------------------------------------------------------------------
-% regarding list printing:
-% this command ensures that a rerun warning is given when \printacronyms
-% is set the first time. This mechanism doesn't make very much sense,
-% should be replaced by a different and more efficient one
-%
-\cs_new_protected:Npn \acro at print@list
-  { \cs_if_exist:NF \acro at printed@list { \cs_new:Npn \acro at printed@list { printed } } }
+\prg_new_protected_conditional:Npnn \acro_acronyms_map:n #1 {T,F,TF}
+  {
+    \__acro_list_filter:NN \g__acro_list_seq \l__acro_tmpa_seq
+    \seq_if_empty:NTF \l__acro_tmpa_seq
+      { \prg_return_false: }
+      {
+        \seq_map_inline:Nn \l__acro_tmpa_seq {#1}
+        \prg_return_true:
+      }
+  }
 
+\cs_new_protected:Npn \acro_list:
+  {
+    \group_begin:
+      \bool_set_true:N \l__acro_list_bool
+      \acro_list_choose_set:
+      \cs_set_eq:NN \__acro_upper_case:n \__acro_list_upper_case:n
+      \bool_if:NT \l__acro_sort_bool { \acro_list_sort: }
+      \acro_template_use:nnV {0} {list} \l__acro_list_tl
+    \group_end:
+  }
+
 % --------------------------------------------------------------------------
-% trailing tokens and what to do when present
+\tl_new:N \l__acro_heading_tl
+\tl_new:N \l__acro_preamble_tl
 
-\cs_new_protected:Npn \acro_new_trailing_token:n #1
-  { \bool_new:c {l__acro_trailing_#1_bool} }
-\cs_new_protected:Npn \acro_activate_trailing_action:n #1
-  { \bool_set_true:c {l__acro_trailing_#1_bool} }
-\cs_new_protected:Npn \acro_deactivate_trailing_action:n #1
-  { \bool_set_false:c {l__acro_trailing_#1_bool} }
+\cs_new_protected:Npn \acro_heading:
+  { \acro_template_use:nnV {0} {heading} \l__acro_heading_tl }
 
-% register a new token but don't activate its action:
-% #1: token
-% #2: name
-\cs_new_protected:Npn \acro_register_trailing_token:Nn #1#2
+\cs_new_protected:Npn \acro_preamble:
+  { \tl_use:N \l__acro_preamble_tl }
+
+\tl_new:N \l__acro_list_name_tl
+
+% --------------------------------------------------------------------------
+\keys_define:nn {acro/list}
   {
-    \prop_put:Nnn \l__acro_trailing_tokens_prop {#2} {#1}
-    \prop_put:Nnn \l__acro_trailing_actions_prop {#1}
-      { \acro_activate_trailing_action:n {#2} }
-    \acro_new_trailing_token:n {#2}
+    template     .tl_set:N    = \l__acro_list_tl ,
+    template     .initial:n   = description ,
+    sort         .bool_set:N  = \l__acro_sort_bool ,
+    sort         .initial:n   = true ,
+    display      .choice: ,
+    display/all  .code:n      = \bool_set_true:N \l__acro_list_display_all_bool ,
+    display/used .code:n      = \bool_set_false:N \l__acro_list_display_all_bool ,
+    display      .initial:n   = used ,
+    include      .clist_set:N = \l__acro_tag_include_clist ,
+    exclude      .clist_set:N = \l__acro_tag_exclude_clist ,
+    local        .bool_set:N  = \l__acro_list_local_bool ,
+    heading      .tl_set:N  = \l__acro_heading_tl ,
+    preamble     .tl_set:N  = \l__acro_preamble_tl ,
+    preamble     .initial:n = ,
+    name         .tl_set:N  = \l__acro_list_name_tl ,
+    name         .initial:n = \acro_translate:n {list-name}
   }
 
-\cs_new_protected:Npn \acro_for_all_trailing_tokens_do:n #1
-  { \prop_map_inline:Nn \l__acro_trailing_tokens_prop {#1} }
+\acro_if_komascript:TF
+  {
+    \cs_if_exist:NTF \chapter
+      { \keys_set:nn {acro/list}{ heading = addchap } }
+      { \keys_set:nn {acro/list}{ heading = addsec } }
+  }
+  {
+    \cs_if_exist:NTF \chapter
+      { \keys_set:nn {acro/list}{ heading = chapter* } }
+      { \keys_set:nn {acro/list}{ heading = section* } }
+  }
 
-% activate a token:
-\cs_new_protected:Npn \acro_activate_trailing_token:n #1
+% --------------------------------------------------------------------------
+\AcroModuleEnd
+\AcroModule{pages}{recording and printing of pages}
+% ----------------------------------------------------------------------------
+% record page numbers:
+\RequirePackage {zref-abspage}
+
+\msg_new:nnn {acro} {label}
+  { The~ list~ template~ `#1'~ needs~ the~ option~ `labels'~ activated. }
+
+\msg_new:nnn {acro} {threshold}
+  { The~ sequentes~ threshold~ needs~ to~ be~ at~ least~ 3. }
+
+\group_begin:
+\char_set_catcode_other:N \@
+
+% #1: id
+\cs_new_protected:Npn \acro_record_page:n #1
   {
-    \prop_get:NnN \l__acro_trailing_tokens_prop {#1} \l__acro_tmpa_tl
-    \tl_put_right:NV \l__acro_trailing_tokens_tl \l__acro_tmpa_tl
+    \seq_if_in:ceF {g__acro_#1_pages_seq}
+      { \arabic{abspage} @ \int_use:N \g_acro_barrier_int @ \thepage }
+      {
+        \seq_gput_right:ce {g__acro_#1_pages_seq}
+          { \arabic{abspage} @ \int_use:N \g_acro_barrier_int @ \thepage }
+      }
+    \seq_gremove_duplicates:c {g__acro_#1_pages_seq}
+    \acro_at_end_document:n
+      {
+        \acro_property_set:nnx {#1} {pages}
+          { \seq_use:cn {g__acro_#1_pages_seq} {|} }
+      }
   }
 
-% deactivate a token:
-\cs_new_protected:Npn \acro_deactivate_trailing_token:n #1
+\cs_new:Npn \__acro_page_name:w #1@#2@#3 \q_stop
   {
-    \prop_get:NnN \l__acro_trailing_tokens_prop {#1} \l__acro_tmpa_tl
-    \tl_remove_all:NV \l__acro_trailing_tokens_tl \l__acro_tmpa_tl
+    \acro_package_if_loaded:nTF {hyperref}
+      { \exp_not:N \hyperpage { \exp_not:n {#3} } }
+      { \exp_not:n {#3} }
   }
 
-% #1: name
-\prg_new_conditional:Npnn \acro_if_trailing_token:n #1 {p,T,F,TF}
+\cs_new:Npn \__acro_absolute_page:w  #1@#2@#3 \q_stop {#1}
+
+\cs_new:Npn \__acro_barrier:w  #1@#2@#3 \q_stop {#2}
+
+\group_end:
+
+\RequirePackage {zref-totpages}
+
+\acro_at_begin_document:n
+  { \intarray_new:Nn \g__acro_pages_intarray { \ztotpages } }
+
+% #1: id
+% #2: one page
+% #3: more than one page
+\cs_new_protected:Npn \acro_print_pages:nnn #1#2#3
   {
-    \bool_if:cTF {l__acro_trailing_#1_bool}
-      { \prg_return_true: }
-      { \prg_return_false: }
+    \acro_if_pages:nT {#1}
+      {
+        \bool_if:NTF \l__acro_pages_all_bool
+          {
+            \bool_if:NTF \l__acro_pages_name_display_bool
+              { \acro_print_page_ranges:nnn {#1} {#2} {#3} }
+              { \acro_print_page_ranges:nnn {#1} {} {} }
+          }
+          {
+            \bool_if:NT \l__acro_pages_name_display_bool {#2}
+            \pageref { \l_acro_label_prefix_tl #1 }
+          }
+      }
   }
+\cs_generate_variant:Nn \acro_print_pages:nnn {e}
 
-% #1: csv list of names
-\prg_new_protected_conditional:Npnn \acro_if_trailing_tokens:n #1 {T,F,TF}
+% #1: id
+% #2: one page
+% #3: more than one page
+\cs_set_protected:Npn \acro_print_page_ranges:nnn #1#2#3
   {
-    \bool_set_false:N \l__acro_trailing_tokens_bool
-    \clist_map_inline:nn {#1}
+    \seq_set_split:Nnx \l__acro_tmpa_seq {|}
+      { \acro_property_get:nn {#1} {pages} }
+    \intarray_gzero:N \g__acro_pages_intarray
+    \seq_map_inline:Nn \l__acro_tmpa_seq
       {
-        \bool_if:cT {l__acro_trailing_##1_bool}
+        \intarray_gset:Nnn \g__acro_pages_intarray
+          { \__acro_absolute_page:w ##1 \q_stop + 1 }
           {
-            \bool_set_true:N \l__acro_trailing_tokens_bool
-            \clist_map_break:
+            \bool_if:NTF \l__acro_list_local_bool
+              {
+                \int_compare:nNnTF
+                  { \__acro_barrier:w ##1 \q_stop }
+                  =
+                  \g_acro_barrier_int
+                  {1}
+                  {0}
+              }
+              {1}
           }
       }
-    \bool_if:NTF \l__acro_trailing_tokens_bool
-      { \prg_return_true: }
-      { \prg_return_false: }
+    \bool_if:NT \l__acro_list_local_bool
+      {
+        \seq_clear:N \l__acro_tmpb_seq
+        \seq_map_inline:Nn \l__acro_tmpa_seq
+          {
+            \int_compare:nNnT
+              { \__acro_barrier:w ##1 \q_stop }
+              =
+              \g_acro_barrier_int
+              { \seq_put_right:Nn \l__acro_tmpb_seq {##1} }
+          }
+        \seq_set_eq:NN \l__acro_tmpa_seq \l__acro_tmpb_seq
+      }
+    \seq_clear:N \l__acro_tmpb_seq
+    \int_zero:N \l__acro_tmpb_int
+    \seq_map_inline:Nn \l__acro_tmpa_seq
+      {
+        % the current page
+        \int_set:Nn \l__acro_tmpa_int
+          { \__acro_absolute_page:w ##1 \q_stop + 1 }
+        \int_compare:nNnTF \l__acro_tmpa_int = 1
+          { % first page, start range
+            \seq_put_right:Ne \l__acro_tmpb_seq
+              { \__acro_page_name:w ##1 \q_stop }
+            \int_incr:N \l__acro_tmpb_int
+          }
+          { % not first page
+            \int_compare:nNnTF
+              {
+                \intarray_item:Nn \g__acro_pages_intarray
+                  { \l__acro_tmpa_int - 1 }
+              }
+              = 0
+              { % start range
+                \int_zero:N \l__acro_tmpb_int
+                \seq_put_right:Ne \l__acro_tmpb_seq
+                  { \__acro_page_name:w ##1 \q_stop }
+                \int_incr:N \l__acro_tmpb_int
+              }
+              { % continue range
+                \int_compare:nNnTF
+                  \l__acro_tmpa_int = { \intarray_count:N \g__acro_pages_intarray }
+                  { % last page, range ended
+                    \__acro_finish_range:Nnn \l__acro_tmpb_seq
+                      { \l__acro_tmpb_int }
+                      {##1}
+                    \int_zero:N \l__acro_tmpb_int
+                  }
+                  { % not last page
+                    \int_compare:nNnTF
+                      {
+                        \intarray_item:Nn \g__acro_pages_intarray
+                          { \l__acro_tmpa_int + 1 }
+                      }
+                      = 0
+                      { % range ended
+                        \__acro_finish_range:Nnn \l__acro_tmpb_seq
+                          { \l__acro_tmpb_int }
+                          {##1}
+                        \int_zero:N \l__acro_tmpb_int
+                      }
+                      {% continue range
+                        \int_incr:N \l__acro_tmpb_int
+                      }
+                  }
+              }
+          }
+      }
+    \seq_use:Nn \l__acro_tmpb_seq { \l__acro_pages_sep_tl }
   }
 
-\cs_new_protected:Npn \aciftrailing { \acro_if_trailing_tokens:nTF }
-
-\cs_new_protected:Npn \__acro_check_trail:N #1
+% #1: sequence
+% #2: range length
+% #3: page property entry
+\cs_new_protected:Npn \__acro_finish_range:Nnn #1#2#3
   {
-    \tl_map_inline:Nn \l__acro_trailing_tokens_tl
+    \seq_pop_right:NN #1 \l__acro_tmpa_tl
+    \int_compare:nNnTF {#2} > 1
       {
-        \token_if_eq_meaning:NNT #1 ##1
-          { \prop_item:Nn \l__acro_trailing_actions_prop {##1} }
+        \bool_lazy_and:nnTF
+          { \l__acro_seq_use_bool }
+          { \int_compare_p:nNn {#2} < \l__acro_pages_seq_threshold_int }
+          {
+            \seq_put_right:Ne \l__acro_tmpb_seq
+              {
+                \exp_not:V \l__acro_tmpa_tl
+                \exp_not:V \l__acro_pages_seq_pre_tl
+                \acro_translate:n {sequentes}
+              }
+          }
+          {
+            \seq_put_right:Ne \l__acro_tmpb_seq
+              {
+                \exp_not:V \l__acro_tmpa_tl
+                --
+                \__acro_page_name:w #3 \q_stop
+              }
+          }
       }
+      {
+        \bool_if:NTF \l__acro_seq_use_bool
+          {
+            \seq_put_right:Ne \l__acro_tmpb_seq
+              {
+                \exp_not:V \l__acro_tmpa_tl
+                \exp_not:V \l__acro_pages_seq_pre_tl
+                \acro_translate:n {sequens}
+              }
+          }
+          {
+            \seq_put_right:Ne \l__acro_tmpb_seq
+              { \exp_not:V \l__acro_tmpa_tl }
+            \seq_put_right:Ne \l__acro_tmpb_seq
+              {  \__acro_page_name:w #3 \q_stop }
+          }
+      }
   }
 
-% options for activating actions:
-\keys_define:nn {acro}
+\bool_new:N \l__acro_pages_all_bool
+\bool_new:N \l__acro_pages_display_bool
+\bool_new:N \l__acro_seq_use_bool
+
+% #1: id
+\prg_new_conditional:Npnn \acro_if_pages:n #1 {p,T,F,TF}
   {
-    activate-trailing-tokens   .code:n =
-      \clist_map_inline:nn {#1} { \acro_activate_trailing_token:n {##1} } ,
-    deactivate-trailing-tokens .code:n =
-      \clist_map_inline:nn {#1} { \acro_deactivate_trailing_token:n {##1} }
+    \bool_lazy_and:nnTF
+      { \l__acro_pages_display_bool }
+      {
+        \bool_lazy_and_p:nn
+          { \acro_attribute_if_set_p:nn {pages} {#1} }
+          { !\acro_if_single_p:n {#1} }
+      }
+      { \prg_return_true: }
+      { \prg_return_false: }
   }
-  
-% ---------------------------------------------------------------------------
-% reset outputs, they'll behave like the first time again (!not like the _only_
-% time!):
-\cs_new_protected:Npn \acro_reset:n #1
+\prg_generate_conditional_variant:Nnn \acro_if_pages:n {e} {p,T,F,TF}
+
+\acro_at_begin_document:n
   {
-    \bool_gset_false:c { g__acro_#1_used_bool }
-    \bool_gset_false:c { g__acro_#1_first_use_bool }
+    \bool_lazy_and:nnT
+      { \l__acro_pages_display_bool }
+      { !\l__acro_pages_all_bool }
+      { \bool_set_true:N \l__acro_label_bool }
   }
 
-\cs_new_protected:Npn \acro_mark_as_used:n #1
+% #1: style name
+\cs_new_protected:Npn \acro_no_page_ranges:n #1
   {
-    \bool_gset_true:c { g__acro_#1_used_bool }
-    \bool_gset_true:c { g__acro_#1_first_use_bool }
-    \bool_gset_true:c { g__acro_#1_in_list_bool }
-    \if at filesw
-      \__acro_aux_file_now:n { \acro at used@once {#1} {} {} {} }
-      \__acro_aux_file_now:n { \acro at used@twice {#1} {} {} {} }
-    \fi
+    \bool_if:NF \l__acro_label_bool
+      { \msg_warning:nnn {acro} {label} {#1} }
+    \bool_set_false:N \l__acro_pages_all_bool
   }
+\cs_generate_variant:Nn \acro_no_page_ranges:n {e}
 
-\cs_new_protected:Npn \acro_reset_all:
-  { \acro_for_all_acronyms_do:n { \acro_reset:n {##1} } }
+\tl_new:N \l__acro_pages_fill_tl
+\tl_new:N \l__acro_pages_sep_tl
+\tl_new:N \l__acro_pages_seq_pre_tl
 
-% make sure that no acronym is used at the beginning of the document, see
-% issue #81 for reasons why this may be necessary:
-\AfterEndPreamble { \acro_reset_all: }
-  
-\cs_new_protected:Npn \acro_mark_all_as_used:
-  { \acro_for_all_acronyms_do:n { \acro_mark_as_used:n {##1} } }
+\int_new:N \l__acro_pages_seq_threshold_int
 
-\prg_new_conditional:Npnn \acro_if_acronym_used:n #1 { p,T,F,TF }
+\keys_define:nn {acro/pages}
   {
-    \bool_lazy_and:nnTF
-      { \bool_if_p:c {g__acro_#1_used_bool} }
-      { !\acro_if_is_single_p:n {#1} }
-      { \prg_return_true: }
-      { \prg_return_false: }
+    display .choice: ,
+    display / all   .code:n =
+     \bool_set_true:N \l__acro_pages_display_bool
+     \bool_set_true:N \l__acro_pages_all_bool ,
+    display / first .code:n =
+      \bool_set_true:N \l__acro_pages_display_bool
+      \bool_set_false:N \l__acro_pages_all_bool ,
+    display / none  .code:n =
+      \bool_set_false:N \l__acro_pages_display_bool ,
+    seq / use       .bool_set:N = \l__acro_seq_use_bool ,
+    seq / use       .initial:n  = true ,
+    seq / pre       .tl_set:N   = \l__acro_pages_seq_pre_tl ,
+    seq / pre       .initial:n  = \, ,
+    seq / threshold .code:n     =
+      \int_compare:nNnTF {#1} < 3
+        { \msg_error:nn {acro} {threshold} }
+        { \int_set:Nn \l__acro_pages_seq_threshold_int {#1} } ,
+    seq / threshold .initial:n = 3 ,
+    fill            .tl_set:N   = \l__acro_pages_fill_tl ,
+    fill            .initial:n  = \dotfill ,
+    sep             .tl_set:N   = \l__acro_pages_sep_tl ,
+    sep             .initial:n  = {,~} ,
+    name            .bool_set:N = \l__acro_pages_name_display_bool ,
+    name            .initial:n  = false
   }
 
-% --------------------------------------------------------------------------
-% acronym barriers: allow local lists of only those acronyms used between two
-% barriers
+% ----------------------------------------------------------------------------
+\AcroModuleEnd
+\AcroModule{locale}{language support}
 
-\keys_define:nn {acro}
-  {
-    use-barriers      .bool_gset:N = \g__acro_use_barriers_bool ,
-    use-barriers      .initial:n   = false ,
-    reset-at-barriers .bool_gset:N = \g__acro_reset_at_barrier_bool ,
-    reset-at-barriers .initial:n   = false
-  }
+\RequirePackage{translations}
 
-\cs_new_protected:Npn \acro_barrier:
+% --------------------------------------------------------------------------
+\msg_new:nnn {acro} {language-not-defined}
   {
-    \int_gincr:N \g__acro_barrier_int
-    \bool_if:NT \g__acro_reset_at_barrier_bool
-      { \acro_reset_all: }
+    You~ chose~ the~ language~ `#1'~ which~ is~ not~ defined~ by~ acro.~
+    `english'~ is~ used~ instead.~ If~ you~ just~ mistyped~ try~ again!~
+    Otherwise~ contact~ the~ author~ and~ he'll~ probably~ add~ your~ language.
   }
 
-\cs_new_protected:Npn \acro_check_barriers:n #1
+\msg_new:nnn {acro} {translation-value}
+  { You~ need~ to~ give~ a~ value~ to~ `#1'~ \msg_line_context: }
+
+% --------------------------------------------------------------------------
+\bool_new:N \l__acro_show_locale_bool
+\bool_new:N \l__acro_list_show_locale_bool
+\tl_new:N \l__acro_locale_format_tl
+
+% #1: id
+% #2: property
+\prg_new_conditional:Npnn \acro_if_locale:nn #1#2 {p,T,F,TF}
   {
-    \bool_if:NT \g__acro_use_barriers_bool
+    \str_if_eq:nnTF {#2} {foreign}
       {
-        \tl_set:Nx \l__acro_tmpa_tl
-          { \seq_use:cn {g__acro_#1_barriers_seq} {} }
-        \tl_set:Nx \l__acro_tmpb_tl
-          { \seq_use:cn {g__acro_#1_recorded_barriers_seq} {} }
-        \tl_if_eq:NNF \l__acro_tmpa_tl \l__acro_tmpb_tl
-          {
-            \@latex at warning@no at line
-              {Rerun~to~get~barriers~of~acronym~#1~right}
-          }
+        \bool_lazy_or:nnTF
+          { \acro_property_if_set_p:nn {#1} {foreign-babel} }
+          { \acro_property_if_set_p:nn {#1} {foreign-locale} }
+          { \prg_return_true: }
+          { \prg_return_false: }
       }
+      { \prg_return_false: }
   }
 
-\cs_new_protected:Npn \acro_record_barrier:n #1
+% #1: id
+% #2: property
+% #3: text
+\cs_new_protected:Npn \acro_locale:nnn #1#2#3
   {
-    \bool_if:NT \g__acro_use_barriers_bool
+    \acro_if_locale:nnTF {#1} {#2}
       {
-        \seq_if_in:cxF {g__acro_#1_barriers_seq}
-          { \int_use:N \g__acro_barrier_int }
+        \__acro_foreign_language:en
+          { \str_lowercase:e { \acro_property_get:nn {#1} {foreign-babel} } }
           {
-            \seq_gput_right:cx  {g__acro_#1_barriers_seq}
-              { \int_use:N \g__acro_barrier_int }
+            \bool_lazy_or:nnT
+              { \l__acro_show_locale_bool }
+              {
+                \bool_lazy_and_p:nn
+                  { \l__acro_list_bool }
+                  { \l__acro_list_show_locale_bool }
+              }
+              {
+                {
+                  \l__acro_locale_format_tl
+                    {
+                      \acro_property_if_set:nnTF {#1} {foreign-locale}
+                        { \acro_property_get:nn {#1} {foreign-locale} }
+                        {
+                           \baselanguage
+                             { \acro_property_get:nn {#1} {foreign-babel} }
+                        }
+                    }
+                }
+                :~
+              }
+            #3
           }
       }
+      {#3}
   }
 
-% #1: id
-% #2: barrier number
-\prg_new_protected_conditional:Npnn \acro_if_in_barrier:nn #1#2 {T,F,TF}
+\cs_new_protected:Npn \__acro_foreign_language:nn #1#2
   {
-    \seq_if_in:cnTF {g__acro_#1_recorded_barriers_seq} {#2}
-      { \prg_return_true: }
-      { \prg_return_false: }
+    \bool_lazy_or:nnTF
+      { \acro_package_if_loaded_p:n {babel} }
+      { \acro_package_if_loaded_p:n {polyglossia} }
+      { \foreignlanguage {#1} {#2} }
+      {#2}
   }
-\cs_generate_variant:Nn \acro_if_in_barrier:nnTF {nx}
+\cs_generate_variant:Nn \__acro_foreign_language:nn {e}
 
-\cs_new_protected:Npn \acro at barriers #1#2
-  { \seq_gset_split:cnn {g__acro_#1_recorded_barriers_seq} {,} {#2} }
+\keys_define:nn {acro/locale}
+  {
+    display .bool_set:N = \l__acro_show_locale_bool ,
+    display .initial:n  = false ,
+    format  .tl_set:N   = \l__acro_locale_format_tl ,
+    format  .initial:n  = \em \text_titlecase_first:n
+  }
 
+\keys_define:nn {acro/list/locale}
+  {
+    display .bool_set:N = \l__acro_list_show_locale_bool ,
+    display .initial:n  = false
+  }
+
 % --------------------------------------------------------------------------
-% the user commands -- preparation:
-\cs_new_protected:Npn \acro_begin:
+
+\bool_new:N      \l__acro_language_auto_bool
+\bool_set_true:N \l__acro_language_auto_bool
+% this token list will hold the chosen language for acro; since the
+% language is either chosen automatically or by option it is only available at
+% begin document
+\tl_new:N  \l_acro_language_tl
+\tl_set:Nn \l_acro_language_tl {english}
+\tl_new:N  \l__acro_current_language_tl
+
+% ----------------------------------------------------------------------------
+\tl_const:Nn \c__acro_keyword_prefix_tl {acro-keyword-}
+\prop_new:N \g_acro_translations_prop
+
+% translate the key #1
+\cs_new:Npn \acro_translate:n #1
   {
-    \group_begin:
-    \__acro_check_after_end:w
+    \bool_if:NTF \l__acro_language_auto_bool
+      { \GetTranslation { \c__acro_keyword_prefix_tl #1 } }
+      {
+        \GetTranslationFor
+          { \l_acro_language_tl }
+          { \c__acro_keyword_prefix_tl #1 }
+      }
   }
 
-\cs_new_protected:Npn \__acro_check_after_end:w #1 \acro_end:
+\acro_at_begin_document:n
   {
-    \cs_set:Npn \__acro_execute:
+    \bool_if:NTF \l__acro_language_auto_bool
       {
-        \__acro_check_trail:N \l_peek_token
-        #1
-        \acro_end: % this will end the group opened by \acro_begin:
+        \tl_set:Nx \l_acro_language_tl
+          { \@trnslt at language{\@trnslt at current@language} }
       }
-    \peek_after:Nw \__acro_execute:
+      {
+        \tl_set_eq:NN
+          \l_acro_language_tl
+          \l__acro_current_language_tl
+      }
   }
 
-\cs_new_protected:Npn \acro_end: { \group_end: }
+% ----------------------------------------------------------------------------
+% #1: language
+% #2: keyword
+% #3: translation
+\cs_new_protected:Npn \acro_declare_translation:nnn #1#2#3
+  {
+    \declaretranslation
+      {#1}
+      { \c__acro_keyword_prefix_tl #2 }
+      {#3}
+    \prop_gput:Nnn \g_acro_translations_prop {#2(#1)} {#3}
+  }
+\cs_generate_variant:Nn \acro_declare_translation:nnn {V,VnV}
 
-\cs_new_protected:Npn \acro_reset_specials:
+% #1: key
+% #2: csv list: { <lang1> = <translation1> , <lang2> = <translation2> }
+\cs_new_protected:Npn \acro_declare_translations:nn #1#2
   {
-    \bool_set_false:N \l__acro_indefinite_bool
-    \bool_set_false:N \l__acro_first_upper_bool
-    \bool_set_false:N \l__acro_upper_indefinite_bool
-    \acro_for_endings_do:n { \bool_set_false:c {l__acro_##1_bool} }
+    \cs_set:Npn \__acro_declare_translation_aux:n ##1
+      { \msg_error:nnn {acro} {translation-value} {##1} }
+    \cs_set:Npn \__acro_declare_translation_aux:nn ##1##2
+      { \acro_declare_translation:nnn {##1} {#1} {##2} }
+    \keyval_parse:NNn
+      \__acro_declare_translation_aux:n
+      \__acro_declare_translation_aux:nn
+      {#2}
   }
 
-% #1: ID
-% #2: true|false
-\cs_new_protected:Npn \acro_check_acronym:nn #1#2
+% #1: language
+% #2: csv list: { <key1> = <translation1> , <key2> = <translation2> }
+\cs_new_protected:Npn \acro_add_translations:nn #1#2
   {
-    \acro_defined:n {#1}
-    \acro_use_acronym:n {#2}
+    \cs_set:Npn \__acro_declare_translation_aux:n ##1
+      { \msg_error:nnn {acro} {translation-value} {##1} }
+    \cs_set:Npn \__acro_declare_translation_aux:nn ##1##2
+      { \acro_declare_translation:nnn {#1} {##1} {##2} }
+    \keyval_parse:NNn
+      \__acro_declare_translation_aux:n
+      \__acro_declare_translation_aux:nn
+      {#2}
   }
 
-% #1: boolean
-% #2: ID
-\cs_new_protected:Npn \acro_check_and_mark_if:nn #1#2
+% within the loop:
+% #1: keyword
+% #2: language
+% #3: translation
+\cs_new_protected:Npn \__acro_for_all_translations_do:n #1
   {
-    \bool_lazy_or:nnTF {#1} { !\l__acro_use_acronyms_bool }
-      { \acro_check_acronym:nn {#2} {false} }
-      { \acro_check_acronym:nn {#2} {true} }
+    \cs_set:Npn \__acro_parse_translate_list_entry:nnn ##1##2##3 {#1}
+    \prop_map_inline:Nn \g_acro_translations_prop
+      { \__acro_parse_translate_list_entry:www ##1 \q_mark ##2 \q_stop }
   }
 
-\cs_new_protected:Npn \acro_switch_off:
-  { \bool_set_false:N \l__acro_use_acronyms_bool }
+% the purpose of the following is to easy documentation:
+\cs_new:Npn \__acro_parse_translate_list_entry:nnn #1#2#3 {}
 
-\cs_new_protected:Npn \acro_switch_on:
-  { \bool_set_true:N \l__acro_use_acronyms_bool }
+\cs_new_protected:Npn \__acro_parse_translate_list_entry:www #1(#2)\q_mark#3\q_stop
+  { \__acro_parse_translate_list_entry:nnn {#1} {#2} {#3} }
 
-% commands for (re)defining \ac-like macros:
-\cs_new_protected:Npn \acro_define_new_acro_command:NN #1#2
+% ----------------------------------------------------------------------------
+
+\keys_define:nn {acro}
   {
-    % #1: csname
-    % #2: definition where `#1' refers to the ID
-    \cs_new_protected:Npn #1 ##1##2
+    language .value_required:n = true ,
+    language .code:n =
+      \str_case:nnF {#1} 
+        { {auto} { \bool_set_true:N \l__acro_language_auto_bool } }
+        {
+          \bool_set_false:N \l__acro_language_auto_bool
+          \tl_set:Nn \l__acro_current_language_tl {#1}
+        } ,
+    language .initial:n = auto
+  }
+
+% --------------------------------------------------------------------------
+\AcroModuleEnd
+\AcroModule{pdfsupport}{support for bookmarks and accessibility}
+
+\msg_new:nnn {acro} {pdf-template-exists}
+  { The~ pdfstring~ template~ `#1'~ already~ exists~ \msg_line_context: }
+
+\msg_new:nnn {acro} {pdf-template-undefined}
+  { The~ pdfstring~ template~ `#1'~ is~ not~ defined~ \msg_line_context: }
+
+\msg_new:nnn {acro} {local-links}
+  {
+    You~ are~ using~ the~ option~ `make-links'~ in~ combination~ with~ local~
+    acronym~ lists.~ Please~ make~ sure~ to~ also~ set \\
+    \ \ \ \ barriers/single~ =~ true \\
+    for~ referencing~ only~ existing~ and~ unique~ links.
+  }
+
+% --------------------------------------------------------------------------
+% hyper linking
+\bool_new:N \l__acro_hyperref_use_bool
+
+\cs_new_eq:NN \__acro_hyper_target:nn \use_ii:nn
+\cs_new_eq:NN \__acro_hyper_link:nn   \use_ii:nn
+
+\cs_generate_variant:Nn \__acro_hyper_target:nn {e}
+\cs_generate_variant:Nn \__acro_hyper_link:nn {e}
+
+% \acro_property_declare:nnnnn
+%   { \c_false_bool } % not unique
+%   { \c_true_bool }  % boolean
+%   { \c_false_bool } % not mandatory
+%   { \c_false_bool } % dynamic
+%   {target-set}
+
+\cs_new_protected:Npn \__acro_activate_hyperref_support:
+  {
+    \bool_lazy_and:nnT
+      { \acro_package_if_loaded_p:n {hyperref} }
+      { \l__acro_hyperref_use_bool }
       {
-        \cs_set:Npn \__acro_tmp:n ####1 {##2}
-        \cs_new_protected:cpx
-          {acro_ \__acro_remove_backslash:N ##1 :nnn} ####1####2####3
+        \sys_if_engine_xetex:TF
           {
-            \acro_begin:
-              \acro_reset_specials:
-              \exp_not:N \tl_if_blank:nF {####2} { \keys_set:nn {acro} {####2} }
-              \acro_check_and_mark_if:nn {####1} {####3}
-              \__acro_tmp:n {####3}
-            \acro_end:
+            \cs_set:Npn \__acro_hyper_link:nn ##1##2
+              { \hyperlink {##1} { \XeTeXLinkBox {##2} } }
           }
-        #2 ##1 {sO{}m}
-          {
-            \acro_case_insensitive_command:cnnn
-              {acro_ \__acro_remove_backslash:N ##1 :nnn}
-              {####1}
-              {####2}
-              {####3}
-          }
+          { \cs_set_eq:NN \__acro_hyper_link:nn \hyperlink }
+        \cs_set:Npn \__acro_hyper_target:nn ##1##2
+          { \raisebox {3ex} [0pt] { \hypertarget {##1} { } } ##2 }
       }
   }
-\cs_generate_variant:Nn \acro_define_new_acro_command:NN {cc}
-\cs_generate_variant:Nn \acro_check_and_mark_if:nn {nx}
 
-% commands for (re)defining \acflike-like macros:
-\cs_new_protected:Npn \acro_define_new_acro_pseudo_command:NN #1#2
+% #1: id
+% #2: property
+% #3: text
+\cs_new_protected:Npn \__acro_make_link:nnn #1#2#3
   {
-    % #1: csname
-    % #2: definition where `#1' refers to the ID and `#2' to the pseudo long form
-    \cs_new_protected:Npn #1 ##1##2
+    \acro_if_short:nTF {#2}
       {
-        \cs_set:Npn \__acro_tmp:nn ####1####2 {##2}
-        \cs_new_protected:cpx
-          {acro_ \__acro_remove_backslash:N ##1 :nnn} ####1####2####3
+        \bool_lazy_all:nTF
           {
-            \acro_begin:
-              \acro_reset_specials:
-              \acro_check_and_mark_if:nn {####1} {####3}
-              \__acro_tmp:nn {####3} {####2}
-            \acro_end:
+            { \acro_package_if_loaded_p:n {hyperref} }
+            { \l__acro_hyperref_use_bool }
+            { !\acro_if_single_p:n {#1} }
           }
-        #2 ##1 {smm}
           {
-            \acro_case_insensitive_command:cnnn
-              {acro_ \__acro_remove_backslash:N ##1 :nnn}
-              {####1}
-              {####3}
-              {####2}
+            \bool_if:NTF \l__acro_list_bool
+              {
+                \__acro_hyper_target:en
+                  {
+                    acro : #1
+                    \bool_lazy_and:nnT
+                      { \l__acro_list_local_bool }
+                      { \l__acro_usage_local_bool }
+                      { : \int_use:N \g_acro_barrier_int }
+                  }
+                  {#3}
+              }
+              {
+                \__acro_hyper_link:en
+                  {
+                    acro : #1
+                    \bool_if:NT \l__acro_usage_local_bool
+                      { : \int_use:N \g_acro_barrier_int }
+                  }
+                  { \phantom {#3} }
+                \__acro_color_link:n { \hbox_overlap_left:n {#3} }
+              }
           }
+          {#3}
       }
+      {#3}
   }
-\cs_generate_variant:Nn \acro_define_new_acro_pseudo_command:NN {cc}
 
-\clist_map_inline:nn {New,Renew,Declare,Provide}
+\acro_at_begin_document:n
   {
-    \acro_define_new_acro_command:cc
-      {#1AcroCommand}
-      {#1DocumentCommand}
-    \acro_define_new_acro_pseudo_command:cc
-      {#1PseudoAcroCommand}
-      {#1DocumentCommand}
-  }
-
-% --------------------------------------------------------------------------
-% user commands -- facilities
-\cs_new_protected:Npn \acro_first_upper:
-  {
-    \bool_if:NTF \l__acro_indefinite_bool
+    \bool_if:nT
       {
-        \bool_set_false:N \l__acro_indefinite_bool
-        \bool_set_true:N \l__acro_upper_indefinite_bool
+        \l__acro_hyperref_use_bool &&
+        \l__acro_barriers_bool &&
+        ! \l__acro_usage_local_bool
       }
-      { \bool_set_true:N \l__acro_first_upper_bool }
+      { \msg_warning:nn {acro} {local-links} }
   }
 
-\cs_new_protected:Npn \acro_indefinite:
+% #1: text
+\cs_new:Npn \__acro_color_link:n #1
   {
-    \bool_if:NTF \l__acro_first_upper_bool
+    \bool_lazy_and:nnTF
+      { \cs_if_exist_p:N \hypersetup }
       {
-        \bool_set_true:N \l__acro_upper_indefinite_bool
-        \bool_set_false:N \l__acro_first_upper_bool
+        \bool_lazy_or_p:nn
+          { \legacy_if_p:n {Hy at colorlinks} }
+          { \legacy_if_p:n {Hy at ocgcolorlinks} }
       }
-      { \bool_set_true:N \l__acro_indefinite_bool }
+      { \textcolor { \@linkcolor } {#1} }
+      {#1}
   }
 
-\cs_new_protected:Npn \acro_cite:
+\acro_at_begin_document:n
   {
-    \bool_set_true:N \l__acro_citation_all_bool
-    \bool_set_true:N \l__acro_citation_first_bool
+    \__acro_activate_hyperref_support:
+    \cs_if_exist:NF \textcolor { \cs_new_eq:NN \textcolor \use_ii:nn }
   }
 
-\cs_new_protected:Npn \acro_no_cite:
+\keys_define:nn {acro}
   {
-    \bool_set_false:N \l__acro_citation_all_bool
-    \bool_set_false:N \l__acro_citation_first_bool
+    make-links .bool_set:N = \l__acro_hyperref_use_bool ,
+    make-links .initial:n  = false
   }
 
-\cs_new_protected:Npn \acro_index:
-  { \bool_set_true:N \l__acro_addto_index_bool }
+% --------------------------------------------------------------------------
+% accessibility support
+\bool_new:N \l__acro_accsupp_bool
+\tl_new:N \l__acro_accsupp_options_tl
+\tl_new:N \l__acro_accsupp_method_tl
 
-% similar macros \acro_<ending>: are defined by \acro_provide_ending:nnn
+% #1: copied text
+% #2: printed text
+\cs_new_protected:Npn \__acro_accsupp:nn #1#2
+  {
+    \bool_if:NTF \l__acro_accsupp_bool
+      {
+        \__acro_do_accsupp:Vnn
+          \l__acro_acc_supp_options_tl
+          {#1}
+          {#2}
+      }
+      {#2}
+  }
+\cs_generate_variant:Nn \__acro_accsupp:nn {ee}
 
-% ---------------------------------------------------------------------------
-% process options:
-\ProcessKeysPackageOptions {acro}
+% #1: options
+% #2: copied text
+% #3: printed text
+\cs_new_protected:Npn \__acro_do_accsupp:nnn #1#2#3
+  {
+    \BeginAccSupp { method = \l__acro_accsupp_method_tl ,  ActualText = {#2} , #1 }
+      #3
+    \EndAccSupp { }
+  }
+\cs_generate_variant:Nn \__acro_do_accsupp:nnn {V}
 
-% ---------------------------------------------------------------------------
-% PDF bookmark support
-\cs_new:Npn \acpdfstring
-  { \acro_pdf_string_short:n }
+\acro_at_begin_document:n
+  {
+    \bool_lazy_all:nT
+      {
+        { \acro_package_if_loaded_p:n {accsupp} }
+        { \acro_package_if_loaded_p:n {hyperref} }
+        { \l__acro_use_accsupp_bool }
+      }
+      { \bool_set_true:N \l__acro_accsupp_bool }
+  }
 
-\cs_new:Npn \acpdfstringalt
-  { \acro_pdf_string_alt:n }
+\keys_define:nn {acro/accsupp}
+  {
+    use      .code:n     =
+      \str_case:nnTF {#1}
+        { {true} {} {false} {} }
+        { \use:c {bool_set_#1:N} \l__acro_use_accsupp_bool }
+        { \msg_error:nnn {kernel} {boolean-values-only} {group} } ,
+    use     .initial:n  = true ,
+    options .tl_set:N   = \l__acro_acc_supp_options_tl ,
+    options .initial:n  = ,
+    method  .tl_set:N   = \l__acro_accsupp_method_tl ,
+    method  .initial:n  = pdfstringdef
+  }
 
-\cs_new:Npn \acpdfstringlong
-  { \acro_pdf_string_long:n }
+% --------------------------------------------------------------------------
+% pdf comments a.k.a. tooltips
+\bool_new:N \l__acro_pdfcomment_use_bool
 
-\cs_new:Npn \acpdfstringfirst #1
-  { \acpdfstringlong {#1} ~ ( \acpdfstring {#1} ) }
+% #1: id
+% #2: property
+% #3: text
+\cs_new_protected:Npn \__acro_pdf_comment:nnn #1#2#3
+  {
+    \bool_lazy_all:nTF
+      {
+        { \l__acro_pdfcomment_use_bool }
+        { \acro_property_if_set_p:nn {#1} {pdfcomment} }
+        { \acro_if_short_p:n {#2} }
+      }
+      {
+        \__acro_pdf_comment_cmd:nn
+          {#3}
+          { \acro_property_get:nn {#1} {pdfcomment} }
+      }
+      {#3}
+  }
 
-% TODO: place this somewhere where endings are defined:
-\cs_new:Npn \acpdfstringlongplural
-  { \acro_pdf_string_long_plural:n }
+\keys_define:nn {acro/pdfcomments}
+  {
+    use .bool_set:N = \l__acro_pdfcomment_use_bool ,
+    use .initial:n = false ,
+    cmd .cs_set:Np = \__acro_pdf_comment_cmd:nn #1#2 ,
+    cmd .initial:n = \pdftooltip {#1} {#2}
+  }
 
+% --------------------------------------------------------------------------
+% expandable templates for use in pdfstrings
 \prg_new_conditional:Npnn \acro_if_star_gobble:n #1 {TF}
   {
     \if_meaning:w *#1
@@ -3500,625 +4251,1201 @@
     \fi:
   }
 
-\cs_new:Npn \acro_expandable_short:n #1
-  { \use:e { \prop_item:Nn \l__acro_short_prop {#1} } }
-  
-\cs_new:Npn \acro_expandable_alt:n #1
-  { \use:e { \prop_item:Nn \l__acro_alt_prop {#1} } }
+% #1: name
+% #2: code
+\cs_new_protected:Npn \acro_pdfstring_template_new:nn #1#2
+  {
+    \cs_if_exist:cTF {____acro:pdfstring:template:#1}
+      { \msg_error:nnn {acro} {pdf-template-exists} {#1} }
+      { \cs_new:cpn {____acro:pdfstring:template:#1} ##1 {#2} }
+  }
 
-\cs_new:Npn \acro_expandable_long:n #1
-  { \use:e { \prop_item:Nn \l__acro_long_prop {#1} } }
+% #1: name
+% #2: code
+\cs_new_protected:Npn \acro_pdfstring_template_set:nn #1#2
+  {
+    \cs_if_exist:cTF {____acro:pdfstring:template:#1}
+      { \cs_set:cpn {____acro:pdfstring:template:#1} ##1 {#2} }
+      { \cs_new:cpn {____acro:pdfstring:template:#1} ##1 {#2} }
+  }
 
-\cs_new:Npn \acro_expandable_long_plural:n #1
+% #1: name
+% #2: name to be let to
+\cs_new_protected:Npn \acro_pdfstring_template_let:nn #1#2
   {
-    \bool_if:cTF
-      { c_ \prop_item:Nn \l__acro_long_plural_form_prop {#1} _bool }
-      { \use:e { \prop_item:Nn \l__acro_long_plural_prop {#1} } }
+    \cs_if_exist:cTF {____acro:pdfstring:template:#2}
       {
-        \use:e {
-          \prop_item:Nn \l__acro_long_prop {#1}
-          \prop_item:Nn \l__acro_long_plural_prop {#1}
-        }
+        \cs_set_eq:cc
+          {____acro:pdfstring:template:#1}
+          {____acro:pdfstring:template:#2}
       }
+      { \msg_error:nnn {acro} {pdf-template-undefined} {#2} }
   }
 
-\cs_new:Npn \acro_pdf_string_short:n #1
+% #1: name
+% #2: id
+\cs_new:Npn \acro_pdfstring_template:nn #1#2
   {
-    \acro_if_star_gobble:nTF {#1}
-      { \acro_expandable_short:n }
-      { \acro_expandable_short:n {#1} }
+     \cs_if_exist:cTF {____acro:pdfstring:template:#1}
+       { \use:c {____acro:pdfstring:template:#1} {#2} }
+       { \msg_expandable_error:nnn {acro} {pdf-template-undefined} {#1} }
   }
 
-\cs_new:Npn \acro_pdf_string_alt:n #1
+% #1: cs
+% #2: template
+\cs_new_protected:Npn \acro_set_pdf_cs:Nn #1#2
   {
-    \acro_if_star_gobble:nTF {#1}
-      { \acro_expandable_alt:n }
-      { \acro_expandable_alt:n {#1} }
+    \cs_set:Npn #1 ##1
+      {
+        \acro_if_star_gobble:nTF {##1}
+          { \acro_pdfstring_template:nn {#2} }
+          { \acro_pdfstring_template:nn {#2} {##1} }
+      }
   }
 
-\cs_new:Npn \acro_pdf_string_long:n #1
+% #1: id
+% #2: property
+\cs_new:Npn \__acro_pdfstring_plural:nn #1#2
   {
-    \acro_if_star_gobble:nTF {#1}
-      { \acro_expandable_long:n }
-      { \acro_expandable_long:n {#1} }
+    \acro_property_get_if_set:nnF {#1} {#2-plural-form}
+      {
+        \str_if_eq:nnTF {#2} {short}
+          { \acro_property_get:nn {#1} {pdfstring} }
+          { \acro_property_get:nn {#1} {#2} }
+        \acro_property_get:nn {#1} {#2-plural}
+      }
   }
 
-% TODO: place this somewhere where endings are defined:
-\cs_new:Npn \acro_pdf_string_long_plural:n #1
+% #1: id
+% #2: property
+\cs_new:Npn \__acro_pdfstring_indefinite:nn #1#2
   {
-    \acro_if_star_gobble:nTF {#1}
-      { \acro_expandable_long_plural:n }
-      { \acro_expandable_long_plural:n {#1} }
+    \acro_property_get_if_set:nnT {#1} {#2-indefinite}
+      { \c_space_tl }
   }
 
-\AtBeginDocument
+% #1: text
+\cs_new:Npn \__acro_pdfstring_upper:n #1
+  { \text_titlecase_first:e {#1} }
+
+\cs_generate_variant:Nn \text_titlecase_first:n {e}
+
+% --------------------------------------------------------------------------
+% long-short
+\acro_pdfstring_template_new:nn {long-short}
   {
-    \@ifpackageloaded {hyperref}
+    \acro_property_get:nn {#1} {long}
+    \acro_space:
+    ( \acro_property_get:nn {#1} {pdfstring} )
+  }
+
+% indef-long-short
+\acro_pdfstring_template_new:nn {indef-long-short}
+  {
+    \__acro_pdfstring_indefinite:nn {#1} {long}
+    \acro_property_get:nn {#1} {long}
+    \acro_space:
+    ( \acro_property_get:nn {#1} {pdfstring} )
+  }
+
+% Long-short
+\acro_pdfstring_template_new:nn {Long-short}
+  {
+    \__acro_pdfstring_upper:n
+      { \acro_property_get:nn {#1} {long} }
+    \acro_space:
+    ( \acro_property_get:nn {#1} {pdfstring} )
+  }
+
+% Indef-long-short
+\acro_pdfstring_template_new:nn {Indef-long-short}
+  {
+    \__acro_pdfstring_upper:n
       {
-        \bool_set_true:N \l__acro_hyperref_loaded_bool
-        \pdfstringdefDisableCommands
-          {
-            \cs_set_eq:NN \ac   \acpdfstring
-            \cs_set_eq:NN \Ac   \acpdfstring
-            \cs_set_eq:NN \acs  \acpdfstring
-            \cs_set_eq:NN \acl  \acpdfstringlong
-            \cs_set_eq:NN \Acl  \acpdfstringlong
-            \cs_set_eq:NN \acf  \acpdfstringfirst
-            \cs_set_eq:NN \Acf  \acpdfstringfirst
-            \cs_set_eq:NN \aca  \acpdfstringalt
-            \cs_set_eq:NN \acp  \acpdfstringplural
-            \cs_set_eq:NN \Acp  \acpdfstringplural
-            \cs_set_eq:NN \acsp \acpdfstringplural
-            \cs_set_eq:NN \aclp \acpdfstringlongplural
-            \cs_set_eq:NN \Aclp \acpdfstringlongplural
-            \cs_set_eq:NN \acfp \acpdfstringplural
-            \cs_set_eq:NN \Acfp \acpdfstringplural
-            \cs_set_eq:NN \acap \acpdfstringaltplural
-          }
-        \cs_set_protected:Npn \acro_hyper_page:n #1 { \hyperpage {#1} }
-      } {}
+        \__acro_pdfstring_indefinite:nn {#1} {long}
+        \acro_property_get:nn {#1} {long}
+      }
+    \acro_space:
+    ( \acro_property_get:nn {#1} {pdfstring} )
   }
 
-% --------------------------------------------------------------------------
-% key and order checking
-\msg_new:nnn {acro} {no-id}
+% long-short-plural
+\acro_pdfstring_template_new:nn {long-short-plural}
   {
-    Something~ has~ gone~ wrong,~ you've~ probably~ forgotten~ to~ set~ the~
-    acronym~ ID.
+    \__acro_pdfstring_plural:nn {#1} {long}
+    \acro_space:
+    ( \__acro_pdfstring_plural:nn {#1} {short} )
   }
 
-\msg_new:nnn {acro} {before-short}
+% Long-short-plural
+\acro_pdfstring_template_new:nn {Long-short-plural}
   {
-    You've~ set~ the~ property~ `#2'~ before~ the~ `short'~ property~ for~
-    acronym~ `#1'~ but~ it~ needs~ to~ be~ set~ after~ it.
+    \__acro_pdfstring_upper:n
+      { \__acro_pdfstring_plural:nn {#1} {long} }
+    \acro_space:
+    ( \__acro_pdfstring_plural:nn {#1} {short} )
   }
 
-\msg_new:nnn {acro} {missing}
-  { The~ `#2'~ property~ for~ acronym~ `#1'~ is~ missing. }
+% --------------------------------------------------------------------------
+% short-long
+\acro_pdfstring_template_new:nn {short-long}
+  {
+    \acro_property_get:nn {#1} {pdfstring}
+    \acro_space:
+    ( \acro_property_get:nn {#1} {long} )
+  }
 
-\msg_new:nnn {acro} {doubled-property}
+% indef-short-long
+\acro_pdfstring_template_new:nn {indef-short-long}
   {
-    It~ seems~ to~ me~ you~ have~ used~ the~ `#2'~ property~ twice~ in~ the~
-    declaration~ of~ acronym~ `#1'.~ If~ you~ haven't~ there's~
-    something~ different~ wrong~ and~ I'm~ lost.~ You~'re~ on~ your~ own~
-    then.
+    \__acro_pdfstring_indefinite:nn {#1} {short}
+    \acro_property_get:nn {#1} {pdfstring}
+    \acro_space:
+    ( \acro_property_get:nn {#1} {long} )
   }
 
-% #1: acronym
-% #2: property
-\cs_new_protected:Npn \__acro_property_check:nn #1#2
+% Short-long
+\acro_pdfstring_template_new:nn {Short-long}
   {
-    \str_if_empty:NT \l__acro_current_id_str
-      { \acro_serious_message:n {no-id} }
-    \str_if_eq:nnF {#2} {short}
-      {
-        \acro_property_if_set:nnF {#1} {short}
-          {
-            \keys_set:nn {acro/declare-acronym} { short = {#1} }
-            \acro_harmless_message:nn {substitute-short} {#1}
-          }
-      }
-    \acro_property_mark_set:nn {#1} {#2}
+    \__acro_pdfstring_upper:n
+      { \acro_property_get:nn {#1} {pdfstring} }
+    \acro_space:
+    ( \acro_property_get:nn {#1} {long} )
   }
 
-\cs_new_protected:Npn \__acro_first_property_check:nn #1#2
+% Indef-short-long
+\acro_pdfstring_template_new:nn {Indef-short-long}
   {
-    \cs_if_exist:cTF {l__acro_#1_short_set_bool}
+    \__acro_pdfstring_upper:n
       {
-         \acro_property_if_set:nnT {#1} {short}
-           { \acro_serious_message:nnn {doubled-property} {#1} {#2} }
+        \__acro_pdfstring_indefinite:nn {#1} {short}
+        \acro_property_get:nn {#1} {pdfstring}
       }
-      { \bool_new:c {l__acro_#1_short_set_bool} }
-    \acro_property_mark_set:nn {#1} {short}
+    \acro_space:
+    ( \acro_property_get:nn {#1} {long} )
   }
 
-% #1: ID
-% #2: property
-\prg_new_conditional:Npnn \acro_property_if_set:nn #1#2 {T,F,TF}
+% short-long-plural
+\acro_pdfstring_template_new:nn {short-long-plural}
   {
-    \bool_if:cTF {l__acro_#1_#2_set_bool}
-      { \prg_return_true: }
-      { \prg_return_false: }
+    \__acro_pdfstring_plural:nn {#1} {short}
+    \acro_space:
+    ( \__acro_pdfstring_plural:nn {#1} {long} )
   }
 
-% #1: ID
-% #2: property
-\cs_new_protected:Npn \acro_property_mark_set:nn #1#2
-  { \bool_set_true:c { l__acro_#1_#2_set_bool } }  
-\cs_generate_variant:Nn \acro_property_mark_set:nn {V}
+% Short-long-plural
+\acro_pdfstring_template_new:nn {Short-long-plural}
+  {
+    \__acro_pdfstring_upper:n
+      { \__acro_pdfstring_plural:nn {#1} {short} }
+    \acro_space:
+    ( \__acro_pdfstring_plural:nn {#1} {long} )
+  }
 
 % --------------------------------------------------------------------------
-% the internal property selection functions for \DeclareAcronym:
+% short
+\acro_pdfstring_template_new:nn {short}
+  { \acro_property_get:nn {#1} {pdfstring} }
 
-\cs_new_protected:Npn \acro_for_properties_do:n
-  { \prop_map_inline:Nn \g__acro_properties_prop }
+% indef-short
+\acro_pdfstring_template_new:nn {indef-short}
+  {
+    \__acro_pdfstring_indefinite:nn {#1} {short}
+    \acro_property_get:nn {#1} {pdfstring}
+  }
 
-% #1: name in associated cs
-% #2: property name
-% #3: action
-\cs_new_protected:Npn \acro_declare_property_generic:nnn #1#2#3
+% Short
+\acro_pdfstring_template_new:nn {Short}
   {
-    \prop_clear_new:c {l__acro_#1_prop}
-    \tl_clear_new:c {l__acro_#1_tl}
-    \cs_new_protected:cpn   {__acro_declare_#1:nn} ##1##2 {#3}
-    \cs_generate_variant:cn {__acro_declare_#1:nn} {V}
-    \keys_define:nn {acro/declare-acronym}
-      {
-        #2 .code:n =
-          \use:c {__acro_declare_#1:Vn} \l__acro_current_id_str {##1}
-          \acro_property_mark_set:Vn \l__acro_current_id_str {#2}
-      }
-    \prop_gput:Nnn \g__acro_properties_prop {#2} {#1}
+    \__acro_pdfstring_upper:n
+      { \acro_property_get:nn {#1} {pdfstring} }
   }
 
-% #1: name in associated cs
-% #2: property name
-% #3: action
-\cs_new_protected:Npn \acro_declare_property:nnn #1#2#3
+% Indef-short
+\acro_pdfstring_template_new:nn {Indef-short}
   {
-    \acro_declare_property_generic:nnn {#1} {#2}
+    \__acro_pdfstring_upper:n
       {
-        \__acro_property_check:nn {##1} {#2}
-        \prop_put:cnn {l__acro_#1_prop} {##1} {##2}
-        #3
+        \__acro_pdfstring_indefinite:nn {#1} {short}
+        \acro_property_get:nn {#1} {pdfstring}
       }
   }
 
-% #1: name in associated cs
-% #2: property name
-\cs_new_protected:Npn \acro_declare_property:nn #1#2
-  { \acro_declare_property:nnn {#1} {#2} {} }
-\cs_generate_variant:Nn \acro_declare_property:nn {V}
+% short-plural
+\acro_pdfstring_template_new:nn {short-plural}
+  { \__acro_pdfstring_plural:nn {#1} {short} }
 
-\cs_new_protected:Npn \acro_declare_property_simple:n #1
+% Short-plural
+\acro_pdfstring_template_new:nn {Short-plural}
   {
-    \tl_set:Nn \l__acro_tmpa_tl {#1}
-    \tl_replace_all:Nnn \l__acro_tmpa_tl {-} {_}
-    \acro_declare_property:Vn \l__acro_tmpa_tl {#1}
+    \__acro_pdfstring_upper:n
+      { \__acro_pdfstring_plural:nn {#1} {short} }
   }
 
-% #1: new alias property
-% #2: old property
-\cs_new_protected:Npn \acro_declare_property_alias:nn #1#2
+% --------------------------------------------------------------------------
+% alt
+\acro_pdfstring_template_new:nn {alt}
   {
-    \keys_define:nn {acro/declare-acronym}
-      { #1 .meta:n = { #2 = {##1} } }
+    \acro_property_get_if_set:nnF {#1} {alt}
+      { \acro_pdfstring_template:nn {#1} {short} }
   }
 
-% --------------------------------------------------------------------------
-% declare the properties for \DeclareAcronym:
-% short:
-\acro_declare_property_generic:nnn {short} {short}
+% indef-alt
+\acro_pdfstring_template_new:nn {indef-alt}
   {
-    \__acro_first_property_check:nn {#1} {short}
-    \prop_put:Nnn \l__acro_short_prop      {#1} {#2}
-    \prop_put:Nnn \l__acro_sort_prop       {#1} {#1}
-    \prop_put:Nnn \l__acro_index_sort_prop {#1} {#1}
-    \prop_put:Nnn \l__acro_alt_prop        {#1} {#2}
-    \prop_put:Nnn \l__acro_pdfstring_short_prop {#1} {#2}
-    \prop_put:Nnn \l__acro_pdfstring_alt_prop {#1} {#2}
-    \acro_for_endings_do:n
+    \acro_property_if_set:nnTF {#1} {alt}
       {
-        \prop_put:cnv {l__acro_short_##1_prop}
-          {#1} {l__acro_default_short_##1_tl}
-        \prop_put:cnx {l__acro_pdfstring_short_##1_prop}
-          {#1} { \exp_not:n {#2} \exp_not:v {l__acro_default_short_##1_tl} }
-        \prop_put:cnn {l__acro_short_##1_form_prop} {#1} {false}
-        \prop_put:cnv {l__acro_alt_##1_prop}
-          {#1} {l__acro_default_alt_##1_tl}
-        \prop_put:cnx {l__acro_pdfstring_alt_##1_prop}
-          {#1} { \exp_not:n {#2} \exp_not:v {l__acro_default_short_##1_tl} }
-        \prop_put:cnn {l__acro_alt_##1_form_prop} {#1} {false}
+        \__acro_pdfstring_indefinite:nn {#1} {alt}
+        \acro_property_get:nn {#1} {alt}
       }
-    \prop_put:NnV \l__acro_short_indefinite_prop
-      {#1} \l__acro_default_indefinite_tl
-    \prop_put:NnV \l__acro_alt_indefinite_prop
-      {#1} \l__acro_default_indefinite_tl
+      { \acro_pdfstring_template:nn {#1} {indef-short} }
   }
 
-% long:
-\acro_declare_property:nnn {long} {long}
+% Alt
+\acro_pdfstring_template_new:nn {Alt}
   {
-    \prop_put:NnV \l__acro_long_indefinite_prop
-      {#1}
-      \l__acro_default_indefinite_tl
-    \acro_for_endings_do:n
+    \acro_property_if_set:nnTF {#1} {alt}
       {
-        \prop_put:cnn {l__acro_long_##1_form_prop} {#1} {false}
-        \acro_property_if_set:nnF {#1} {long-##1}
-          { \prop_put:cnv {l__acro_long_##1_prop} {#1} {l__acro_default_long_##1_tl} }
-        \prop_put:cnn {l__acro_foreign_##1_form_prop} {#1} {false}
-        \acro_property_if_set:nnF {#1} {foreign-##1}
-          { \prop_put:cnv {l__acro_foreign_##1_prop} {#1} {l__acro_default_foreign_##1_tl} }
+        \__acro_pdfstring_upper:n
+          { \acro_property_get:nn {#1} {alt} }
       }
+      { \acro_pdfstring_template:nn {#1} {Short} }
   }
 
-\acro_declare_property_simple:n {first-style}
+% Indef-alt
+\acro_pdfstring_template_new:nn {Indef-alt}
+  {
+    \acro_property_if_set:nnTF {#1} {alt}
+      {
+        \__acro_pdfstring_upper:n
+          { \__acro_pdfstring_indefinite:nn {#1} {alt} }
+        \acro_property_get:nn {#1} {alt}
+      }
+      { \acro_pdfstring_template:nn {#1} {Indef-short} }
+  }
 
-% list:
-\acro_declare_property_simple:n {list}
+% alt-plural
+\acro_pdfstring_template_new:nn {alt-plural}
+  {
+    \acro_property_if_set:nnTF {#1} {alt}
+      { \__acro_pdfstring_plural:nn {#1} {alt} }
+      { \acro_pdfstring_template:nn {#1} {short-plural} }
+  }
 
-% defines `short-plural', `long-plural' and `long-plural-form' as well as the
-% options `plural-ending', `short-plural-ending' and `long-plural-ending':
-% \ProvideAcroEnding {plural} {s} {s}
+% Alt-plural
+\acro_pdfstring_template_new:nn {Alt-plural}
+  {
+    \acro_property_if_set:nnTF {#1} {alt}
+      {
+        \__acro_pdfstring_upper:n
+          { \__acro_pdfstring_plural:nn {#1} {alt} }
+      }
+      { \acro_pdfstring_template:nn {#1} {Short-plural} }
+  }
 
-% short indefinite article:
-\acro_declare_property_simple:n {short-indefinite}
+% --------------------------------------------------------------------------
+% long
+\acro_pdfstring_template_new:nn {long}
+  { \acro_property_get:nn {#1} {long} }
 
-% long indefinite article:
-\acro_declare_property_simple:n {long-indefinite}
+% indef-long
+\acro_pdfstring_template_new:nn {indef-long}
+  {
+    \__acro_pdfstring_indefinite:nn {#1} {long}
+    \acro_property_get:nn {#1} {long}
+  }
 
-% pre long:
-\acro_declare_property_simple:n {long-pre}
-
-% post long:
-\acro_declare_property_simple:n {long-post}
-
-% post:
-\acro_declare_property_simple:n {post}
-
-% sort:
-\acro_declare_property:nnn {sort} {sort}
+% Long
+\acro_pdfstring_template_new:nn {Long}
   {
-    \acro_property_if_set:nnF {#1} {index-sort}
-      { \prop_put:Nnn \l__acro_index_sort_prop {#1} {#2} }
+    \__acro_pdfstring_upper:n
+      { \acro_property_get:nn {#1} {long} }
   }
 
-% alternative:
-\acro_declare_property:nnn {alt} {alt}
+% Indef-long
+\acro_pdfstring_template_new:nn {Indef-long}
   {
-    \prop_put:Nnn \l__acro_pdfstring_alt_prop {#1} {#2}
-    \prop_put:NnV \l__acro_alt_indefinite_prop
-      {#1} \l__acro_default_indefinite_tl
+    \__acro_pdfstring_upper:n
+      {
+        \__acro_pdfstring_indefinite:nn {#1} {long}
+        \acro_property_get:nn {#1} {long}
+      }
   }
 
-\cs_set_protected:Npn \acro_alt_error:n #1
+% long-plural
+\acro_pdfstring_template_new:nn {long-plural}
+  { \__acro_pdfstring_plural:nn {#1} {long} }
+
+% Long-plural
+\acro_pdfstring_template_new:nn {Long-plural}
   {
-    \acro_property_if_set:nnF {#1} {alt} 
-      { \acro_harmless_message:nn {no-alternative} {#1} }
+    \__acro_pdfstring_upper:n
+      { \__acro_pdfstring_plural:nn {#1} {long} }
   }
 
-% alt. indefinite article:
-\acro_declare_property_simple:n {alt-indefinite}
+% --------------------------------------------------------------------------
+% first
+\acro_pdfstring_template_let:nn {first} {short}
 
-% foreign:
-\acro_declare_property_simple:n {foreign}
+% indef-first
+\acro_pdfstring_template_let:nn {indef-first} {indef-short}
 
-% foreign-lang:
-\acro_declare_property_simple:n {foreign-lang}
+% First
+\acro_pdfstring_template_let:nn {First} {Short}
 
-% format:
-\acro_declare_property_simple:n {format}
+% indef-first
+\acro_pdfstring_template_let:nn {Indef-first} {Indef-short}
 
-% short format:
-\acro_declare_property_alias:nn {short-format} {format}
+% first-plural
+\acro_pdfstring_template_let:nn {first-plural} {short-plural}
 
-% alt format:
-\acro_declare_property_simple:n {alt-format}
+% First-plural
+\acro_pdfstring_template_let:nn {First-plural} {Short-plural}
 
-% long format:
-\acro_declare_property_simple:n {long-format}
+% --------------------------------------------------------------------------
 
-% first long format:
-\acro_declare_property_simple:n {first-long-format}
-
-% pdfstring -- currently needs to be done `by hand':
-\cs_new_protected:Npn \__acro_declare_pdfstring:nw #1#2/#3/#4 \acro_stop:
+\acro_at_begin_document:n
   {
-    \__acro_property_check:nn {#1} {pdfstring}
-    \prop_put:Nnx \l__acro_pdfstring_short_prop {#1} {#2}
-    \acro_for_endings_do:n
+    \acro_package_if_loaded:nT {hyperref}
       {
-        \tl_if_blank:nTF {#4}
+        \pdfstringdefDisableCommands
           {
-            \prop_put:cnx {l__acro_pdfstring_short_##1_prop}
-              {#1} { \exp_not:n {#2} \exp_not:v {l__acro_default_short_##1_tl} }
+            \acro_set_pdf_cs:Nn \ac {first}
+            \acro_set_pdf_cs:Nn \iac {indef-first}
+            \acro_set_pdf_cs:Nn \Ac {First}
+            \acro_set_pdf_cs:Nn \Iac {Indef-first}
+            \acro_set_pdf_cs:Nn \acs {short}
+            \acro_set_pdf_cs:Nn \iacs {indef-short}
+            \acro_set_pdf_cs:Nn \Acs {Short}
+            \acro_set_pdf_cs:Nn \Iacs {Indef-short}
+            \acro_set_pdf_cs:Nn \acl {long}
+            \acro_set_pdf_cs:Nn \iacl {indef-long}
+            \acro_set_pdf_cs:Nn \Acl {Long}
+            \acro_set_pdf_cs:Nn \Iacl {Indef-long}
+            \acro_set_pdf_cs:Nn \aca {alt}
+            \acro_set_pdf_cs:Nn \iaca {indef-alt}
+            \acro_set_pdf_cs:Nn \Aca {Alt}
+            \acro_set_pdf_cs:Nn \Iaca {Indef-alt}
+
+            \acro_set_pdf_cs:Nn \acp {first-plural}
+            \acro_set_pdf_cs:Nn \Acp {First-plural}
+            \acro_set_pdf_cs:Nn \acsp {short-plural}
+            \acro_set_pdf_cs:Nn \Acsp {Short-plural}
+            \acro_set_pdf_cs:Nn \aclp {long-plural}
+            \acro_set_pdf_cs:Nn \Aclp {Long-plural}
+            \acro_set_pdf_cs:Nn \acap {alt-plural}
+            \acro_set_pdf_cs:Nn \Acap {Alt-plural}
+            \cs_set_eq:NN \acro_format:nnn \use_iii:nnn
+            \cs_set:Npn \@ {}
           }
-          {
-            \prop_put:cnn {l__acro_pdfstring_short_##1_prop}
-              {#1} {#2#3}
-          }
-      }
+        \cs_set_protected:Npn \acro_hyper_page:n #1 { \hyperpage {#1} }
+      } {}
   }
-\cs_generate_variant:Nn \__acro_declare_pdfstring:nw {V}
+
+% ----------------------------------------------------------------------------
+\AcroModuleEnd
+\AcroModule{definitions}{definitions of user commands}
+
+% --------------------------------------------------------------------------
+% commands for typesetting acronyms:
+\NewAcroCommand \ac {m}
+  { \UseAcroTemplate {first} {#1} }
+\NewAcroCommand \acp {m}
+  { \acroplural \UseAcroTemplate {first} {#1} }
+\NewAcroCommand \iac {m}
+  { \acroindefinite \UseAcroTemplate {first} {#1} }
+\NewAcroCommand \Ac {m}
+  { \acroupper \UseAcroTemplate {first} {#1} }
+\NewAcroCommand \Acp {m}
+  { \acroplural \acroupper \UseAcroTemplate {first} {#1} }
+\NewAcroCommand \Iac {m}
+  { \acroupper \acroindefinite \UseAcroTemplate {first} {#1} }
+
+\NewAcroCommand \acs {m}
+  { \UseAcroTemplate {short} {#1} }
+\NewAcroCommand \acsp {m}
+  { \acroplural \UseAcroTemplate {short} {#1} }
+\NewAcroCommand \iacs {m}
+  { \acroindefinite \UseAcroTemplate {short} {#1} }
+\NewAcroCommand \Acs {m}
+  { \acroupper \UseAcroTemplate {short} {#1} }
+\NewAcroCommand \Acsp {m}
+  { \acroplural \acroupper \UseAcroTemplate {short} {#1} }
+\NewAcroCommand \Iacs {m}
+  { \acroupper \acroindefinite \UseAcroTemplate {short} {#1} }
   
-\keys_define:nn {acro/declare-acronym}
+\NewAcroCommand \acl {m}
+  { \UseAcroTemplate {long} {#1} }
+\NewAcroCommand \aclp {m}
+  { \acroplural \UseAcroTemplate {long} {#1} }
+\NewAcroCommand \iacl {m}
+  { \acroindefinite \UseAcroTemplate {long} {#1} }
+\NewAcroCommand \Acl {m}
+  { \acroupper \UseAcroTemplate {long} {#1} }
+\NewAcroCommand \Aclp {m}
+  { \acroplural \acroupper \UseAcroTemplate {long} {#1} }
+\NewAcroCommand \Iacl {m}
+  { \acroupper \acroindefinite \UseAcroTemplate {long} {#1} }
+
+\NewAcroCommand \aca {m}
+  { \UseAcroTemplate {alt} {#1} }
+\NewAcroCommand \acap {m}
+  { \acroplural \UseAcroTemplate {alt} {#1} }
+\NewAcroCommand \iaca {m}
+  { \acroindefinite \UseAcroTemplate {alt} {#1} }
+\NewAcroCommand \Aca {m}
+  { \acroupper \UseAcroTemplate {alt} {#1} }
+\NewAcroCommand \Acap {m}
+  { \acroplural \acroupper \UseAcroTemplate {alt} {#1} }
+\NewAcroCommand \Iaca {m}
+  { \acroupper \acroindefinite \UseAcroTemplate {alt} {#1} }
+
+\NewAcroCommand \acf {m}
+  { \acrofull \UseAcroTemplate {first} {#1} }
+\NewAcroCommand \acfp {m}
+  { \acrofull \acroplural \UseAcroTemplate {first} {#1} }
+\NewAcroCommand \iacf {m}
+  { \acrofull \acroindefinite \UseAcroTemplate {first} {#1} }
+\NewAcroCommand \Acf {m}
+  { \acrofull \acroupper \UseAcroTemplate {first} {#1} }
+\NewAcroCommand \Acfp {m}
+  { \acrofull \acroplural \acroupper \UseAcroTemplate {first} {#1} }
+\NewAcroCommand \Iacf {m}
+  { \acrofull \acroupper \acroindefinite \UseAcroTemplate {first} {#1} }
+
+\NewAcroCommand \acshow {m}
+  { \acrodonotuse \UseAcroTemplate {show} {#1} }
+
+% --------------------------------------------------------------------------
+\DeclareAcroEnding {plural} {s} {s}
+
+\DeclareAcroArticle {indefinite} {a}
+
+\ProvideExpandableDocumentCommand \nospace {} {}
+
+% --------------------------------------------------------------------------
+% acronym templates:
+\NewAcroTemplate {long-short}
   {
-    pdfstring    .code:n =
-      \__acro_declare_pdfstring:Vw \l__acro_current_id_str #1 // \acro_stop:
+    \acroiffirstTF
+      {
+        \acrowrite {long}
+        \acspace
+          (
+            \acroifT {foreign} { \acrowrite {foreign} ,~ }
+            \acrowrite {short}
+            \acroifT {alt} { ~ \acrotranslate {or} ~ \acrowrite {alt} }
+            \acrogroupcite
+          )
+      }
+      { \acrowrite {short} }
   }
 
-\cs_new_protected:Npn \__acro_declare_pdfstring_alt:nw #1#2/#3/#4 \acro_stop:
+\NewAcroTemplate {short-long}
   {
-    \__acro_property_check:nn {#1} {pdfstring-alt}
-    \prop_put:Nnn \l__acro_pdfstring_alt_prop {#1} {#2}
-    \acro_for_endings_do:n
+    \acrowrite {short}
+    \acroiffirstT
       {
-        \tl_if_empty:nTF {#3}
-          {
-            \prop_put:cnx {l__acro_pdfstring_alt_##1_prop}
-              {#1} { \exp_not:n {#2} \exp_not:v {l__acro_default_alt_##1_tl} }
-          }
-          { \prop_put:cnn {l__acro_pdfstring_alt_##1_prop} {#1} {#2#3} }
+        \space
+          (
+            \acroifT {alt} { \acrotranslate {or} ~ \acrowrite {alt} ~ }
+            \acroifT {foreign} { \acrowrite {foreign} :~ }
+            \acrowrite {long}
+            \acrogroupcite
+          )
       }
   }
-\cs_generate_variant:Nn \__acro_declare_pdfstring_alt:nw {V}
   
-\keys_define:nn {acro/declare-acronym}
+\NewAcroTemplate {footnote}
   {
-    pdfstring-alt .code:n =
-      \__acro_declare_pdfstring_alt:Vw \l__acro_current_id_str #1 // \acro_stop:
+    \acrowrite {short}
+    \acroiffirstT
+      {
+        \acfootnote
+          {
+            \acroifT {alt} { \acrotranslate {or} ~ \acrowrite {alt} :~ }
+            \acroifT {foreign} { \acrowrite {foreign} ,~ }
+            \acrowrite {long}
+            \acrogroupcite
+          }
+      }
   }
-  
-% class:
-\acro_declare_property_simple:n {class}
 
-% extra information:
-\acro_declare_property_simple:n {extra}
+\NewAcroTemplate {long}
+  { \acrowrite {long} }
 
-% single appearances:
-\acro_declare_property_simple:n {single}
+\NewAcroTemplate {short}
+  { \acrowrite {short} }
 
-% single format:
-\acro_declare_property_simple:n {single-format}
+\NewAcroTemplate {alt}
+  {
+    \acroifTF {alt}
+      { \acrowrite {alt} }
+      { \acrowrite {short} }
+  }
 
-% acc supp:
-\acro_declare_property:nn {acc_supp} {accsupp}
+\NewAcroTemplate {show}
+  {
+    \iow_term:n {}
+    \iow_term:x
+      {
+        The~ acronym~ `\AcronymID'~ has~ the~ properties~ (without~ outer~
+        braces):
+      }
+    \iow_term:n {}
+    \AcroPropertiesMap { \acroshow {##1} }
+    \iow_term:n {}
+  }
 
-% tooltip:
-\acro_declare_property_simple:n {tooltip}
+% --------------------------------------------------------------------------
+% heading templates:
+\NewAcroTemplate[heading] {none} { }
 
-% before-citation:
-\acro_declare_property_simple:n {before-citation}
+\NewAcroTemplate[heading] {section}
+  { \section { \acrolistname } }
 
-% after-citation:
-\acro_declare_property_simple:n {after-citation}
+\NewAcroTemplate[heading] {section*}
+  { \section* { \acrolistname } }
 
-% citation -- this needs a bit more work:
-\cs_new_protected:Npn \__acro_declare_citation:nw #1#2[#3]#4[#5]#6#7 \acro_stop:
+\acro_if_komascript:T
   {
-    % no options: #1: ID, #2: property, #7 is blank
-    % 1 option:   #1: ID, #4: property, #3: option, #5: \q_no_value
-    % 2 options:  #1: ID: #6: property, #3: first option, #5: second option
-    \tl_if_blank:nTF {#7}
+    \NewAcroTemplate[heading] {addsec}
+      { \addsec { \acrolistname } }
+  }
+  
+\cs_if_exist:NT \chapter
+  {
+    \NewAcroTemplate[heading] {chapter}
+      { \chapter { \acrolistname } }
+    \NewAcroTemplate[heading] {chapter*}
+      { \chapter* { \acrolistname } }
+    \acro_if_komascript:T
       {
-        \__acro_declare_citation_aux:nnnn {#1}
-          { \q_no_value }
-          { \q_no_value }
-          {#2}
+        \NewAcroTemplate[heading] {addchap}
+        { \addchap { \acrolistname } }
       }
+  }
+
+% --------------------------------------------------------------------------
+% list templates:
+\NewAcroTemplate[list] {description}
+  {
+    \acroheading
+    \acropreamble
+    \begin {description}
+      \acronymsmapF
+        {
+          \item [ \acrowrite {short} \acroifT {alt} { / \acrowrite {alt} } ]
+            \acrowrite {list}
+            \acroifanyT {foreign,extra} {~(}
+            \acroifT {foreign}
+              {
+                \acrowrite {foreign}
+                \acroifT {extra} {,~}
+              }
+            \acroifT {extra}
+              { \acrowrite {extra} }
+            \acroifanyT {foreign,extra} {)}
+            \acropagefill
+            \acropages
+              { \acrotranslate {page} \nobreakspace }
+              { \acrotranslate {pages} \nobreakspace }
+        }
+        { \item \AcroRerun }
+    \end {description}
+  }
+
+\NewAcroTemplate[list] {tabular}
+  {
+    \AcroNeedPackage {array}
+    \acronymsmapF
       {
-        \quark_if_no_value:nTF {#5}
+        \AcroAddRow
           {
-            \__acro_declare_citation_aux:nnnx {#1}
-              { \q_no_value }
-              {#3}
-              { \tl_head:n {#4} }
+            \acrowrite {short}
+            \acroifT {alt} { / \acrowrite {alt} }
+            &
+            \acrowrite {list}
+            \acroifanyT {foreign,extra} {~(}
+            \acroifT {foreign}
+              {
+                \acrowrite {foreign}
+                \acroifT {extra} {,~}
+              }
+            \acroifT {extra}
+              { \acrowrite {extra} }
+            \acroifanyT {foreign,extra} {)}
+            \acropagefill
+            \acropages
+              { \acrotranslate {page} \nobreakspace }
+              { \acrotranslate {pages} \nobreakspace }
+            \tabularnewline
           }
-          { \__acro_declare_citation_aux:nnnn {#1} {#3} {#5} {#6} }
       }
+      { \AcroRerun }
+    \acroheading
+    \acropreamble
+    \par \noindent
+    \begin {tabular} {>{\bfseries}lp{.7\linewidth}}
+      \AcronymTable
+    \end {tabular}
   }
-\cs_generate_variant:Nn \__acro_declare_citation:nw {V}
 
-\keys_define:nn {acro/declare-acronym}
+\NewAcroTemplate[list] {longtable}
   {
-    cite .code:n =
-      \__acro_declare_citation:Vw
-        \l__acro_current_id_str #1 [\q_no_value][\q_no_value] \scan_stop: \acro_stop:
+    \AcroNeedPackage {array}
+    \AcroNeedPackage {longtable}
+    \acronymsmapF
+      {
+        \AcroAddRow
+          {
+            \acrowrite {short}
+            \acroifT {alt} { / \acrowrite {alt} }
+            &
+            \acrowrite {list}
+            \acroifanyT {foreign,extra} {~(}
+            \acroifT {foreign}
+              {
+                \acrowrite {foreign}
+                \acroifT {extra} {,~}
+              }
+            \acroifT {extra}
+              { \acrowrite {extra} }
+            \acroifanyT {foreign,extra} {)}
+            \acropagefill
+            \acropages
+              { \acrotranslate {page} \nobreakspace }
+              { \acrotranslate {pages} \nobreakspace }
+            \tabularnewline
+          }
+      }
+      { \AcroRerun }  
+    \acroheading
+    \acropreamble
+    \par \noindent
+    \begin {longtabu} {>{\bfseries}lp{.7\linewidth}}
+      \AcronymTable
+    \end {longtabu}
   }
-\prop_gput:Nnn \g__acro_properties_prop {cite} {cite}
   
-% #1: ID
-% #2: pre
-% #3: post
-% #4: citation key
-\cs_new_protected:Npn \__acro_declare_citation_aux:nnnn #1#2#3#4
+\NewAcroTemplate[list] {longtabu}
   {
-    \__acro_property_check:nn {#1} {cite}
-    \prop_put:Nnn \l__acro_citation_prop {#1} {#4}
-    \quark_if_no_value:nF {#2}
-      { \prop_put:Nnn \l__acro_citation_pre_prop {#1} {#2} }
-    \quark_if_no_value:nF {#3}
-      { \prop_put:Nnn \l__acro_citation_post_prop {#1} {#3} }
+    \AcroNeedPackage {array}
+    \AcroNeedPackage {longtable}
+    \AcroNeedPackage {tabu}
+    \acronymsmapF
+      {
+        \AcroAddRow
+          {
+            \acrowrite {short}
+            \acroifT {alt} { / \acrowrite {alt} }
+            &
+            \acrowrite {list}
+            \acroifanyT {foreign,extra} {~(}
+            \acroifT {foreign}
+              {
+                \acrowrite {foreign}
+                \acroifT {extra} {,~}
+              }
+            \acroifT {extra}
+              { \acrowrite {extra} }
+            \acroifanyT {foreign,extra} {)}
+            \acropagefill
+            \acropages
+              { \acrotranslate {page} \nobreakspace }
+              { \acrotranslate {pages} \nobreakspace }
+            \tabularnewline
+          }
+      }
+      { \AcroRerun }
+    \acroheading
+    \acropreamble
+    \par \noindent
+    \begin {longtabu} {>{\bfseries}lX[l]}
+      \AcronymTable
+    \end {longtabu}
   }
-\cs_generate_variant:Nn \__acro_declare_citation_aux:nnnn {nnnx}
-  
-% TODO:
-% add index entries, by default \index{<sort>@<short>}
-% index: overwrite default <sort>@<short> entry completely
-% index-sort: overwrite the <sort> part of <sort>@<short> entry
 
-% need to take care of custom index cmd, at least
-%  - \index{}
-%  - \index[]{}
-% question is, though, if it should be the same one for all acronyms?
-% I go for yes but would also add a `post' property that allows to add arbitrary
-% TeX code after an acronym is typeset
+\NewAcroTemplate [list] {lof}
+  {
+    \acroheading
+    \acropreamble
+    \acronopagerange
+    \let\l at acro\l at figure
+    \acronymsmapF
+      {
+        \contentsline {acro}
+          {
+            \numberline
+              { \acrowrite {short} \acroifT {alt} { / \acrowrite {alt} } }
+              {
+                \acrowrite {list}
+                \acroifT {foreign}
+                  { \acrowrite {foreign} \acroifT {extra} {,~} }
+                \acroifT {extra} { \acrowrite {extra} }
+                \acroifanyT {foreign,extra} {)}
+              }
+          }
+          { \acropages {} {} }
+          {}
+      }
+      { \AcroRerun }
+  }
 
-% index:
-\acro_declare_property_simple:n {index}
-
-% index-sort:
-\acro_declare_property_simple:n {index-sort}
-
-% index-cmd:
-\acro_declare_property_simple:n {index-cmd}
-
-% --------------------------------------------------------------------------
-% acronym macros:
-\cs_new_protected:Npn \__acro_define_acronym_macro:n #1
+\NewAcroTemplate [list] {toc}
   {
-    \bool_if:NT \l__acro_create_macros_bool
+    \acroheading
+    \acropreamble
+    \acronopagerange
+    \acronymsmapF
       {
-        \cs_if_exist:cTF {#1}
+        \contentsline { \acroifchapterTF {chapter} {section} }
+          { \acrowrite {short} \acroifT {alt} { / \acrowrite {alt} } }
+          {}{}
+        \contentsline { \acroifchapterF {sub} section }
           {
-            \bool_if:NTF \l__acro_strict_bool
-              { \cs_set:cpn {#1} { \ac {#1} \acro_xspace: } }
-              { \acro_serious_message:nn {macro} {#1} }
+            \acrowrite {list}
+            \acroifT {foreign}
+              { \acrowrite {foreign} \acroifT {extra} {,~} }
+            \acroifT {extra} { \acrowrite {extra} }
+            \acroifanyT {foreign,extra} {) }
           }
-          { \cs_new:cpn {#1} { \ac {#1} \acro_xspace: } }
+          { \acropages {} {} }
+          {}
       }
+      { \AcroRerun }
   }
 
 % --------------------------------------------------------------------------
-% internal acronym declaring function:
-\cs_new_protected:Npn \acro_declare_acronym:nn #1#2
-  { \acro_case_insensitive:Nnn \__acro_declare_acronym:nn {#1} {#2} }
+% translations:
+% list name
+\DeclareAcroTranslation {list-name}
+  {
+    Fallback   = Acronyms ,
+    English    = Acronyms ,
+    French     = Acronymes ,
+    German     = Abk\"urzungen ,
+    Italian    = Acronimi ,
+    Portuguese = Acr\'onimos ,
+    Spanish    = Siglas ,
+    Catalan    = Sigles
+  }
 
-\cs_new_protected:Npn \__acro_declare_acronym:nn #1#2
+% page name
+\DeclareAcroTranslation {page}
   {
-    \seq_gput_right:Nn \g__acro_declared_acronyms_seq {#1}
-    \bool_gset_true:N \g__acro_first_acronym_declared_bool
-    \str_set:Nn \l__acro_current_id_str {#1}
-    \acro_for_properties_do:n
-      { \bool_new:c {l__acro_ \l__acro_current_id_str _##1_set_bool} }
-    \keys_set:nn {acro/declare-acronym} {#2}
-    \bool_new:c {g__acro_#1_first_use_bool}
-    \bool_new:c {g__acro_#1_used_bool}
-    \bool_new:c {g__acro_#1_label_bool}
-    \bool_new:c {g__acro_#1_in_list_bool}
-    \seq_new:c  {g__acro_#1_barriers_seq}
-    \seq_new:c  {g__acro_#1_recorded_barriers_seq}
-    \bool_if:NF \l__acro_print_only_used_bool
-      { \bool_gset_true:c {g__acro_#1_in_list_bool} }
-    \__acro_create_page_records:n {#1}
-    \__acro_define_acronym_macro:n {#1}
-    \str_clear:N \l__acro_current_id_str
-    \acro_property_if_set:nnF {#1} {short}
-      { \acro_serious_message:nnn {missing} {#1} {short} }
-    \acro_property_if_set:nnF {#1} {long}
-      { \acro_serious_message:nnn {missing} {#1} {long} }
-    \__acro_log_acronym:n {#1}
+    Fallback   = p\abbrdot ,
+    English    = p\abbrdot ,
+    French     = p\abbrdot ,
+    German     = S\abbrdot ,
+    Italian    = p\abbrdot ,
+    Portuguese = p\abbrdot ,
+    Spanish    = p\'ag\abbrdot ,
+    Catalan    = p\`ag\abbrdot
   }
 
-  
-% --------------------------------------------------------------------------
-% print the list:
-% #1: list of classes
-% #2: list of excluded classes
-\keys_define:nn {acro/print-acronyms}
+% pages name
+\DeclareAcroTranslation {pages}
   {
-    include-classes   .tl_set:N   = \l__acro_included_classes_tl ,
-    exclude-classes   .tl_set:N   = \l__acro_excluded_classes_tl ,
-    name              .tl_set:N   = \l__acro_list_name_tl ,
-    heading           .code:n     = \__acro_set_list_heading:n {#1} ,
-    sort              .bool_set:N = \l__acro_sort_bool ,
-    local-to-barriers .bool_set:N = \l__acro_use_barrier_bool
+    Fallback   = pp\abbrdot ,
+    English    = pp\abbrdot ,
+    French     = pp\abbrdot ,
+    German     = S\abbrdot ,
+    Italian    = pp\abbrdot ,
+    Portuguese = pp\abbrdot ,
+    Spanish    = p\'ags\abbrdot ,
+    Catalan    = p\`ag\abbrdot
   }
 
-\cs_new_protected:Npn \acro_print_acronyms:n #1
+% following page
+\DeclareAcroTranslation {sequens}
   {
-    \group_begin:
-      % this is a cheap trick to prevent the \@noitemerr
-      % if one forgot to delete either the aux file or
-      % remove \printacronyms -- but it's local:
-      \cs_set:Npn \@noitemerr {}
-      \tl_clear:N \l__acro_included_classes_tl
-      \tl_clear:N \l__acro_excluded_classes_tl
-      \tl_if_blank:nF {#1}
-        { \keys_set:nn {acro/print-acronyms} {#1} }
-      \__acro_aux_file_now:n { \acro at print@list }
-      \bool_if:NT \l__acro_sort_bool
-        { \acro_sort_prop:NN \l__acro_short_prop \l__acro_sort_prop }
-      \acro_title_instance:VV
-        \l__acro_list_heading_cmd_tl
-        \l__acro_list_name_tl
-      \cs_if_exist:NTF \acro at printed@list
-        {
-          \acro_list_instance:VVV
-            \l__acro_list_instance_tl
-            \l__acro_included_classes_tl
-            \l__acro_excluded_classes_tl
-        }
-        { \@latex at warning@no at line {Rerun~to~get~acronym~list~right} }
-    \group_end:
+    Fallback   = f\abbrdot ,
+    English    = f\abbrdot ,
+    French     = sq\abbrdot ,
+    German     = f\abbrdot ,
+    Italian    = s\abbrdot ,
+    Portuguese = s\abbrdot ,
+    Spanish    = s\abbrdot ,
+    Catalan    = seq\abbrdot
   }
 
-% --------------------------------------------------------------------------
-% language support
-\RequirePackage {translations}
+% following pages
+\DeclareAcroTranslation {sequentes}
+  {
+    Fallback   = ff\abbrdot ,
+    English    = ff\abbrdot ,
+    French     = sqq\abbrdot ,
+    German     = ff\abbrdot ,
+    Italian    = ss\abbrdot ,
+    Portuguese = ss\abbrdot ,
+    Spanish    = ss\abbrdot ,
+    Catalan    = et seq\abbrdot
+  }
 
-\cs_new_protected:Npn \__acro_declare_translation:www #1 \q_mark #2=#3 \q_stop
+% also
+\DeclareAcroTranslation {also}
   {
-    \tl_set:Nx \l__acro_tmpa_tl { \tl_trim_spaces:n {#1} }
-    \tl_set:Nx \l__acro_tmpb_tl { \tl_trim_spaces:n {#2} }
-    \tl_if_in:nnT {#3} {=}
-      {} % TODO: misplaced equal sign
-    \tl_set:Nx \l__acro_tmpc_tl { \tl_trim_spaces:n {#3} }
-    \__acro_declare_translation:VVV
-      \l__acro_tmpb_tl
-      \l__acro_tmpa_tl
-      \l__acro_tmpc_tl
+    Fallback   = also ,
+    English    = also ,
+    French     = aussi ,
+    German     = auch ,
+    Italian    = anche ,
+    Portuguese = tamb\'{e}m ,
+    Spanish    = tambien ,
+    Catalan    = tamb\'{e}
   }
 
-% #1: key
-% #2: lang
-% #3: translation
-\cs_new_protected:Npn \__acro_declare_translation:nnn #1#2#3
-  { \DeclareTranslation {#1} {#2} {#3} }
-\cs_generate_variant:Nn \__acro_declare_translation:nnn {VVV}
+% or
+\DeclareAcroTranslation {or}
+  {
+    Fallback   = or ,
+    English    = or ,
+    French     = ou ,
+    German     = oder ,
+    Italian    = o ,
+    Portuguese = ou ,
+    Spanish    = o ,
+    Catalan    = o
+  }
 
-% #1: key
-% #2: csv list: { <lang1> = <translation1> , <lang2> = <translation2> }
-\cs_new_protected:Npn \acro_declare_translation:nn #1#2
+% and
+\DeclareAcroTranslation {and}
   {
-    \clist_map_inline:nn {#2}
+    Fallback   = and ,
+    English    = and ,
+    French     = et ,
+    German     = und ,
+    Italian    = e ,
+    Portuguese = e ,
+    Spanish    = y ,
+    Catalan    = i
+  }
+
+% --------------------------------------------------------------------------  
+\AcroModuleEnd
+\AcroModule{upgrade}{ease upgrading from version 2}
+
+% ----------------------------------------------------------------------------
+\msg_new:nnn {acro} {deprecated}
+  {
+    On~ line~ \msg_line_number: : \\
+    The~ #1~ `#2'~ is~ deprecated.~ Use~ #1~ `#3'~ instead .
+  }
+
+\msg_new:nnn {acro} {deprecated-function}
+  { The~ command~ #1~ is~ deprecated.~ Use~ #2 instead . }
+
+\msg_new:nnn {acro} {removed-function}
+  { The~ command~ #1~ has~ been~ removed. }
+
+\msg_new:nnn {acro} {removed}
+  {
+    On~ line~ \msg_line_number: : \\
+    The~ #1~ `#2'~ has~ been~ removed~ from~ acro. \\
+    If~ you~ need~ it~ back~ please~ open~ an~ issue~ on~ \\
+    https://github.com/cgnieder/acro/issues
+    \tl_if_blank:nF {#3} { \\ #3 }
+  }
+
+% ----------------------------------------------------------------------------
+% #1: type
+% #2: old
+% #3: new
+\cs_new_protected:Npn \__acro_deprecation_warning:nnn #1#2#3
+  { \msg_warning:nnnnn {acro} {deprecated} {#1} {#2} {#3} }
+\cs_generate_variant:Nn \__acro_deprecation_warning:nnn {nne,nV}
+
+\acro_attribute_new:n {deprecated}
+\acro_attribute_new:n {removed}
+
+\prg_new_conditional:Npnn \acro_if_deprecated:n #1 {p,T,F,TF}
+  {
+    \acro_attribute_if_set:nnTF {deprecated} {#1}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+\prg_new_conditional:Npnn \acro_if_removed:n #1 {p,T,F,TF}
+  {
+    \acro_attribute_if_set:nnTF {removed} {#1}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+% #1: old
+% #2: new
+\cs_new_protected:Npn \acro_deprecate:nn #1#2
+  { \acro_attribute_set:nnn {deprecated} {#1} {#2} }
+
+% #1: old
+\cs_new_protected:Npn \acro_remove:n #1
+  { \acro_attribute_set:nnn {removed} {#1} {} }
+
+% #1: type
+% #2: old
+\cs_new_protected:Npn \acro_deprecation_warning:nn #1#2
+  {
+    \__acro_deprecation_warning:nne
+      {#1}
+      {#2}
+      { \acro_attribute_get:nn {deprecated} {#2} }
+  }
+
+% #1: type
+% #2: old
+% #3: additional text
+\cs_new_protected:Npn \acro_removal_warning:nnn #1#2#3
+  { \msg_warning:nnnnn {acro} {removed} {#1} {#2} {#3} }
+\cs_generate_variant:Nn \acro_removal_warning:nnn {nV}
+
+% #1: type
+% #2: old
+\cs_new_protected:Npn \acro_removal_warning:nn #1#2
+  { \msg_warning:nnnn {acro} {removed} {#1} {#2} }
+\cs_generate_variant:Nn \acro_removal_warning:nn {nV}
+
+% ----------------------------------------------------------------------------
+% #1: id
+% #2: property
+% #3: value
+\cs_set_protected:Npn \__acro_property_set:nnn #1#2#3
+  {
+    \acro_if_deprecated:nT {#2}
       {
-        \tl_if_blank:nF {##1}
-          { \__acro_declare_translation:www #1 \q_mark ##1 \q_stop }
+        \acro_deprecation_warning:nn {property} {#2}
+        \__acro_property_remove_from_auxlist:ne {#1}
+          { \acro_attribute_get:nn {deprecated} {#2} }
+        \__acro_auxlist_add:en
+          { \acro_attribute_get:nn {deprecated} {#2} }
+          {#1=={#3}}
+        \acro_attribute_set:enn
+          { \acro_attribute_get:nn {deprecated} {#2} }
+          {#1} {#3}
       }
+    \acro_if_removed:nT {#2}
+      { \acro_removal_warning:nn {property} {#2} }
+    \bool_lazy_and:nnT
+      { ! \acro_if_deprecated_p:n {#2} }
+      { ! \acro_if_removed_p:n {#2} }
+      {
+        \__acro_property_remove_from_auxlist:nn {#1} {#2}
+        \__acro_auxlist_add:nn {#2} {#1=={#3}}
+        \acro_attribute_set:nnn {#2} {#1} {#3}
+      }
   }
 
-% tokenlists using the translations:
-\tl_set:Nn \l__acro_list_name_tl  { \GetTranslation {acronym-list-name} }
-\tl_set:Nn \l__acro_page_name_tl  { \GetTranslation {acronym-page-name}\@\, }
-\tl_set:Nn \l__acro_pages_name_tl { \GetTranslation {acronym-pages-name}\@\, }
-\tl_set:Nn \l__acro_next_page_tl  { \,\GetTranslation {acronym-next-page}\@ }
-\tl_set:Nn \l__acro_next_pages_tl { \,\GetTranslation {acronym-next-pages}\@ }
+\cs_generate_variant:Nn \acro_attribute_set:nnn {e}
+\cs_generate_variant:Nn \__acro_auxlist_add:nn {e}
+\cs_generate_variant:Nn \__acro_property_remove_from_auxlist:nn {ne}
 
-% --------------------------------------------------------------------------
-% definition file:
-\tl_const:Nn \c_acro_definition_file_name_tl      {acro.definitions}
-\tl_const:Nn \c_acro_definition_file_extension_tl {tex}
+% #1: old
+% #2: new
+\cs_new_protected:Npn \acro_deprecated_property:nn #1#2
+  {
+    \acro_deprecate:nn {#1} {#2}
+    \acro_property_declare:nnnnn
+      { \c_false_bool }
+      { \c_false_bool }
+      { \c_false_bool }
+      { \c_false_bool }
+      {#1}
+  }
 
-\file_if_exist:nTF
-  { \c_acro_definition_file_name_tl .\c_acro_definition_file_extension_tl }
+% #1: old
+\cs_new_protected:Npn \acro_removed_property:n #1
   {
-    \@onefilewithoptions
-      {\c_acro_definition_file_name_tl} [] []
-      \c_acro_definition_file_extension_tl
+    \acro_remove:n {#1}
+    \acro_property_declare:nnnnn
+      { \c_false_bool }
+      { \c_false_bool }
+      { \c_false_bool }
+      { \c_false_bool }
+      {#1}
   }
-  { \acro_serious_message:n {definitions-missing} }
 
-% --------------------------------------------------------------------------
-% allow for a configuration file:
+% ----------------------------------------------------------------------------
+% #1: old
+% #2: new
+\cs_new_protected:Npn \acro_deprecate_function:NN #1#2
+  {
+    \cs_set_protected:Npn #1
+      {
+        \msg_error:nnnn {acro} {deprecated-function} {#1} {#2}
+        #2
+      }
+  }
 
-\file_if_exist:nT
-  { \l_acro_config_file_name_tl . \l_acro_config_file_extension_tl }
+% #1: old
+\cs_new_protected:Npn \acro_remove_function:N #1
   {
-    \@onefilewithoptions
-      {\l_acro_config_file_name_tl} [] []
-      \l_acro_config_file_extension_tl
+    \cs_set_protected:Npn #1
+      { \msg_error:nnn {acro} {removed-function} {#1} }
   }
 
+% ----------------------------------------------------------------------------
+% #1: new
+% #2: value
+\cs_new_protected:Npn \acro_deprecate_option:nn #1#2
+  {
+    \__acro_deprecation_warning:nVn {option} \l_keys_key_str {#1}
+    \keys_set:nn {acro} { #1 = #2 }
+  }
+
+% #1: additional text
+\cs_new_protected:Npn \acro_remove_option:n #1
+  { \acro_removal_warning:nVn {option} \l_keys_key_str {#1} }
+
+\cs_new_protected:Npn \acro_remove_option:
+  { \acro_removal_warning:nV {option} \l_keys_key_str }
+
+% ----------------------------------------------------------------------------
+% old properties:
+\acro_deprecated_property:nn {accsupp} {short-acc}
+\acro_deprecated_property:nn {tooltip} {pdfcomment}
+\acro_deprecated_property:nn {class} {tag}
+\acro_deprecated_property:nn {foreign-lang} {foreign-babel}
+
+\acro_removed_property:n {long-pre}
+\acro_removed_property:n {after-citation}
+\acro_removed_property:n {index-cmd}
+
+% ----------------------------------------------------------------------------
+% old functions
+\acro_remove_function:N \acflike
+\acro_remove_function:N \acfplike
+\acro_remove_function:N \acsingle
+\acro_remove_function:N \Acsingle
+\acro_remove_function:N \acpsingle
+\acro_remove_function:N \Acpsingle
+
+\acro_remove_function:N \acpdfstring
+\acro_remove_function:N \acpdfstringplural
+\acro_remove_function:N \AcroRegisterTrailing
+
+\acro_deprecate_function:NN \acifused \acroifusedTF
+\acro_deprecate_function:NN \aciffirst \acroiffirstTF
+\acro_deprecate_function:NN \ProvideAcroEnding \DeclareAcroEnding
+
+\acro_remove_function:N \DeclareAcroListStyle
+\acro_remove_function:N \DeclareAcroListHeading
+\acro_remove_function:N \DeclareAcroFirstStyle
+\acro_remove_function:N \DeclareAcroExtraStyle
+\acro_remove_function:N \DeclareAcroPageStyle
+\acro_remove_function:N \AcroRegisterTrailing
+
+% ----------------------------------------------------------------------------
+% old options:
+\keys_define:nn {acro}
+  {
+    %%% package:
+    log .code:n =
+      \acro_remove_option:n
+        { You~ can~ use~ \acshow ~ to~ inspect~ an~ acronym~ instead . } ,
+    messages .code:n = \acro_remove_option: ,
+    macros .code:n = \acro_remove_option: ,
+    xspace .code:n = \acro_remove_option: ,
+    strict .code:n = \acro_remove_option: ,
+    %%% behaviour:
+    hyperref .code:n =
+      \acro_deprecate_option:nn {make-links} {true} ,
+    label .code:n =
+      \acro_deprecate_option:nn {labels} {true} ,
+    only-used .code:n =
+      \acro_deprecate_option:nn {list/display} {used} ,
+    mark-as-used .code:n =
+      \acro_deprecate_option:nn {use-only-first} {true} ,
+    sort .code:n =
+      \acro_deprecate_option:nn {list/sort} {true} ,
+    display-foreign .code:n = \acro_remove_option: ,
+    cite .code:n =
+      \acro_deprecate_option:nn {cite/display} {#1} ,
+    cite-cmd .code:n =
+      \acro_deprecate_option:nn {cite/cmd} {#1} ,
+    group-citation .code:n =
+      \acro_deprecate_option:nn {cite/group} {true} ,
+    cite-connect .code:n =
+      \acro_deprecate_option:nn {cite/pre} {#1} ,
+    group-cite-connect .code:n =
+      \acro_deprecate_option:nn {cite/group/pre} {#1} ,
+    group-cite-cmd .code:n =
+      \acro_remove_option:n {Maybe~ the~ option~ `cite/cmd'~ helps.} ,
+    index .code:n =
+      \acro_deprecate_option:nn {index/use} {true} ,
+    index-cmd .code:n =
+      \acro_deprecate_option:nn {index/cmd} {#1} ,
+    short-format .code:n =
+      \acro_deprecate_option:nn {format/short} {#1} ,
+    long-format .code:n =
+      \acro_deprecate_option:nn {format/long} {#1} ,
+    foreign-format .code:n =
+      \acro_deprecate_option:nn {format/foreign} {#1} ,
+    extra-format .code:n =
+      \acro_deprecate_option:nn {format/extra} {#1} ,
+    single-format .code:n = \acro_remove_option: ,
+    single-form   .code:n =
+      \acro_deprecate_option:nn {single-style} {#1} ,
+    first-long-format .code:n =
+      \acro_deprecate_option:nn {format/first-long} {#1} ,
+    list-short-format .code:n = \acro_remove_option: ,
+    list-long-format .code:n =
+      \acro_deprecate_option:nn {format/list} {#1} ,
+    list-foreign-format .code:n = \acro_remove_option: ,
+    override-list-format .code:n = \acro_remove_option: ,
+    format-include-endings .code:n =
+      \acro_deprecate_option:nn {include-endings} {true} ,
+    extra-style .code:n = \acro_remove_option: ,
+    page-style.code:n = \acro_remove_option: ,
+    pages .code:n =
+      \acro_deprecate_option:nn {pages/display} {#1} ,
+    page-name .code:n = \acro_remove_option: ,
+    pages-name .code:n = \acro_remove_option: ,
+    following-page .code:n =
+      \acro_deprecate_option:nn {pages/seq} {true} ,
+    following-pages .code:n =
+      \acro_deprecate_option:nn {pages/seq} {true} ,
+    next-page .code:n = \acro_remove_option: ,
+    next-pages .code:n = \acro_remove_option: ,
+    uc-cmd .code:n =
+      \acro_deprecate_option:nn {uppercase/cmd} {#1} ,
+    uppercase-short .code:n =
+      \acro_deprecate_option:nn {uppercase/short} {#1} ,
+    tooltip .code:n =
+      \acro_deprecate_option:nn {pdfcomments/use} {#1} ,
+    tooltip-cmd .code:n =
+      \acro_deprecate_option:nn {pdfcomments/cmd} {#1} ,
+    use-barriers .code:n = \acro_remove_option: ,
+    reset-at-barriers .code:n =
+      \acro_deprecate_option:nn {barriers/reset} {#1} ,
+    activate-trailing-tokens .code:n =
+      \acro_deprecate_option:nn {trailing/activate} {#1} ,
+    deactivate-trailing-tokens .code:n =
+      \acro_deprecate_option:nn {trailing/deactivate} {#1} ,
+    %%% list options:
+    list-style .code:n =
+      \acro_deprecate_option:nn {list/template} {#1} ,
+    list-heading .code:n =
+      \acro_deprecate_option:nn {list/heading} {#1} ,
+    list-name .code:n =
+      \acro_deprecate_option:nn {list/name} {#1} ,
+    list-caps .code:n = \acro_remove_option: ,
+    print-acronyms/include-classes .code:n =
+      \acro_deprecate_option:nn {list/include} {#1} ,
+    print-acronyms/exclude-classes .code:n =
+      \acro_deprecate_option:nn {list/exclude} {#1} ,
+    print-acronyms/name .code:n =
+      \acro_deprecate_option:nn {list/name} {#1} ,
+    print-acronyms/heading .code:n =
+      \acro_deprecate_option:nn {list/heading} {#1} ,
+    print-acronyms/sort .code:n =
+      \acro_deprecate_option:nn {list/sort} {true} ,
+    print-acronyms/local-to-barriers .code:n =
+      \acro_deprecate_option:nn {list/local} {true}
+  }
+
+% ----------------------------------------------------------------------------
+\AcroModuleEnd
+% finish package:
+\AtEndDocument { \acro_close_aux: \acro_do_rerun: }
+%----------------------------------------------------------------------------
 \file_input_stop:

Added: trunk/Master/texmf-dist/tex/latex/acro/acro2.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/acro/acro2.sty	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/acro/acro2.sty	2020-04-29 21:22:29 UTC (rev 54937)
@@ -0,0 +1,4640 @@
+% --------------------------------------------------------------------------
+% the ACRO package
+% 
+%   Typeset Acronyms
+% 
+% --------------------------------------------------------------------------
+% Clemens Niederberger
+% Web:    https://github.com/cgnieder/acro/
+% E-Mail: contact at mychemistry.eu
+% --------------------------------------------------------------------------
+% Copyright 2011--2020 Clemens Niederberger
+% 
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+%   http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+% 
+% This work has the LPPL maintenance status `maintained'.
+% 
+% The Current Maintainer of this work is Clemens Niederberger.
+% --------------------------------------------------------------------------
+% The acro package consists of the files
+% - acro.sty, acro.definitions.tex, acro.cfg
+% - acro-manual.tex, acro-manual.pdf, acro-manual.cls
+% - acro.history, README
+% --------------------------------------------------------------------------
+% If you have any ideas, questions, suggestions or bugs to report, please
+% feel free to contact me.
+% --------------------------------------------------------------------------
+\RequirePackage{expl3,xparse,xtemplate,l3keys2e}
+\RequirePackage{etoolbox} % for the document hooks
+
+\ProvidesExplPackage
+  {acro2}
+  {2020/03/07}
+  {2.11d}
+  {\csname c_acro_info_tl\endcsname}
+
+% --------------------------------------------------------------------------
+% warning and error messages:
+\msg_new:nnn {acro} {undefined}
+  {
+    You've~ requested~ acronym~ `#1'~ \msg_line_context: \ but~ you~
+    apparently~ haven't~ defined~ it,~ yet! \\
+    Maybe~ you've~ misspelled~ `#1'?
+  }
+
+\msg_new:nnn {acro} {macro}
+  {
+    A~ macro~ with~ the~ csname~ `#1'~ already~ exists! \\
+    Unless~ you~ set~ acro's~ option~ `strict'~ I~ won't~ redefine~ it~
+    \msg_line_context: .
+  } 
+
+\msg_new:nnn {acro} {replaced}
+  {
+    The~ #1~ `#2' ~you ~used~ \msg_line_context: \ is~ deprecated~ and~ has~
+    been~ replaced~ by~ `#3'. ~Since~ I~ will~ not~ guarantee~ that~ #1~ `#2'~
+    will~ be~ kept~ forever~ I~ strongly~ encourage~ you~ to~ switch!
+  }
+
+\msg_new:nnn {acro} {deprecated}
+  {
+    The~ #1~ `#2'~ you~ used~ \msg_line_context: \ is~ deprecated~and~ there~
+    is~ no~ replacement.~ Since~ I~ will~ not~ guarantee~ that~ #1~ `#2'~
+    will~ be~ kept~ forever~ I~ strongly~ encourage~ you~ to~ remove~ it~
+    from~ your~ document.
+  }
+
+\msg_new:nnn {acro} {substitute-short}
+  {
+    There~ is~ no~ short~ form~ set~ for~ acronym~ `#1'! \\
+    I~ am~ setting~ the~ short~ form~ equal~ to~ the~ ID~ `#1'. \\
+    If~ that~ is~ not~ what~ you~ want~ make~ sure~ to~ add~ an~ explicit~
+    short~ form.
+  }
+\msg_new:nnn {acro} {ending-exists}
+  {
+    An~ ending~ with~ the~ name~ `#1'~ already~ exists! \\ \\
+    I~ am~ overwriting~ the~ defaults.
+  }
+
+\msg_new:nnn {acro} {ending-before-acronyms}
+  {
+    You~ are~ using~ \token_to_str:N \ProvideAcroEnding \ after~ you've~
+    declared~ at~ least~ one~ acronym.~ This~ will~ lead~ to~ trouble! \\
+    Make~ sure~ to~ define~ endings~ before~ *any*~ acronym~ declarations!
+  }
+
+\msg_new:nnn {acro} {no-alternative}
+  {
+    There~ is~ no~ alternative~ form~ for~ acronym~ `#1'! \\ \\
+    I~ am~ using~ the~ short~ form~ instead.
+  }
+
+\msg_new:nnn {acro} {unknown}
+  {
+    You're~ trying~ to~ use~ the~ #1~ `#2'~ \msg_line_context: . \\
+    However,~ I~ do~ not~ know~ #1~ `#2'! \\
+    If~ this~ is~ no~ typo~ please~ contact~ the~ package~ author. \\ \\
+    I~ am~ going~ to~ use~ the~ #1~ `#3'~ instead.
+  }
+\msg_new:nnn {acro} {definitions-missing}
+  {
+    I~ cannot~ find~ the~ file~ \c_acro_definition_file_name_tl
+    .\c_acro_definition_file_extension_tl !~ This~ file~ contains~ all~
+    essential~ user~ commands~ of~ acro~ and~ is~ a~ crucial~ part~ of~ the~
+    package!~ Please~ check~ your~ installation.
+  }
+
+% --------------------------------------------------------------------------
+% temporary variables
+\tl_new:N   \l__acro_tmpa_tl
+\tl_new:N   \l__acro_tmpb_tl
+\tl_new:N   \l__acro_tmpc_tl
+\prop_new:N \l__acro_tmpa_prop
+\prop_new:N \l__acro_tmpb_prop
+\seq_new:N  \l__acro_tmpa_seq
+\seq_new:N  \l__acro_tmpb_seq
+\int_new:N  \l__acro_tmpa_int
+\int_new:N  \l__acro_tmpb_int
+\int_new:N  \l__acro_tmpc_int
+\int_new:N  \l__acro_tmpd_int
+
+% --------------------------------------------------------------------------
+% variants of kernel commands
+\cs_generate_variant:Nn \quark_if_no_value:nTF  {V}
+\cs_generate_variant:Nn \tl_put_right:Nn        {NV,Nv}
+\cs_generate_variant:Nn \tl_if_eq:nnT           {V}
+\cs_generate_variant:Nn \tl_if_eq:nnF           {V}
+\cs_generate_variant:Nn \seq_use:Nnnn           {c}
+\cs_generate_variant:Nn \seq_gset_split:Nnn     {c}
+\cs_generate_variant:Nn \seq_set_split:Nnn      {NnV}
+\cs_generate_variant:Nn \seq_if_in:NnT          {NV}
+\cs_generate_variant:Nn \seq_if_in:NnTF         {Ne}
+\cs_generate_variant:Nn \prop_put:Nnn           {NnV,cnx,cnv}
+\cs_generate_variant:Nn \prop_get:NnNTF         {cnc}
+\cs_generate_variant:Nn \prop_get:NnNF          {cn,cnc}
+\cs_generate_variant:Nn \prop_get:NnN           {cnc}
+\cs_generate_variant:Nn \cs_generate_variant:Nn {c}
+\cs_generate_variant:Nn \str_case:nn            {V}
+
+% --------------------------------------------------------------------------
+% variables:
+\bool_new:N      \l__acro_acc_supp_bool
+\bool_new:N      \l__acro_addto_index_bool
+\bool_new:N      \l__acro_capitalize_list_bool
+\bool_new:N      \g__acro_case_sensitive_bool
+\bool_new:N      \l__acro_citation_all_bool
+\bool_new:N      \l__acro_citation_first_bool
+\bool_set_true:N \l__acro_citation_first_bool
+\bool_new:N      \l__acro_create_macros_bool
+\bool_new:N      \l__acro_custom_alt_format_bool
+\bool_new:N      \l__acro_custom_long_format_bool
+\bool_new:N      \l__acro_custom_short_format_bool
+\bool_new:N      \l__acro_custom_foreign_format_bool
+\bool_new:N      \l__acro_extra_punct_bool
+\bool_new:N      \l__acro_extra_use_brackets_bool
+\bool_new:N      \g__acro_first_acronym_declared_bool
+\bool_new:N      \l__acro_first_instance_bool
+\bool_new:N      \l__acro_first_only_short_bool
+\bool_new:N      \l__acro_first_only_long_bool
+\bool_new:N      \l__acro_first_reversed_bool
+\bool_new:N      \l__acro_first_switched_bool
+\bool_new:N      \l__acro_first_use_brackets_bool
+\bool_new:N      \l__acro_first_upper_bool
+\bool_new:N      \l__acro_following_page_bool
+\bool_new:N      \l__acro_following_pages_bool
+\bool_new:N      \l__acro_foreign_bool
+\bool_set_true:N \l__acro_foreign_bool
+\bool_new:N      \l__acro_group_citation_bool
+\bool_new:N      \l__acro_hyperref_loaded_bool
+\bool_new:N      \l__acro_hyperref_use_bool
+\bool_new:N      \l__acro_include_endings_format_bool
+\bool_new:N      \l__acro_indefinite_bool
+\bool_new:N      \l__acro_in_list_bool
+\bool_new:N      \l__acro_is_included_bool
+\bool_new:N      \l__acro_is_excluded_bool
+\bool_new:N      \l__acro_list_all_pages_bool
+\bool_set_true:N \l__acro_list_all_pages_bool
+\bool_new:N      \l__acro_list_reverse_long_extra_bool
+\bool_new:N      \l__acro_log_acronyms_bool
+\bool_new:N      \l__acro_log_acronyms_verbose_bool
+\bool_new:N      \l__acro_mark_as_used_bool
+\bool_new:N      \g__acro_mark_first_as_used_bool
+\bool_new:N      \l__acro_override_list_format_bool
+\bool_new:N      \l__acro_page_brackets_bool
+\bool_new:N      \l__acro_page_display_bool
+\bool_new:N      \l__acro_page_punct_bool
+\bool_new:N      \l__acro_place_label_bool
+\bool_new:N      \l__acro_print_only_used_bool
+\bool_set_true:N \l__acro_print_only_used_bool
+\bool_new:N      \g__acro_reset_at_barrier_bool
+\bool_new:N      \l__acro_silence_bool
+\bool_new:N      \l__acro_single_use_bool
+\bool_new:N      \l__acro_sort_bool
+\bool_set_true:N \l__acro_sort_bool
+\bool_new:N      \l__acro_strict_bool
+\bool_new:N      \l__acro_trailing_tokens_bool
+\bool_new:N      \l__acro_tooltip_bool
+\bool_new:N      \l__acro_tooltip_inside_bool
+\bool_new:N      \l__acro_upper_indefinite_bool
+\bool_new:N      \l__acro_upper_short_bool
+\bool_new:N      \l__acro_use_acronyms_bool
+\bool_set_true:N \l__acro_use_acronyms_bool
+\bool_new:N      \l__acro_use_barrier_bool
+\bool_new:N      \g__acro_use_barriers_bool
+\bool_new:N      \l__acro_use_ending_form_bool
+\bool_new:N      \l__acro_use_note_bool
+\bool_new:N      \l__acro_xspace_bool
+
+\str_new:N \l__acro_current_id_str
+
+\tl_new:N  \l__acro_list_entries_tl
+\tl_new:N  \l__acro_endings_tl
+\tl_new:N  \l__acro_trailing_tokens_tl
+\tl_new:N  \l__acro_included_classes_tl
+\tl_new:N  \l__acro_excluded_classes_tl
+\tl_new:N  \l__acro_ignore_tl
+\tl_new:N  \l__acro_default_indefinite_tl
+\tl_set:Nn \l__acro_default_indefinite_tl {a}
+\tl_new:N  \l__acro_foreign_sep_tl
+\tl_new:N  \l__acro_extra_instance_tl
+\tl_set:Nn \l__acro_extra_instance_tl {default}
+\tl_new:N  \l__acro_page_instance_tl
+\tl_set:Nn \l__acro_page_instance_tl  {none}
+\tl_new:N  \l__acro_page_name_tl
+\tl_new:N  \l__acro_pages_name_tl
+\tl_new:N  \l__acro_next_page_tl
+\tl_new:N  \l__acro_next_pages_tl
+\tl_new:N  \l__acro_list_instance_tl
+\tl_set:Nn \l__acro_list_instance_tl  {description}
+\tl_new:N  \l__acro_list_type_tl
+\tl_new:N  \l__acro_list_heading_cmd_tl
+\tl_set:Nn \l__acro_list_heading_cmd_tl {section*}
+\tl_new:N  \l__acro_list_name_tl
+\tl_new:N  \l__acro_list_before_tl
+\tl_new:N  \l__acro_list_after_tl
+\tl_new:N  \l__acro_custom_short_format_tl
+\tl_new:N  \l__acro_first_between_tl
+\tl_new:N  \l__acro_citation_connect_tl
+\tl_new:N  \l__acro_between_group_connect_citation_tl
+\tl_new:N  \l__acro_extra_brackets_tl
+\tl_new:N  \l__acro_extra_punct_tl
+\tl_new:N  \l__acro_first_brackets_tl
+\tl_new:N  \l__acro_page_punct_tl
+\tl_new:N  \l__acro_page_brackets_tl
+\tl_new:N  \l__acro_last_page_tl
+\tl_new:N  \l__acro_current_page_tl
+\tl_new:N  \l__acro_list_table_tl
+\tl_new:N  \l__acro_list_table_spec_tl
+\tl_new:N  \l__acro_acc_supp_tl
+\tl_new:N  \l__acro_acc_supp_options_tl
+\tl_new:N  \l__acro_label_prefix_tl
+\tl_set:Nn \l__acro_label_prefix_tl {ac:}
+\tl_new:N  \l__acro_index_short_tl
+\tl_new:N  \l__acro_first_instance_tl
+\tl_set:Nn \l__acro_first_instance_tl {default}
+\tl_new:N  \l__acro_short_tl
+\tl_new:N  \l__acro_short_format_tl
+\tl_new:N  \l__acro_list_short_format_tl
+\tl_new:N  \l__acro_alt_tl
+\tl_new:N  \l__acro_alt_format_tl
+\tl_new:N  \l__acro_long_tl
+\tl_new:N  \l__acro_long_format_tl
+\tl_new:N  \l__acro_list_long_format_tl
+\tl_new:N  \l__acro_single_form_tl
+\tl_set:Nn \l__acro_single_form_tl {long}
+\tl_new:N  \l__acro_extra_format_tl
+\tl_new:N  \l__acro_foreign_format_tl
+\tl_new:N  \l__acro_foreign_list_format_tl
+\tl_set:Nn \l__acro_foreign_list_format_tl { \acroenparen }
+\tl_new:N  \l__acro_index_format_tl
+
+\skip_new:N \l__acro_page_space_skip
+
+\dim_new:N  \l__acro_short_width_dim
+\dim_set:Nn \l__acro_short_width_dim {3em}
+
+\int_new:N  \g__acro_barrier_int
+
+\seq_new:N \l__acro_endings_seq
+\seq_new:N \l__acro_actions_seq
+\seq_new:N \g__acro_declared_acronyms_seq
+
+\prop_new:N \l__acro_citation_prop
+\prop_new:N \l__acro_citation_pre_prop
+\prop_new:N \l__acro_citation_post_prop
+\prop_new:N \l__acro_pdfstring_alt_prop
+\prop_new:N \l__acro_pdfstring_short_prop
+\prop_new:N \g__acro_properties_prop
+\prop_new:N \l__acro_trailing_tokens_prop
+\prop_new:N \l__acro_trailing_actions_prop
+\prop_new:N \l__acro_list_styles_prop
+\prop_new:N \l__acro_list_headings_prop
+\prop_new:N \l__acro_first_styles_prop
+\prop_new:N \l__acro_extra_styles_prop
+\prop_new:N \l__acro_page_styles_prop
+
+% --------------------------------------------------------------------------
+% logging:
+\prg_new_conditional:Npnn \acro_if_log: {p,T,F,TF}
+  {
+    \bool_if:NTF \l__acro_log_acronyms_bool
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+\keys_define:nn {acro}
+  {
+    log           .choice: ,
+    log / true    .code:n    =
+      \bool_set_true:N \l__acro_log_acronyms_bool
+      \bool_set_false:N \l__acro_log_acronyms_verbose_bool ,
+    log / silent  .meta:n    = { log = true } ,
+    log / verbose .code:n    =
+      \bool_set_true:N \l__acro_log_acronyms_bool
+      \bool_set_true:N \l__acro_log_acronyms_verbose_bool ,
+    log / false   .code:n    =
+      \bool_set_false:N \l__acro_log_acronyms_bool
+      \bool_set_false:N \l__acro_log_acronyms_verbose_bool ,
+    log           .default:n = true ,
+    log           .initial:n = false
+  }
+
+\cs_new:Npn \__acro_write_log:nn #1#2 { \ \ \ #1 ~ = ~ {#2} }
+\cs_new:Npn \__acro_write_log_property:nnn #1#2#3
+  { \__acro_write_log:nn {#2} { \__acro_property_get:nn {#3} {#1} } }
+
+\cs_new:Npn \__acro_ending_log_entry:nn #1#2
+  {
+    | \\
+    | \__acro_write_log_property:nnn {#1} {short-#2} {short_#2} \\
+    | \__acro_write_log_property:nnn {#1} {short-#2-form} {short_#2_form} \\
+    | \__acro_write_log_property:nnn {#1} {long-#2} {long_#2} \\
+    | \__acro_write_log_property:nnn {#1} {long-#2-form} {long_#2_form} \\
+    | \__acro_write_log_property:nnn {#1} {alt-#2} {alt_#2} \\
+    | \__acro_write_log_property:nnn {#1} {alt-#2-form} {alt_#2_form} \\
+    | \__acro_write_log_property:nnn {#1} {foreign-#2} {foreign_#2} \\
+    | \__acro_write_log_property:nnn {#1} {foreign-#2-form} {foreign_#2_form} \\
+  }
+  
+\msg_new:nnn {acro} {log-acronym-verbose}
+  {
+    ================================================= \\
+    | ~ \msg_info_text:n {acro}~ --~ defining~ new~ acronym: \\
+    | \__acro_write_log:nn {ID} {#1} \\
+    | \__acro_write_log_property:nnn {#1} {short} {short} \\
+    | \__acro_write_log_property:nnn {#1} {long} {long} \\
+    | \__acro_write_log_property:nnn {#1} {alt} {alt} \\
+    | \__acro_write_log_property:nnn {#1} {sort} {sort} \\
+    | \__acro_write_log_property:nnn {#1} {class} {class} \\
+    | \__acro_write_log_property:nnn {#1} {list} {list} \\
+    | \__acro_write_log_property:nnn {#1} {extra} {extra} \\
+    | \__acro_write_log_property:nnn {#1} {foreign} {foreign} \\
+    | \__acro_write_log_property:nnn {#1} {single} {single} \\
+    | \__acro_write_log_property:nnn {#1} {pdfstring} {pdfstring} \\
+    | \__acro_write_log_property:nnn {#1} {accsupp} {accsupp} \\
+    | \__acro_write_log_property:nnn {#1} {tooltip} {tooltip} \\
+    | \\
+    | \__acro_write_log_property:nnn {#1} {short-indefinite} {short_indefinite} \\
+    | \__acro_write_log_property:nnn {#1} {long-indefinite} {long_indefinite} \\
+    | \__acro_write_log_property:nnn {#1} {alt-indefinite} {alt_indefinite} \\
+    \seq_map_function:NN \l__acro_endings_seq \__acro_ending_log_entry:n
+    | \\
+    | \__acro_write_log_property:nnn {#1} {short-format} {short_format} \\
+    | \__acro_write_log_property:nnn {#1} {long-format} {long_format} \\
+    | \__acro_write_log_property:nnn {#1} {first-long-format} {first_long_format} \\
+    | \__acro_write_log_property:nnn {#1} {single-format} {single_format} \\
+    | \__acro_write_log_property:nnn {#1} {foreign-lang} {foreign_lang} \\    
+    | \\
+    | \__acro_write_log_property:nnn {#1} {cite} {citation} \\
+    | \__acro_write_log_property:nnn {#1} {before-citation} {before_citation} \\
+    | \__acro_write_log_property:nnn {#1} {after-citation} {after_citation} \\
+    | \__acro_write_log_property:nnn {#1} {index} {index} \\
+    | \__acro_write_log_property:nnn {#1} {index-sort} {index_sort} \\
+    | \\
+    | \__acro_write_log_property:nnn {#1} {long-pre} {long_pre} \\
+    | \__acro_write_log_property:nnn {#1} {long-post} {long_post} \\
+    | \__acro_write_log_property:nnn {#1} {post} {post} \\
+    | \__acro_write_log_property:nnn {#1} {index-cmd} {index_cmd} \\
+    | \__acro_write_log_property:nnn {#1} {first-style} {first_style} \\
+    =================================================
+  }
+
+\msg_new:nnn {acro} {log-acronym-silent}
+  {
+    ================================================= \\
+    | ~ \msg_info_text:n {acro}~ --~ defining~ new~ acronym: \\
+    | \__acro_write_log:nn {ID} {#1} \\
+    | \__acro_write_log_property:nnn {#1} {short} {short} \\
+    | \__acro_write_log_property:nnn {#1} {long} {long} \\
+    | \__acro_write_log_property:nnn {#1} {alt} {alt} \\
+    | \__acro_write_log_property:nnn {#1} {sort} {sort} \\
+    | \__acro_write_log_property:nnn {#1} {class} {class} \\
+    | \__acro_write_log_property:nnn {#1} {list} {list} \\
+    | \__acro_write_log_property:nnn {#1} {extra} {extra} \\
+    | \__acro_write_log_property:nnn {#1} {foreign} {foreign} \\
+    | \__acro_write_log_property:nnn {#1} {cite} {citation} \\
+    =================================================
+  }
+  
+\cs_new_protected:Npn \__acro_log_acronym:n #1
+  {
+    \bool_if:NT \l__acro_log_acronyms_bool
+      {
+        \cs_set:Npn \__acro_ending_log_entry:n ##1
+          { \__acro_ending_log_entry:nn {#1} {##1} }
+        \bool_if:NTF \l__acro_log_acronyms_verbose_bool
+          { \msg_log:nnn {acro} {log-acronym-verbose} {#1} }
+          { \msg_log:nnn {acro} {log-acronym-silent} {#1} }
+      }
+  }   
+
+% --------------------------------------------------------------------------
+% message macros:
+\cs_new:Npn \__acro_remove_backslash:N #1
+  { \exp_after:wN \use_none:n \token_to_str:N #1 }
+
+\cs_new_protected:Npn \acro_new_message_commands:Nnnn #1#2#3#4
+  {
+    \clist_map_inline:nn {#2}
+      {
+        \cs_new_protected:cpn { \__acro_remove_backslash:N #1 ##1 }
+          {
+            \bool_if:NTF \l__acro_silence_bool
+              { \use:c { \__acro_remove_backslash:N #3 n##1 } {acro} }
+              { \use:c { \__acro_remove_backslash:N #4 n##1 } {acro} }
+          }
+      }
+  }
+
+\acro_new_message_commands:Nnnn \acro_serious_message: {n,nn,nnn}
+  { \msg_warning: }
+  { \msg_error: }
+
+\acro_new_message_commands:Nnnn \acro_harmless_message: {n,nn,nnn,nnnn}
+  { \msg_info: }
+  { \msg_warning: }
+
+\cs_new_protected:Npn \acro_option_deprecated:nn #1#2
+  {
+    \tl_if_blank:nTF {#2}
+      { \acro_harmless_message:nnn  {deprecated} {option} {#1} }
+      { \acro_harmless_message:nnnn {replaced}   {option} {#1} {#2} }
+  }
+\cs_new_protected:Npn \acro_option_deprecated:n #1
+  { \acro_option_deprecated:nn {#1} {} }
+
+\cs_new_protected:Npn \acro_command_deprecated:NN #1#2
+  {
+    \tl_if_blank:nTF {#2}
+      {
+        \acro_harmless_message:nnn {deprecated} {command}
+          { \token_to_str:N #1 }
+      }
+      {
+        \acro_harmless_message:nnnn {replaced} {command}
+          { \token_to_str:N #1 }
+          { \token_to_str:N #2 }
+      }
+  }
+
+% --------------------------------------------------------------------------
+% small commands for use at various places
+\cs_new:Npn \acro_no_break: { \tex_penalty:D 10000 \scan_stop: }
+
+\cs_new_protected:Npn \__acro_first_upper_case:n #1
+  { \text_titlecase_first: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
+
+% --------------------------------------------------------------------------
+\tl_new:N \l_acro_config_file_name_tl
+\tl_new:N \l_acro_config_file_extension_tl
+
+\tl_set:Nn \l_acro_config_file_name_tl      {acro}
+\tl_set:Nn \l_acro_config_file_extension_tl {cfg}
+
+% options:
+\keys_define:nn {acro}
+  {
+    messages          .choice: ,
+    messages / silent .code:n     =
+      \bool_set_true:N \l__acro_silence_bool ,
+    messages / loud .code:n       =
+      \bool_set_false:N \l__acro_silence_bool ,
+    messages          .value_required:n = true ,
+    config-file-name  .tl_set:N   = \l_acro_config_file_name_tl ,
+    config-file-name  .initial:n  = acro ,
+    config-file-extension .tl_set:N  = \l_acro_config_file_extension_tl ,
+    config-file-extension .initial:n = cfg ,
+    accsupp           .bool_set:N = \l__acro_acc_supp_bool ,
+    accsupp-options   .tl_set:N   = \l__acro_acc_supp_options_tl ,
+    tooltip           .bool_set:N = \l__acro_tooltip_bool ,
+    tooltip-cmd       .code:n     = \cs_set:Npn \__acro_tooltip_cmd:nn {#1} ,
+    tooltip-cmd       .value_required:n = true ,
+    macros            .bool_set:N = \l__acro_create_macros_bool ,
+    xspace            .bool_set:N = \l__acro_xspace_bool ,
+    % xspace            .code:n     = \acro_option_deprecated:nn {xspace} {} ,
+    strict            .bool_set:N = \l__acro_strict_bool ,
+    case-sensitive    .bool_set:N = \g__acro_case_sensitive_bool ,
+    case-sensitive    .initial:n  = true ,
+    sort              .bool_set:N = \l__acro_sort_bool ,
+    short-format      .code:n     =
+      \tl_set:Nn \l__acro_short_format_tl {#1}
+      \tl_set_eq:NN \l__acro_alt_format_tl \l__acro_short_format_tl
+      \tl_set:Nn \l__acro_list_short_format_tl {#1} ,
+    short-format      .value_required:n = true ,
+    alt-format        .tl_set:N   = \l__acro_alt_format_tl ,
+    alt-format        .value_required:n = true ,
+    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} ,
+    long-format       .value_required:n = true ,
+    first-long-format .code:n     =
+      \tl_set:Nn \l__acro_first_long_format_tl {#1} ,
+    first-long-format .value_required:n = true ,
+    single-format     .tl_set:N   = \l__acro_single_format_tl ,
+    single-format     .value_required:n = true ,
+    format-include-endings .bool_set:N = \l__acro_include_endings_format_bool ,
+    display-foreign   .bool_set:N = \l__acro_foreign_bool ,
+    foreign-format    .tl_set:N   = \l__acro_foreign_format_tl ,
+    foreign-format    .value_required:n = true ,
+    list-short-format .tl_set:N   = \l__acro_list_short_format_tl ,
+    list-short-format .value_required:n = true ,
+    list-short-width  .dim_set:N  = \l__acro_short_width_dim ,
+    list-short-width  .value_required:n = true ,
+    list-long-format  .tl_set:N   = \l__acro_list_long_format_tl ,
+    list-long-format  .value_required:n = true ,
+    list-foreign-format .tl_set:N = \l__acro_foreign_list_format_tl ,
+    list-foreign-format .value_required:n = true ,
+    override-list-format .bool_set:N = \l__acro_override_list_format_bool ,
+    override-list-format .initial:n  = true ,
+    extra-format      .tl_set:N   = \l__acro_extra_format_tl ,
+    extra-format      .value_required:n = true ,
+    single            .bool_set:N = \l__acro_single_use_bool ,
+    single-form       .tl_set:N   = \l__acro_single_form_tl ,
+    single-form       .value_required:n = true ,
+    first-style       .code:n     = \acro_set_first_style:n {#1} ,
+    first-style       .value_required:n = true ,
+    extra-style       .code:n     = \acro_set_extra_style:n {#1} ,
+    extra-style       .value_required:n = true ,
+    label             .bool_set:N = \l__acro_place_label_bool ,
+    label-prefix      .tl_set:N   = \l__acro_label_prefix_tl ,
+    label-prefix      .value_required:n = true ,
+    pages             .choice: ,
+    pages / all       .code:n     =
+      \bool_set_true:N \l__acro_list_all_pages_bool ,
+    pages / first     .code:n     =
+      \bool_set_true:N \l__acro_place_label_bool
+      \bool_set_false:N \l__acro_list_all_pages_bool ,
+    pages             .value_required:n = true ,
+    page-ref          .code:n     =
+      \acro_option_deprecated:nn {page-ref} {page-style}
+      \acro_set_page_style:n {#1} ,
+    page-style        .code:n     = \acro_set_page_style:n {#1} ,
+    page-style        .value_required:n = true ,
+    page-name         .tl_set:N   = \l__acro_page_name_tl ,
+    page-name         .value_required:n = true ,
+    pages-name        .tl_set:N   = \l__acro_pages_name_tl ,
+    pages-name        .value_required:n = true ,
+    following-page    .bool_set:N = \l__acro_following_page_bool ,
+    following-pages   .bool_set:N = \l__acro_following_pages_bool ,
+    following-pages*  .meta:n     =
+      { following-page = #1 , following-pages = #1 } ,
+    following-pages*  .default:n  = true ,
+    next-page         .tl_set:N   = \l__acro_next_page_tl ,
+    next-page         .value_required:n = true ,
+    next-pages        .tl_set:N   = \l__acro_next_pages_tl ,
+    next-pages        .value_required:n = true ,
+    list-style        .code:n     = \acro_set_list_style:n {#1} ,
+    list-style        .value_required:n = true ,
+    list-heading      .code:n     = \acro_set_list_heading:n {#1} ,
+    list-heading      .value_required:n = true ,
+    list-name         .tl_set:N   = \l__acro_list_name_tl ,
+    list-name         .value_required:n = true ,
+    hyperref          .bool_set:N = \l__acro_hyperref_use_bool ,
+    only-used         .bool_set:N = \l__acro_print_only_used_bool ,
+    mark-as-used      .choice: ,
+    mark-as-used / first .code:n  =
+      \bool_gset_true:N \g__acro_mark_first_as_used_bool ,
+    mark-as-used / any   .code:n  =
+      \bool_gset_false:N \g__acro_mark_first_as_used_bool ,
+    mark-as-used      .default:n  = any ,
+    list-caps         .bool_set:N = \l__acro_capitalize_list_bool ,
+    cite              .choice: ,
+    cite / all        .code:n     =
+      \bool_set_true:N \l__acro_citation_all_bool
+      \bool_set_true:N \l__acro_citation_first_bool ,
+    cite / none       .code:n     =
+      \bool_set_false:N \l__acro_citation_all_bool
+      \bool_set_false:N \l__acro_citation_first_bool ,
+    cite / first      .code:n     =
+      \bool_set_false:N \l__acro_citation_all_bool
+      \bool_set_true:N  \l__acro_citation_first_bool ,
+    cite              .default:n  = all ,
+    cite-cmd          .code:n     =
+      \cs_set:Npn \__acro_citation_cmd:w {#1} ,
+    cite-cmd          .value_required:n = true ,
+    group-cite-cmd    .code:n     =
+      \cs_set:Npn \__acro_group_citation_cmd:w {#1} ,
+    group-cite-cmd    .value_required:n = true ,
+    group-citation    .bool_set:N = \l__acro_group_citation_bool ,
+    cite-connect      .tl_set:N   = \l__acro_citation_connect_tl ,
+    cite-connect      .initial:n  = \nobreakspace ,
+    cite-connect      .value_required:n = true ,
+    group-cite-connect .tl_set:N = \l__acro_between_group_connect_citation_tl ,
+    group-cite-connect .initial:n = {,\nobreakspace} ,
+    group-cite-connect .value_required:n = true ,
+    index             .bool_set:N = \l__acro_addto_index_bool ,
+    index-cmd         .code:n     =
+      \cs_set:Npn \__acro_index_cmd:n {#1} ,
+    index-cmd         .value_required:n = true ,
+    uc-cmd            .code:n     =
+      \cs_set_eq:NN \__acro_first_upper_case:n #1 ,
+    uc-cmd            .value_required:n = true ,
+    uppercase-short   .bool_set:N = \l__acro_upper_short_bool ,
+    uppercase-short   .initial:n  = true
+  }
+
+\AtBeginDocument
+  {
+    \bool_if:NTF \l__acro_xspace_bool
+      {
+        \@ifpackageloaded {xspace}
+          { }
+          { \RequirePackage {xspace} }
+        \cs_new_eq:NN \acro_xspace: \xspace
+      }
+      { \cs_new:Npn \acro_xspace: {} }
+  }
+
+% --------------------------------------------------------------------------
+% 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}
+
+\cs_new_protected:Npn \acro_first_instance:nn #1#2
+  {
+    \acro_property_if_set:nnTF {#1} {first-style}
+      {
+        \tl_set_eq:NN
+          \l__acro_tmpa_tl
+          \l__acro_first_style_tl
+      }
+      {
+        \tl_set_eq:NN
+          \l__acro_tmpa_tl
+          \l__acro_first_instance_tl
+      }
+    \acro_if_defined:nT {#1}
+      {
+        \use:x {
+          \UseInstance {acro-first}
+            { \exp_not:V \l__acro_tmpa_tl }
+            { \exp_not:n {#1} }
+            { \exp_not:n {#2} }
+          }
+      }
+  }
+\cs_generate_variant:Nn \acro_first_instance:nn {nV}
+
+% --------------------------------------------------------------------------
+% hyperref support
+\cs_new_eq:NN \acro_hyper_target:nn \use_ii:nn
+\cs_new_eq:NN \acro_hyper_link:nn   \use_ii:nn
+
+\cs_new_protected:Npn \acro_activate_hyperref_support:
+  {
+    \bool_lazy_and:nnT
+      { \l__acro_hyperref_loaded_bool }
+      { \l__acro_hyperref_use_bool }
+      {
+        \sys_if_engine_xetex:TF
+          {
+            \cs_set:Npn \acro_hyper_link:nn ##1##2
+              { \hyperlink {##1} { \XeTeXLinkBox {##2} } }
+          }
+          { \cs_set_eq:NN \acro_hyper_link:nn \hyperlink }
+        \cs_set:Npn \acro_hyper_target:nn ##1##2
+          { \raisebox {3ex} [0pt] { \hypertarget {##1} { } } ##2 }
+      }
+  }
+
+% #1: id
+% #2: text
+\cs_new_protected:Npn \__acro_make_link:nn #1#2
+  {
+    \bool_lazy_and:nnTF
+      { \l__acro_hyperref_use_bool }
+      { \l__acro_hyperref_loaded_bool }
+      {
+         \acro_hyper_link:nn {#1} { \phantom {#2} }
+         \acro_if_is_single:nTF {#1}
+           { \hbox_overlap_left:n {#2} }
+           { \acro_color_link:n { \hbox_overlap_left:n {#2} } }
+       }
+       {#2}
+  }
+
+\cs_new:Npn \acro_color_link:n #1
+  {
+    \cs_if_exist:NTF \hypersetup
+      {
+        \ifHy at colorlinks
+          \exp_after:wN \use_i:nn
+        \else
+          \ifHy at ocgcolorlinks
+            \exp_after:wN \use_i:nn
+          \else
+            \exp_after:wN \exp_after:wN \exp_after:wN \use_ii:nn
+          \fi
+        \fi
+        { \textcolor { \@linkcolor } {#1} }
+        {#1}
+      }
+      {#1}
+  }
+
+\AtBeginDocument{
+  \cs_if_exist:NF \textcolor { \cs_new_eq:NN \textcolor \use_ii:nn }
+}
+
+% --------------------------------------------------------------------------
+% output style of the first time an acronym is used
+
+% helper macros for the styles
+% #1: short|long
+% #2: id
+% #3: long
+\cs_new_protected:Npn \__acro_print_form_and_indefinite:nnn #1#2#3
+  {
+    \group_begin:
+      \acro_for_all_trailing_tokens_do:n
+        { \acro_deactivate_trailing_action:n {##1} }
+      \str_case:nn {#1}
+        {
+          {long} {
+            \bool_lazy_or:nnT
+              { \l__acro_first_only_long_bool }
+              {  !\l__acro_first_only_short_bool }
+              {
+                \acro_write_indefinite:nn {#2} {long}
+                \acro_write_expanded:nnn {#2} {first-long} {#3}
+              }
+          }
+          {short} {
+            \bool_lazy_or:nnT
+              { !\l__acro_first_only_long_bool }
+              { \l__acro_first_only_short_bool }
+              {
+                \acro_soft_upper:
+                \acro_write_indefinite:nn {#2} {short}
+                \acro_write_compact:nn {#2} {short}
+              }
+          }
+        }
+    \group_end:
+  }
+
+\cs_new_protected:Npn \__acro_open_bracket:
+  {
+    \bool_lazy_and:nnT
+      { !\l__acro_first_only_long_bool }
+      { !\l__acro_first_only_short_bool }
+      {
+        \acro_space:
+        \tl_if_blank:VF \l__acro_first_between_tl
+          {
+            \tl_use:N \l__acro_first_between_tl
+            \acro_space:
+          }
+        \bool_if:NT \l__acro_first_use_brackets_bool
+          { \tl_head:N \l__acro_first_brackets_tl }
+      }
+  }
+
+\cs_new_protected:Npn \__acro_close_bracket:
+  {
+    \bool_lazy_all:nT
+      {
+        { \l__acro_first_use_brackets_bool }
+        { !\l__acro_first_only_short_bool }
+        { !\l__acro_first_only_long_bool }
+      }
+      { \tl_tail:N \l__acro_first_brackets_tl }
+  }
+  
+% #1: short|long
+% #2: id
+% #3: long
+\cs_new_protected:Npn \__acro_print_form:nnn #1#2#3
+  {
+    \str_case:nn {#1}
+      {
+        {long} {
+          \bool_lazy_or:nnT
+            { \l__acro_first_only_long_bool }
+            { !\l__acro_first_only_short_bool }
+            {
+              \group_begin:
+                \bool_set_false:N \l__acro_first_upper_bool
+                \acro_write_expanded:nnn {#2} {first-long} {#3}
+              \group_end:
+            }
+        }
+        {short} {
+          \bool_lazy_or:nnT
+            { !\l__acro_first_only_long_bool }
+            { \l__acro_first_only_short_bool }
+            {
+              \group_begin:
+                \acro_soft_upper:
+                \acro_write_compact:nn {#2} {short}
+              \group_end:
+            }
+        }
+      }
+  }
+
+% #1: id
+\cs_new_protected:Npn \__acro_foreign_sep:n #1
+  {
+    \bool_lazy_all:nT
+      {
+        { \l__acro_foreign_bool }
+        { !\l__acro_first_only_short_bool }
+        { !\l__acro_first_only_long_bool }
+      }
+      { \acro_if_foreign:nT {#1} { \tl_use:N \l__acro_foreign_sep_tl } }
+  }
+  
+% #1: id
+\cs_new_protected:Npn \__acro_print_foreign:n #1
+  {
+    \acro_if_foreign:nT {#1}
+      {
+        \bool_lazy_all:nT
+          {
+            { \l__acro_foreign_bool }
+            { !\l__acro_first_only_short_bool }
+            { !\l__acro_first_only_long_bool }
+          }
+          {
+            \acro_write_foreign:n {#1}
+            \acro_endings:nn {#1} {foreign}
+          }
+      }
+  }
+
+\cs_new_protected:Npn \__acro_print_citation:n #1
+  {
+    \bool_if:NT \l__acro_group_citation_bool
+      { \acro_group_cite:n {#1} }
+  }
+
+\cs_new_protected:Npn \__acro_finalize_first:n #1
+  {
+    \bool_if:NF \l__acro_group_citation_bool
+      { \acro_cite_if:Nn \l__acro_citation_first_bool {#1} }
+    \acro_index_if:Nn \l__acro_addto_index_bool {#1}
+    \acro_property_get:nnT {#1} {post}
+      { \tl_use:N \l__acro_post_tl }
+  }
+
+% --------------------------------------------------------------------------
+% the `acro-first' object, templates, instances:
+% #1: id
+% #2: long
+\DeclareObjectType {acro-first} {2}
+
+% template for inline appearance:
+\DeclareTemplateInterface {acro-first} {inline} {2}
+  {
+    brackets      : boolean   = true  ,
+    brackets-type : tokenlist = ()    ,
+    only-short    : boolean   = false ,
+    only-long     : boolean   = false ,
+    reversed      : boolean   = false ,
+    between       : tokenlist         ,
+    foreign-sep   : tokenlist = {,~}
+  }
+\DeclareTemplateCode {acro-first} {inline} {2}
+  {
+    brackets      = \l__acro_first_use_brackets_bool ,
+    brackets-type = \l__acro_first_brackets_tl       ,
+    only-short    = \l__acro_first_only_short_bool   ,
+    only-long     = \l__acro_first_only_long_bool    ,
+    reversed      = \l__acro_first_reversed_bool     ,
+    between       = \l__acro_first_between_tl        ,
+    foreign-sep   = \l__acro_foreign_sep_tl
+  }
+  {
+    \AssignTemplateKeys
+    \bool_set_true:N \l__acro_first_instance_bool
+    \bool_if:NTF \l__acro_first_reversed_bool
+      { % zuerst kurze Form, dann lange Form:
+        \__acro_print_form_and_indefinite:nnn {short} {#1} {#2}
+        \__acro_open_bracket:
+        \__acro_print_foreign:n {#1}
+        \__acro_foreign_sep:n {#1}
+        \__acro_print_form:nnn {long} {#1} {#2}
+        \__acro_print_citation:n {#1}
+        \__acro_close_bracket:
+        \__acro_finalize_first:n {#1}
+      }
+      { % zuerst lange Form, dann kurze Form:
+        \__acro_print_form_and_indefinite:nnn {long} {#1} {#2}
+        \__acro_open_bracket:
+        \__acro_print_foreign:n {#1}
+        \__acro_foreign_sep:n {#1}
+        \__acro_print_form:nnn {short} {#1} {#2}
+        \__acro_print_citation:n {#1}
+        \__acro_close_bracket:
+        \__acro_finalize_first:n {#1}
+      }
+  }
+  
+% template for footnotes, sidenotes, ...
+\cs_new:Npn \__acro_note_command:n #1 {#1}
+\DeclareTemplateInterface {acro-first} {note} {2}
+  {
+    use-note     : boolean    = true ,
+    note-command : function 1 = \footnote {#1} ,
+    foreign-sep  : tokenlist  = {,~} ,
+    reversed      : boolean   = false ,
+  }
+
+\DeclareTemplateCode {acro-first} {note} {2}
+  {
+    use-note     = \l__acro_use_note_bool  ,
+    note-command = \__acro_note_command:n  ,
+    foreign-sep  = \l__acro_foreign_sep_tl ,
+    reversed     = \l__acro_first_reversed_bool
+  }
+  {
+    \AssignTemplateKeys
+    \bool_if:NTF \l__acro_first_reversed_bool
+      { % long in text and short in note
+        \__acro_print_form_and_indefinite:nnn {long} {#1} {#2}
+        \bool_if:NT \l__acro_use_note_bool
+          {
+            \__acro_note_command:n
+              {
+                \__acro_print_foreign:n {#1}
+                \__acro_foreign_sep:n {#1}
+                \__acro_print_form:nnn {short} {#1} {#2}
+                \__acro_print_citation:n {#1}
+                \__acro_finalize_first:n {#1}
+              }
+          }
+      }
+      { % short in text and long in note
+        \__acro_print_form_and_indefinite:nnn {short} {#1} {#2}
+        \bool_if:NT \l__acro_use_note_bool
+          {
+            \__acro_note_command:n
+              {
+                \__acro_print_foreign:n {#1}
+                \__acro_foreign_sep:n {#1}
+                \__acro_print_form:nnn {long} {#1} {#2}
+                \__acro_print_citation:n {#1}
+                \__acro_finalize_first:n {#1}
+              }
+          }
+      }
+  }
+
+% --------------------------------------------------------------------------
+% declare new first styles:
+\cs_new_protected:Npn \acro_declare_first_style:nnn #1#2#3
+  {
+    \DeclareInstance {acro-first} {#1} {#2} {#3}
+    \prop_put:Nnn \l__acro_first_styles_prop  {#1} {#2}
+  }
+
+% set a list style
+\cs_new_protected:Npn \acro_set_first_style:n #1
+  {
+    \prop_if_in:NnTF \l__acro_first_styles_prop {#1}
+      { \__acro_set_first_style:n {#1} }
+      {
+        \msg_warning:nnnnn {acro} {unknown}
+          {first~ style}
+          {#1}
+          {default}
+        \__acro_set_first_style:n {default}
+      }
+  }
+
+\cs_new_protected:Npn \__acro_set_first_style:n #1
+  {
+    \tl_set:Nn \l__acro_first_instance_tl {#1}
+    \prop_get:NnN \l__acro_first_styles_prop {#1} \l__acro_tmpa_tl
+  }
+
+% --------------------------------------------------------------------------
+% formatting the extras information:
+\DeclareObjectType {acro-extra} {1}
+
+\DeclareTemplateInterface {acro-extra} {inline} {1}
+  {
+    punct         : boolean   = false ,
+    punct-symbol  : tokenlist = {,}   ,
+    brackets      : boolean   = true  ,
+    brackets-type : tokenlist = ()
+  }
+
+\DeclareTemplateCode {acro-extra} {inline} {1}
+  {
+    punct         = \l__acro_extra_punct_bool        ,
+    punct-symbol  = \l__acro_extra_punct_tl          ,
+    brackets      = \l__acro_extra_use_brackets_bool ,
+    brackets-type = \l__acro_extra_brackets_tl
+  }
+  {
+    \AssignTemplateKeys
+    \bool_if:NT \l__acro_extra_punct_bool
+      { \tl_use:N \l__acro_extra_punct_tl \tl_use:N \c_space_tl }
+    \bool_if:NT \l__acro_extra_use_brackets_bool
+      { \tl_head:N \l__acro_extra_brackets_tl }
+    \acro_write_long:Vn \l__acro_extra_format_tl {#1}
+    \bool_if:NT \l__acro_extra_use_brackets_bool
+      { \tl_tail:N \l__acro_extra_brackets_tl }
+  }
+
+% declare new extra styles:
+\cs_new_protected:Npn \acro_declare_etxra_style:nnn #1#2#3
+  {
+    \DeclareInstance {acro-etxra} {#1} {#2} {#3}
+    \prop_put:Nnn \l__acro_etxra_styles_prop  {#1} {#2}
+  }
+
+% set an extra style
+\cs_new_protected:Npn \acro_set_extra_style:n #1
+  {
+    \prop_if_in:NnTF \l__acro_extra_styles_prop {#1}
+      { \__acro_set_extra_style:n {#1} }
+      {
+        \msg_warning:nnnnn {acro} {unknown}
+          {extra~ style}
+          {#1}
+          {default}
+        \__acro_set_extra_style:n {default}
+      }
+  }
+
+\cs_new_protected:Npn \__acro_set_extra_style:n #1
+  {
+    \tl_set:Nn \l__acro_extra_instance_tl {#1}
+    \prop_get:NnN \l__acro_extra_styles_prop {#1} \l__acro_tmpa_tl
+  }
+
+\cs_new_protected:Npn \acro_declare_extra_style:nnn #1#2#3
+  {
+    \DeclareInstance {acro-extra} {#1} {#2} {#3}
+    \prop_put:Nnn \l__acro_extra_styles_prop  {#1} {#2}
+  }
+
+% --------------------------------------------------------------------------
+% outputting the page numbers:
+\RequirePackage {zref-abspage}
+
+\cs_new_protected:Npn \__acro_create_page_records:n #1
+  {
+    \seq_new:c { g__acro_#1_pages_seq }
+    \tl_new:c  { g__acro_#1_recorded_pages_tl }
+  }
+
+\cs_new_protected:Npn \acro_hyper_page:n #1 { \use:n {#1} }
+
+\cs_new:Npn \acro_get_thepage:nnn #1#2#3 { \acro_hyper_page:n {#1} }
+\cs_new:Npn \acro_get_thepage_from:N #1
+  { \exp_after:wN \acro_get_thepage:nnn #1 }
+
+\cs_new:Npn \acro_get_page_number:nnn #1#2#3 {#2}
+\cs_new:Npn \acro_get_page_number_from:N #1
+  { \exp_after:wN \acro_get_page_number:nnn #1 }
+
+\cs_new:Npn \acro_get_abspage:nnn #1#2#3 {#3}
+\cs_new:Npn \acro_get_abspage_from:N #1
+  { \exp_after:wN \acro_get_abspage:nnn #1 }
+
+\cs_new:Npn \acro_page_range_comma: {}
+
+\cs_new_protected:Npn \acro_print_page_numbers:n #1
+  {
+    \seq_if_empty:cF {g__acro_#1_pages_seq}
+      {
+        \bool_if:NTF \l__acro_list_all_pages_bool
+          {
+            % have the numbers changed?
+            \tl_set:Nx \l__acro_tmpa_tl
+              { \seq_use:cn {g__acro_#1_pages_seq} {|} }
+            \tl_if_eq:cNF {g__acro_#1_recorded_pages_tl} \l__acro_tmpa_tl
+              {
+                \@latex at warning@no at line
+                  {Rerun~to~get~page~numbers~of~acronym~#1~in~acronym~list~right}
+              }
+            \tl_clear:N \l__acro_write_pages_tl
+            \tl_clear:N \l__acro_last_page_tl
+            \tl_clear:N \l__acro_current_page_tl
+            \seq_set_eq:Nc \l__acro_tmpb_seq { g__acro_#1_pages_seq }
+            \seq_remove_duplicates:N \l__acro_tmpb_seq
+            \seq_clear:N \l__acro_tmpa_seq
+            \cs_set_protected:Npn \acro_page_range_comma:
+              { \cs_set:Npn \acro_page_range_comma: { ,~ } }
+            % get the numbers:
+            \int_compare:nNnTF { \seq_count:N \l__acro_tmpb_seq } = { 1 }
+              {
+                \tl_use:N \l__acro_page_name_tl
+                \seq_get_right:cN { g__acro_#1_pages_seq } \l__acro_tmpa_tl
+                \acro_get_thepage_from:N \l__acro_tmpa_tl
+              }
+              {
+                \tl_use:N \l__acro_pages_name_tl
+                \seq_map_inline:cn { g__acro_#1_pages_seq }
+                  {
+                    \tl_if_blank:VTF \l__acro_last_page_tl
+                      {% we're at the beginning
+                        \seq_put_right:Nn \l__acro_tmpa_seq {##1}
+                        \tl_set:Nn \l__acro_last_page_tl {##1}
+                      }
+                      {% we'at least at the second page
+                         % current page:
+                         \tl_set:Nn  \l__acro_current_page_tl {##1}
+                         % last page:
+                         \seq_get_right:NN \l__acro_tmpa_seq \l__acro_last_page_tl
+                         \tl_if_eq:NNTF \l__acro_current_page_tl \l__acro_last_page_tl
+                           {% there were more than one appearance on the current page
+                             \seq_put_right:Nn \l__acro_tmpa_seq {##1}
+                           }
+                           {% new page
+                             \acro_determine_page_ranges:NNn
+                               \l__acro_tmpa_seq
+                               \l__acro_write_pages_tl
+                               {##1}
+                           }
+                      }
+                  }
+                \seq_if_empty:NF \l__acro_tmpa_seq
+                  {
+                    \acro_determine_page_ranges:NNV
+                      \l__acro_tmpa_seq
+                      \l__acro_write_pages_tl
+                      \l__acro_current_page_tl
+                  }
+                \tl_use:N \l__acro_write_pages_tl
+                \tl_clear:N \l__acro_write_pages_tl
+              }
+          }
+          {
+            \tl_use:N \l__acro_page_name_tl
+            \pageref{\l__acro_label_prefix_tl #1}
+          }
+      }
+    \seq_clear:N \l__acro_tmpa_seq
+    \seq_clear:N \l__acro_tmpb_seq
+  }
+
+\cs_new:Npn \acro_determine_page_ranges:NNn #1#2#3
+  {
+    \seq_remove_duplicates:N #1
+    % current page:
+    \int_set:Nn \l__acro_tmpa_int { \acro_get_abspage:nnn #3 }
+    \int_set:Nn \l__acro_tmpb_int { \acro_get_page_number:nnn #3 }
+    % last page:
+    \seq_get_right:NN #1 \l__acro_last_page_tl
+    \int_set:Nn \l__acro_tmpc_int
+      { \acro_get_abspage_from:N \l__acro_last_page_tl }
+    \int_set:Nn \l__acro_tmpd_int
+      { \acro_get_page_number_from:N \l__acro_last_page_tl }
+    \bool_lazy_and:nnTF
+      {
+        \int_compare_p:nNn
+          { \l__acro_tmpa_int - \l__acro_tmpc_int }
+           =
+          { \l__acro_tmpb_int - \l__acro_tmpd_int }
+      }
+      {
+        \int_compare_p:nNn
+        { \l__acro_tmpb_int - \l__acro_tmpd_int } = {1}
+      }
+      {% same kind of page numbering, one page ahead
+       % => possible range
+         \seq_put_right:Nn #1 {#3}
+      }
+      {% any possible range ended
+        \tl_put_right:Nn #2 { \acro_page_range_comma: }
+        \int_compare:nNnTF
+          { \seq_count:N #1 } > {2}
+          {% real range
+            \seq_get_left:NN #1 \l__acro_tmpa_tl
+            \tl_put_right:Nx #2 { \acro_get_thepage_from:N \l__acro_tmpa_tl }
+            \bool_if:NTF \l__acro_following_pages_bool
+              { \tl_put_right:Nn #2 { \l__acro_next_pages_tl } }
+              {
+                \tl_put_right:Nn #2 { -- }
+                \seq_get_right:NN #1 \l__acro_tmpa_tl
+                \tl_put_right:Nx #2 { \acro_get_thepage_from:N \l__acro_tmpa_tl }
+              }
+          }
+          {
+            \int_compare:nNnTF
+              { \seq_count:N #1 } = {2}
+              {% range of two pages
+                \seq_get_left:NN #1 \l__acro_tmpa_tl
+                \tl_put_right:Nx #2 { \acro_get_thepage_from:N \l__acro_tmpa_tl }
+                \bool_if:NTF \l__acro_following_page_bool
+                  { \tl_put_right:Nn #2 { \l__acro_next_page_tl } }
+                  {
+                    \tl_put_right:Nn #2 { ,~ }
+                    \seq_get_right:NN #1 \l__acro_tmpa_tl
+                    \tl_put_right:Nx #2 { \acro_get_thepage_from:N \l__acro_tmpa_tl }
+                  }
+              }
+              {% no range at all
+                \seq_get_right:NN #1 \l__acro_tmpa_tl
+                \tl_put_right:Nx #2 { \acro_get_thepage_from:N \l__acro_tmpa_tl }
+              }
+          }
+        \seq_clear:N #1
+        \seq_put_right:Nn #1 {#3}
+      }
+  }
+\cs_generate_variant:Nn \acro_determine_page_ranges:NNn {NNV}
+
+% --------------------------------------------------------------------------
+\DeclareObjectType {acro-page-number} {1}
+
+\DeclareTemplateInterface {acro-page-number} {inline} {1}
+  {
+    display       : boolean   = true  ,
+    punct         : boolean   = false ,
+    punct-symbol  : tokenlist = {,}   ,
+    brackets      : boolean   = false ,
+    brackets-type : tokenlist = ()    ,
+    space         : skip      = .333333em plus .166666em minus .111111em
+  }
+
+\DeclareTemplateCode {acro-page-number} {inline} {1}
+  {
+    display       = \l__acro_page_display_bool  ,
+    punct         = \l__acro_page_punct_bool    ,
+    punct-symbol  = \l__acro_page_punct_tl      ,
+    brackets      = \l__acro_page_brackets_bool ,
+    brackets-type = \l__acro_page_brackets_tl   ,
+    space         = \l__acro_page_space_skip
+  }
+  {
+    \AssignTemplateKeys
+    \bool_if:NT \l__acro_page_display_bool
+      {
+        \bool_if:NT \l__acro_page_punct_bool
+          { \tl_use:N \l__acro_page_punct_tl }
+        % \tl_use:N \c_space_tl
+        \dim_compare:nNnF { \l__acro_page_space_skip } = { 0pt }
+          { \skip_horizontal:N \l__acro_page_space_skip }
+        \bool_if:NT \l__acro_page_brackets_bool
+          { \tl_head:N \l__acro_page_brackets_tl }
+        \acro_print_page_numbers:n {#1}
+        \bool_if:NT \l__acro_page_brackets_bool
+          { \tl_tail:N \l__acro_page_brackets_tl }
+      }
+  }
+
+% declare new page styles:
+\cs_new_protected:Npn \acro_declare_page_style:nnn #1#2#3
+  {
+    \DeclareInstance {acro-page-number} {#1} {#2} {#3}
+    \prop_put:Nnn \l__acro_page_styles_prop  {#1} {#2}
+  }
+
+% set a page style
+\cs_new_protected:Npn \acro_set_page_style:n #1
+  {
+    \prop_if_in:NnTF \l__acro_page_styles_prop {#1}
+      { \__acro_set_page_style:n {#1} }
+      {
+        \msg_warning:nnnnn {acro} {unknown}
+          {page~ style}
+          {#1}
+          {none}
+        \__acro_set_page_style:n {none}
+      }
+  }
+
+\cs_new_protected:Npn \__acro_set_page_style:n #1
+  {
+    \tl_set:Nn \l__acro_page_instance_tl {#1}
+    \prop_get:NnN \l__acro_page_styles_prop {#1} \l__acro_tmpa_tl
+  }
+
+% --------------------------------------------------------------------------
+% the title of the list:
+\cs_new:Npn \acro_list_title_format:n #1 {#1}
+
+\DeclareObjectType {acro-title} {1}
+
+\DeclareTemplateInterface {acro-title} {sectioning} {1}
+  { name-format : function 1 = #1 }
+
+\DeclareTemplateCode {acro-title} {sectioning} {1}
+  { name-format = \acro_list_title_format:n }
+  {
+    \AssignTemplateKeys
+    \acro_list_title_format:n {#1}
+  }
+
+% set a list heading:
+\cs_new_protected:Npn \acro_set_list_heading:n #1
+  {
+    \prop_if_in:NnTF \l__acro_list_headings_prop {#1}
+      { \__acro_set_list_heading:n {#1} }
+      {
+        \msg_warning:nnnnn {acro} {unknown}
+          {list~ heading}
+          {#1}
+          {section*}
+        \__acro_set_list_heading:n {section*}
+      }
+  }
+
+\cs_new_protected:Npn \__acro_set_list_heading:n #1
+  { \tl_set:Nn \l__acro_list_heading_cmd_tl {#1} }
+  
+\cs_new_protected:Npn \acro_declare_list_heading:nn #1#2
+  {
+    \prop_put:Nnn \l__acro_list_headings_prop {#1} {#2}
+    \DeclareInstance {acro-title} {#1} {sectioning}
+      { name-format = #2 {##1} }
+  }
+
+% --------------------------------------------------------------------------
+% typesetting the acronym list
+\DeclareObjectType {acro-list} {2}
+
+% #1: id
+% #2: excluded classes
+\prg_new_protected_conditional:Npnn \acro_if_is_excluded:nn #1#2 {T,F,TF}
+  {
+    \bool_set_false:N \l__acro_is_excluded_bool
+    \tl_if_blank:nF {#2}
+      {
+        \acro_property_get:nnT {#1} {class}
+          {
+            \seq_set_split:NnV \l__acro_tmpa_seq {,} \l__acro_class_tl
+            \clist_map_inline:nn {#2}
+              {
+                \seq_if_in:NnT \l__acro_tmpa_seq {##1}
+                  { \bool_set_true:N \l__acro_is_excluded_bool }
+              }
+          }
+      }
+    \bool_if:NTF \l__acro_is_excluded_bool
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+% #1: id
+% #2: included classes
+\prg_new_protected_conditional:Npnn \acro_if_is_included:nn #1#2 {T,F,TF}
+  {
+    \bool_set_false:N \l__acro_is_included_bool
+    \tl_if_blank:nTF {#2}
+      { \bool_set_true:N \l__acro_is_included_bool }
+      {
+        \acro_property_get:nnT {#1} {class}
+          {
+            \seq_set_split:NnV \l__acro_tmpa_seq {,} \l__acro_class_tl
+            \clist_map_inline:nn {#2}
+              {
+                \seq_if_in:NnT \l__acro_tmpa_seq {##1}
+                  { \bool_set_true:N \l__acro_is_included_bool }
+              }
+          }
+      }
+    \bool_if:NTF \l__acro_is_included_bool
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+% #1: id
+\cs_new_protected:Npn \__acro_list_entry_short:n #1
+  {
+    \group_begin:
+      \acro_get:n {#1}
+      \acro_hyper_target:nn
+        {#1}
+        {
+          \acro_acc_supp:nn
+            {#1}
+            {
+              \bool_lazy_and:nnTF
+                { \l__acro_custom_short_format_bool }
+                { \l__acro_override_list_format_bool }
+                { \l__acro_custom_short_format_tl }
+                { \l__acro_list_short_format_tl }
+              { \__acro_property_get:nn {short} {#1} }
+            }
+        }
+    \group_end:
+  }
+
+% #1: id
+\cs_new_protected:Npn \__acro_list_entry_long: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_if_in:NnTF \l__acro_list_prop {#1}
+            { \__acro_property_get:nn {list} {#1} }
+            { \__acro_property_get:nn {long} {#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}
+  }
+
+% #1: id
+\cs_new_protected:Npn \__acro_list_entry_extra:n #1
+  {
+    \acro_property_get:nnT {#1} {extra}
+      {
+        \acro_extra_instance:VV
+          \l__acro_extra_instance_tl
+          \l__acro_extra_tl
+      }
+  }
+
+% #1: id
+\cs_new_protected:Npn \__acro_list_entry_page:n #1
+  {
+    \cs_if_exist:cT {acro@#1 at once}
+      {
+        \acro_page_number_instance:Vn
+          \l__acro_page_instance_tl
+          {#1}
+      }
+  }
+  
+% macro for retrieval of items in the list:
+% #1: property
+% #2: id
+\cs_new_protected:Npn \acro_list_entry:nn #1#2
+  {
+    \str_case:nnF {#1}
+      {
+        {short} { \__acro_list_entry_short:n {#2} }
+        {long}  { \__acro_list_entry_long:n {#2} }
+        {extra} { \__acro_list_entry_extra:n {#2} }
+        {page}  { \__acro_list_entry_page:n {#2} }
+      }
+      { \__acro_property_get:nn {#1} {#2} }
+  }
+
+% this macro may/should 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_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' -- this macro should be used in
+% the template code for retrieving the list
+  
+% #1: id
+% #2: included classes
+% #3: excluded classes
+\prg_new_protected_conditional:Npnn \acro_if_entry:nnn #1#2#3 {T,F,TF}
+  {
+    \bool_lazy_or:nnTF
+      {
+        \bool_lazy_and_p:nn
+          { !\l__acro_single_use_bool }
+          { !\l__acro_print_only_used_bool }
+      }
+      {
+        \bool_lazy_and_p:nn
+          { \bool_if_p:c {g__acro_#1_in_list_bool} }
+          {
+            \bool_lazy_or_p:nn
+              {
+                \bool_lazy_and_p:nn
+                  { \l__acro_single_use_bool }
+                  { \cs_if_exist_p:c {acro@#1 at twice} }
+              }
+              {
+                \bool_lazy_all_p:n
+                  {
+                    { !\l__acro_single_use_bool }
+                    { \cs_if_exist_p:c {acro@#1 at once} }
+                    { \l__acro_print_only_used_bool }
+                  }
+              }
+          }
+      }
+      {
+        \acro_if_is_excluded:nnTF {#1} {#3}
+          { \prg_return_false: }
+          {
+            \acro_if_is_included:nnTF {#1} {#2}
+              {
+                \bool_lazy_and:nnTF
+                  { \g__acro_use_barriers_bool }
+                  { \l__acro_use_barrier_bool }
+                  {
+                    \acro_if_in_barrier:nxTF {#1}
+                      { \int_use:N \g__acro_barrier_int }
+                      { \prg_return_true: }
+                      { \prg_return_false: }
+                  }
+                  { \prg_return_true: }
+              }
+              { \prg_return_false: }
+          }
+      }
+      { \prg_return_false: }
+  }
+
+% this macro is used in templates for fetching all items to be printed; it
+% collects all entries in a tl which then is used where needed
+%
+% #1: tl containing the entries
+% #2: included classes
+% #3: excluded classes
+\cs_new_protected:Npn \acro_build_list_entries:Nnn #1#2#3
+  {
+    \tl_clear:N #1
+    \acro_for_all_acronyms_do:n
+      {% ##1: id; ##2: short form
+        \group_begin:
+          \acro_get:n {##1}
+          \acro_if_entry:nnnT {##1} {#2} {#3}
+            {
+              \tl_gput_right:Nn #1
+                {
+                  \acro_print_list_entry:nnnn
+                    { \acro_list_entry:nn {short} {##1} }
+                    { \acro_list_entry:nn {long} {##1} }
+                    { \acro_list_entry:nn {extra} {##1} }
+                    { \acro_list_entry:nn {page} {##1} }
+                }
+            }
+        \group_end:  
+      }
+  }
+
+% this macro is used in templates for fetching all items to be printed:
+\cs_new_protected:Npn \acro_list_items:nn #1#2
+  {
+    \acro_build_list_entries:Nnn \l__acro_list_entries_tl {#1} {#2}
+    \tl_use:N \l__acro_list_entries_tl
+  }
+  
+% --------------------------------------------------------------------------
+% declare templates for the list:
+% `list' template:
+\DeclareTemplateInterface {acro-list} {list} {2}
+  {
+    foreign-sep : tokenlist = {~} ,
+    list        : tokenlist = {description} ,
+    reverse     : boolean   = false ,
+    before      : tokenlist = ,
+    after       : tokenlist =
+  }
+
+\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:
+    \bool_if:NTF \l__acro_list_reverse_long_extra_bool
+      {
+        \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_entry:nnnn ##1##2##3##4
+          { \item [##1] ##2 ##3 ##4 }
+      }
+    \use:x
+      {
+        \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
+      }
+  }
+
+% `list-of' template:
+\DeclareTemplateInterface {acro-list} {list-of} {2}
+  {
+    foreign-sep : tokenlist = {~} ,
+    style       : tokenlist = {toc} ,
+    reverse     : boolean   = false ,
+    before      : tokenlist = ,
+    after       : tokenlist =
+  }
+
+\DeclareTemplateCode {acro-list} {list-of} {2}
+  {
+    foreign-sep = \l__acro_foreign_sep_tl ,
+    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
+    \bool_set_true:N \l__acro_in_list_bool
+    \tl_if_eq:VnT \l__acro_page_instance_tl {none}
+      { \tl_set:Nn \l__acro_page_instance_tl {plain} }
+    \tl_set:Nn \l__acro_page_name_tl {}
+    \tl_set:Nn \l__acro_pages_name_tl {}
+    \acro_activate_hyperref_support:
+    \str_case:Vn \l__acro_list_of_style
+      {
+        {toc}
+        { % similar to the table of contents
+          \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
+                {
+                  \cs_set_protected:Npn \acro_print_list_entry:nnnn ##1##2##3##4
+                    {
+                      \contentsline{chapter}{##1}{}{}
+                      \contentsline{section}{##2##3}{##4}{}
+                    } 
+                }
+                {
+                  \cs_set_protected:Npn \acro_print_list_entry:nnnn ##1##2##3##4
+                    {
+                      \contentsline{section}{##1}{}{}
+                      \contentsline{subsection}{##2##3}{##4}{}
+                    }
+                }
+            }
+        }
+        {lof}
+        { % similar to the list of figures
+          \cs_set_protected:Npn \l at acro
+            { \@dottedtocline {1} {1.5em} {\l__acro_short_width_dim} }
+          \bool_if:NTF \l__acro_list_reverse_long_extra_bool
+            {
+              \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}{} }
+            }
+        }
+      }
+    \use:x
+      {
+        \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
+      }
+  }
+  
+% `table' template:
+\DeclareTemplateInterface {acro-list} {table} {2}
+  {
+    table       : tokenlist = tabular ,
+    table-spec  : tokenlist = lp{.7\linewidth} ,
+    foreign-sep : tokenlist = {~} ,
+    reverse     : boolean   = false ,
+    before      : tokenlist = ,
+    after       : tokenlist = 
+  }
+
+\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 ,
+    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:
+    \bool_if:NTF \l__acro_list_reverse_long_extra_bool
+      {
+        \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_entry:nnnn ##1##2##3##4
+          { ##1 & ##2 ##3 ##4 \tabularnewline }
+      }
+    \acro_build_list_entries:Nnn \l__acro_list_entries_tl {#1} {#2}
+    \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:V \l__acro_list_entries_tl
+        \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} {2}
+  {
+    table       : tokenlist = tabular ,
+    table-spec  : tokenlist = llll ,
+    foreign-sep : tokenlist = {~} ,
+    reverse     : boolean   = false ,
+    before      : tokenlist = ,
+    after       : tokenlist = 
+  }
+
+\DeclareTemplateCode {acro-list} {extra-table} {2}
+  {
+    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:
+    \bool_if:NTF \l__acro_list_reverse_long_extra_bool
+      {
+        \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_entry:nnnn ##1##2##3##4
+          { ##1 & ##2 & ##3 & ##4 \tabularnewline }
+      }
+    \acro_build_list_entries:Nnn \l__acro_list_entries_tl {#1} {#2}
+    \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:V \l__acro_list_entries_tl
+        \exp_not:N \end { \exp_not:V \l__acro_list_table_tl }
+        \exp_not:V \l__acro_list_after_tl
+      }
+  }
+
+% --------------------------------------------------------------------------
+% declare new list styles:
+\cs_new_protected:Npn \acro_declare_list_style:nnn #1#2#3
+  {
+    \DeclareInstance {acro-list} {#1} {#2} {#3}
+    \prop_put:Nnn \l__acro_list_styles_prop  {#1} {#2}
+  }
+
+% set a list style
+\cs_new_protected:Npn \acro_set_list_style:n #1
+  {
+    \prop_if_in:NnTF \l__acro_list_styles_prop {#1}
+      { \__acro_set_list_style:n {#1} }
+      {
+        \msg_warning:nnnnn {acro} {unknown}
+          {list~ style}
+          {#1}
+          {description}
+        \__acro_set_list_style:n {description}
+      }
+  }
+
+\cs_new_protected:Npn \__acro_set_list_style:n #1
+  {
+    \tl_set:Nn \l__acro_list_instance_tl {#1}
+    \prop_get:NnN \l__acro_list_styles_prop {#1} \l__acro_list_type_tl
+  }
+
+% --------------------------------------------------------------------------
+% case insensitivity of the ID:
+\cs_new:Npn \acro_case_insensitive:n #1
+  {
+    \bool_if:NTF \g__acro_case_sensitive_bool
+      { \tl_to_str:n {#1} }
+      { \str_lowercase:n {#1} }
+  }
+
+\cs_new_protected:Npn \acro_protected_case_insensitive:n #1
+  { \acro_case_insensitive:n {#1} }
+
+\cs_new:Npn \acro_case_insensitive:Nn #1#2
+  { \exp_args:Ne #1 { \acro_case_insensitive:n {#2} } }
+
+\cs_new:Npn \acro_case_insensitive:Nnn #1#2#3
+  { \exp_args:Ne #1 { \acro_case_insensitive:n {#2} } {#3} }
+
+\cs_new_protected:Npn \acro_case_insensitive_command:Nnnn #1#2#3#4
+  { \exp_args:Nnnx #1 {#2} {#3} { \acro_case_insensitive:n {#4} } }
+\cs_generate_variant:Nn \acro_case_insensitive_command:Nnnn {c}
+
+% --------------------------------------------------------------------------
+% automatic typesetting, the internals of \ac:
+% #1: id
+
+\cs_new_protected:Npn \acro_soft_upper:
+  {
+    \bool_if:NF \l__acro_upper_short_bool
+      { \bool_set_false:N \l__acro_first_upper_bool }
+  }
+
+\cs_new_protected:Npn \acro_use:n #1
+  {
+    % get the acronym and the plural settings:
+    \acro_get:n {#1}
+    \acro_is_used:nTF {#1}
+      {
+        \acro_soft_upper:
+        % this is not the first time
+        \acro_write_indefinite:nn {#1} {short}
+        \acro_write_compact:nn {#1} {short}
+        \acro_after:n {#1}
+      }
+      {
+        % this is the first time
+        \bool_gset_true:c { g__acro_#1_first_use_bool }
+        \acro_if_is_single:nTF {#1}
+          { \acro_single:n {#1} }
+          { \acro_first_instance:nV {#1} \l__acro_long_tl }
+      }
+  }
+
+% single appearances:
+\cs_new_protected:Npn \acro_single:n #1
+  {
+    \acro_cite:
+    \acro_single_form:nV {#1} \l__acro_single_form_tl
+    \acro_after:n {#1}
+  }
+
+% #1: ID
+% #2: long|first|<other>
+\cs_new_protected:Npn \acro_single_form:nn #1#2
+  {
+    \acro_write_indefinite:nn {#1} {#2}
+    \str_case:nnF {#2}
+      {
+        {long} {
+          \tl_if_blank:VT \l__acro_single_format_tl
+            {
+              \bool_if:NTF \l__acro_custom_long_format_bool
+                {
+                  \tl_set_eq:NN
+                    \l__acro_single_format_tl
+                    \l__acro_custom_long_format_tl
+                }
+                {
+                  \tl_set_eq:NN
+                    \l__acro_single_format_tl
+                    \l__acro_long_format_tl
+                }
+            }
+          \tl_if_blank:VT \l__acro_single_tl
+            { \tl_set_eq:NN \l__acro_single_tl \l__acro_long_tl }
+          % BUG: should that be \acro_write_expanded:nn ?
+          % \acro_write_expanded:nnn {#1} {#2} {\l__acro_single_tl}
+          \acro_write_long:VV \l__acro_single_format_tl \l__acro_single_tl
+          \acro_endings:nn {#1} {single}
+          \l__acro_long_post_tl
+        }
+        {first} {
+          \tl_if_blank:VF \l__acro_single_format_tl
+            {
+              \tl_set_eq:NN
+                \l__acro_first_long_format_tl
+                \l__acro_single_format_tl
+            }
+          \tl_if_blank:VT \l__acro_single_tl
+            { \tl_set_eq:NN \l__acro_single_tl \l__acro_long_tl }
+          \acro_first_instance:nV {#1} \l__acro_single_tl
+        }
+      }
+      { % other (e.g. short)
+        \acro_soft_upper:
+        \tl_if_blank:VF \l__acro_single_tl
+          { \tl_set_eq:cN {l__acro_#2_tl} \l__acro_single_tl }
+        \tl_if_blank:VF \l__acro_single_format_tl
+          { \tl_set_eq:cN {l__acro_#2_format_tl} \l__acro_single_format_tl }
+        \acro_write_compact:nn {#1} {#2}
+      }
+  }
+\cs_generate_variant:Nn \acro_single_form:nn {nV}
+
+\prg_new_conditional:Npnn \acro_if_is_single:n #1 { p,T,TF }
+  {
+    \bool_lazy_or:nnTF
+      { !\l__acro_single_use_bool }
+      { \cs_if_exist_p:c {acro@#1 at twice} }
+      { \prg_return_false: }
+      { \prg_return_true: }
+  }
+
+\cs_new_protected:Npn \acro_use_acronym:n #1
+  { \use:c {bool_set_#1:N} \l__acro_mark_as_used_bool }
+
+% --------------------------------------------------------------------------
+% some helpers we'll need more often:
+\prg_new_conditional:Npnn \acro_if_defined:n #1 {p,T,F,TF}
+  {
+    \seq_if_in:NeTF \g__acro_declared_acronyms_seq
+      { \acro_case_insensitive:n {#1} }
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+\cs_new_protected:Npn \acro_defined:n #1
+  {
+    \acro_if_defined:nF {#1}
+      { \acro_serious_message:nn {undefined} {#1} }
+  }
+
+% expandably gets property but doesn't transform property name -- internal
+% name is needed
+% #1: property
+% #2: id
+\cs_new:Npn \__acro_property_get:nn #1#2
+  { \prop_item:cn {l__acro_#1_prop} {#2} }
+
+% #1: id
+% #2: property
+% #3: set case
+% #4: not set case
+\prg_new_protected_conditional:Npnn \acro_property_get:nn #1#2 {T,F,TF}
+  {
+    \tl_set:Nn \l__acro_tmpa_tl {#2}
+    \tl_replace_all:Nnn \l__acro_tmpa_tl {-} {_}
+    \prop_get:cncTF
+      {l__acro_ \l__acro_tmpa_tl _prop}
+      {#1}
+      {l__acro_ \l__acro_tmpa_tl _tl}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+\cs_new_protected:Npn \acro_property_get:nn #1#2
+  { \acro_property_get:nnTF {#1} {#2} {} {} }
+\cs_generate_variant:Nn \acro_property_get:nn {V}
+
+% within this command one can refer to the current id with `#1'
+\cs_new_protected:Npn \acro_add_action:n #1
+  { \seq_put_right:Nn \l__acro_actions_seq {#1} }
+
+\cs_new_protected:Npn \__acro_get_actions:n #1
+  {
+    \seq_map_inline:Nn \l__acro_actions_seq
+      {
+        \cs_set:Npn \__acro_action:n ####1 {##1}
+        \__acro_action:n {#1}
+      }
+  }
+
+\cs_new_protected:Npn \acro_get:n #1
+  {
+    \bool_if:NF \l__acro_in_list_bool { \leavevmode }
+    \acro_activate_hyperref_support:
+    % short:
+    \acro_property_get:nn {#1} {short}
+    % alt:
+    \acro_property_get:nnF {#1} {alt}
+      { \tl_set_eq:NN \l__acro_alt_tl \l__acro_short_tl }
+    % long:
+    \acro_property_get:nn {#1} {long}
+    % foreign:
+    \acro_property_get:nn {#1} {foreign}
+    % foreign-lang:
+    \acro_property_get:nn {#1} {foreign-lang}
+    % extra:
+    \acro_property_get:nn {#1} {extra}
+    % single:
+    \acro_property_get:nn {#1} {single}
+    % first-style:
+    \acro_property_get:nn {#1} {first-style}
+    % formatting
+    \acro_property_get:nnTF {#1} {long-format}      
+      {
+        \tl_set_eq:NN \l__acro_custom_long_format_tl \l__acro_long_format_tl
+        \bool_set_true:N  \l__acro_custom_long_format_bool
+      }
+      { \bool_set_false:N \l__acro_custom_long_format_bool }
+    \acro_property_get:nn {#1} {first-long-format}
+    \acro_property_get:nnTF {#1} {format}
+      {
+        \tl_set_eq:NN \l__acro_custom_short_format_tl \l__acro_format_tl
+        \bool_set_true:N \l__acro_custom_short_format_bool
+      }
+      { \bool_set_false:N \l__acro_custom_short_format_bool }
+    \acro_property_get:nnTF {#1} {alt-format}
+      {
+        \tl_set_eq:NN \l__acro_custom_alt_format_tl \l__acro_alt_format_tl
+        \bool_set_true:N \l__acro_custom_alt_format_bool
+      }
+      { \bool_set_false:N \l__acro_custom_alt_format_bool }
+    \acro_property_get:nnTF {#1} {foreign-format}
+      {
+        \tl_set_eq:NN \l__acro_custom_foreign_format_tl \l__acro_foreign_format_tl
+        \bool_set_true:N \l__acro_custom_foreign_format_bool
+      }
+      { \bool_set_false:N \l__acro_custom_foreign_format_bool }
+    \acro_property_get:nn {#1} {single-format}
+    \acro_for_endings_do:n
+      {
+        \bool_if:cT {l__acro_##1_bool}
+          { \__acro_set_ending_for:nnn {##1} {#1} {long} }
+      }
+    \acro_property_get:nnF {#1} {long-post}
+      { \tl_clear:N \l__acro_long_post_tl }
+    \acro_property_get:nnT {#1} {long-pre}
+      { \tl_put_left:NV \l__acro_long_tl \l__acro_long_pre_tl }
+    \__acro_get_actions:n {#1}
+  }
+
+% --------------------------------------------------------------------------
+% plural endings and similar concepts:
+
+\cs_new_protected:Npn \acro_for_endings_do:n #1
+  { \seq_map_inline:Nn \l__acro_endings_seq {#1} }
+
+% #1: ending
+% #2: ID
+\cs_new_protected:Npn \__acro_set_ending:nn #1#2
+  {
+    \bool_if:cT {l__acro_#1_bool}
+      {
+        \__acro_set_ending_for:nnn {#1} {#2} {short}
+        \__acro_set_ending_for:nnn {#1} {#2} {alt}
+        \__acro_set_ending_for:nnn {#1} {#2} {long}
+        \__acro_set_ending_for:nnn {#1} {#2} {foreign} % XXX
+      }
+  }
+
+% this does nothing if a non-existent ending (#1) or non-existent form (#3) is
+% input
+% #1: ending
+% #2: id
+% #3: short|alt|long|foreign
+\cs_new_protected:Npn \__acro_set_ending_for:nnn #1#2#3
+  {
+    \acro_if_ending_form_exist:nnT {#1} {#3}
+      {
+        \bool_if:cTF
+          { c_ \prop_item:cn {l__acro_#3_#1_form_prop} {#2} _bool }
+          { \prop_get:cnc {l__acro_#3_#1_prop} {#2} {l__acro_#3_tl}  }
+          { \prop_get:cnc {l__acro_#3_#1_prop} {#2} {l__acro_#3_#1_tl} }
+      }
+  }
+
+\cs_new_protected:Npn \__acro_set_endings:n #1
+  {
+    \acro_for_endings_do:n
+      { \__acro_set_ending:nn {##1} {#1} }
+  }
+
+% #1: id
+% #2: short|alt|…
+\cs_new_protected:Npn \acro_get_ending_form:nn #1#2
+  {
+    \acro_for_endings_do:n
+      {
+        \acro_if_ending_form_exist:nnT {##1} {#2}
+          {
+            \bool_lazy_and:nnT
+              { \use:c {l__acro_##1_bool} }
+              { \use:c { c_ \prop_item:cn {l__acro_#2_##1_form_prop} {#1} _bool } }
+              { \prop_get:cncF {l__acro_#2_##1_prop} {#1} {l__acro_#2_tl} {} }
+          }
+      }
+  }
+
+% #1: id
+% #2: short|alt|…
+\cs_new_protected:Npn \acro_endings:nn #1#2
+  {
+    \group_begin:
+      \str_if_eq:nnTF {#2} {single}
+        {
+          \keys_set:nn {acro}
+            { long-format= \l__acro_single_format_tl }
+          \__acro_endings:nn {#1} {long}
+        }
+        { \__acro_endings:nn {#1} {#2} }
+    \group_end:
+  }
+
+\cs_new_protected:Npn \__acro_endings:nn #1#2
+  {
+    \acro_for_endings_do:n
+      {
+        \__acro_set_ending_for:nnn {##1} {#1} {#2}
+        \bool_if:cT {l__acro_##1_bool}
+          { \__acro_ending_format:nn {#2} { \tl_use:c {l__acro_#2_##1_tl} } }
+      }
+  }
+
+% #1: long|short|alt
+% #2: string
+\cs_new_protected:Npn \__acro_ending_format:nn #1#2
+  {
+    \bool_if:NTF \l__acro_include_endings_format_bool
+      {
+        \str_case:nn {#1}
+          {
+            {long}
+            {
+              \bool_if:NTF \l__acro_custom_long_format_bool
+                { \l__acro_custom_long_format_tl }
+                {
+                  \bool_if:NTF \l__acro_first_instance_bool
+                    { \l__acro_first_long_format_tl }
+                    { \l__acro_long_format_tl }
+                }
+            }
+            {short}
+            {
+              \bool_if:NTF \l__acro_custom_short_format_bool
+                { \l__acro_custom_short_format_tl }
+                { \l__acro_short_format_tl }
+            }
+            {alt}
+            {
+              \bool_if:NTF \l__acro_custom_alt_format_bool
+                { \l__acro_custom_alt_format_tl }
+                { \l__acro_alt_format_tl }
+            }
+            {foreign}
+            {
+              \bool_if:NTF \l__acro_custom_foreign_format_bool
+                { \l__acro_custom_foreign_format_tl }
+                { \l__acro_foreign_format_tl }
+            }
+          }
+      }
+      { \use:n }
+      {#2}
+  }
+  
+\prg_new_conditional:Npnn \acro_if_ending_exist:n #1 {p,T,F,TF}
+  {
+    \seq_if_in:NnTF \l__acro_endings_seq {#1}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+% #1: ending
+% #2: short|alt|…
+\prg_new_conditional:Npnn \acro_if_ending_form_exist:nn #1#2 {p,T,F,TF}
+  {
+    \cs_if_exist:cTF {l__acro_#2_#1_prop}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+  
+% #1: name
+% #2: default short
+% #3: default long
+\cs_new_protected:Npn \acro_provide_ending:nnn #1#2#3
+  {
+    \acro_if_ending_exist:nTF {#1}
+      {
+        \acro_harmless_message:nn {ending-exists} {#1}
+        % short variables
+        \acro_set_ending_variables:nnn {short} {#1} {#2}
+        % alt variables
+        \acro_set_ending_variables:nnn {alt} {#1} {#2}
+        % long variables
+        \acro_set_ending_variables:nnn {long} {#1} {#3}
+        % foreign variables % XXX
+        \acro_set_ending_variables:nnn {foreign} {#1} {#3}
+      }
+      {
+        % registering:
+        \bool_if:NT \g__acro_first_acronym_declared_bool
+          { \acro_serious_message:n {ending-before-acronyms} }
+        \seq_put_right:Nn \l__acro_endings_seq {#1}
+        \bool_new:c {l__acro_#1_bool}
+        % short variables
+        \acro_define_and_set_ending_variables:nnn {short} {#1} {#2}
+        % alt variables
+        \acro_define_and_set_ending_variables:nnn {alt} {#1} {#2}
+        % long variables
+        \acro_define_and_set_ending_variables:nnn {long} {#1} {#3}
+        % foreign variables % XXX
+        \acro_define_and_set_ending_variables:nnn {foreign} {#1} {#3}
+        % define setup command:
+        \tl_set:Nn \l__acro_tmpa_tl {#1}
+        \tl_replace_all:Nnn \l__acro_tmpa_tl {-} {_}
+        \cs_new_protected:cpn {acro_ \l__acro_tmpa_tl :}
+          { \bool_set_true:c {l__acro_#1_bool} }
+        % acronym properties:
+        % short-<ending>:
+        \acro_declare_property:nnn {short_#1} {short-#1}
+          {
+            \prop_put:cnn {l__acro_short_#1_form_prop} {##1} {false}
+            \prop_put:cnx {l__acro_pdfstring_short_#1_prop}
+              {##1} { \prop_item:Nn \l__acro_short_prop {##1} \exp_not:n {##2} }
+          }
+        % short-<ending>-form:
+        \acro_declare_property_generic:nnn {short_#1_form} {short-#1-form}
+          {
+            \__acro_property_check:nn {##1} {short-#1-form}
+            \prop_put:cnn {l__acro_short_#1_form_prop} {##1} {true}
+            \prop_put:cnn {l__acro_short_#1_prop} {##1} {##2}
+            \prop_put:cnn {l__acro_pdfstring_short_#1_prop} {##1} {##2}
+          }
+        % alt-<ending>:
+        \acro_declare_property:nnn {alt_#1} {alt-#1}
+          {
+            \prop_put:cnn {l__acro_alt_#1_form_prop} {##1} {false}
+            \prop_put:cnx {l__acro_pdfstring_alt_#1_prop}
+              {##1} { \prop_item:Nn \l__acro_alt_prop {##1} \exp_not:n {##2} }
+          }
+        % alt-<ending>-form:
+        \acro_declare_property_generic:nnn {alt_#1_form} {alt-#1-form}
+          {
+            \__acro_property_check:nn {##1} {alt-#1-form}
+            \prop_put:cnn {l__acro_alt_#1_form_prop} {##1} {true}
+            \prop_put:cnn {l__acro_alt_#1_prop} {##1} {##2}
+            \prop_put:cnn {l__acro_pdfstring_alt_#1_prop} {##1} {##2}
+          }
+        % long-<ending>:
+        \acro_declare_property:nnn {long_#1} {long-#1}
+          { \prop_put:cnn {l__acro_long_#1_form_prop} {##1} {false} }
+        % long-<ending>-form:
+        \acro_declare_property_generic:nnn {long_#1_form} {long-#1-form}
+          {
+            \__acro_property_check:nn {##1} {long-#1-form}
+            \prop_put:cnn {l__acro_long_#1_form_prop} {##1} {true}
+            \prop_put:cnn {l__acro_long_#1_prop} {##1} {##2}
+          }
+        % foreign-<ending>: % XXX
+        \acro_declare_property:nnn {foreign_#1} {foreign-#1}
+          { \prop_put:cnn {l__acro_foreign_#1_form_prop} {##1} {false} }
+        % foreign-<ending>-form: % XXX
+        \acro_declare_property_generic:nnn {foreign_#1_form} {foreign-#1-form}
+          {
+            \__acro_property_check:nn {##1} {foreign-#1-form}
+            \prop_put:cnn {l__acro_foreign_#1_form_prop} {##1} {true}
+            \prop_put:cnn {l__acro_foreign_#1_prop} {##1} {##2}
+          }
+        % options:
+        %   short-<ending>-ending
+        %   alt-<ending>-ending
+        %   long-<ending>-ending
+        %   foreign-<ending>-ending % XXX
+        %   <ending>-ending
+        \keys_define:nn {acro}
+          {
+            short-#1-ending .code:n =
+              \bool_if:NT \g__acro_first_acronym_declared_bool
+                { \acro_serious_message:n {ending-before-acronyms} }
+              \tl_set:cn {l__acro_default_short_#1_tl} {##1} ,
+            alt-#1-ending   .code:n =
+              \bool_if:NT \g__acro_first_acronym_declared_bool
+                { \acro_serious_message:n {ending-before-acronyms} }
+              \tl_set:cn {l__acro_default_alt_#1_tl} {##1} ,
+            long-#1-ending  .code:n =
+              \bool_if:NT \g__acro_first_acronym_declared_bool
+                { \acro_serious_message:n {ending-before-acronyms} }
+                \tl_set:cn {l__acro_default_long_#1_tl} {##1} ,
+            foreign-#1-ending .code:n =
+              \bool_if:NT \g__acro_first_acronym_declared_bool
+                { \acro_serious_message:n {ending-before-acronyms} }
+              \tl_set:cn {l__acro_default_foreign_#1_tl} {##1} ,
+            #1-ending       .code:n   =
+              \bool_if:NT \g__acro_first_acronym_declared_bool
+                { \acro_serious_message:n {ending-before-acronyms} }
+              \__acro_read_ending_settings:nww {#1} ##1// \acro_stop:
+          }
+        % pdfstrings:
+        % TODO: add long forms:
+        \prop_new:c {l__acro_pdfstring_short_#1_prop}
+        \cs_new:cpn {acro_pdf_string_short_#1:n} ##1
+          {
+            \acro_if_star_gobble:nTF {##1}
+              { \use:e { \prop_item:cn {l__acro_pdfstring_short_#1_prop} } }
+              { \use:e {\prop_item:cn {l__acro_pdfstring_short_#1_prop} {##1} } }
+          }
+        \cs_new:cpn {acpdfstring#1} { \use:c {acro_pdf_string_short_#1:n} }
+        \prop_new:c {l__acro_pdfstring_alt_#1_prop}
+        \cs_new:cpn {acro_pdf_string_alt_#1:n} ##1
+          {
+            \acro_if_star_gobble:nTF {##1}
+              { \prop_item:cn {l__acro_pdfstring_alt_#1_prop} }
+              { \prop_item:cn {l__acro_pdfstring_alt_#1_prop} {##1} }
+          }
+        \cs_new:cpn {acpdfstringalt#1} { \use:c {acro_pdf_string_alt_#1:n} }
+      }
+  }
+
+% #1: short|alt|long
+% #2: ending name
+% #3: default ending
+\cs_new_protected:Npn \acro_define_and_set_ending_variables:nnn #1#2#3
+  {
+    \acro_define_ending_variables:nn {#1} {#2}
+    \acro_set_ending_variables:nnn {#1} {#2} {#3}
+  }
+
+% #1: short|alt|long
+% #2: ending name
+\cs_new_protected:Npn \acro_define_ending_variables:nn #1#2
+  {
+    \prop_new:c {l__acro_#1_#2_prop}
+    \prop_new:c {l__acro_#1_#2_form_prop}
+    \tl_new:c   {l__acro_#1_#2_tl}
+    \tl_new:c   {l__acro_default_#1_#2_tl}
+  }
+
+% #1: short|alt|long
+% #2: ending name
+% #3: default ending
+\cs_new_protected:Npn \acro_set_ending_variables:nnn #1#2#3
+  { \tl_set:cn  {l__acro_default_#1_#2_tl} {#3} }
+
+% #1: ending name
+% #2: short (and long if #4 is blank)
+% #3: long
+\cs_new_protected:Npn \__acro_read_ending_settings:nww #1#2/#3/#4 \acro_stop:
+  {
+    \acro_set_ending_variables:nnn {short} {#1} {#2}
+    \acro_set_ending_variables:nnn {alt} {#1} {#2}
+    \tl_if_blank:nTF {#4}
+      {
+        \acro_set_ending_variables:nnn {long} {#1} {#3}
+        \acro_set_ending_variables:nnn {foreign} {#1} {#3}
+      }
+      {
+        \acro_set_ending_variables:nnn {long} {#1} {#2}
+        \acro_set_ending_variables:nnn {foreign} {#1} {#2}
+      }
+  }
+
+% --------------------------------------------------------------------------
+% enable us to know if the acronym is used only once and provide a different
+% style for that:
+\prg_new_protected_conditional:Npnn \acro_is_used:n #1 { T,F,TF }
+  {
+    \acro_record_barrier:n {#1}
+    \bool_lazy_and:nnTF
+      { \bool_if_p:c {g__acro_#1_used_bool} }
+      {
+        \bool_lazy_or_p:nn
+          {
+            \bool_lazy_and_p:nn
+              { \bool_if_p:c {g__acro_#1_first_use_bool} }
+              { \g__acro_mark_first_as_used_bool }
+          }
+          { !\g__acro_mark_first_as_used_bool }
+      }
+      {
+        \bool_if:NTF \l__acro_mark_as_used_bool
+          {
+            \__acro_aux_file:Nxxxx \acro at used@twice
+              {#1}
+              { \thepage }
+              { \arabic {page} }
+              { \arabic {abspage} }
+          }
+          { \__acro_aux_file:Nxxxx \acro at used@twice {#1} {} {} {} }
+        \prg_return_true:
+      }
+      {
+        \bool_if:NTF \l__acro_mark_as_used_bool
+          {
+            \__acro_aux_file:Nxxxx \acro at used@once
+              {#1}
+              { \thepage }
+              { \arabic {page} }
+              { \arabic {abspage} }
+            \bool_lazy_and:nnT
+              { !\bool_if_p:c {g__acro_#1_label_bool} }
+              { \l__acro_place_label_bool }
+              {
+                \bool_gset_true:c { g__acro_#1_label_bool }
+                \label{\l__acro_label_prefix_tl #1}
+              }
+            \bool_gset_true:c { g__acro_#1_used_bool }
+          }
+          {}
+          % I can't remember why I want an empty first use case for starred
+          % acronyms…
+          % { \__acro_aux_file:Nxxxx \acro at used@once {#1} {} {} {} }
+        \prg_return_false:
+      }
+  }
+
+\cs_new:Npn \acro_is_used:n #1
+  { \acro_is_used:nTF {#1} { } { } }
+
+\cs_new_protected:Npn \__acro_aux_file:Nnnnn #1#2#3#4#5
+  { \iow_shipout:Nn \@auxout { #1 {#2} {#3} {#4} {#5} } }
+\cs_generate_variant:Nn \__acro_aux_file:Nnnnn {Nxxxx}
+  
+\cs_new_protected:Npn \__acro_aux_file_now:n #1
+  { \iow_now:Nn \@auxout {#1} }
+\cs_generate_variant:Nn \__acro_aux_file_now:n {x}
+
+% --------------------------------------------------------------------------
+% the commands for the auxiliary file:
+\cs_new_protected:Npn \acro at used@once #1#2#3#4
+  {
+    \cs_gset_nopar:cpn {acro@#1 at once} {#1}
+    \bool_gset_true:c {g__acro_#1_in_list_bool}
+    \tl_if_empty:nF {#2#3#4}
+      {
+        % \bool_gset_true:c { g__acro_#1_used_bool }
+        \seq_gput_right:cn {g__acro_#1_pages_seq} { {#2}{#3}{#4} }
+      }
+  }
+\cs_new_protected:Npn \acro at used@twice #1#2#3#4
+  {
+    \cs_gset_nopar:cpn {acro@#1 at twice} {#1}
+    \tl_if_empty:nF {#2#3#4}
+      { \seq_gput_right:cn {g__acro_#1_pages_seq} { {#2}{#3}{#4} } }
+  }
+
+\cs_new_protected:Npn \acro at pages #1#2
+  { \tl_gset:cn {g__acro_#1_recorded_pages_tl} {#2} }
+
+\cs_new_protected:Npn \acro at rerun@check
+  {
+    \bool_if:NT \g__acro_rerun_bool
+      {
+        \@latex at warning@no at line
+          {Acronyms~ may~ have~ changed.~ Please~ rerun~ LaTeX}
+      }
+  }
+
+\AtEndDocument
+  {
+    \bool_gset_false:N \g__acro_rerun_bool
+    \cs_gset_protected:Npn \acro at used@once #1#2#3#4
+      {
+        \tl_set:Nn \l__acro_tmpa_tl {#1}
+        \tl_if_eq:cNF {acro@#1 at once} \l__acro_tmpa_tl
+          { \bool_gset_true:N \g__acro_rerun_bool }
+      }
+    \cs_gset_protected:Npn \acro at used@twice #1#2#3#4
+      {
+        \tl_set:Nn \l__acro_tmpa_tl {#1}
+        \tl_if_eq:cNF {acro@#1 at twice} \l__acro_tmpa_tl
+          { \bool_gset_true:N \g__acro_rerun_bool }
+      }
+    \acro_for_all_acronyms_do:n
+      {
+        \seq_if_empty:cF {g__acro_#1_pages_seq}
+          {
+            \__acro_aux_file_now:x
+              {
+                \acro at pages {#1}
+                  { \seq_use:cn {g__acro_#1_pages_seq} {|} } ^^J
+                \acro at barriers {#1}
+                  { \seq_use:cn {g__acro_#1_barriers_seq} {,} }
+              }
+          }
+        \acro_check_barriers:n {#1}
+      }
+    \__acro_aux_file_now:n { \acro at rerun@check }
+  }
+
+% if `acro' is deactivated prevent unnecessary errors from aux file:
+\if at filesw
+\AtBeginDocument
+  {
+    \__acro_aux_file_now:n
+      {
+        \providecommand \acro at used@once [4] {} ^^J
+        \providecommand \acro at used@twice [4] {} ^^J
+        \providecommand \acro at pages [2] {} ^^J
+        \providecommand \acro at rerun@check {} ^^J
+        \providecommand \acro at print@list {} ^^J
+        \providecommand \acro at barriers [2] {}
+      }
+  }
+\fi
+
+% --------------------------------------------------------------------------
+% #1: short|alt|long
+% #2: string to be typeset
+\cs_new_protected:Npn \__acro_typeset:nn #1#2
+  {
+    \mode_if_horizontal:F { \leavevmode }
+    \group_begin:
+      \use:x
+        {
+          \bool_if:cTF {l__acro_custom_#1_format_bool}
+            { \exp_not:v {l__acro_custom_#1_format_tl} }
+            { \exp_not:v {l__acro_#1_format_tl} }
+            {#2}
+        }
+    \group_end:
+  }
+
+% typeset the short form:
+% #1: ID
+% #2: short form
+\cs_new_protected:Npn \acro_write_short:nn #1#2
+  {
+    \__acro_make_link:nn {#1}
+      {
+        \__acro_typeset:nn {short}
+          {
+            \bool_if:NTF \l__acro_first_upper_bool
+              { \exp_not:N \__acro_first_upper_case:n { \exp_not:n {#2} } }
+              { \exp_not:n {#2} }
+          }
+      }
+  }
+\cs_generate_variant:Nn \acro_write_short:nn {nV,nv}
+
+% typeset the alternative form:
+% #1: ID
+% #2: alt form
+\cs_new_protected:Npn \acro_write_alt:nn #1#2
+  {
+    \__acro_make_link:nn {#1}
+      {
+        \__acro_typeset:nn {alt}
+          {
+            \bool_lazy_and:nnTF
+              { \l__acro_first_upper_bool }
+              { \l__acro_upper_short_bool }
+              { \exp_not:N \__acro_first_upper_case:n { \exp_not:n {#2} } }
+              { \exp_not:n {#2} }
+          }
+      }
+  }
+\cs_generate_variant:Nn \acro_write_alt:nn {nV,nv}
+
+% typeset a long form:
+%   TODO: rethink the formatting mechanism
+%   right now a custom format gets applied additionally to the global one
+%   although before it
+% #1: format
+% #2: long form
+\cs_new_protected:Npn \acro_write_long:nn #1#2
+  {
+    \__acro_typeset:nn {long}
+      {
+        \exp_not:n {#1}
+        {
+          \bool_if:NTF \l__acro_first_upper_bool
+            { \exp_not:N \__acro_first_upper_case:n { \exp_not:n {#2} } }
+            { \exp_not:n {#2} }
+        }
+      }
+  }
+\cs_generate_variant:Nn \acro_write_long:nn {VV,Vo,Vf,V,v,vv}
+
+\prg_new_conditional:Npnn \acro_if_foreign:n #1 {T,F,TF}
+  {
+    \bool_lazy_and:nnTF
+      { \l__acro_foreign_bool }
+      { \prop_if_in_p:Nn \l__acro_foreign_prop {#1} }
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+\cs_new_protected:Npn \acro_foreign_language:nn #1#2 {}
+\AtBeginDocument{
+  \cs_if_exist:NTF \foreignlanguage
+    {
+      \cs_set_protected:Npn \acro_foreign_language:nn #1#2
+        {
+          \tl_if_blank:nTF {#1}
+            {#2}
+            { \foreignlanguage {#1} {#2} }
+        }
+    }
+    {
+      \cs_set_protected:Npn \acro_foreign_language:nn #1#2
+        { \use_ii:nn {#1} {#2} }
+    }
+}
+\cs_generate_variant:Nn \acro_foreign_language:nn {VV}
+
+\cs_new_protected:Npn \acro_write_foreign:n #1
+  {
+    \acro_if_foreign:nT {#1}
+      {
+        \acro_property_get:nnT {#1} {foreign}
+          {
+            \group_begin:
+              \__acro_endings:nn {#1} {foreign}
+              \tl_use:N \l__acro_foreign_format_tl
+              {
+                \acro_foreign_language:VV
+                  \l__acro_foreign_lang_tl
+                  \l__acro_foreign_tl
+              }
+            \group_end:
+          }
+      }
+  }
+
+\cs_new:Npn \acroenparen #1 { (#1) }
+
+\cs_new_protected:Npn \acro_get_foreign:n #1
+  {
+    \acro_property_get:nnT {#1} {foreign}
+      {
+        \tl_use:N \l__acro_foreign_sep_tl
+        \group_begin:
+          \tl_use:N \l__acro_foreign_list_format_tl
+          {
+            \acro_foreign_language:VV
+              \l__acro_foreign_lang_tl
+              \l__acro_foreign_tl
+          }
+        \group_end:
+      }
+  }
+
+% --------------------------------------------------------------------------
+% #1: id
+% #2: short|alt
+\cs_set_protected:Npn \acro_write_compact:nn #1#2
+  {
+    \acro_get_ending_form:nn {#1} {#2}
+    \acro_acc_supp:nn
+      {#1}
+      {
+        \acro_write_tooltip:nnV
+          {#1}
+          {
+            \use:c {acro_write_#2:nv} {#1} {l__acro_#2_tl}
+            \acro_endings:nn {#1} {#2}
+          }
+          \l__acro_long_tl
+      }
+  }
+
+% TODO: get rid of argument #3?
+% #1: ID
+% #2: long|first-long|list-long|extra
+% #3: long form
+\cs_new_protected:Npn \acro_write_expanded:nnn #1#2#3
+  {
+    \tl_set:Nn \l__acro_tmpa_tl {#2}
+    \tl_replace_all:Nnn \l__acro_tmpa_tl {-} {_}
+    \acro_write_long:vn {l__acro_ \l__acro_tmpa_tl _format_tl} {#3}
+    \acro_endings:nn {#1} {long}
+    \tl_if_in:nnT {#2} {long}
+      { \l__acro_long_post_tl }
+  }
+\cs_generate_variant:Nn \acro_write_expanded:nnn {nnV}
+
+% #1: ID
+% #2: long|first-long|list-long|extra
+\cs_new_protected:Npn \acro_write_expanded:nn #1#2
+  {
+    \tl_set:Nn \l__acro_tmpa_tl {#2}
+    \tl_replace_all:Nnn \l__acro_tmpa_tl {-} {_}
+    \acro_write_long:vv
+      {l__acro_ \l__acro_tmpa_tl _format_tl}
+      {l__acro_ \l__acro_tmpa_tl _tl}
+    \acro_endings:nn {#1} {long}
+    \tl_if_in:nnT {#2} {long}
+      { \l__acro_long_post_tl }
+  }
+
+% #1: id
+\cs_new_protected:Npn \acro_after:n #1
+  {
+    \acro_cite_if:Nn \l__acro_citation_all_bool {#1}
+    \acro_index_if:Nn \l__acro_addto_index_bool {#1}
+    \acro_property_get:nnT {#1} {post}
+      { \tl_use:N \l__acro_post_tl }
+  }
+
+\cs_new_protected:Npn \acro_check_single:n #1
+  {
+    \acro_if_is_single:nT {#1}
+      { \cs_set_eq:NN \acro_hyper_link:nn \use_ii:nn }
+  }
+
+% --------------------------------------------------------------------------
+% #1: id
+\cs_new_protected:Npn \acro_before:n #1
+  {
+    \acro_get:n {#1}
+    \acro_is_used:n {#1}
+    \acro_check_single:n {#1}
+  }
+
+% the standard internals:
+% #1: id
+\cs_new_protected:Npn \acro_short:n #1
+  {
+    \acro_before:n {#1}
+    \acro_write_indefinite:nn {#1} {short}
+    \acro_write_compact:nn {#1} {short}
+    \acro_after:n {#1}
+  }
+
+% get alternative entry:
+% #1: id
+\cs_new_protected:Npn \acro_alt:n #1
+  {
+    \acro_before:n {#1}
+    \acro_alt_error:n {#1}
+    \acro_write_indefinite:nn {#1} {alt}
+    \acro_write_compact:nn {#1} {alt}
+    \acro_after:n {#1}
+  }
+
+% get long entry:
+% #1: id
+\cs_new_protected:Npn \acro_long:n #1
+  {
+    \acro_before:n {#1}
+    \acro_write_indefinite:nn {#1} {long}
+    \acro_write_expanded:nn {#1} {long}
+    \acro_after:n {#1}
+  }
+
+% get foreign entry:
+% #1: id
+\cs_new_protected:Npn \acro_foreign:n #1
+  {
+    \acro_get:n {#1}
+    \tl_if_blank:VF \l__acro_foreign_tl
+      {
+        \acro_is_used:n {#1}
+        \acro_check_single:n {#1}
+        \acro_write_long:VV \l__acro_foreign_format_tl \l__acro_foreign_tl
+        \acro_after:n {#1}
+      }
+  }
+
+% get extra entry:
+% #1: id
+\cs_new_protected:Npn \acro_extra:n #1
+  {
+    \acro_get:n {#1}
+    \tl_if_blank:VF \l__acro_extra_tl
+      {
+        \acro_is_used:n {#1}
+        \acro_check_single:n {#1}
+        \acro_write_long:VV \l__acro_extra_format_tl \l__acro_extra_tl
+        \acro_after:n {#1}
+      }
+  }
+
+% output like the first time:
+% #1: id
+\cs_new_protected:Npn \acro_first:n #1
+  {
+    \bool_gset_true:c {g__acro_#1_first_use_bool}
+    \acro_before:n {#1}
+    \acro_first_instance:nV {#1} \l__acro_long_tl
+  }
+
+% output like the first time with own long version:
+% #1: id
+% #2: instead of long entry
+\cs_new_protected:Npn \acro_first_like:nn #1#2
+  {
+    \bool_gset_true:c {g__acro_#1_first_use_bool}
+    \acro_before:n {#1}
+    \acro_first_instance:nn {#1} {#2}
+  }
+
+% ----------------------------------------------------------------------------
+% citations:
+\cs_new:Npn \__acro_citation_cmd:w { \cite }
+\cs_new:Npn \__acro_group_citation_cmd:w { \cite }
+
+% #1 pre
+% #2 post
+% #3 key
+\cs_new:Npn \__acro_cite:nnn #1#2#3
+  {
+    \quark_if_no_value:nTF {#1}
+      { \__acro_citation_cmd:w {#3} }
+      {
+        \quark_if_no_value:nTF {#2}
+          { \__acro_citation_cmd:w [#1] {#3} }
+          { \__acro_citation_cmd:w [#1] [#2] {#3} }
+      }
+  }
+\cs_generate_variant:Nn \__acro_cite:nnn {VVV}
+
+\cs_new_protected:Npn \acro_cite:n #1
+  {
+    \acro_property_get:nnT {#1} {before-citation}
+      { \acro_no_break: \l__acro_before_citation_tl  }
+    \prop_get:NnNT \l__acro_citation_prop {#1} \l__acro_tmpa_tl
+      {
+        \prop_get:NnN \l__acro_citation_pre_prop {#1} \l__acro_tmpb_tl
+        \prop_get:NnN \l__acro_citation_post_prop {#1} \l__acro_tmpc_tl
+        \acro_no_break:
+        \tl_use:N \l__acro_citation_connect_tl
+        \__acro_cite:VVV
+          \l__acro_tmpb_tl
+          \l__acro_tmpc_tl
+          \l__acro_tmpa_tl
+      }
+    \acro_property_get:nnT {#1} {after-citation}
+      { \acro_no_break: \l__acro_after_citation_tl  }
+  }
+
+\cs_new_protected:Npn \acro_group_cite:n #1
+  {
+    \group_begin:
+      \cs_set_eq:NN \__acro_citation_cmd:w \__acro_group_citation_cmd:w
+      \tl_set_eq:NN
+        \l__acro_citation_connect_tl
+        \l__acro_between_group_connect_citation_tl
+      \acro_cite_if:Nn \l__acro_citation_first_bool {#1}
+    \group_end:
+  }
+
+\cs_new_protected:Npn \acro_cite_if:Nn #1#2
+  { \bool_if:NT #1 { \acro_cite:n {#2} } }
+
+% ----------------------------------------------------------------------------
+% indexing:
+\cs_new_protected:Npn \acro_index_if:Nn #1#2
+  {
+    \bool_lazy_and:nnT {#1} { \l__acro_mark_as_used_bool }
+      {
+        \prop_get:NnN \l__acro_index_cmd_prop  {#2} \l__acro_tmpa_tl
+        \prop_get:NnN \l__acro_index_sort_prop {#2} \l__acro_tmpb_tl
+        \prop_get:NnN \l__acro_index_prop      {#2} \l__acro_tmpc_tl
+        \__acro_index:VnVV
+          \l__acro_tmpa_tl
+          {#2}
+          \l__acro_tmpb_tl
+          \l__acro_tmpc_tl
+      }
+  }
+
+\cs_new:Npn \__acro_index_cmd:n { \index }
+
+% #1: cmd
+% #2: key
+% #3: sort
+% #4: replace
+\cs_new_protected:Npn \__acro_index:nnnn #1#2#3#4
+  {
+    \prop_get:NnNF \l__acro_short_prop  {#2} \l__acro_index_short_tl {}
+    \prop_get:NnNF \l__acro_format_prop {#2} \l__acro_index_format_tl {}
+    \quark_if_no_value:VTF \l__acro_index_format_tl
+      { \tl_set:Nn \l__acro_tmpa_tl { \l__acro_short_format_tl \l__acro_index_short_tl } }
+      { \tl_set:Nn \l__acro_tmpa_tl { \l__acro_index_format_tl \l__acro_index_short_tl } }
+    \quark_if_no_value:nF {#1}
+      { \cs_set:Npn \__acro_index_cmd:n {#1} }
+    \quark_if_no_value:nTF {#4}
+      {
+        \quark_if_no_value:nTF {#3}
+          { \__acro_index_cmd:n { #2 @ { \l__acro_tmpa_tl } } }
+          { \__acro_index_cmd:n { #3 @ { \l__acro_tmpa_tl } } }
+      }
+      { \__acro_index_cmd:n {#4} }
+  }
+\cs_generate_variant:Nn \__acro_index:nnnn {VnVV}
+
+% ----------------------------------------------------------------------------
+% accessability support
+\cs_new_eq:NN \acro_acc_supp:nn \use_ii:nn
+
+\cs_new_protected:Npn \acro_get_acc_supp:nn #1#2
+  {
+    \prop_get:NnNF \l__acro_acc_supp_prop {#1} \l__acro_acc_supp_tl
+      { \prop_get:NnNF \l__acro_short_prop {#1} \l__acro_acc_supp_tl {} }
+    \acro_for_endings_do:n
+      {
+        \bool_if:cT {l__acro_##1_bool}
+          {
+            \tl_put_right:Nv
+              \l__acro_acc_supp_tl
+              {l__acro_short_##1_tl}
+          }
+      }
+    \acro_do_acc_supp:VVn
+      \l__acro_acc_supp_tl
+      \l__acro_acc_supp_options_tl
+      {#2}
+  }
+
+\cs_new:Npn \acro_do_acc_supp:nnn #1#2#3
+  {
+    \BeginAccSupp { ActualText = #1 , #2 }
+      #3
+    \EndAccSupp { }
+  }
+\cs_generate_variant:Nn \acro_do_acc_supp:nnn {VV}
+
+\AtEndPreamble
+  {
+    \bool_if:NT \l__acro_acc_supp_bool
+      {
+        \RequirePackage {accsupp}
+        \cs_set_eq:NN \acro_acc_supp:nn \acro_get_acc_supp:nn
+      }
+    \bool_if:NT \l__acro_tooltip_bool
+      {
+        \RequirePackage {pdfcomment}
+        \cs_if_eq:NNT \__acro_tooltip_cmd:nn \use_i:nn
+          { \cs_set:Npn \__acro_tooltip_cmd:nn { \pdftooltip } }
+      }
+  }
+
+% --------------------------------------------------------------------------
+% tooltips for acronyms
+
+% #1: id
+% #2: printed text
+% #3: tool tip text
+\cs_new_protected:Npn \acro_write_tooltip:nnn #1#2#3
+  {
+    \acro_property_get:nnTF {#1} {tooltip}
+      { \__acro_check_tooltip:nV {#2} \l__acro_tooltip_tl }
+      { \__acro_check_tooltip:nn {#2} {#3} }
+  }
+\cs_generate_variant:Nn \acro_write_tooltip:nnn {nnV}
+
+% #1: printed text
+% #2: tool tip text
+\cs_new_protected:Npn \__acro_check_tooltip:nn #1#2
+  {
+    \bool_if:NTF \l__acro_tooltip_inside_bool
+      {#1}
+      {
+        \bool_set_true:N \l__acro_tooltip_inside_bool
+        \__acro_tooltip_cmd:nn {#1} {#2}
+      }
+  }
+\cs_generate_variant:Nn \__acro_check_tooltip:nn { nV }
+
+% use whatever command you like for creating tooltips here:
+% #1: printed text
+% #2: tool tip text
+\cs_new_eq:NN \__acro_tooltip_cmd:nn \use_i:nn
+  
+% --------------------------------------------------------------------------
+% indefinite articles:
+
+% #1: ID
+% #2: short|long|alt
+\cs_new_protected:Npn \acro_write_indefinite:nn #1#2
+  {
+    \bool_if:NT \l__acro_indefinite_bool
+      { \prop_item:cn {l__acro_#2_indefinite_prop} {#1} ~ }
+    \bool_if:NT \l__acro_upper_indefinite_bool
+      {
+         \__acro_first_upper_case:x
+           { \prop_item:cn {l__acro_#2_indefinite_prop} {#1} } ~
+      }
+  }
+
+% --------------------------------------------------------------------------
+% experimental sorting feature:
+
+% the following code is an adaption of expl3 code used for \str_if_eq:NN(TF)
+\sys_if_engine_luatex:TF
+  {
+    \tl_set:Nn \l__acro_tmpa_tl
+      {
+        acro ~ = ~ acro ~ or ~ { ~ } ~
+        function ~ acro.strcmp ~ (A, B) ~
+          if ~ A ~ == ~ B ~ then ~
+            tex.write ("0") ~
+          elseif ~ A ~ < ~ B ~ then ~
+            tex.write ("-1") ~
+          else ~
+            tex.write ("1") ~
+          end ~
+        end
+      }
+    \lua_now:e { \l__acro_tmpa_tl }
+    \cs_new_protected:Npn \acro_strcmp:nn #1#2
+      {
+        \lua_now:e
+          {
+            acro.strcmp
+              (
+                " \__acro_escape_x:n {#1} " ,
+                " \__acro_escape_x:n {#2} "
+              )
+          }
+      }
+    \cs_new:Npn \__acro_escape_x:n #1
+      {
+        \lua_escape:e
+          { \__kernel_tl_to_str:w \use:e { {#1} } }
+      }
+  }
+  { \cs_new_eq:NN \acro_strcmp:nn \tex_strcmp:D }
+
+\AtBeginDocument
+  {
+    \bool_if:NT \l__acro_sort_bool
+      {
+        \cs_new_protected:Npn \acro_sort_prop:NN #1#2
+          {
+            \seq_clear:N  \l__acro_tmpa_seq
+            \prop_clear:N \l__acro_tmpa_prop
+            \prop_clear:N \l__acro_tmpb_prop
+            \prop_map_inline:Nn #2
+              {
+                \seq_put_right:Nn \l__acro_tmpa_seq {##2}
+                \prop_put:Nnn \l__acro_tmpa_prop {##1} {##2}
+              }
+            \seq_sort:Nn \l__acro_tmpa_seq
+              {
+                \int_compare:nTF
+                  {
+                    \acro_strcmp:nn
+                      { \str_fold_case:n {##1} }
+                      { \str_fold_case:n {##2} }
+                        = -1
+                  }
+                  { \sort_return_same: }
+                  { \sort_return_swapped: }
+              }
+            \seq_map_inline:Nn \l__acro_tmpa_seq
+              {
+                \prop_map_inline:Nn \l__acro_tmpa_prop
+                  {
+                    \str_if_eq:nnT {##1} {####2}
+                      {
+                        \prop_get:NnN #1 {####1} \l__acro_tmpa_tl
+                        \prop_put:NnV \l__acro_tmpb_prop {####1}
+                          \l__acro_tmpa_tl
+                      }
+                  }
+              }
+            \prop_set_eq:NN #1 \l__acro_tmpb_prop
+          }
+      }
+  }
+
+% --------------------------------------------------------------------------
+% regarding list printing:
+% this command ensures that a rerun warning is given when \printacronyms
+% is set the first time. This mechanism doesn't make very much sense,
+% should be replaced by a different and more efficient one
+%
+\cs_new_protected:Npn \acro at print@list
+  { \cs_if_exist:NF \acro at printed@list { \cs_new:Npn \acro at printed@list { printed } } }
+
+% --------------------------------------------------------------------------
+% trailing tokens and what to do when present
+
+\cs_new_protected:Npn \acro_new_trailing_token:n #1
+  { \bool_new:c {l__acro_trailing_#1_bool} }
+\cs_new_protected:Npn \acro_activate_trailing_action:n #1
+  { \bool_set_true:c {l__acro_trailing_#1_bool} }
+\cs_new_protected:Npn \acro_deactivate_trailing_action:n #1
+  { \bool_set_false:c {l__acro_trailing_#1_bool} }
+
+% register a new token but don't activate its action:
+% #1: token
+% #2: name
+\cs_new_protected:Npn \acro_register_trailing_token:Nn #1#2
+  {
+    \prop_put:Nnn \l__acro_trailing_tokens_prop {#2} {#1}
+    \prop_put:Nnn \l__acro_trailing_actions_prop {#1}
+      { \acro_activate_trailing_action:n {#2} }
+    \acro_new_trailing_token:n {#2}
+  }
+
+\cs_new_protected:Npn \acro_for_all_trailing_tokens_do:n #1
+  { \prop_map_inline:Nn \l__acro_trailing_tokens_prop {#1} }
+
+% activate a token:
+\cs_new_protected:Npn \acro_activate_trailing_token:n #1
+  {
+    \prop_get:NnN \l__acro_trailing_tokens_prop {#1} \l__acro_tmpa_tl
+    \tl_put_right:NV \l__acro_trailing_tokens_tl \l__acro_tmpa_tl
+  }
+
+% deactivate a token:
+\cs_new_protected:Npn \acro_deactivate_trailing_token:n #1
+  {
+    \prop_get:NnN \l__acro_trailing_tokens_prop {#1} \l__acro_tmpa_tl
+    \tl_remove_all:NV \l__acro_trailing_tokens_tl \l__acro_tmpa_tl
+  }
+
+% #1: name
+\prg_new_conditional:Npnn \acro_if_trailing_token:n #1 {p,T,F,TF}
+  {
+    \bool_if:cTF {l__acro_trailing_#1_bool}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+% #1: csv list of names
+\prg_new_protected_conditional:Npnn \acro_if_trailing_tokens:n #1 {T,F,TF}
+  {
+    \bool_set_false:N \l__acro_trailing_tokens_bool
+    \clist_map_inline:nn {#1}
+      {
+        \bool_if:cT {l__acro_trailing_##1_bool}
+          {
+            \bool_set_true:N \l__acro_trailing_tokens_bool
+            \clist_map_break:
+          }
+      }
+    \bool_if:NTF \l__acro_trailing_tokens_bool
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+\cs_new_protected:Npn \aciftrailing { \acro_if_trailing_tokens:nTF }
+
+\cs_new_protected:Npn \__acro_check_trail:N #1
+  {
+    \tl_map_inline:Nn \l__acro_trailing_tokens_tl
+      {
+        \token_if_eq_meaning:NNT #1 ##1
+          { \prop_item:Nn \l__acro_trailing_actions_prop {##1} }
+      }
+  }
+
+% options for activating actions:
+\keys_define:nn {acro}
+  {
+    activate-trailing-tokens   .code:n =
+      \clist_map_inline:nn {#1} { \acro_activate_trailing_token:n {##1} } ,
+    deactivate-trailing-tokens .code:n =
+      \clist_map_inline:nn {#1} { \acro_deactivate_trailing_token:n {##1} }
+  }
+  
+% ---------------------------------------------------------------------------
+% reset outputs, they'll behave like the first time again (!not like the _only_
+% time!):
+\cs_new_protected:Npn \acro_reset:n #1
+  {
+    \bool_gset_false:c { g__acro_#1_used_bool }
+    \bool_gset_false:c { g__acro_#1_first_use_bool }
+  }
+
+\cs_new_protected: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 }
+    \bool_gset_true:c { g__acro_#1_in_list_bool }
+    \if at filesw
+      \__acro_aux_file_now:n { \acro at used@once {#1} {} {} {} }
+      \__acro_aux_file_now:n { \acro at used@twice {#1} {} {} {} }
+    \fi
+  }
+
+\cs_new_protected:Npn \acro_reset_all:
+  { \acro_for_all_acronyms_do:n { \acro_reset:n {##1} } }
+
+% make sure that no acronym is used at the beginning of the document, see
+% issue #81 for reasons why this may be necessary:
+\AfterEndPreamble { \acro_reset_all: }
+  
+\cs_new_protected:Npn \acro_mark_all_as_used:
+  { \acro_for_all_acronyms_do:n { \acro_mark_as_used:n {##1} } }
+
+\prg_new_conditional:Npnn \acro_if_acronym_used:n #1 { p,T,F,TF }
+  {
+    \bool_lazy_and:nnTF
+      { \bool_if_p:c {g__acro_#1_used_bool} }
+      { !\acro_if_is_single_p:n {#1} }
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+% --------------------------------------------------------------------------
+% acronym barriers: allow local lists of only those acronyms used between two
+% barriers
+
+\keys_define:nn {acro}
+  {
+    use-barriers      .bool_gset:N = \g__acro_use_barriers_bool ,
+    use-barriers      .initial:n   = false ,
+    reset-at-barriers .bool_gset:N = \g__acro_reset_at_barrier_bool ,
+    reset-at-barriers .initial:n   = false
+  }
+
+\cs_new_protected:Npn \acro_barrier:
+  {
+    \int_gincr:N \g__acro_barrier_int
+    \bool_if:NT \g__acro_reset_at_barrier_bool
+      { \acro_reset_all: }
+  }
+
+\cs_new_protected:Npn \acro_check_barriers:n #1
+  {
+    \bool_if:NT \g__acro_use_barriers_bool
+      {
+        \tl_set:Nx \l__acro_tmpa_tl
+          { \seq_use:cn {g__acro_#1_barriers_seq} {} }
+        \tl_set:Nx \l__acro_tmpb_tl
+          { \seq_use:cn {g__acro_#1_recorded_barriers_seq} {} }
+        \tl_if_eq:NNF \l__acro_tmpa_tl \l__acro_tmpb_tl
+          {
+            \@latex at warning@no at line
+              {Rerun~to~get~barriers~of~acronym~#1~right}
+          }
+      }
+  }
+
+\cs_new_protected:Npn \acro_record_barrier:n #1
+  {
+    \bool_if:NT \g__acro_use_barriers_bool
+      {
+        \seq_if_in:cxF {g__acro_#1_barriers_seq}
+          { \int_use:N \g__acro_barrier_int }
+          {
+            \seq_gput_right:cx  {g__acro_#1_barriers_seq}
+              { \int_use:N \g__acro_barrier_int }
+          }
+      }
+  }
+
+% #1: id
+% #2: barrier number
+\prg_new_protected_conditional:Npnn \acro_if_in_barrier:nn #1#2 {T,F,TF}
+  {
+    \seq_if_in:cnTF {g__acro_#1_recorded_barriers_seq} {#2}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+\cs_generate_variant:Nn \acro_if_in_barrier:nnTF {nx}
+
+\cs_new_protected:Npn \acro at barriers #1#2
+  { \seq_gset_split:cnn {g__acro_#1_recorded_barriers_seq} {,} {#2} }
+
+% --------------------------------------------------------------------------
+% the user commands -- preparation:
+\cs_new_protected:Npn \acro_begin:
+  {
+    \group_begin:
+    \__acro_check_after_end:w
+  }
+
+\cs_new_protected:Npn \__acro_check_after_end:w #1 \acro_end:
+  {
+    \cs_set:Npn \__acro_execute:
+      {
+        \__acro_check_trail:N \l_peek_token
+        #1
+        \acro_end: % this will end the group opened by \acro_begin:
+      }
+    \peek_after:Nw \__acro_execute:
+  }
+
+\cs_new_protected:Npn \acro_end: { \group_end: }
+
+\cs_new_protected:Npn \acro_reset_specials:
+  {
+    \bool_set_false:N \l__acro_indefinite_bool
+    \bool_set_false:N \l__acro_first_upper_bool
+    \bool_set_false:N \l__acro_upper_indefinite_bool
+    \acro_for_endings_do:n { \bool_set_false:c {l__acro_##1_bool} }
+  }
+
+% #1: ID
+% #2: true|false
+\cs_new_protected:Npn \acro_check_acronym:nn #1#2
+  {
+    \acro_defined:n {#1}
+    \acro_use_acronym:n {#2}
+  }
+
+% #1: boolean
+% #2: ID
+\cs_new_protected:Npn \acro_check_and_mark_if:nn #1#2
+  {
+    \bool_lazy_or:nnTF {#1} { !\l__acro_use_acronyms_bool }
+      { \acro_check_acronym:nn {#2} {false} }
+      { \acro_check_acronym:nn {#2} {true} }
+  }
+
+\cs_new_protected:Npn \acro_switch_off:
+  { \bool_set_false:N \l__acro_use_acronyms_bool }
+
+\cs_new_protected:Npn \acro_switch_on:
+  { \bool_set_true:N \l__acro_use_acronyms_bool }
+
+% commands for (re)defining \ac-like macros:
+\cs_new_protected:Npn \acro_define_new_acro_command:NN #1#2
+  {
+    % #1: csname
+    % #2: definition where `#1' refers to the ID
+    \cs_new_protected:Npn #1 ##1##2
+      {
+        \cs_set:Npn \__acro_tmp:n ####1 {##2}
+        \cs_new_protected:cpx
+          {acro_ \__acro_remove_backslash:N ##1 :nnn} ####1####2####3
+          {
+            \acro_begin:
+              \acro_reset_specials:
+              \exp_not:N \tl_if_blank:nF {####2} { \keys_set:nn {acro} {####2} }
+              \acro_check_and_mark_if:nn {####1} {####3}
+              \__acro_tmp:n {####3}
+            \acro_end:
+          }
+        #2 ##1 {sO{}m}
+          {
+            \acro_case_insensitive_command:cnnn
+              {acro_ \__acro_remove_backslash:N ##1 :nnn}
+              {####1}
+              {####2}
+              {####3}
+          }
+      }
+  }
+\cs_generate_variant:Nn \acro_define_new_acro_command:NN {cc}
+\cs_generate_variant:Nn \acro_check_and_mark_if:nn {nx}
+
+% commands for (re)defining \acflike-like macros:
+\cs_new_protected:Npn \acro_define_new_acro_pseudo_command:NN #1#2
+  {
+    % #1: csname
+    % #2: definition where `#1' refers to the ID and `#2' to the pseudo long form
+    \cs_new_protected:Npn #1 ##1##2
+      {
+        \cs_set:Npn \__acro_tmp:nn ####1####2 {##2}
+        \cs_new_protected:cpx
+          {acro_ \__acro_remove_backslash:N ##1 :nnn} ####1####2####3
+          {
+            \acro_begin:
+              \acro_reset_specials:
+              \acro_check_and_mark_if:nn {####1} {####3}
+              \__acro_tmp:nn {####3} {####2}
+            \acro_end:
+          }
+        #2 ##1 {smm}
+          {
+            \acro_case_insensitive_command:cnnn
+              {acro_ \__acro_remove_backslash:N ##1 :nnn}
+              {####1}
+              {####3}
+              {####2}
+          }
+      }
+  }
+\cs_generate_variant:Nn \acro_define_new_acro_pseudo_command:NN {cc}
+
+\clist_map_inline:nn {New,Renew,Declare,Provide}
+  {
+    \acro_define_new_acro_command:cc
+      {#1AcroCommand}
+      {#1DocumentCommand}
+    \acro_define_new_acro_pseudo_command:cc
+      {#1PseudoAcroCommand}
+      {#1DocumentCommand}
+  }
+
+% --------------------------------------------------------------------------
+% user commands -- facilities
+\cs_new_protected:Npn \acro_first_upper:
+  {
+    \bool_if:NTF \l__acro_indefinite_bool
+      {
+        \bool_set_false:N \l__acro_indefinite_bool
+        \bool_set_true:N \l__acro_upper_indefinite_bool
+      }
+      { \bool_set_true:N \l__acro_first_upper_bool }
+  }
+
+\cs_new_protected:Npn \acro_indefinite:
+  {
+    \bool_if:NTF \l__acro_first_upper_bool
+      {
+        \bool_set_true:N \l__acro_upper_indefinite_bool
+        \bool_set_false:N \l__acro_first_upper_bool
+      }
+      { \bool_set_true:N \l__acro_indefinite_bool }
+  }
+
+\cs_new_protected:Npn \acro_cite:
+  {
+    \bool_set_true:N \l__acro_citation_all_bool
+    \bool_set_true:N \l__acro_citation_first_bool
+  }
+
+\cs_new_protected:Npn \acro_no_cite:
+  {
+    \bool_set_false:N \l__acro_citation_all_bool
+    \bool_set_false:N \l__acro_citation_first_bool
+  }
+
+\cs_new_protected:Npn \acro_index:
+  { \bool_set_true:N \l__acro_addto_index_bool }
+
+% similar macros \acro_<ending>: are defined by \acro_provide_ending:nnn
+
+% ---------------------------------------------------------------------------
+% process options:
+\ProcessKeysPackageOptions {acro}
+
+% ---------------------------------------------------------------------------
+% PDF bookmark support
+\cs_new:Npn \acpdfstring
+  { \acro_pdf_string_short:n }
+
+\cs_new:Npn \acpdfstringalt
+  { \acro_pdf_string_alt:n }
+
+\cs_new:Npn \acpdfstringlong
+  { \acro_pdf_string_long:n }
+
+\cs_new:Npn \acpdfstringfirst #1
+  { \acpdfstringlong {#1} ~ ( \acpdfstring {#1} ) }
+
+% TODO: place this somewhere where endings are defined:
+\cs_new:Npn \acpdfstringlongplural
+  { \acro_pdf_string_long_plural:n }
+
+\prg_new_conditional:Npnn \acro_if_star_gobble:n #1 {TF}
+  {
+    \if_meaning:w *#1
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
+  }
+
+\cs_new:Npn \acro_expandable_short:n #1
+  { \use:e { \prop_item:Nn \l__acro_short_prop {#1} } }
+  
+\cs_new:Npn \acro_expandable_alt:n #1
+  { \use:e { \prop_item:Nn \l__acro_alt_prop {#1} } }
+
+\cs_new:Npn \acro_expandable_long:n #1
+  { \use:e { \prop_item:Nn \l__acro_long_prop {#1} } }
+
+\cs_new:Npn \acro_expandable_long_plural:n #1
+  {
+    \bool_if:cTF
+      { c_ \prop_item:Nn \l__acro_long_plural_form_prop {#1} _bool }
+      { \use:e { \prop_item:Nn \l__acro_long_plural_prop {#1} } }
+      {
+        \use:e {
+          \prop_item:Nn \l__acro_long_prop {#1}
+          \prop_item:Nn \l__acro_long_plural_prop {#1}
+        }
+      }
+  }
+
+\cs_new:Npn \acro_pdf_string_short:n #1
+  {
+    \acro_if_star_gobble:nTF {#1}
+      { \acro_expandable_short:n }
+      { \acro_expandable_short:n {#1} }
+  }
+
+\cs_new:Npn \acro_pdf_string_alt:n #1
+  {
+    \acro_if_star_gobble:nTF {#1}
+      { \acro_expandable_alt:n }
+      { \acro_expandable_alt:n {#1} }
+  }
+
+\cs_new:Npn \acro_pdf_string_long:n #1
+  {
+    \acro_if_star_gobble:nTF {#1}
+      { \acro_expandable_long:n }
+      { \acro_expandable_long:n {#1} }
+  }
+
+% TODO: place this somewhere where endings are defined:
+\cs_new:Npn \acro_pdf_string_long_plural:n #1
+  {
+    \acro_if_star_gobble:nTF {#1}
+      { \acro_expandable_long_plural:n }
+      { \acro_expandable_long_plural:n {#1} }
+  }
+
+\AtBeginDocument
+  {
+    \@ifpackageloaded {hyperref}
+      {
+        \bool_set_true:N \l__acro_hyperref_loaded_bool
+        \pdfstringdefDisableCommands
+          {
+            \cs_set_eq:NN \ac   \acpdfstring
+            \cs_set_eq:NN \Ac   \acpdfstring
+            \cs_set_eq:NN \acs  \acpdfstring
+            \cs_set_eq:NN \acl  \acpdfstringlong
+            \cs_set_eq:NN \Acl  \acpdfstringlong
+            \cs_set_eq:NN \acf  \acpdfstringfirst
+            \cs_set_eq:NN \Acf  \acpdfstringfirst
+            \cs_set_eq:NN \aca  \acpdfstringalt
+            \cs_set_eq:NN \acp  \acpdfstringplural
+            \cs_set_eq:NN \Acp  \acpdfstringplural
+            \cs_set_eq:NN \acsp \acpdfstringplural
+            \cs_set_eq:NN \aclp \acpdfstringlongplural
+            \cs_set_eq:NN \Aclp \acpdfstringlongplural
+            \cs_set_eq:NN \acfp \acpdfstringplural
+            \cs_set_eq:NN \Acfp \acpdfstringplural
+            \cs_set_eq:NN \acap \acpdfstringaltplural
+          }
+        \cs_set_protected:Npn \acro_hyper_page:n #1 { \hyperpage {#1} }
+      } {}
+  }
+
+% --------------------------------------------------------------------------
+% key and order checking
+\msg_new:nnn {acro} {no-id}
+  {
+    Something~ has~ gone~ wrong,~ you've~ probably~ forgotten~ to~ set~ the~
+    acronym~ ID.
+  }
+
+\msg_new:nnn {acro} {before-short}
+  {
+    You've~ set~ the~ property~ `#2'~ before~ the~ `short'~ property~ for~
+    acronym~ `#1'~ but~ it~ needs~ to~ be~ set~ after~ it.
+  }
+
+\msg_new:nnn {acro} {missing}
+  { The~ `#2'~ property~ for~ acronym~ `#1'~ is~ missing. }
+
+\msg_new:nnn {acro} {doubled-property}
+  {
+    It~ seems~ to~ me~ you~ have~ used~ the~ `#2'~ property~ twice~ in~ the~
+    declaration~ of~ acronym~ `#1'.~ If~ you~ haven't~ there's~
+    something~ different~ wrong~ and~ I'm~ lost.~ You~'re~ on~ your~ own~
+    then.
+  }
+
+% #1: acronym
+% #2: property
+\cs_new_protected:Npn \__acro_property_check:nn #1#2
+  {
+    \str_if_empty:NT \l__acro_current_id_str
+      { \acro_serious_message:n {no-id} }
+    \str_if_eq:nnF {#2} {short}
+      {
+        \acro_property_if_set:nnF {#1} {short}
+          {
+            \keys_set:nn {acro/declare-acronym} { short = {#1} }
+            \acro_harmless_message:nn {substitute-short} {#1}
+          }
+      }
+    \acro_property_mark_set:nn {#1} {#2}
+  }
+
+\cs_new_protected:Npn \__acro_first_property_check:nn #1#2
+  {
+    \cs_if_exist:cTF {l__acro_#1_short_set_bool}
+      {
+         \acro_property_if_set:nnT {#1} {short}
+           { \acro_serious_message:nnn {doubled-property} {#1} {#2} }
+      }
+      { \bool_new:c {l__acro_#1_short_set_bool} }
+    \acro_property_mark_set:nn {#1} {short}
+  }
+
+% #1: ID
+% #2: property
+\prg_new_conditional:Npnn \acro_property_if_set:nn #1#2 {T,F,TF}
+  {
+    \bool_if:cTF {l__acro_#1_#2_set_bool}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+% #1: ID
+% #2: property
+\cs_new_protected:Npn \acro_property_mark_set:nn #1#2
+  { \bool_set_true:c { l__acro_#1_#2_set_bool } }  
+\cs_generate_variant:Nn \acro_property_mark_set:nn {V}
+
+% --------------------------------------------------------------------------
+% the internal property selection functions for \DeclareAcronym:
+
+\cs_new_protected:Npn \acro_for_properties_do:n
+  { \prop_map_inline:Nn \g__acro_properties_prop }
+
+% #1: name in associated cs
+% #2: property name
+% #3: action
+\cs_new_protected:Npn \acro_declare_property_generic:nnn #1#2#3
+  {
+    \prop_clear_new:c {l__acro_#1_prop}
+    \tl_clear_new:c {l__acro_#1_tl}
+    \cs_new_protected:cpn   {__acro_declare_#1:nn} ##1##2 {#3}
+    \cs_generate_variant:cn {__acro_declare_#1:nn} {V}
+    \keys_define:nn {acro/declare-acronym}
+      {
+        #2 .code:n =
+          \use:c {__acro_declare_#1:Vn} \l__acro_current_id_str {##1}
+          \acro_property_mark_set:Vn \l__acro_current_id_str {#2}
+      }
+    \prop_gput:Nnn \g__acro_properties_prop {#2} {#1}
+  }
+
+% #1: name in associated cs
+% #2: property name
+% #3: action
+\cs_new_protected:Npn \acro_declare_property:nnn #1#2#3
+  {
+    \acro_declare_property_generic:nnn {#1} {#2}
+      {
+        \__acro_property_check:nn {##1} {#2}
+        \prop_put:cnn {l__acro_#1_prop} {##1} {##2}
+        #3
+      }
+  }
+
+% #1: name in associated cs
+% #2: property name
+\cs_new_protected:Npn \acro_declare_property:nn #1#2
+  { \acro_declare_property:nnn {#1} {#2} {} }
+\cs_generate_variant:Nn \acro_declare_property:nn {V}
+
+\cs_new_protected:Npn \acro_declare_property_simple:n #1
+  {
+    \tl_set:Nn \l__acro_tmpa_tl {#1}
+    \tl_replace_all:Nnn \l__acro_tmpa_tl {-} {_}
+    \acro_declare_property:Vn \l__acro_tmpa_tl {#1}
+  }
+
+% #1: new alias property
+% #2: old property
+\cs_new_protected:Npn \acro_declare_property_alias:nn #1#2
+  {
+    \keys_define:nn {acro/declare-acronym}
+      { #1 .meta:n = { #2 = {##1} } }
+  }
+
+% --------------------------------------------------------------------------
+% declare the properties for \DeclareAcronym:
+% short:
+\acro_declare_property_generic:nnn {short} {short}
+  {
+    \__acro_first_property_check:nn {#1} {short}
+    \prop_put:Nnn \l__acro_short_prop      {#1} {#2}
+    \prop_put:Nnn \l__acro_sort_prop       {#1} {#1}
+    \prop_put:Nnn \l__acro_index_sort_prop {#1} {#1}
+    \prop_put:Nnn \l__acro_alt_prop        {#1} {#2}
+    \prop_put:Nnn \l__acro_pdfstring_short_prop {#1} {#2}
+    \prop_put:Nnn \l__acro_pdfstring_alt_prop {#1} {#2}
+    \acro_for_endings_do:n
+      {
+        \prop_put:cnv {l__acro_short_##1_prop}
+          {#1} {l__acro_default_short_##1_tl}
+        \prop_put:cnx {l__acro_pdfstring_short_##1_prop}
+          {#1} { \exp_not:n {#2} \exp_not:v {l__acro_default_short_##1_tl} }
+        \prop_put:cnn {l__acro_short_##1_form_prop} {#1} {false}
+        \prop_put:cnv {l__acro_alt_##1_prop}
+          {#1} {l__acro_default_alt_##1_tl}
+        \prop_put:cnx {l__acro_pdfstring_alt_##1_prop}
+          {#1} { \exp_not:n {#2} \exp_not:v {l__acro_default_short_##1_tl} }
+        \prop_put:cnn {l__acro_alt_##1_form_prop} {#1} {false}
+      }
+    \prop_put:NnV \l__acro_short_indefinite_prop
+      {#1} \l__acro_default_indefinite_tl
+    \prop_put:NnV \l__acro_alt_indefinite_prop
+      {#1} \l__acro_default_indefinite_tl
+  }
+
+% long:
+\acro_declare_property:nnn {long} {long}
+  {
+    \prop_put:NnV \l__acro_long_indefinite_prop
+      {#1}
+      \l__acro_default_indefinite_tl
+    \acro_for_endings_do:n
+      {
+        \prop_put:cnn {l__acro_long_##1_form_prop} {#1} {false}
+        \acro_property_if_set:nnF {#1} {long-##1}
+          { \prop_put:cnv {l__acro_long_##1_prop} {#1} {l__acro_default_long_##1_tl} }
+        \prop_put:cnn {l__acro_foreign_##1_form_prop} {#1} {false}
+        \acro_property_if_set:nnF {#1} {foreign-##1}
+          { \prop_put:cnv {l__acro_foreign_##1_prop} {#1} {l__acro_default_foreign_##1_tl} }
+      }
+  }
+
+\acro_declare_property_simple:n {first-style}
+
+% list:
+\acro_declare_property_simple:n {list}
+
+% defines `short-plural', `long-plural' and `long-plural-form' as well as the
+% options `plural-ending', `short-plural-ending' and `long-plural-ending':
+% \ProvideAcroEnding {plural} {s} {s}
+
+% short indefinite article:
+\acro_declare_property_simple:n {short-indefinite}
+
+% long indefinite article:
+\acro_declare_property_simple:n {long-indefinite}
+
+% pre long:
+\acro_declare_property_simple:n {long-pre}
+
+% post long:
+\acro_declare_property_simple:n {long-post}
+
+% post:
+\acro_declare_property_simple:n {post}
+
+% sort:
+\acro_declare_property:nnn {sort} {sort}
+  {
+    \acro_property_if_set:nnF {#1} {index-sort}
+      { \prop_put:Nnn \l__acro_index_sort_prop {#1} {#2} }
+  }
+
+% alternative:
+\acro_declare_property:nnn {alt} {alt}
+  {
+    \prop_put:Nnn \l__acro_pdfstring_alt_prop {#1} {#2}
+    \prop_put:NnV \l__acro_alt_indefinite_prop
+      {#1} \l__acro_default_indefinite_tl
+  }
+
+\cs_set_protected:Npn \acro_alt_error:n #1
+  {
+    \acro_property_if_set:nnF {#1} {alt} 
+      { \acro_harmless_message:nn {no-alternative} {#1} }
+  }
+
+% alt. indefinite article:
+\acro_declare_property_simple:n {alt-indefinite}
+
+% foreign:
+\acro_declare_property_simple:n {foreign}
+
+% foreign-lang:
+\acro_declare_property_simple:n {foreign-lang}
+
+% format:
+\acro_declare_property_simple:n {format}
+
+% short format:
+\acro_declare_property_alias:nn {short-format} {format}
+
+% alt format:
+\acro_declare_property_simple:n {alt-format}
+
+% long format:
+\acro_declare_property_simple:n {long-format}
+
+% first long format:
+\acro_declare_property_simple:n {first-long-format}
+
+% pdfstring -- currently needs to be done `by hand':
+\cs_new_protected:Npn \__acro_declare_pdfstring:nw #1#2/#3/#4 \acro_stop:
+  {
+    \__acro_property_check:nn {#1} {pdfstring}
+    \prop_put:Nnx \l__acro_pdfstring_short_prop {#1} {#2}
+    \acro_for_endings_do:n
+      {
+        \tl_if_blank:nTF {#4}
+          {
+            \prop_put:cnx {l__acro_pdfstring_short_##1_prop}
+              {#1} { \exp_not:n {#2} \exp_not:v {l__acro_default_short_##1_tl} }
+          }
+          {
+            \prop_put:cnn {l__acro_pdfstring_short_##1_prop}
+              {#1} {#2#3}
+          }
+      }
+  }
+\cs_generate_variant:Nn \__acro_declare_pdfstring:nw {V}
+  
+\keys_define:nn {acro/declare-acronym}
+  {
+    pdfstring    .code:n =
+      \__acro_declare_pdfstring:Vw \l__acro_current_id_str #1 // \acro_stop:
+  }
+
+\cs_new_protected:Npn \__acro_declare_pdfstring_alt:nw #1#2/#3/#4 \acro_stop:
+  {
+    \__acro_property_check:nn {#1} {pdfstring-alt}
+    \prop_put:Nnn \l__acro_pdfstring_alt_prop {#1} {#2}
+    \acro_for_endings_do:n
+      {
+        \tl_if_empty:nTF {#3}
+          {
+            \prop_put:cnx {l__acro_pdfstring_alt_##1_prop}
+              {#1} { \exp_not:n {#2} \exp_not:v {l__acro_default_alt_##1_tl} }
+          }
+          { \prop_put:cnn {l__acro_pdfstring_alt_##1_prop} {#1} {#2#3} }
+      }
+  }
+\cs_generate_variant:Nn \__acro_declare_pdfstring_alt:nw {V}
+  
+\keys_define:nn {acro/declare-acronym}
+  {
+    pdfstring-alt .code:n =
+      \__acro_declare_pdfstring_alt:Vw \l__acro_current_id_str #1 // \acro_stop:
+  }
+  
+% class:
+\acro_declare_property_simple:n {class}
+
+% extra information:
+\acro_declare_property_simple:n {extra}
+
+% single appearances:
+\acro_declare_property_simple:n {single}
+
+% single format:
+\acro_declare_property_simple:n {single-format}
+
+% acc supp:
+\acro_declare_property:nn {acc_supp} {accsupp}
+
+% tooltip:
+\acro_declare_property_simple:n {tooltip}
+
+% before-citation:
+\acro_declare_property_simple:n {before-citation}
+
+% after-citation:
+\acro_declare_property_simple:n {after-citation}
+
+% citation -- this needs a bit more work:
+\cs_new_protected:Npn \__acro_declare_citation:nw #1#2[#3]#4[#5]#6#7 \acro_stop:
+  {
+    % no options: #1: ID, #2: property, #7 is blank
+    % 1 option:   #1: ID, #4: property, #3: option, #5: \q_no_value
+    % 2 options:  #1: ID: #6: property, #3: first option, #5: second option
+    \tl_if_blank:nTF {#7}
+      {
+        \__acro_declare_citation_aux:nnnn {#1}
+          { \q_no_value }
+          { \q_no_value }
+          {#2}
+      }
+      {
+        \quark_if_no_value:nTF {#5}
+          {
+            \__acro_declare_citation_aux:nnnx {#1}
+              { \q_no_value }
+              {#3}
+              { \tl_head:n {#4} }
+          }
+          { \__acro_declare_citation_aux:nnnn {#1} {#3} {#5} {#6} }
+      }
+  }
+\cs_generate_variant:Nn \__acro_declare_citation:nw {V}
+
+\keys_define:nn {acro/declare-acronym}
+  {
+    cite .code:n =
+      \__acro_declare_citation:Vw
+        \l__acro_current_id_str #1 [\q_no_value][\q_no_value] \scan_stop: \acro_stop:
+  }
+\prop_gput:Nnn \g__acro_properties_prop {cite} {cite}
+  
+% #1: ID
+% #2: pre
+% #3: post
+% #4: citation key
+\cs_new_protected:Npn \__acro_declare_citation_aux:nnnn #1#2#3#4
+  {
+    \__acro_property_check:nn {#1} {cite}
+    \prop_put:Nnn \l__acro_citation_prop {#1} {#4}
+    \quark_if_no_value:nF {#2}
+      { \prop_put:Nnn \l__acro_citation_pre_prop {#1} {#2} }
+    \quark_if_no_value:nF {#3}
+      { \prop_put:Nnn \l__acro_citation_post_prop {#1} {#3} }
+  }
+\cs_generate_variant:Nn \__acro_declare_citation_aux:nnnn {nnnx}
+  
+% TODO:
+% add index entries, by default \index{<sort>@<short>}
+% index: overwrite default <sort>@<short> entry completely
+% index-sort: overwrite the <sort> part of <sort>@<short> entry
+
+% need to take care of custom index cmd, at least
+%  - \index{}
+%  - \index[]{}
+% question is, though, if it should be the same one for all acronyms?
+% I go for yes but would also add a `post' property that allows to add arbitrary
+% TeX code after an acronym is typeset
+
+% index:
+\acro_declare_property_simple:n {index}
+
+% index-sort:
+\acro_declare_property_simple:n {index-sort}
+
+% index-cmd:
+\acro_declare_property_simple:n {index-cmd}
+
+% --------------------------------------------------------------------------
+% acronym macros:
+\cs_new_protected:Npn \__acro_define_acronym_macro:n #1
+  {
+    \bool_if:NT \l__acro_create_macros_bool
+      {
+        \cs_if_exist:cTF {#1}
+          {
+            \bool_if:NTF \l__acro_strict_bool
+              { \cs_set:cpn {#1} { \ac {#1} \acro_xspace: } }
+              { \acro_serious_message:nn {macro} {#1} }
+          }
+          { \cs_new:cpn {#1} { \ac {#1} \acro_xspace: } }
+      }
+  }
+
+% --------------------------------------------------------------------------
+% internal acronym declaring function:
+\cs_new_protected:Npn \acro_declare_acronym:nn #1#2
+  { \acro_case_insensitive:Nnn \__acro_declare_acronym:nn {#1} {#2} }
+
+\cs_new_protected:Npn \__acro_declare_acronym:nn #1#2
+  {
+    \seq_gput_right:Nn \g__acro_declared_acronyms_seq {#1}
+    \bool_gset_true:N \g__acro_first_acronym_declared_bool
+    \str_set:Nn \l__acro_current_id_str {#1}
+    \acro_for_properties_do:n
+      { \bool_new:c {l__acro_ \l__acro_current_id_str _##1_set_bool} }
+    \keys_set:nn {acro/declare-acronym} {#2}
+    \bool_new:c {g__acro_#1_first_use_bool}
+    \bool_new:c {g__acro_#1_used_bool}
+    \bool_new:c {g__acro_#1_label_bool}
+    \bool_new:c {g__acro_#1_in_list_bool}
+    \seq_new:c  {g__acro_#1_barriers_seq}
+    \seq_new:c  {g__acro_#1_recorded_barriers_seq}
+    \bool_if:NF \l__acro_print_only_used_bool
+      { \bool_gset_true:c {g__acro_#1_in_list_bool} }
+    \__acro_create_page_records:n {#1}
+    \__acro_define_acronym_macro:n {#1}
+    \str_clear:N \l__acro_current_id_str
+    \acro_property_if_set:nnF {#1} {short}
+      { \acro_serious_message:nnn {missing} {#1} {short} }
+    \acro_property_if_set:nnF {#1} {long}
+      { \acro_serious_message:nnn {missing} {#1} {long} }
+    \__acro_log_acronym:n {#1}
+  }
+
+  
+% --------------------------------------------------------------------------
+% print the list:
+% #1: list of classes
+% #2: list of excluded classes
+\keys_define:nn {acro/print-acronyms}
+  {
+    include-classes   .tl_set:N   = \l__acro_included_classes_tl ,
+    exclude-classes   .tl_set:N   = \l__acro_excluded_classes_tl ,
+    name              .tl_set:N   = \l__acro_list_name_tl ,
+    heading           .code:n     = \__acro_set_list_heading:n {#1} ,
+    sort              .bool_set:N = \l__acro_sort_bool ,
+    local-to-barriers .bool_set:N = \l__acro_use_barrier_bool
+  }
+
+\cs_new_protected:Npn \acro_print_acronyms:n #1
+  {
+    \group_begin:
+      % this is a cheap trick to prevent the \@noitemerr
+      % if one forgot to delete either the aux file or
+      % remove \printacronyms -- but it's local:
+      \cs_set:Npn \@noitemerr {}
+      \tl_clear:N \l__acro_included_classes_tl
+      \tl_clear:N \l__acro_excluded_classes_tl
+      \tl_if_blank:nF {#1}
+        { \keys_set:nn {acro/print-acronyms} {#1} }
+      \__acro_aux_file_now:n { \acro at print@list }
+      \bool_if:NT \l__acro_sort_bool
+        { \acro_sort_prop:NN \l__acro_short_prop \l__acro_sort_prop }
+      \acro_title_instance:VV
+        \l__acro_list_heading_cmd_tl
+        \l__acro_list_name_tl
+      \cs_if_exist:NTF \acro at printed@list
+        {
+          \acro_list_instance:VVV
+            \l__acro_list_instance_tl
+            \l__acro_included_classes_tl
+            \l__acro_excluded_classes_tl
+        }
+        { \@latex at warning@no at line {Rerun~to~get~acronym~list~right} }
+    \group_end:
+  }
+
+% --------------------------------------------------------------------------
+% language support
+\RequirePackage {translations}
+
+\cs_new_protected:Npn \__acro_declare_translation:www #1 \q_mark #2=#3 \q_stop
+  {
+    \tl_set:Nx \l__acro_tmpa_tl { \tl_trim_spaces:n {#1} }
+    \tl_set:Nx \l__acro_tmpb_tl { \tl_trim_spaces:n {#2} }
+    \tl_if_in:nnT {#3} {=}
+      {} % TODO: misplaced equal sign
+    \tl_set:Nx \l__acro_tmpc_tl { \tl_trim_spaces:n {#3} }
+    \__acro_declare_translation:VVV
+      \l__acro_tmpb_tl
+      \l__acro_tmpa_tl
+      \l__acro_tmpc_tl
+  }
+
+% #1: key
+% #2: lang
+% #3: translation
+\cs_new_protected:Npn \__acro_declare_translation:nnn #1#2#3
+  { \DeclareTranslation {#1} {#2} {#3} }
+\cs_generate_variant:Nn \__acro_declare_translation:nnn {VVV}
+
+% #1: key
+% #2: csv list: { <lang1> = <translation1> , <lang2> = <translation2> }
+\cs_new_protected:Npn \acro_declare_translation:nn #1#2
+  {
+    \clist_map_inline:nn {#2}
+      {
+        \tl_if_blank:nF {##1}
+          { \__acro_declare_translation:www #1 \q_mark ##1 \q_stop }
+      }
+  }
+
+% tokenlists using the translations:
+\tl_set:Nn \l__acro_list_name_tl  { \GetTranslation {acronym-list-name} }
+\tl_set:Nn \l__acro_page_name_tl  { \GetTranslation {acronym-page-name}\@\, }
+\tl_set:Nn \l__acro_pages_name_tl { \GetTranslation {acronym-pages-name}\@\, }
+\tl_set:Nn \l__acro_next_page_tl  { \,\GetTranslation {acronym-next-page}\@ }
+\tl_set:Nn \l__acro_next_pages_tl { \,\GetTranslation {acronym-next-pages}\@ }
+
+% --------------------------------------------------------------------------
+% allow for a configuration file:
+
+\file_if_exist:nT
+  { \l_acro_config_file_name_tl . \l_acro_config_file_extension_tl }
+  {
+    \@onefilewithoptions
+      {\l_acro_config_file_name_tl} [] []
+      \l_acro_config_file_extension_tl
+  }
+
+% --------------------------------------------------------------------------
+% define user functions:
+% document commands:
+\NewDocumentCommand \DeclareAcronym {mm}
+  { \acro_declare_acronym:nn {#1} {#2} }
+
+\NewDocumentCommand \acsetup { m }
+  {
+    \tl_if_blank:nF {#1}
+      { \keys_set:nn {acro} {#1} }
+    \ignorespaces
+  }
+
+\NewDocumentCommand \ProvideAcroEnding {mmm}
+  { \acro_provide_ending:nnn {#1} {#2} {#3} }
+
+\NewDocumentCommand \AcroRegisterTrailing {mm}
+  { \acro_register_trailing_token:Nn #1 {#2} }
+
+\NewDocumentCommand \DeclareAcroTranslation {mm}
+  { \acro_declare_translation:nn {#1} {#2} }
+
+\DeclareExpandableDocumentCommand \acifused { m }
+  { \acro_if_acronym_used:nTF {#1} }
+
+\NewDocumentCommand \acresetall {}
+  { \acro_reset_all: }
+
+\NewDocumentCommand \acuseall {}
+  { \acro_mark_all_as_used: }
+
+\NewDocumentCommand \acreset { > { \SplitList {,} } m }
+  { \ProcessList {#1} { \acro_reset:n } \ignorespaces }
+
+\NewDocumentCommand \acuse { > { \SplitList {,} } m }
+  { \ProcessList {#1} { \acro_mark_as_used:n } \ignorespaces }
+
+\NewDocumentCommand \acfirstupper {m}
+  { \acro_first_upper_case:n {#1} }
+
+\NewExpandableDocumentCommand \aciffirst {+m+m}
+  { \bool_if:NTF \l__acro_first_instance_bool {#1} {#2} }
+
+\NewDocumentCommand \acdot   {} { \acro_dot: }
+\NewDocumentCommand \acspace {} { \acro_space: }
+
+\NewDocumentCommand \acbarrier {}
+  { \acro_barrier: }
+
+\NewDocumentCommand \acswitchoff {}
+  { \acro_switch_off: }
+
+\NewDocumentCommand \acswitchon {}
+  { \acro_switch_on: }
+
+\NewDocumentCommand \printacronyms { O{} }
+  { \acro_print_acronyms:n {#1} }
+
+% --------------------------------------------------------------------------
+% styles
+% #1: name
+% #2: template
+% #3: settings
+\NewDocumentCommand \DeclareAcroFirstStyle {mmm}
+  { \acro_declare_first_style:nnn {#1} {#2} {#3} }
+
+\NewDocumentCommand \DeclareAcroExtraStyle {mmm}
+  { \acro_declare_extra_style:nnn {#1} {#2} {#3} }
+
+\NewDocumentCommand \DeclareAcroPageStyle {mmm}
+  { \acro_declare_page_style:nnn {#1} {#2} {#3} }
+
+\NewDocumentCommand \DeclareAcroListHeading {mm}
+  { \acro_declare_list_heading:nn {#1} {#2} }
+
+\NewDocumentCommand \DeclareAcroListStyle {mmm}
+  { \acro_declare_list_style:nnn {#1} {#2} {#3} }
+
+% --------------------------------------------------------------------------
+% endings:
+\ProvideAcroEnding {plural} {s} {s}
+
+% --------------------------------------------------------------------------
+% use acronyms:
+% automatic:
+\NewAcroCommand \ac
+  { \acro_use:n {#1} }
+
+\NewAcroCommand \Ac
+  {
+    \acro_first_upper:
+    \acro_use:n {#1}
+  }
+
+\NewAcroCommand \iac
+  {
+    \acro_indefinite:
+    \acro_use:n {#1}
+  }
+
+\NewAcroCommand \Iac
+  {
+    \acro_first_upper:
+    \acro_indefinite:
+    \acro_use:n {#1}
+  }
+
+\NewAcroCommand \acp
+  {
+    \acro_plural:
+    \acro_use:n {#1}
+  }
+
+\NewAcroCommand \Acp
+  {
+    \acro_plural:
+    \acro_first_upper:
+    \acro_use:n {#1}
+  }
+
+\NewAcroCommand \acsingle
+  {
+    \acro_get:n {#1}
+    \acro_single:n {#1}
+  }
+
+\NewAcroCommand \acpsingle
+  {
+    \acro_get:n {#1}
+    \acro_plural:
+    \acro_single:n {#1}
+  }
+
+\NewAcroCommand \Acsingle
+  {
+    \acro_get:n {#1}
+    \acro_first_upper:
+    \acro_single:n {#1}
+  }
+
+\NewAcroCommand \Acpsingle
+  {
+    \acro_get:n {#1}
+    \acro_first_upper:
+    \acro_plural:
+    \acro_single:n {#1}
+  }
+
+% short:
+\NewAcroCommand \acs
+  { \acro_short:n {#1} }
+
+\NewAcroCommand \Acs
+  {
+    \acro_first_upper:
+    \acro_short:n {#1}
+  }
+
+\NewAcroCommand \iacs
+  {
+    \acro_indefinite:
+    \acro_short:n {#1}
+  }
+
+\NewAcroCommand \Iacs
+  {
+    \acro_first_upper:
+    \acro_indefinite:
+    \acro_short:n {#1}
+  }
+
+\NewAcroCommand \acsp
+  {
+    \acro_plural:
+    \acro_short:n {#1}
+  }
+
+\NewAcroCommand \Acsp
+  {
+    \acro_first_upper:
+    \acro_plural:
+    \acro_short:n {#1}
+  }
+
+% alt:
+\NewAcroCommand \aca
+  { \acro_alt:n {#1} }
+
+\NewAcroCommand \Aca
+  {
+    \acro_first_upper:
+    \acro_alt:n {#1}
+  }
+  
+\NewAcroCommand \iaca
+  {
+    \acro_indefinite:
+    \acro_alt:n {#1}
+  }
+
+\NewAcroCommand \Iaca
+  {
+    \acro_first_upper:
+    \acro_indefinite:
+    \acro_alt:n {#1}
+  }
+
+\NewAcroCommand \acap
+  {
+    \acro_plural:
+    \acro_alt:n {#1}
+  }
+
+\NewAcroCommand \Acap
+  {
+    \acro_first_upper:
+    \acro_plural:
+    \acro_alt:n {#1}
+  }
+
+% long:
+\NewAcroCommand \acl
+  { \acro_long:n {#1} }
+
+\NewAcroCommand \Acl
+  {
+    \acro_first_upper:
+    \acro_long:n {#1}
+  }
+
+\NewAcroCommand \iacl
+  {
+    \acro_indefinite:
+    \acro_long:n {#1}
+  }
+
+\NewAcroCommand \Iacl
+  {
+    \acro_first_upper:
+    \acro_indefinite:
+    \acro_long:n {#1}
+  }
+
+\NewAcroCommand \aclp
+  {
+    \acro_plural:
+    \acro_long:n {#1}
+  }
+
+\NewAcroCommand \Aclp
+  {
+    \acro_plural:
+    \acro_first_upper:
+    \acro_long:n {#1}
+  }
+
+% first:
+\NewAcroCommand \acf
+  { \acro_first:n {#1} }
+
+\NewAcroCommand \Acf
+  {
+    \acro_first_upper:
+    \acro_first:n {#1}
+  }
+
+\NewAcroCommand \iacf
+  {
+    \acro_indefinite:
+    \acro_first:n {#1}
+  }
+
+\NewAcroCommand \Iacf
+  {
+    \acro_first_upper:
+    \acro_indefinite:
+    \acro_first:n {#1}
+  }
+
+\NewAcroCommand \acfp
+  {
+    \acro_plural:
+    \acro_first:n {#1}
+  }
+
+\NewAcroCommand \Acfp
+  {
+    \acro_plural:
+    \acro_first_upper:
+    \acro_first:n {#1}
+  }
+
+% first-like:
+\NewPseudoAcroCommand \acflike
+  { \acro_first_like:nn {#1} {#2} }
+
+\NewPseudoAcroCommand \iacflike
+  {
+    \acro_indefinite:
+    \acro_first_like:nn {#1} {#2}
+  }
+
+\NewPseudoAcroCommand \Iacflike
+  {
+    \acro_first_upper:
+    \acro_indefinite:
+    \acro_first_like:nn {#1} {#2}
+  }
+
+\NewPseudoAcroCommand \acfplike
+  {
+    \acro_plural:
+    \acro_first_like:nn {#1} {#2}
+  }
+
+% --------------------------------------------------------------------------
+% first appearance styles:
+\DeclareAcroFirstStyle {default} {inline}
+  { }
+
+\DeclareAcroFirstStyle {reversed} {inline}
+  { reversed = true }
+
+\DeclareAcroFirstStyle {short} {inline}
+  {
+    only-short = true ,
+    brackets = false
+  }
+
+\DeclareAcroFirstStyle {long} {inline}
+  {
+    only-long = true ,
+    brackets = false
+  }
+
+\DeclareAcroFirstStyle {square} {inline}
+  { brackets-type = [] }
+
+\DeclareAcroFirstStyle {plain} {inline}
+  {
+    brackets = false ,
+    between = --
+  }
+
+\DeclareAcroFirstStyle {plain-reversed} {inline}
+  { 
+    brackets = false ,
+    between = -- ,
+    reversed = true
+  }
+
+\DeclareAcroFirstStyle {footnote} {note}
+  { }
+
+\DeclareAcroFirstStyle {footnote-reversed} {note}
+  { reversed = true }
+
+\DeclareAcroFirstStyle {sidenote} {note}
+  { note-command = \sidenote {#1} }
+
+\DeclareAcroFirstStyle {sidenote-reversed} {note}
+  {
+    note-command = \sidenote {#1} ,
+    reversed     = true
+  }
+
+\DeclareAcroFirstStyle {empty} {note}
+  { use-note = false }
+
+% --------------------------------------------------------------------------
+% extra info appearance styles:
+\DeclareAcroExtraStyle {default} {inline}
+  {
+    brackets     = false ,
+    punct        = true ,
+    punct-symbol = .
+  }
+
+\DeclareAcroExtraStyle {plain} {inline}
+  {
+    brackets     = false ,
+    punct        = true ,
+    punct-symbol =
+  }
+
+\DeclareAcroExtraStyle {paren} {inline}
+  {
+    brackets     = true ,
+    punct        = true ,
+    punct-symbol =
+  }
+
+\DeclareAcroExtraStyle {bracket} {inline}
+  {
+    brackets      = true ,
+    punct         = true ,
+    punct-symbol  = ,
+    brackets-type = []
+  }
+
+\DeclareAcroExtraStyle {comma} {inline}
+  {
+    punct         = true,
+    punct-symbol  = {,} ,
+    brackets      = false
+  }
+
+% --------------------------------------------------------------------------
+% page number appearance styles:
+\DeclareAcroPageStyle {default} {inline}
+  {
+    punct = true ,
+    punct-symbol = .
+  }
+  
+\DeclareAcroPageStyle {plain}   {inline}
+  { punct = false }
+
+\DeclareAcroPageStyle {comma}   {inline}
+  { punct = true }
+
+\DeclareAcroPageStyle {paren}   {inline}
+  {
+    brackets=true ,
+    punct-symbol = ~
+  }
+
+\DeclareAcroPageStyle {none}    {inline}
+  { display = false }
+
+% --------------------------------------------------------------------------
+% list heading styles:
+\DeclareAcroListHeading {part}           {\part}
+\DeclareAcroListHeading {part*}          {\part*}
+\DeclareAcroListHeading {chapter}        {\chapter}
+\DeclareAcroListHeading {chapter*}       {\chapter*}
+\DeclareAcroListHeading {addchap}        {\addchap}
+\DeclareAcroListHeading {section}        {\section}
+\DeclareAcroListHeading {section*}       {\section*}
+\DeclareAcroListHeading {addsec}         {\addsec}
+\DeclareAcroListHeading {subsection}     {\subsection}
+\DeclareAcroListHeading {subsection*}    {\subsection*}
+\DeclareAcroListHeading {subsubsection}  {\subsubsection}
+\DeclareAcroListHeading {subsubsection*} {\subsubsection*}
+\DeclareAcroListHeading {none}           {\use_none:n}
+
+% --------------------------------------------------------------------------
+% list styles:
+\DeclareAcroListStyle {description} {list}
+  { }
+
+\DeclareAcroListStyle {toc} {list-of}
+  { }
+
+\DeclareAcroListStyle {lof} {list-of}
+  { style = lof }
+
+\DeclareAcroListStyle {tabular} {table}
+  { table = tabular }
+
+\DeclareAcroListStyle {longtable} {table}
+  { table = longtable }
+
+\DeclareAcroListStyle {extra-tabular} {extra-table}
+  { table = tabular }
+
+\DeclareAcroListStyle {extra-longtable} {extra-table}
+  { table = longtable }
+
+\DeclareAcroListStyle {extra-tabular-rev} {extra-table}
+  {
+    table   = tabular ,
+    reverse = true
+  }
+
+\DeclareAcroListStyle {extra-longtable-rev} {extra-table}
+  {
+    table   = longtable ,
+    reverse = true
+  }
+
+% --------------------------------------------------------------------------
+% register some tokens to be checked for:
+\AcroRegisterTrailing . {dot}
+\AcroRegisterTrailing - {dash}
+\AcroRegisterTrailing \babelhyphen {babel-hyphen}
+
+\acsetup { activate-trailing-tokens = dot }
+
+% some user macros:
+\cs_new_protected:Npn \acro_dot:
+  { \acro_if_trailing_tokens:nF {dot} {.\@} }
+
+\cs_new_protected:Npn \acro_space:
+  { \acro_if_trailing_tokens:nF {dash,babel-hyphen} { \c_space_tl } }
+
+% --------------------------------------------------------------------------
+% translations:
+% list name
+\DeclareAcroTranslation {acronym-list-name}
+  {
+    Fallback   = Acronyms ,
+    English    = Acronyms ,
+    French     = Acronymes ,
+    German     = Abk\"urzungen ,
+    Italian    = Acronimi ,
+    Portuguese = Acr\'onimos ,
+    Spanish    = Siglas ,
+    Catalan    = Sigles ,
+    Turkish    = K\i saltmalar
+  }
+
+% page name
+\DeclareAcroTranslation {acronym-page-name}
+  {
+    Fallback   = p. ,
+    English    = p. ,
+    German     = S. ,
+    Portuguese = p.
+  }
+
+% pages name
+\DeclareAcroTranslation {acronym-pages-name}
+  {
+    Fallback   = pp. ,
+    English    = pp. ,
+    German     = S. ,
+    Portuguese = pp.
+  }
+
+% following page
+\DeclareAcroTranslation {acronym-next-page}
+  {
+    Fallback   = f. ,
+    English    = f. ,
+    German     = f. ,
+    Portuguese = s.
+  }
+
+% following pages
+\DeclareAcroTranslation {acronym-next-pages}
+  {
+    Fallback   = ff. ,
+    English    = ff. ,
+    German     = ff. ,
+    Portuguese = ss.
+  }
+
+% --------------------------------------------------------------------------
+\file_input_stop:


Property changes on: trunk/Master/texmf-dist/tex/latex/acro/acro2.sty
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property


More information about the tex-live-commits mailing list.