texlive[61631] Master/texmf-dist: chemmacros (17jan22)

commits+karl at tug.org commits+karl at tug.org
Mon Jan 17 21:55:11 CET 2022


Revision: 61631
          http://tug.org/svn/texlive?view=revision&revision=61631
Author:   karl
Date:     2022-01-17 21:55:11 +0100 (Mon, 17 Jan 2022)
Log Message:
-----------
chemmacros (17jan22)

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

Removed Paths:
-------------
    trunk/Master/texmf-dist/doc/latex/chemmacros/chemmacros.history
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros-manual.cls
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.acid-base.code.tex
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.all.code.tex
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.base.code.tex
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.charges.code.tex
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.chemformula.code.tex
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.errorcheck.code.tex
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.greek.code.tex
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.isotopes.code.tex
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.lang.code.tex
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.mechanisms.code.tex
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.newman.code.tex
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.nomenclature.code.tex
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.orbital.code.tex
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.particles.code.tex
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.phases.code.tex
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.polymers.code.tex
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.reactions.code.tex
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.redox.code.tex
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.scheme.code.tex
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.spectroscopy.code.tex
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.symbols.code.tex
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.thermodynamics.code.tex
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.tikz.code.tex
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.units.code.tex
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.xfrac.code.tex
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros4.sty
    trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros5.sty

Modified: trunk/Master/texmf-dist/doc/latex/chemmacros/README
===================================================================
--- trunk/Master/texmf-dist/doc/latex/chemmacros/README	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/doc/latex/chemmacros/README	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,5 +1,5 @@
 --------------------------------------------------------------------------
-the CHEMMACROS package v5.11a 2020/11/21
+the CHEMMACROS package v6.0 2022/01/16
 
   comprehensive support for typesetting chemistry documents
 
@@ -8,7 +8,7 @@
 Web:    https://github.com/cgnieder/chemmacros/
 E-Mail: contact at mychemistry.eu
 --------------------------------------------------------------------------
-Copyright 2011--2020 Clemens Niederberger
+Copyright 2011--2022 Clemens Niederberger
 
 This work may be distributed and/or modified under the
 conditions of the LaTeX Project Public License, either version 1.3c
@@ -25,40 +25,12 @@
 The chemmacros package consists of the following files
  == STYLE FILES ==
     chemmacros.sty
-    chemmacros4.sty
-    chemmacros5.sty,
  == DOCUMENTATION FILES ==
     chemmacros-manual.tex
     chemmacros-manual.pdf
     chemmacros-manual.cls
     README
-    chemmacros.history
- == MODULE CODE FILES ==
-    chemmacros.module.acid.code.tex
-    chemmacros.module.all.code.tex
-    chemmacros.module.base.code.tex
-    chemmacros.module.charges.code.tex
-    chemmacros.module.chemformula.code.tex
-    chemmacros.module.errorcheck.code.tex
-    chemmacros.module.greek.code.tex
-    chemmacros.module.isotopes.code.tex
-    chemmacros.module.lang.code.tex
-    chemmacros.module.mechanisms.code.tex
-    chemmacros.module.newman.code.tex
-    chemmacros.module.nomenclature.code.tex
-    chemmacros.module.orbital.code.tex
-    chemmacros.module.particles.code.tex
-    chemmacros.module.phases.code.tex
-    chemmacros.module.polymers.code.tex
-    chemmacros.module.reactions.code.tex
-    chemmacros.module.redox.code.tex
-    chemmacros.module.scheme.code.tex
-    chemmacros.module.spectroscopy.code.tex
-    chemmacros.module.symbols.code.tex
-    chemmacros.module.thermodynamics.code.tex
-    chemmacros.module.tikz.code.tex
-    chemmacros.module.units.code.tex
-    chemmacros.module.xfrac.code.tex
+    HISTORY
 --------------------------------------------------------------------------
 If you have any ideas, questions, suggestions or bugs to report, please
 feel free to contact me.

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

Modified: trunk/Master/texmf-dist/doc/latex/chemmacros/chemmacros-manual.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/chemmacros/chemmacros-manual.tex	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/doc/latex/chemmacros/chemmacros-manual.tex	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,4 +1,4 @@
-% !arara: pdflatex
+% !arara: pdflatex: { interaction: nonstopmode }
 % !arara: biber
 % arara: pdflatex: { interaction: nonstopmode }
 % arara: pdflatex: { interaction: nonstopmode }
@@ -16,7 +16,7 @@
 % If you have any ideas, questions, suggestions or bugs to report, please
 % feel free to contact me.
 % --------------------------------------------------------------------------
-% Copyright 2011--2020 Clemens Niederberger
+% Copyright 2011--2022 Clemens Niederberger
 %
 % This work may be distributed and/or modified under the
 % conditions of the LaTeX Project Public License, either version 1.3c
@@ -32,64 +32,8 @@
 % --------------------------------------------------------------------------
 \documentclass{chemmacros-manual}
 
-\DeclareAcronym{ghs}{
-  short     = ghs ,
-  long      = Globally Harmonized System of Classification and Labelling of
-    Chemicals ,
-  pdfstring = GHS ,
-  accsupp   = GHS
-}
-\DeclareAcronym{eu}{
-  short     = EU ,
-  long      = European Union ,
-  pdfstring = EU ,
-  accsupp   = EU
-}
-\DeclareAcronym{iupac}{
-  short     = iupac ,
-  long      = International Union of Pure and Applied Chemistry ,
-  pdfstring = IUPAC ,
-  accsupp   = IUPAC
-}
-\DeclareAcronym{UN}{
-  short     = un ,
-  long      = United Nations ,
-  pdfstring = UN ,
-  accsupp   = UN
-}
-\DeclareAcronym{dvi}{
-  short     = dvi ,
-  long      = device independent file format ,
-  pdfstring = DVI ,
-  accsupp   = DVO
-}
-\DeclareAcronym{pdf}{
-  short     = pdf ,
-  long      = portable document file ,
-  pdfstring = PDF ,
-  accsupp   = PDF
-}
-\DeclareAcronym{id}{
-  short     = id ,
-  long      = identification string ,
-  pdfstring = ID ,
-  accsupp   = ID
-}
+\usepackage[T1]{fontenc}
 
-\chemsetup{
-  modules = {all,polymers} ,
-  greek = newtx ,
-  formula = chemformula ,
-  chemformula/format = \libertineLF
-}
-
-\sisetup{
-  detect-mode=false,
-  mode=text,
-  text-rm=\libertineLF
-}
-
-\defbibheading{bibliography}{\section{References}}
 \addbibresource{\jobname.bib}
 \addbibresource{cnltx.bib}
 
@@ -172,147 +116,33 @@
   urldate = {2015-07-16} ,
   date    = {2015-07-15}
 }  
+ at package{pkg:glossaries-extra,
+  title    = {glossaries-extra},
+  author   = {Nicola L. C. Talbot},
+  date     = {2020-04-01},
+  version  = {1.45},
+  url      = {https://ctan.org/pkg/glossaries-extra/}
+}
+ at package{pkg:xltabular,
+  title    = {xltabular},
+  author   = {Herbert Voß and Rolf Niepraschk},
+  date     = {2020-11-04},
+  version  = {0.2e},
+  url      = {https://ctan.org/pkg/xltabular/}
+}
 \end{filecontents*}
 
-\DeclareInstance{xfrac}{chemformula-text-frac}{text}
-  {
-    scale-factor        = 1 ,
-    denominator-bot-sep = -.2ex ,
-    denominator-format  = \scriptsize #1 ,
-    numerator-top-sep   = -.2ex ,
-    numerator-format    = \scriptsize #1 ,
-    slash-right-kern    = .05em ,
-    slash-left-kern     = .05em
-  }
-
-\usetikzlibrary{calc,positioning,decorations.pathmorphing,patterns}
-
-% \newpackagename\chemmacros{chemmacros}
-\newcommand*\chemmacrosversion{\csname c_chemmacros_version_tl\endcsname}
 \newpackagename\chemformula{chemformula}
 \newpackagename\ghsystem{ghsystem}
 \newpackagename\chemgreek{chemgreek}
 
-\renewcommand*\AmS{\hologo{AmS}}
-\newcommand*\TikZ{Ti\textit{k}Z}
-\newcommand*\tablehead[1]{\textrm{\bfseries#1}}
-
-\providecommand*\XyM{%
-  X\kern-.30em
-  \smash{\raise.50ex\hbox{\char'7}}%
-  \kern-.30em M%
-}
-\providecommand*\XyMTeX{\XyM\kern-.1em\TeX}
-
-% \NewChemPhase{\aqi}{aq,$\infty$}% aqueous solution at infinite dilution
-% \NewChemPhase{\cd}{cd}% condensed phase
-% \NewChemPhase{\lc}{lc}% liquid crystal
-
 \newname\hensel{Martin Hensel}
 \newname\pedersen{Bj\o rn Pedersen}
+\newname\leandriis{Sonja K.}
 
-\newcommand*\iupaccs[3][]{%
-  \command{#2}[\quad\iupac{\csuse{#2}}]
-    #3\ifblank{#1}{}{\ifblank{#3}{}{ }An alias for this command is \cs{#1}.}%
-}
-
-% \undef\module
-% \undef\moduleidx
-\newidxcmd\chemmodule{\code{#1}}[ (module)]
-\newidxcmd\tikzdecoration{\code{#1}}[ (\TikZ\ decoration)]
-\AtEndPreamble{%
-  \pdfstringdefDisableCommands{%
-    \def\chemmodule*#1{\textquotedblleft#1\textquotedblright}%
-  }%
-}
-\newidxcmd\sym{\code{#1}}[ (symbol)]
-
-\makeatletter
-\def\cnltx at bash@listings at style{
-  language         = bash,
-  basicstyle       = {\sourceformat\color{black}},
-  % numbers          = left,
-  % numberstyle      = \tiny,
-  xleftmargin      = 1em,
-  numbersep        = .75em,
-  gobble           = \cnltx at gobble ,
-  columns          = fullflexible,
-  literate         =
-    {ä}{{\"a}}1
-    {ö}{{\"o}}1
-    {ü}{{\"u}}1
-    {Ä}{{\"A}}1
-    {Ö}{{\"O}}1
-    {Ü}{{\"U}}1
-    {ß}{{\ss}}1 ,
-  breaklines       = true,
-  keepspaces       = true,
-  breakindent      = 1em,
-  commentstyle     = \color{comment},
-  keywordstyle     = \color{black}\bfseries ,
-  stringstyle      = \color{black} ,
-  showstringspaces = false ,
-  morekeywords     = texdoc
-}
-
-\cnltx at expandargs(nx)\lstdefinestyle
-  {bash}
-  {\expandonce\cnltx at bash@listings at style}
-
-\newcommand*\prompt{}
-\patchcmd\lst at NewLine
-  {\hbox{}}% search
-  {\hbox{}\prompt}% replace
-  {}% success
-  {}% failure
-\newsourcecodeenv[
-  code-only,
-  sourcecode-options = {
-    style = bash ,
-    deleteindex = [5][keyword5] ,
-    deleteindex = [6][keyword6]
-  },
-  pre-code           = \def\prompt{\textasciitilde\space\$\space}  
-]{lbash}
-\makeatother
-
 \renewcommand*\dictumauthorformat[1]{#1}
 \renewcommand*\raggeddictumtext{}
 
-\newcommand*\TF{\textcolor{red}{\uline{\code{\textcolor{cs}{\textit{TF}}}}}}
-
-\makeatletter
-\newrobustcmd*\explcsformat[1]{%
-  \code{\textbackslash\textcolor{cs}{\detokenize{#1}}}%
-}
-\newidxcmd\explcs{\explcsformat{#1}}[ (expl3)]
-
-\cnltx at deflistitem{\cnltx at explcommand}{\explcs}
-\renewenvironment{commands}
-  {%
-    \let\command\cnltx at command
-    \let\explcommand\cnltx at explcommand
-    \cnltxlist
-  }
-  {\endcnltxlist}
-\newenvironment{tikzcode}
-  {%
-    \def\arrowtip{\@cnltx at option@item\code}%
-    \cnltxlist
-  }
-  {\endcnltxlist}
-
-\newrobustcmd*\showenv[1]{\beginenv*\code{\{}\env{#1}\code{\}}}
-\makeatother
-
-\ExplSyntaxOn
-\cs_new_protected:Npn \chemboldchecks #1
-  {
-    \seq_set_map:NNn \l_tmpa_seq \l__chemmacros_if_bf_seq { \code {##1} }
-    \seq_use:Nnnn \l_tmpa_seq {,~} {,~} {~#1~}
-  }
-\ExplSyntaxOff
-
 \AtBeginDocument{\renewcommand*\reftextfaraway[1]{starting on page~\pageref{#1}}}
 
 \usepackage{bookmark}
@@ -320,14 +150,9 @@
 \begin{document}
 
 \part{Preliminaries}
-\section{Licence, Requirements and \textsc{README}}\label{sec:licence-requ-readme}
+\section{License}\label{sec:licence-requ-readme}
 \license
 
-\chemmacros\ loads the packages \pkg{expl3}~\cite{bnd:l3kernel} and
-\pkg{xparse}~\cite{bnd:l3packages}.  Depending on your usage other packages
-will be loaded.  They are mentioned when the corresponding module using the
-package is described.
-
 \section{Motivation and Background}\label{sec:motiv-backgr}
 This package grew from a small collection of personal helper macros back
 in~2010 into a rather big package supporting various different chemical
@@ -367,44 +192,33 @@
 logical consequence from \chemmacros' history: since version~2.0, \ie, since
 the fall of~2011 \chemmacros\ already had modular options.
 
-The different modules of \chemmacros\ are divided into two groups:
+Since version~6.0 the different modules of \chemmacros\ are divided into three
+groups:
 \begin{enumerate}
-  \item Internal modules which provide underlying functionality or basic
+  \item Core modules which provide underlying functionality or basic
     functionality which is not of direct interest from a user perspective but
     might be if you plan to write a module yourself (see
     section~\ref{sec:own-modules} for details).
-  \item User modules which provide all the stuff for typesetting.
+  \item Main modules which provide all the stuff for typesetting and which are
+    always loaded.
+  \item Additional modules which are also loaded in the default setup. They
+    are not loaded if \chemmacros\ is loaded with the minimal setup:
+    \cs*{usepackage}\Oarg{minimal}\Marg{chemmacros}.
 \end{enumerate}
-Both groups each are subdivided into two groups: preloaded modules and modules
-which have to be loaded by the programmer (internal modules) or by the
-document author (user modules).  Those modules are described in
-parts~\ref{part:preloaded-modules} (preloaded modules)
-and~\ref{part:additional-modules} (additional modules) of this manual.
 
-The above means that not all functionality is available per default.  If you
-want to load \emph{all} modules no matter what then you can say:
-\begin{sourcecode}
-  \usechemmodule{all}
-\end{sourcecode}
-or
-\begin{sourcecode}
-  \chemsetup{modules=all}
-\end{sourcecode}
-which will load all modules which are part of \chemmacros\ (also see
-section~\vref{sec:all-module}). Own modules (see
-section~\vref{sec:own-modules}) are \emph{not} loaded through this, though,
-and still have to be loaded additionally.
-
-In part~\vref{part:preloaded-modules} the preloaded modules are described,
-first the user modules then the internal ones, in
-part~\vref{part:additional-modules} the other available modules are described,
-again the user modules first.  In each section the modules are described in
-an alphabetical order.
-
-\subsection{Using \chemmacros' Options}\label{sec:using-chemm-opti}
+\subsection{\chemmacros' Options}\label{sec:using-chemm-opti}
 Prior to v5.0 \chemmacros\ had quite a number of package options.
-\chemmacros\ v5.0 or higher has none!  All of \chemmacros' options are set
-using the command
+\chemmacros\ v6.0 has only two:
+\begin{options}
+  \keybool{minimal}\Default{false}
+    Loads \chemmacros\ with the basic preset of modules.
+  \keyval{modules}{comma separated list of module names}\Default
+    When \option{minimal} is used this option allows to load additional
+    modules.
+\end{options}
+These are load-time option that only can be used in the optional argument of
+\cs*{usepackage}. \emph{All} other of \chemmacros' options are set using the
+command
 \begin{commands}
   \command{chemsetup}[\oarg{module}\marg{option list}]
     \chemmacros' setup command.
@@ -448,6 +262,19 @@
 The second way allows to set options belonging to different modules with one
 call of \cs{chemsetup}.
 
+\chemmacros\ has some core options which don't belong to any of the modules
+described in parts~\ref{part:main-modules} and~\ref{part:additional-modules}.
+Those options have no module denoted in the left margin next to their
+descriptions and are also set without specifying a module:
+\begin{sourcecode}
+  \chemsetup{
+    option1 = value ,
+    option2 = value
+  }
+\end{sourcecode}
+Some internal modules may also define core options, \eg, the \chemmodule{lang}
+module, see section~\vref{sec:lang-module}.
+
 \subsection{Support Package \chemformula}
 \chemformula\ provides means of typesetting chemical formulas and reactions.
 You will see its macros \cs{ch} and \cs{chcpd} every now and then in this
@@ -455,9 +282,9 @@
 package~\cite{pkg:chemformula} to be loaded as \chemmacros\ makes use of it in
 various places.  \chemmacros\ and \chemformula\ are tightly intertwined.
 Nevertheless you should be able to use the \pkg{mhchem}~\cite{pkg:mhchem}
-package with \chemmacros. Please see section~\vref{sec:using-mhchem} for
-details and \latin{caveat}s.  \emph{The recommendation is to use
-  \chemformula.}
+package with \chemmacros\ without problems. Please see
+section~\vref{sec:using-mhchem} for details and \latin{caveat}s.  \emph{The
+  recommendation is to use \chemformula.}
 
 A historical note: \chemformula\ started as a part of \chemmacros\ in
 January~2012.  Since July~2013 it is a completely independent package -- from
@@ -464,198 +291,29 @@
 \chemformula's point of view.  It is maintained independently and has a manual
 of its own.
 
-\subsection{Upgrading from version $<5.0$}
-People upgrading from versions $<5.0$ will find that almost everything they
-know from earlier versions is the same in versions $\geq5.0$.  But there are
+\subsection{Upgrading from version $5.x$}
+People upgrading from versions $<6.0$ will find that almost everything they
+know from earlier versions is the same in versions $6.x$.  But there are
 important and \emph{breaking} differences:
 \begin{itemize}
-  \item \chemmacros\ has no package options any more, all options are set via
-    \cs{chemsetup}, also see section~\vref{sec:using-chemm-opti}.
-  \item Not all of the features are available per default any more, for some
-    the corresponding module has to be loaded explicitly, see
-    section~\ref{sec:general-options}.  If suddenly some commands or
-    environments seem to be undefined this is the most likely reason.
-  \item Some option modules have been renamed (\eg, \module*{iupac} is now
-    \module{nomenclature}).  If you experience strange errors when you upgrade
-    your document this is the most likely source.
-  \item The command family \cs*{NewChem\ldots}, \cs*{RenewChem\ldots} and
-    \cs*{DeclareChem\ldots} has a new member \cs*{ProvideChem\ldots}.
-  \item In \cs{iupac} the macro \cs*{-} no longer gives a dash with breaking
-    point.  Instead \sym*{-} can be used directly\footnote{\cs*{-} is provided
-      up to and including v5.2 but is dropped in higher versions.}.
-  \item The macro \cs{ox} has another default behaviour (\keyis{pos}{super})
-    and the starred version has another effect (\keyis{pos}{top}) than the
-    same macro in earlier versions.  Now the default behaviour follows
-    \acs{iupac} recommendations.  A second change is that the atom is now
-    treated as a \chemformula\ input (this depends on the setting of the
-    \option{formula} option, see~\vref{sec:chemformula-module}).
-  \item The syntax of \cs{NewChemReaction} and friends is now different from
-    what it used to be.  If you have defined your own reaction environments
-    you need to adapt!
-  \item \chemmacros\ offers a macro \cs{state} which is similar to but
-    different from the earlier macro \cs*{State}.  \cs*{State} is deprecated.
-    There are also differences in the syntax of \cs{enthalpy} \vs\ the earlier
-    \cs*{Enthalpy}, \cs{entropy} \vs\ \cs*{Entropy} and \cs{gibbs} \vs\
-    \cs*{Gibbs}.  The uppercase versions are deprecated. The  macro
-    \cs{NewChemState} also has a different syntax now.
-  \item At various places in the code improvements and fixes have been made,
-    too many to list them here.  You should keep an open eye and first of all
-    read the manual closely.
+  \item The compatibility mode and all its commands have been dropped.
+  \item The option \option{modules} now is a load-time option and cannot be
+    set through \cs{chemsetup} any more.  The command \cs{usechemmodule} has
+    been dropped.
+  \item Per default \emph{all} modules are now loaded.  A new option
+    \option{minimal} allows to load \chemmacros\ with smallest subset
+    necessary. Then additional modules can be added with the
+    \option{modules}.
+  \item A new module \module{reactants} has been added, thanks to \leandriis.
 \end{itemize}
 
-\subsection{Compatibility Mode}
+\part{Main Modules}\label{part:main-modules}
 
-\subsubsection{For Users}
-It is actually not true that \chemmacros' has no package options any more.  It
-has one very important package option:
-\begin{options}
-  \keychoice{compatibility}{\meta{version},newest,latest}\Default{\chemmacrosversion}
-    Let's you specify the version of \chemmacros\ you want to use.  Any
-    version earlier than 5.0 will load v4.7. \ie, the last version before
-    \chemmacros\ got its modular structure\footnote{Mostly: the loaded v4.7
-      has got a few fixes}.  Not using the option will always load the newest
-    version.
+The modules described in this part are always loaded by \chemmacros, even in
+the minimal setup.
 
-    Both values \code{newest} and \code{latest} will choose the latest version
-    available.
-\end{options}
+\section{The \chemmodule*{acid-base} Module}\label{sec:acid-base-module}
 
-In your document you can check for the compatibility mode.  For the following
-functions it is important to understand the rules: \emph{greater} means
-\emph{newer}.  The version number is \emph{not} a usual decimal number!  The
-syntax for \meta{version} is \meta{major}\code{.}\meta{minor}\meta{optional
-  subrelease}.  This means that a version~5.11 is \emph{newer} than a
-version~5.7!  In the same way \emph{less} means \emph{older}.  As last
-example: 5.10~is \emph{newer} (greater) than~5.1.  \meta{optional subrelease}
-is a lowercase letter which might or might not be present in a version number.
-Version~5.7b is newer than~5.7a which in turn is newer than~5.7.
-\begin{commands}
-  \expandable\command{IfChemCompatibilityTF}[\marg{comp}\marg{version}%
-  \marg{true}\marg{false}]
-    Checks the value given through the option \option{compatibility} against
-    \meta{version} using \meta{comp} and either leaves \meta{true} or
-    \meta{false} in the input stream. \meta{comp} can be one of \code{<},
-    \code{<=}, \code{=}, \code{>=} or \code{>}.
-  \expandable\command{IfChemCompatibilityT}[\marg{comp}\marg{version}\marg{true}]
-    Checks the value given through the option \option{compatibility} against
-    \meta{version} using \meta{comp} and leaves \meta{true} in the input
-    stream if the check is logically true.  \meta{comp} can be one of
-    \code{<}, \code{<=}, \code{=}, \code{>=} or \code{>}.
-  \expandable\command{IfChemCompatibilityF}[\marg{comp}\marg{version}\marg{false}]
-    Checks the value given through the option \option{compatibility} against
-    \meta{version} using \meta{comp} and leaves \meta{false} in the input
-    stream if the check is logically false.  \meta{comp} can be one of
-    \code{<}, \code{<=}, \code{=}, \code{>=} or \code{>}.
-\end{commands}
-
-A possible usage:
-\begin{sourcecode}
-  \IfChemCompatibilityT{>=}{5.0}{\usechemmodule{all}}
-\end{sourcecode}
-
-Loading \chemmacros\ with \keyis{compatibility}{4.7} also allows to use the
-package options from that version:
-\begin{sourcecode}
-  \usepackage[compatibility=4.7,language=german]{chemmacros}
-\end{sourcecode}
-
-\subsubsection{For Module Writers}
-For future versions the aim is not to make such breaking changes again.  While
-we never know what the future actually will bring \chemmacros\ now has the
-tools for tying code to a version number:
-\begin{commands}
-  \expandable\explcommand{chemmacros_if_compatibility:nn}[\TF\ \marg{comp}
-  \marg{version} \marg{true} \marg{false}]
-    expl3 version of \cs{IfChemCompatibilityTF}.
-\end{commands}
-
-In modules one can try adding code for a certain version or range of versions:
-\begin{commands}
-  \command{ChemCompatibility}[\marg{version} \meta{code} \cs{EndChemCompatibility}]
-    Leaves \meta{code} in the input stream if the compatibility version $x$
-    given by \option{compatibility} matches \meta{version}
-    ($x=\text{\meta{version}}$).
-  \command{ChemCompatibilityFrom}[\marg{version} \meta{code} \cs{EndChemCompatibility}]
-    Leaves \meta{code} in the input stream if the compatibility version $x$
-    given by \option{compatibility} matches \meta{version} or newer.  This
-    means \meta{version} is the \emph{oldest} version allowed
-    ($x\geq\text{\meta{version}}$).
-  \command{ChemCompatibilityTo}[\marg{version} \meta{code} \cs{EndChemCompatibility}]
-    \changedversion{5.8a}Leaves \meta{code} in the input stream if the
-    compatibility version $x$ given by \option{compatibility} matches any
-    version up to and \emph{excluding} \meta{version}. This means
-    \meta{version} is the \emph{oldest} version \emph{not} allowed
-    ($x<\text{\meta{version}}$).
-  \command{ChemCompatibilityBetween}[\marg{version 1}\marg{version 2} \meta{code}
-  \cs{EndChemCompatibility}]
-    \changedversion{5.8a}Leaves \meta{code} in the input stream if the
-    compatibility version $x$ given by \option{compatibility} lies between and
-    \emph{including} \meta{version 1} up to and \emph{excluding} \meta{version 2}
-    ($\text{\meta{version 1}}\leq x<\text{\meta{version 2}}$).
-  \command{EndChemCompatibility}
-    This macro \emph{must} end each of the \cs*{ChemCompatibility\ldots}
-    macros.
-\end{commands}
-
-You may refer to the current version of \chemmacros\ with the following
-tokenlists:
-\begin{commands}
-  \explcommand{c_chemmacros_date_tl}
-    The current release date: \enquote{\csname
-      c_chemmacros_date_tl\endcsname}.
-  \explcommand{c_chemmacros_version_major_number_tl}
-    The current major version: \enquote{\csname
-    c_chemmacros_version_major_number_tl\endcsname}.
-  \explcommand{c_chemmacros_version_minor_number_tl}
-    The current minor version: \enquote{\csname
-    c_chemmacros_version_minor_number_tl\endcsname}.
-  \explcommand{c_chemmacros_version_number_tl}
-    The current version number: \enquote{\csname
-    c_chemmacros_version_number_tl\endcsname}.
-  \explcommand{c_chemmacros_version_subrelease_tl}
-    The current sub-release: \enquote{\csname
-    c_chemmacros_version_subrelease_tl\endcsname}.
-  \explcommand{c_chemmacros_version_tl}
-    The current version: \enquote{\csname c_chemmacros_version_tl\endcsname}.
-  \explcommand{c_chemmacros_info_tl}
-    The package information: \enquote{\csname
-      c_chemmacros_info_tl\endcsname}.
-\end{commands}
-
-\section{General Options}\label{sec:general-options}
-
-\chemmacros\ has some core options which don't belong to any of the modules
-described in parts~\ref{part:preloaded-modules}
-and~\ref{part:additional-modules}.  Those options have no module denoted in
-the left margin next to their descriptions and are also set without specifying
-a module:
-\begin{sourcecode}
-  \chemsetup{
-    option1 = value ,
-    option2 = value
-  }
-\end{sourcecode}
-
-Two of those options are explained now:
-\begin{options}
-  \keyval{modules}{comma separated list of module names}\Default
-    With this option you can specify which modules you want to load.
-    Alternatively you can use \cs{usechemmodule}\marg{comma separated list of
-      module names}.
-  \keyval{greek}{mapping}\Default
-    Explicitly specify which mapping should be used by the \chemgreek\
-    package~\cite{pkg:chemgreek}.  For details about what this means please
-    refer to section~\vref{sec:greek-module}.
-\end{options}
-
-Some internal modules may also define core options, \eg, the \chemmodule{lang}
-module, see section~\vref{sec:lang-module}.
-
-\part{The Preloaded Modules}\label{part:preloaded-modules}
-
-\section{User Modules}
-\subsection{The \chemmodule*{acid-base} Module}\label{sec:acid-base-module}
-
 Easy representation of \pH, \pKa \ldots
 \begin{commands}
   \command{pH} \pH
@@ -738,11 +396,11 @@
   \NewChemEqConstant\Ka{K-acid}{\mathrm{a}}
 \end{sourcecode}
 
-\subsection{The \chemmodule*{charges} Module}\label{sec:charges-module}
+\section{The \chemmodule*{charges} Module}\label{sec:charges-module}
 
 The \chemmodule{charges} module loads the module \chemmodule{chemformula}.
 
-\subsubsection{Charge Symbols}
+\subsection{Charge Symbols}
 \begin{commands}
   \command{fplus} \fplus\ formal positive charge
   \command{fminus} \fminus\ formal negative charge
@@ -760,7 +418,7 @@
     usage in \pkg{chemfig}'s formulas).
 \end{commands}
 
-\subsubsection{Ion Charges}\label{sec:ion-charges}
+\subsection{Ion Charges}\label{sec:ion-charges}
 Simple displaying of (real) charges.  It is worth noting that these commands
 really are relicts from a time when \chemmacros\ tried hard to be compliant
 with \pkg{mhchem} and \chemformula\ didn't exist, yet.  \textbf{They are still
@@ -781,7 +439,7 @@
   A\pch\ B\mch[3] C\fpch[2] D\fmch
 \end{example}
 
-\subsubsection{Partial Charges and Similar Stuff}\label{sec:part-charg-simil}
+\subsection{Partial Charges and Similar Stuff}\label{sec:part-charg-simil}
 
 The next ones probably are seldomly needed but nevertheless useful:
 \begin{commands}
@@ -800,10 +458,10 @@
     redox/pos       = top
   }
   \ch{"\ox{\delp,H}" -{} "\ox{\delm,Cl}"} \hspace*{1cm}
-  \chemfig{\chemabove[3pt]{\lewis{246,Br}}{\delm}-\chemabove[3pt]{H}{\delp}}
+  \chemfig{\chemabove[3pt]{\charge{90=\|,180=\|,270=\|}{Br}}{\delm}-\chemabove[3pt]{H}{\delp}}
 \end{example}
 
-\subsubsection{Charge Options}
+\subsection{Charge Options}
 
 \begin{options}
   \keychoice{circled}{formal,\default{all},none}\Module{charges}\Default{formal}
@@ -820,7 +478,7 @@
     section~\ref{sec:own-charge-macros}).
 \end{options}
 
-\subsubsection{Own Charge Macros}\label{sec:own-charge-macros}
+\subsection{Own Charge Macros}\label{sec:own-charge-macros}
 Just in case the existing macros don't fit you needs there are commands for
 defining new ones or modifying the existing ones.  These commands define
 macros like those described in section~\vref{sec:ion-charges}.
@@ -863,13 +521,13 @@
   \NewChemPartialCharge\fdelm{\fminus}
 \end{sourcecode}
 
-\subsection{The \chemmodule*{nomenclature} Module}\label{sec:nomenclature-module}
+\section{The \chemmodule*{nomenclature} Module}\label{sec:nomenclature-module}
 
 The \chemmodule{nomenclature} module loads the \chemmodule{tikz} module.  It
 also loads the package \pkg{scrlfile} which is part of the
 \KOMAScript\ bundle~\cite{bnd:koma-script}.
 
-\subsubsection{The \cs*{iupac} Command}
+\subsection{The \cs*{iupac} Command}
 
 Similar to the \pkg{bpchem} package~\cite{pkg:bpchem} \chemmacros\ provides a
 command\footnote{The idea and initial implementation is shamelessly borrowed
@@ -981,9 +639,9 @@
   \end{tabular}
 \end{table}
 
-\subsubsection{Macros Defined (Not Only) For Usage in \cs*{iupac}}
+\subsection{Macros Defined (Not Only) For Usage in \cs*{iupac}}
 
-\paragraph{One-letter Macros}\label{sec:one-letter-commands}
+\subsection{One-letter Macros}\label{sec:one-letter-commands}
 For some of the macros explained in this section one-letter commands are
 defined -- with a \latin{caveat} in mind, though: they are not actively
 recommended.  One-letter commands seldomly have meaningful names and often
@@ -995,7 +653,7 @@
 command (see section~\vref{sec:acid-base-module}).  For all other one-letter
 macros alternatives with more meaningful names exist.
 
-\paragraph{Greek Letters}\label{par:greek_letters}
+\subsection{Greek Letters}\label{par:greek_letters}
 
 Greek letters in compound names are typeset upright.  Here are a few examples
 for the existing macros:
@@ -1042,7 +700,7 @@
     -chloro|poly(1,4-phenylene|methylene)}
 \end{example}
 
-\paragraph{Hetero Atoms and added Hydrogen}
+\subsection{Hetero Atoms and added Hydrogen}
 
 Attachments to hetero atoms and added hydrogen atoms are indicated by italic
 letters~\cite{iupac:greenbook}.  \chemmacros\ defines a few macros for the
@@ -1062,7 +720,7 @@
   \iupac{\oxygen-ethyl hexanethioate}
 \end{example}
 
-\paragraph{Cahn-Ingold-Prelog}\label{par:cip}
+\subsection{Cahn-Ingold-Prelog}\label{par:cip}
 \begin{commands}
   \command{cip}[\marg{conf}]
     Typeset Cahn-Ingol-Prelog descriptors, \eg: \cs{cip}\Marg{R,S}
@@ -1087,18 +745,18 @@
   \keyval{cip-inner-format}{format}\Default{\cs*{itshape}}
     \sinceversion{5.8}The format of the entries in \cs{cip}.  This format
     works additive to the outer format.
-  \keyval{cip-number-format}{format}\Default{\cs*{itshape}}
-    \sinceversion{5.8}The format of numbers in \cs{cip}.  This format works
+  \keyval{cip-number-format}{format}\Default{\cs*{upshape}}
+    \changedversion{6.0}The format of numbers in \cs{cip}.  This format works
     additive to the outer format and is applied to arabic figures only.
 \end{options}
 
-\paragraph{Fischer}
+\subsection{Fischer}
 \begin{commands}
   \iupaccs[D]{dexter}{The dexter descriptor.}
   \iupaccs[L]{laevus}{The laevus descriptor.}
 \end{commands}
 
-\paragraph{cis/trans, zusammen/entgegen, syn/anti \& tert}
+\subsection{cis/trans, zusammen/entgegen, syn/anti \& tert}
 \begin{itemize}
   \item \cs{cis}   \iupac{\cis} \quad \cs{trans} \iupac{\trans}
   \item \cs{fac}   \iupac{\fac} \quad \cs{mer}   \iupac{\mer}
@@ -1110,7 +768,7 @@
 An alias for \cs{entgegen} is \cs{E} and an alias for \cs{zusammen} is
 \cs{Z}.
 
-\paragraph{ortho/meta/para}
+\subsection{ortho/meta/para}
 \begin{center}
     \cs{ortho} \iupac{\ortho} \quad
     \cs{meta}  \iupac{\meta} \quad
@@ -1128,7 +786,7 @@
   names.
 \end{cnltxquote}
 
-\paragraph{Absolute Configuration}
+\subsection{Absolute Configuration}
 \begin{commands}
   \command{Rconf}[\oarg{letter}]
     \cs{Rconf}: \Rconf \quad \cs{Rconf}\oarg{}: \Rconf[]
@@ -1136,7 +794,7 @@
     \cs{Sconf}: \Sconf \quad \cs{Sconf}\oarg{}: \Sconf[]
 \end{commands}
 
-\paragraph{Coordination Chemistry}
+\subsection{Coordination Chemistry}
 
 \chemmacros\ provides a few commands useful in coordination chemistry:
 \begin{commands}
@@ -1164,7 +822,7 @@
 The default behaviour\sinceversion{5.8} of \cs{hapto} and \cs{dento} has
 changed with version~5.8 to follow \ac{iupac} recommendations.
 
-\paragraph{Examples}
+\subsection{Examples}
 \begin{example}
   \iupac{\dexter-Wein|s\"aure} =
   \iupac{\cip{2S,3S}-Wein|s\"aure} \par
@@ -1177,7 +835,7 @@
   \iupac{1,3-Di|methyl|benzene}
 \end{example}
 
-\subsubsection{Own \cs*{iupac} Macros And Shorthands}
+\subsection{Own \cs*{iupac} Macros And Shorthands}
 
 If you find any commands missing you can define them using
 \begin{commands}
@@ -1237,7 +895,7 @@
     Deletes an existing \ac{iupac} shorthand.
 \end{commands}
 
-\subsubsection{Latin Phrases}
+\subsection{Latin Phrases}
 
 \chemmacros\ provides a command for typesetting latin phrases:
 \begin{commands}
@@ -1273,12 +931,12 @@
     \changedversion{5.7}Sets the format for the latin phrases.
 \end{options}
 
-\subsection{The \chemmodule*{particles} Module}\label{sec:particles-module}
+\section{The \chemmodule*{particles} Module}\label{sec:particles-module}
 
 The \chemmodule{particles} module loads the modules \chemmodule{charges} and
 \chemmodule{chemformula}.
 
-\subsubsection{Provided Particle Macros}
+\subsection{Provided Particle Macros}
 The \chemmodule{particles} defines a number of macros which can be used for
 typesetting common particles in the running text.  Most of them don't make
 much sense in \pkg{chemformula}~\cite{pkg:chemformula}'s \cs{ch}, though,
@@ -1309,7 +967,7 @@
   \ba\ \Nuc
 \end{example}
 
-\subsubsection{Defining Own Particle Macros}\label{sec:defin-own-part}
+\subsection{Defining Own Particle Macros}\label{sec:defin-own-part}
 
 There are two sets of macros, one for defining particles and one for defining
 nucleophiles.
@@ -1373,11 +1031,11 @@
 A macro defined this way will have an optional argument for the
 \option{elpair} option.
 
-\subsection{The \chemmodule*{phases} Module}\label{sec:phases-module}
+\section{The \chemmodule*{phases} Module}\label{sec:phases-module}
 
 The \chemmodule{phases} module loads the \chemmodule{chemformula} modul.
 
-\subsubsection{Basics}
+\subsection{Basics}
 
 These commands are intended to indicate the phase of a compound.
 \begin{center}
@@ -1414,7 +1072,7 @@
 
 All those phase commands have an optional argument:
 \begin{example}[side-by-side]
-  \ch{H2O "\lqd[\SI{5}{\celsius}]"}
+  \ch{H2O "\lqd[\qty{5}{\celsius}]"}
 \end{example}
 
 There is also a generic phase command:
@@ -1424,7 +1082,7 @@
     denote a phase for which there is no phase command, yet.
 \end{commands}
 
-\subsubsection{Define Own Phases}
+\subsection{Define Own Phases}
 Depending on the subject of your document you might need to indicate other
 states of aggregation.  You can easily define them.
 \begin{commands}
@@ -1456,7 +1114,7 @@
   \ch{NaOH\aqi} \ch{H2O\cd} \ch{U\phase{cr}} \ch{A\lc}
 \end{example}
 
-\subsubsection{Language Dependencies}\label{sec:lang-depend}
+\subsection{Language Dependencies}\label{sec:lang-depend}
 For each phase command a translation into the custom language can be defined.
 If a phase is declared with \cs{NewChemPhase} no translation exists and
 for every \pkg{babel} language the literal string is used that was provided
@@ -1477,7 +1135,7 @@
 See section~\vref{sec:lang-module} for predefined translations and general
 language options of \chemmacros.
 
-\subsection{The \chemmodule*{symbols} Module}\label{sec:symbols-module}
+\section{The \chemmodule*{symbols} Module}\label{sec:symbols-module}
 
 The \chemmodule{symbols} module defines a few symbols chemists need now and
 then.  It loads the package \pkg{amstext}~\cite{pkg:amstext}.
@@ -1490,136 +1148,12 @@
     The uppercase delta used in \state[superscript=]{H} for example.
 \end{commands}
 
-\section{Internal Modules}
-\subsection{The \chemmodule*{base} Module}\label{sec:base-module}
+\section{The \chemmodule*{chemformula} Module}\label{sec:chemformula-module}
 
-The \chemmodule{base} module is the core module of \chemmacros. It defines
-some tools which can (and should) be used in other modules.  This means this
-section is only interesting for you if you plan to write a module yourself
-(see section~\vref{sec:own-modules} for details).
-
-This module requires the packages \pkg{bm}~\cite{pkg:bm}, 
-\pkg{amstext}~\cite{pkg:amstext}, and \pkg{etoolbox}~\cite{pkg:etoolbox}.
-
-This module also provides \cs{chemsetup} and the option \option{modules}.
-
-It also provides a number of (expl3) macros which may be used in other
-modules. In the macro descriptions below \TF\ denotes that a \code{T}, an
-\code{F} and a \code{TF} variant exist.  In case of an expandable conditional
-(\expandablesymbol) also the predicate variant is available.
-\begin{commands}
-  \expandable\explcommand{chemmacros_if_loaded:nn}[\TF\
-  \Marg{package|class} \marg{name} \marg{true} \marg{false}]
-    Checks if package (or class) \meta{name} has been loaded. Also works after
-    begin document.
-  \expandable\explcommand{chemmacros_if_package_loaded:n}[\TF\ \marg{name}
-  \marg{true} \marg{false}]
-    Checks if package \meta{name} has been loaded. Also works after begin
-    document.
-  \expandable\explcommand{chemmacros_if_class_loaded:n}[\TF\ \marg{name}
-  \marg{true} \marg{false}]
-    Checks if class \meta{name} has been loaded. Also works after begin
-    document.
-  \explcommand{chemmacros_nobreak:}
-    Inserts a penalty of \num{10000}.
-  \explcommand{chemmacros_allow_break:}
-    Inserts a penalty of \num{0}.
-  \explcommand{chemmacros_skip_nobreak:N}[ \meta{skip/length variable}]
-    Insert a horizontal skip where a linebreak is disallowed.
-  \expandable\explcommand{chemmacros_if_is_int:n}[\TF\ \marg{input} \marg{true}
-  \marg{false}]
-    Checks if \meta{input} is an integer or something else.
-  \explcommand{chemmacros_if_bold:}[\TF\ \marg{true} \marg{false}]
-    Checks if the current font weight is one of \chemboldchecks{or}.
-  \explcommand{chemmacros_bold:n}[ \marg{text}]
-    Checks if the current font weight is bold and if yes places \meta{text} in
-    \cs*{textbf} if in text mode or in \cs*{bm} if in math mode.  If no
-    \meta{text} simply is placed in the input stream as is.
-  \explcommand{chemmacros_text:n}[ \marg{text}]
-    Ensures that \meta{text} is placed in text mode.
-  \explcommand{chemmacros_math:n}[ \marg{text}]
-    Ensures that \meta{text} is placed in math mode.
-  \explcommand{chemmacros_new_macroset:nnn}[ \marg{name} \marg{arg spec}
-  \marg{internal command call}]
-    \changedversion{5.3b}A command to define a set of macros
-    \cs*{NewChem\meta{name}}, \cs*{RenewChem\meta{name}},
-    \cs*{DeclareChem\meta{name}} and \cs*{ProvideChem\meta{name}} where the
-    first letter of \meta{name} is converted to uppercase, other letters are
-    kept unchanged. \meta{arg spec} is any valid argument specification for
-    \pkg{xparse}'s \\
-    \cs{DeclareDocumentCommand}~\cite{bnd:l3packages}. \meta{internal command
-      call} should be a macro which makes definitions \emph{without} error
-    checks, \ie, define new macros or redefine existing ones like \cs*{def}
-    does.  This macro just should get the arguments passed on to.  Have a look
-    at the example below.
-  \explcommand{chemmacros_new_environment_macroset:nnn}[ \marg{name} \marg{arg spec}
-  \marg{internal command call}]
-    Like \explcs{chemmacros_new_macroset:nnn} but for environments.
-  \command{NewChemMacroset}[\sarg\marg{name}\marg{arg spec}\marg{internal
-    command call}]
-    A non-expl3 version of \explcs{chemmacros_new_macroset:nnn} for \LaTeXe\
-    programmers.  The starred version calls
-    \explcs{chemmacros_new_environment_macroset:nnn}.
-  \explcommand{chemmacros_add_cleveref_support:nnnnn}[ \marg{counter}
-    \marg{singular} \marg{plural} \marg{uppercase singular} \marg{uppercase
-      plural}]
-    A\sinceversion{5.6} command to add suiting names for a counter for the
-    \pkg{cleveref} package's \cs*{cref} commands.  This command acts at the
-    end of the preamble and only if a user hasn't provided definitions with
-    \cs*{crefname} already.
-  \command{ChemCleverefSupport}[\marg{counter}\marg{singular}\oarg{uppercase
-    singular}\marg{plural}\oarg{uppercase plural}]
-    \sinceversion{5.6}\LaTeXe-version of
-    \explcs{chemmacros_add_cleveref_support:nnnnn}.
-  \explcommand{chemmacros_add_fancyref_support:nnn}[ \marg{prefix} \marg{name}
-    \marg{uppercase name}]
-    A\sinceversion{5.6} command to add suiting names for a counter for the
-    \pkg{fancyref} package's \cs*{fref} commands.  This command acts at the
-    end of the preamble and doesn't override definitions made by the users.
-  \command{ChemFancyrefSupport}[\marg{prefix}\marg{name}\oarg{uppercase name}]
-    \sinceversion{5.6}\LaTeXe-version of
-    \explcs{chemmacros_add_fancyref_support:nnnnn}.
-\end{commands}
-This is how the macros \cs{NewChemParticle}, \cs{RenewChemParticle},
-\cs{DeclareChemParticle} and \cs{ProvideChemParticle} were defined:
-\begin{sourcecode}
-  \NewChemMacroset {Particle} {mm}
-    { \chemmacros_define_particle:Nn #1 {#2} }
-\end{sourcecode}
-
-The following macros strictly speaking are not provided by the
-\chemmodule{base} module but this place fits best for their description.
-\begin{commands}
-  \expandable\explcommand{chemmacros_if_module_exist:n}[\TF\ \marg{module}
-  \marg{true} \marg{false}]
-    Checks if a file with the correct name for a module \meta{module} can be
-    found.
-  \expandable\explcommand{chemmacros_if_module_loaded:n}[\TF\ \marg{module}
-  \marg{true} \marg{false}]
-    Checks if the module \meta{module} has already been loaded or not.
-  \explcommand{chemmacros_load_module:n}[ \marg{module}]
-    Loads module \meta{module} if it hasn't been loaded, yet.
-  \explcommand{chemmacros_load_modules:n}[ \marg{csv list of modules}]
-    Loads every module in \meta{csv list of modules} if they haven't been
-    loaded, yet. This is the code level variant of \cs{usechemmodule}.
-  \explcommand{chemmacros_before_module:nn}[ \marg{module} \marg{code}]
-    Saves\sinceversion{5.1} \meta{code} and inserts it right before
-    \meta{module} is loaded.  If \meta{module} is never loaded then
-    \meta{code} is never inserted.  If \meta{module} already is loaded when
-    the command is used then \meta{code} also is never inserted.
-  \explcommand{chemmacros_after_module:nn}[ \marg{module} \marg{code}]
-    Saves\sinceversion{5.1} \meta{code} and inserts it right after
-    \meta{module} is loaded.  If \meta{module} is never loaded then
-    \meta{code} is never inserted.  If \meta{module} already is loaded when
-    the command is used then \meta{code} is inserted immediately.
-\end{commands}
-
-\subsection{The \chemmodule*{chemformula} Module}\label{sec:chemformula-module}
-
 The \chemmodule{chemformula} module loads the \pkg{amstext}
 package~\cite{pkg:amstext} and the \chemmodule{charges} module.
 
-\subsubsection{For Users}
+\subsection{For Users}
 There are different packages which provide means for typesetting chemical
 formulas:
 \begin{itemize}
@@ -1662,7 +1196,7 @@
 you'll have to choose manually. \emph{All automatic choices only happen at the
   end of the preamble}.
 
-\paragraph{Using the \pkg*{chemformula} Package}
+\subsection{Using the \pkg*{chemformula} Package}
 If you set \keyis{formula}{chemformula} the \chemmodule{chemformula} module
 makes it possible that you can set all \chemformula\ options via the
 \cs{chemsetup} command using the module \module{chemformula}, for example:
@@ -1676,7 +1210,7 @@
 
 \emph{This method is the recommended choice!}
 
-\paragraph{Using the \pkg*{mhchem} Package}\sinceversion{5.1}\label{sec:using-mhchem}
+\subsection{Using the \pkg*{mhchem} Package}\sinceversion{5.1}\label{sec:using-mhchem}
 If you set \keyis{formula}{mhchem} the \chemmodule{chemformula} module makes
 it possible that you can set all of \pkg{mhchem}'s options via the
 \cs{chemsetup} command using the module \module{mhchem}, for example:
@@ -1703,7 +1237,7 @@
     \chemmacros' mechanism).
 \end{itemize}
 
-\paragraph{Using the \pkg*{chemfig} Package}\sinceversion{5.6}\label{sec:using-chemfig}
+\subsection{Using the \pkg*{chemfig} Package}\sinceversion{5.6}\label{sec:using-chemfig}
 Everywhere where \chemmacros\ typesets chemical formulas \pkg{chemfig}'s macro
 \cs{printatom} is used, for example in the reaction environments provided by
 the \chemmodule{reactions} module.
@@ -1723,7 +1257,7 @@
     methods \pkg{chemformula} or \pkg{mhchem} instead.
 \end{itemize}
 
-\paragraph{Using the \pkg*{chemist} Package}\sinceversion{5.6}\label{sec:using-chemist}
+\subsection{Using the \pkg*{chemist} Package}\sinceversion{5.6}\label{sec:using-chemist}
 Everywhere where \chemmacros\ typesets chemical formulas \pkg{chemist}'s macro
 \cs{ChemForm} is used, for example in the reaction environments provided by
 the \chemmodule{reactions} module.
@@ -1745,7 +1279,7 @@
       a number of chemical reaction environments itself.}.
 \end{itemize}
 
-\subsubsection{For Module Writers}
+\subsection{For Module Writers}
 
 There are two macros for module writers:
 \begin{commands}
@@ -1763,13 +1297,8 @@
     \cs*{chemmacros at reaction}.
 \end{commands}
 
-\subsection{The \chemmodule*{errorcheck} Module}\label{sec:errorcheck-module}
-The\sinceversion{5.2} \chemmodule{errorcheck} module provides some rudimentary
-support for giving users more meaningful messages when they use a command or
-environment provided by a module that they haven't loaded.
+\section{The \chemmodule*{greek} Module}\label{sec:greek-module}
 
-\subsection{The \chemmodule*{greek} Module}\label{sec:greek-module}
-
 The \chemmodule{greek} module loads the \pkg{chemgreek}
 package~\cite{pkg:chemgreek}.
 
@@ -1805,136 +1334,12 @@
 \end{sourcecode}
 For further details on mappings please refer to \chemgreek's manual.
 
-\subsection{The \chemmodule*{lang} Module}\label{sec:lang-module}
-
-The \chemmodule{lang} module provides language support for \chemmacros.  It
-loads the package \pkg{translations}~\cite{pkg:translations}.
-
-\subsubsection{Information For Users}\label{sec:information-users}
-
-This module defines the following option:
-\begin{options}
-  \keychoice{language}{auto,\meta{language}}\Default{auto}
-    If set to \code{auto} \chemmacros\ will detect the language used by
-    \pkg{babel}~\cite{pkg:babel} or \pkg{polyglossia}~\cite{pkg:polyglossia}
-    automatically, the fallback translation is English and will be used if no 
-    translation for the actual language is available.  Any language known to
-    the \pkg{translations} package is a valid value for \meta{language}.
-\end{options}
-
-The language chosen via \option{language} is used for translation of certain
-strings in different places all over \chemmacros.  They are mentioned in the
-places when the corresponding function of \chemmacros\ is explained.
-
-Translation is done with the help of the \pkg{translations} package, available
-translation keys are listed in section~\vref{sec:avail-transl-keys}.
-
-\subsubsection{Available Translation Keys}\label{sec:avail-transl-keys}
-
-Table~\vref{tab:translation-keys} lists all predefined translations of the
-available keys.  \emph{Some of the translations have changed in
-  version~5.6\changedversion{5.6}.} The \chemmodule{lang} module doesn't
-provide the translations themselves -- they are provided by the corresponding
-modules.  A translation key is a unique string\footnote{That is, a string
-  using the definition for strings used for expl3, i.e., converted to a series
-  of category code~12 characters..} of characters.  Each key is used to
-identify a replacement text which depends on the current language or the
-language set through the \option{language} option.  For each key at least the
-English fallback translation is provided, for most also the German translation
-is provided.  For a few keys also other translations are provided.  If you
-find that a translation for your language is missing you can provide it in the
-preamble:
-\begin{commands}
-  % \command{DeclareTranslation}[\marg{language}\marg{key}\marg{translation}]
-  %   Defines a translation of key \meta{key} for the language \meta{language}.
-  %   No error will be raised if a translation of \meta{key} already exists.
-  %   This command can only be used in the preamble and is defined by the
-  %   \pkg{translations} package.
-  \command{DeclareChemTranslation}[\marg{key}\marg{language}\marg{translation}]
-    \sinceversion{5.6}A command which makes an abstraction from the
-    \pkg{translations} package.  It should be used in documents for adding
-    missing translations that are needed.  This command can only be used in
-    the preamble.
-  \command{DeclareChemTranslations}[\marg{key}\Marg{\meta{language} =
-    \meta{translation}}]
-    \sinceversion{5.6}A command rather meant for module writers but can be
-    used by document authors as well, of course.  It gets a csv list of
-    key\slash value pairs of translations.  This command can only be used in
-    the preamble.
-\end{commands}
-If you send me an email (see section~\vref{sec:sugg-bug-reports}) with the
-translations for your language I'll gladly add them to the next release of
-\chemmacros!
-
-\emph{Please do not use \pkg{translations}' \cs{DeclareTranslation} for
-  declaring translations.}
-
-\ForAllChemTranslationsDo{
-  \appto\chemtranslationtable{\texttt{#1} & #2 & \texttt{\detokenize{#3}} \\}
-}
-
-\begin{longtable}{lll}
-    \caption{Translation keys predefined by \chemmacros\ (except
-      \code{phase-aqi}, \code{phase-cd} and \code{phase-lc} which were defined
-      in this document).}
-    \label{tab:translation-keys} \\
-    \toprule
-    \bfseries key & \bfseries language & \bfseries translation \\
-    \midrule
-  \endfirsthead
-    \toprule
-    \bfseries key & \bfseries language & \bfseries translation \\
-    \midrule
-  \endhead
-    \bottomrule
-  \endlastfoot
-    \midrule
-    & & \hfill\emph{continues} \\
-  \endfoot
-  \chemtranslationtable
-\end{longtable}
-  
-\subsubsection{Information For Module Writers}
-
-In addition to the commands from section~\vref{sec:avail-transl-keys} the
-following macros are available:
-\begin{commands}
-  \expandable\explcommand{chemmacros_translate:n}[ \marg{translation key}]
-    Translates the given key to the language which is detected automatically
-    or given by the user.  Should be used in \chemmacros' macros instead of
-    \pkg{translations}' \cs*{GetTranslation}.
-  \explcommand{l_chemmacros_language_tl}
-    A token list variable that holds the language which is used by
-    \explcs{chemmacros_translate:n} for translation, \emph{after begin
-      document}.
-  \command{ChemTranslate}[\marg{translation key}]
-    A version of \explcs{chemmacros_translate:n} for those who prefer
-    traditional \LaTeXe\ programming over expl3.
-  \explcommand{chemmacros_declare_translation:nnn}[\marg{language}\marg{key}%
-    \marg{translation}]
-    The expl3 version of \cs{DeclareChemTranslation}.
-  \explcommand{chemmacros_declare_translations:nn}[\marg{key}\Marg{\meta{language}
-    = \meta{translation}}]
-    The expl3 version of \cs{DeclareChemTranslations}.
-\end{commands}
-
-\clearpage
-
 \part{Additional Modules}\label{part:additional-modules}
 
-\section{User Modules}
-\subsection{The \chemmodule*{all} \emph{pseudo}-module}\label{sec:all-module}
+The modules described in this part are not part of \chemmacros' minimal setup.
 
-The \chemmodule{all} module is a pseudo module: it doesn't define any
-functionality at all.  It does however load all other modules.  So you can say
-\begin{sourcecode}
-  \chemsetup{ modules = all }
-\end{sourcecode}
-to ensure that every module is available.  This \emph{will not} load personal
-modules!
+\section{The \chemmodule*{isotopes} Module}\label{sec:isotopes-module}
 
-\subsection{The \chemmodule*{isotopes} Module}\label{sec:isotopes-module}
-
 The \chemmodule{isotope} module loads the \pkg{elements}
 package~\cite{pkg:elements}.  This module defines one user command:
 \begin{commands}
@@ -1981,7 +1386,7 @@
   \isotope{C}
 \end{example}
 
-\subsection{The \chemmodule*{mechanisms} Module}\label{sec:mechanisms-module}
+\section{The \chemmodule*{mechanisms} Module}\label{sec:mechanisms-module}
 
 The module \chemmodule{mechanisms} loads the package
 \pkg{amstext}~\cite{pkg:amstext}.  It provides one macro:
@@ -2017,7 +1422,7 @@
     \mech[cb]
 \end{commands}
 
-\subsection{The \chemmodule*{newman} Module}\label{sec:newman-module}
+\section{The \chemmodule*{newman} Module}\label{sec:newman-module}
 The \chemmodule{newman} module provides a command for drawing Newman
 projections.  It loads the \chemmodule{tikz} module.
 \begin{commands}
@@ -2067,7 +1472,7 @@
   \newman{1,2,3,4,5,6} \newman(170){1,2,3,4,5,6}
 \end{example}
 
-\subsection{The \chemmodule*{orbital} Module}\label{sec:orbital-module}
+\section{The \chemmodule*{orbital} Module}\label{sec:orbital-module}
 The \chemmodule{orbital} module loads the \chemmodule{tikz} module.  It
 provides the following command to create orbitals:
 \begin{commands}
@@ -2162,16 +1567,16 @@
   \vspace{1cm}
 \end{example}
 
-\subsection{The \chemmodule*{polymers} Module}\label{sec:polymers-module}
+\section{The \chemmodule*{polymers} Module}\label{sec:polymers-module}
 The\sinceversion{5.5} \chemmodule{polymers} module loads the
 \chemmodule{nomenclature} and the \chemmodule{tikz} modules.
 
-\subsubsection{Nomenclature}
+\subsection{Nomenclature}
 
 The \chemmodule{polymers} module defines a number of \ac{iupac} macros for
 usage inside \cs{iupac} which are used in polymer chemistry.
 
-\paragraph{Copolymers}
+\subsection{Copolymers}
 \begin{commands}
   \iupaccs[co]{copolymer}{unspecified copolymer.}
   \iupaccs[stat]{statistical}{statistical copolymer.}
@@ -2182,7 +1587,7 @@
   \iupaccs{graft}{graft copolymer.}
 \end{commands}
 
-\paragraph{Non-linear (Co) Polymers and Polymer Assemblies}
+\subsection{Non-linear (Co) Polymers and Polymer Assemblies}
 \begin{commands}
   \iupaccs{blend}{The blend qualifier.}
   \iupaccs{comb}{The comb qualifier.}
@@ -2195,7 +1600,7 @@
   \iupaccs{star}{The star qualifier.}
 \end{commands}
 
-\subsubsection{Polymer Denotations in \pkg*{chemfig}'s Molecules}
+\subsection{Polymer Denotations in \pkg*{chemfig}'s Molecules}
 The \pkg{chemfig} manual proposes some code defining the macros
 \cs*{setpolymerdelim} and \cs*{makebraces} which make it possible to add
 delimiters to \pkg{chemfig} molecules.  The \chemmodule{polymers} module
@@ -2226,11 +1631,11 @@
   \makepolymerdelims[delimiters=()]{5pt}[27pt]{op}{cl}
 \end{example}
 
-\subsection{The \chemmodule*{reactions} Module}\label{sec:reactions-module}
+\section{The \chemmodule*{reactions} Module}\label{sec:reactions-module}
 The \chemmodule{reactions} module loads the \chemmodule{chemformula} module
 and the \pkg{mathtools} package~\cite{pkg:mathtools}.
 
-\subsubsection{Predefined Environments}
+\subsection{Predefined Environments}
 
 You can use these environments for numbered\ldots
 \begin{environments}
@@ -2338,7 +1743,7 @@
 \env{reaction} counter is supported already.  For \pkg{fancyref} use the
 prefix \code{rct}.
 
-\subsubsection{Own Reactions}
+\subsection{Own Reactions}
 You can create new types of reactions with the command:
 \begin{commands}
   \command{NewChemReaction}[\marg{name}\oarg{number of arguments}\marg{math name}]
@@ -2385,7 +1790,7 @@
   \end{reactionsat*}
 \end{example}
 
-\subsubsection{List of Reactions}
+\subsection{List of Reactions}
 
 The \chemmodule{reactions} module also provides a command to display a list of
 the reactions created with the \env{reaction} environment.
@@ -2448,13 +1853,405 @@
   \end{reactions}
 \end{example}
 
-\subsection{The \chemmodule*{redox} Module}\label{sec:redox-module}
+\section{The \chemmodule*{reactants} Module}\label{sec:reactants-module}
+\sinceversion{6.0}Idea for this module is by \leandriis, who also does the
+main development of the module.  Many thanks for all her work!
 
+\subsection{Idea and Getting Started}
+The \module{reactants} module offers a simplified input syntax for chemical
+reactants in the description of reaction procedures. Reactant and solvent
+names are declared in the preamble removing the need to repeat the same
+\ac{iupac} names multiple times throughout the document. With the help of
+module options the output style (order of name number and data) can be altered
+globally (or locally) to suit your needs, while the data itself is input using
+an easy to use key-value approach and processed by the \pkg{siunitx}
+package. The \module{reactants} module responds to the language declared with
+the \pkg{babel} package and also offers methods to integrate the acronyms of
+used reactants or solvents into the list of acronyms.
+
+The module requires and loads the packages \pkg{chemnum}~\cite{pkg:chemnum}
+and \pkg{siunitx}~\cite{pkg:siunitx}. Depending on the selected options the
+packages \pkg{acro}~\cite{pkg:acro},
+\pkg{glossaries-extra}~\cite{pkg:glossaries-extra},
+\pkg{hyperref}~\cite{pkg:hyperref}, \pkg{longtable}~\cite{pkg:longtable}
+and/or \pkg{xltabular}~\cite{pkg:xltabular} might be needed for this module
+and will be explicitly mentioned in the corresponding sections of this manual.
+
+\subsection{Basic Commands}
+
+\begin{commands}
+  \command{DeclareChemReactant}[\marg{ID}\marg{properties}]
+    This command defines the reactant \meta{ID} with the properties
+    \meta{properties}.  \emph{Should be used in the preamble. Must be used in
+      the preamble when \pkg{acro} is used as acronym support package.}
+  \command{DeclareChemReactant}[\Marg{\meta{main ID}.\meta{sub ID}}\marg{properties}]
+    Analogously to \pkg{chemnum}'s \cs{cmpd} command, both the
+    \cs{DeclareChemReactant} and \cs{reactant} commands accept a combined
+    \meta{ID} consisting of a \meta{main ID} and \meta{sub ID} part. The
+    default separator is a \code{.} here, but this can be changed using
+    \pkg{chemnum}'s \keyis{main-sub-sep}{token} option.
+\end{commands}
+Valid \meta{properties} include the following key-value pairs:
+\begin{options}
+  \keyval{name}{name}
+    Mandatory property: the name of the substance.
+  \keyval{short}{abbreviation}
+    Optional property: a short form of the name, used when the
+    \module{reactants} module is used in combination with the
+    \option{acronym-support} option, see section~\vref{sec:acronyms-in-reactants}.
+  \keyval{bookmark}{replacement in \ac{pdf} bookmarks}
+    Optional property: replaces \meta{name} in a \ac{pdf} bookmark.  This
+    might be advisable when reactants are used in section titles and the
+    \pkg{hyperref} package is used as well, see
+    section~\vref{sec:reactants-in-headings}.
+  \keyval{upper-name}{upper case version of the name}
+    Optional property: The upper case version of a compound's name, e.g. for
+    the use in the beginning of a sentence.
+  \keyval{upper-bookmark}{upper case version of the bookmark text}
+    Optional property: The upper case version of the \meta{name} in a \ac{pdf} bookmark.
+\end{options}
+
+Common declarations will look like this:
+\begin{sourcecode}
+  \DeclareChemReactant{thf}{name={tetrahydrofuran}, short={THF}}
+  \DeclareChemReactant{H2SO4}{name={\ch{H2SO4}}}
+  \DeclareChemReactant{dichloropentane}{name={\iupac{2,4-di|chloro|pentane}}}
+\end{sourcecode}
+
+\begin{commands}
+  \command{reactant}[\oarg{data and units}\marg{ID}]
+    This command is used to insert name, number, and, if present, data of a
+    predefined reactant with the \meta{ID} in the text. The order of the
+    information in the output can be controlled through the
+    \option{reactant-output-style} option, see
+    section~\vref{sec:output-styles}.  The upper case version of this command
+    \cs{Reactant} can be used in order to start a sentence with an upper case
+    version of a compound's name. The corresponding text must be defined
+    through \cs{DeclareChemReactant}'s \option{upper-name} option. Further
+    variants of \cs{reactant} with different suffixes, such as \code{*},
+    \code{+}, \code{l}, \code{s} or \code{plain} will be described later.
+  \command{solvent}[\oarg{data and units}\marg{ID}]
+    Analogous to \cs{reactants}. Can be used to insert solvent names and
+    corresponding data in the text. Format and order depend on the on the
+    \option{solvent-output-style} option. The upper case version of this
+    command \cs{Solvent} can be used in order to start a sentence with an
+    upper case version of a solvent's name. The corresponding text must be
+    defined through  \cs{DeclareChemReactant}'s \option{upper-name} option.
+    \code{s} and \code{l} suffixed variants exist and are discussed later.
+\end{commands}
+
+\meta{data and units} accepts a comma separated list of key-value pairs. Valid keys,
+acceptable values as well as their defaults are listed in table~\vref{tab:reactant-data}.
+
+Typical uses will look like this:
+\begin{sourcecode}
+  \reactant{dichloropentane}
+  \reactant[volume=5]{dichloropentane}
+  \reactant[volume=0.5, volume-unit=\L]{dichloropentane}
+  \solvent{thf}
+  \solvent[volume=200]{thf}
+  \solvent[volume=1.5, volume-unit=\L]{thf}
+\end{sourcecode}
+
+\begin{commands}
+  \command{printreactants}
+    Prints a list of number and name of all reactants used throughout the
+    document. The resulting list is sorted by number and also includes
+    compounds numbered with \pkg{chemnum}'s \cs{cmpd} command. The starred
+    variant also includes the \meta{ID} in the list of reactants. Using
+    \option{printreactants-style} different styles can be selected. (See
+    section~\vref{sec:list-of-reactants}).
+\end{commands}
+
+\subsection{Options}
+\begin{options}
+  \keybool{initiate}\Module{reactants}\Default{false}
+    The \pkg{chemnum} package that is internally used for numbering the
+    reactants offers two ways of initiating a new label: either when \cs{cmpd}
+    is first used or through \cs{initcmpd}.  The \module{reactants} module
+    also offers these two methods with initiating a new label upon the first
+    use of a reactant being the default.   If you prefer to initiate a
+    new label through the \cs{DeclareChemReactant} command set this option to
+    true.
+
+    Reactants are automatically numbered in the order of their first
+    appearance, while \option{initiate} numbers the compounds in the order in
+    which they were declared in the preamble or in an external document.
+  \keybool{switch}\Module{reactants}\Default{false}
+    While \cs{reactants} will output name and number of a reactant, its
+    starred variant \cs{reactant*}, will by default result in the name without
+    the corresponding number. Setting \keyis{switch}{true}, globally or
+    locally, reverses this behavior and outputs a reactant's number without
+    its name.
+\end{options}
+Other options are described at later places when the corresponding behavior is
+described.
+
+\subsubsection{Data and Units}
+
+Describing synthetic procedures often requires adding a lot of data with the
+corresponding units to each reactant/solvent that is used. In order to allow
+for a uniform representation of numbers and units, as well as making the code
+more readable, the \cs{reactant} and \cs{solvent} commands offer an optional
+argument that can be used to easily input this data:
+
+\begin{commands}
+  \command{reactant}[\oarg{data and units}\marg{ID}]
+  \command{solvent}[\oarg{data and units}\marg{ID}]
+\end{commands}
+
+\begin{table}[bp]
+  \newcolumntype{K}{>{\collectcell\code}l<{\endcollectcell}}
+  \newcolumntype{O}{>{\collectcell\option}l<{\endcollectcell}}
+  \centering
+  \caption{Overview of available keys as well as the default units and the
+    option to locally or globally change that default unit.}
+  \label{tab:reactant-data}
+  \begin{tabular}{KlO}
+    \toprule
+      \tablehead{Key} & \tablehead{default unit} & \tablehead{option} \\
+    \midrule
+      mass          & \unit{\gram}                 & mass-unit          \\
+      volume        & \unit{\milli\liter}          & volume-unit        \\
+      fraction      & w/w\%                      & fraction-unit      \\
+      amount        & \unit{\milli\mole}           & amount-unit        \\
+      equiv         & eq                         & equiv-unit         \\
+      purity        & \%                         & purity-unit        \\
+      concentration & \unit{\Molar}                & concentration-unit \\
+      solvent       & n.a.                       &                    \\
+    \midrule
+      solution-name & solution in                & solution           \\
+    \bottomrule
+  \end{tabular}
+\end{table}
+
+\meta{data and units} accepts a comma separated list of key-value pairs with
+the available keys and their default units/values listed in
+table~\vref{tab:reactant-data}.  Key-value pairs can be input in any order as
+they are categorized and rearranged internally according to the order in which
+they are listed in table~\vref{tab:reactant-data}. Customization of this order
+is thus far somewhat limited. The available customization possibilities are
+described in section~\vref{sec:output-styles}. Since numbers and their
+corresponding units are processed using \pkg{siunitx}, the usual \cs{sisetup}
+command can be used to alter, for example, the output decimal separator
+according to your needs. Be aware, though, that you must surround a number
+with a set of \code{\{\}} if you use a comma as input decimal
+separator. Otherwise the decimal places will be truncated without a warning.
+
+\option{solution} here refers to the text that links concentration and
+solvent. This text automatically adapts to the document language set via
+\pkg{babel} or \pkg{polyglossia}.  Currently, the English fallback, as well as
+the German translation are included in the package.  If you write in a
+different language (or just don't like the predefined text), you can use the
+command \cs{DeclareChemTranslation}\marg{key}\marg{language}\marg{translation}
+(with \keyis{\meta{key}}{solution}) as described in
+section~\vref{sec:lang-module} in order to supply your own translation.
+
+\begin{example}
+  % in the preamble:
+  % \DeclareChemReactant{nBuLi}{name={\iupac{\textit{n}=butyllithium}}}
+  % \DeclareChemReactant{Br2benzene}{name={\iupac{1,4=di|bromo|benzene}}}
+  % \DeclareChemReactant{HBr}{name={\ch{HBr\aq}}}
+
+  \reactant[volume=5.00, amount=12.5, equiv=1.00, concentration=2.5, solvent=hexane]{nBuLi}\par
+  \reactant[mass=3.9, amount=15.6, equiv=1.3, purity=95]{Br2benzene}\par
+  \reactant[volume=2.0, amount=43.8, equiv=3.5, fraction=65]{HBr}
+\end{example}
+
+The options that change the units of the properties can be set with
+\cs{chemsetup} or in the optional argument of \cs{reactant}. Accepted units
+are units defined by the \pkg{siunitx} package or by the \module{units} module.
+\begin{options}
+  \keyval{mass-unit}{unit}\Module{reactants}\Default{\cs*{gram}}
+    Change the unit of the \code{mass} property.
+  \keyval{volume-unit}{unit}\Module{reactants}\Default{\cs*{milli}\cs*{liter}}
+    Change the unit of the \code{volume} property.
+  \keyval{fraction-unit}{unit}\Module{reactants}\Default{\code{w/w \cs*{percent}}}
+    Change the unit of the \code{fraction} property.
+  \keyval{amount-unit}{unit}\Module{reactants}\Default{\cs*{milli}\cs*{mole}}
+    Change the unit of the \code{amount} property.
+  \keyval{equiv-unit}{unit}\Module{reactants}\Default{\code{eq}}
+    Change the unit of the \code{equiv} property.
+  \keyval{concentration-unit}{unit}\Module{reactants}\Default{\cs*{Molar}}
+    Change the unit of the \code{concentration} property.
+  \keyval{purity-unit}{unit}\Module{reactants}\Default{\cs*{percent}}
+    Change the unit of the \code{purity} property.
+\end{options} 
+
+\begin{example}
+  \reactant[volume=5.5]{thf} \par
+  \reactant[volume=5, volume-unit=\cubic\centi\metre]{thf}
+\end{example}
+
+\subsubsection{Output Styles}\label{sec:output-styles}
+
+The \module{reactants} module categorizes the data into different categories
+that are later used to determine the order in which this information is
+displayed. This behavior can be controlled using the following predefined
+output styles:
+
+\begin{options}
+  \keychoice{reactant-output-style}{name-main-other,main-name-other,main-other-name}%
+    \Module{reactants}\\[-\baselineskip]
+    \Default{name-main-other}
+    Select one of the three predefined styles to determine the output style of
+    the data and their units in the \cs{reactant} command.
+  \keychoice{solvent-output-style}{main-name,name-main}\Module{reactants}\Default{main-name}
+    Select one of the two predefined styles to determine the output style of
+    the data and their units in the \cs{solvent} command.
+\end{options}
+
+\code{name} here refers to the combination of name and number (or if just one
+of them is available, to either name or number).
+    
+\code{main} here refers to the \code{mass} or \code{volume} of a reactant or
+solvent. If needed, \code{equiv} and/or \code{amount} can also be assigned to
+the main category.
+    
+\code{other} here refers to all the other data that is give to the reactant
+command.
+
+The names of the \option{reactant-output-style} and
+\option{solvent-output-style} choice options refer to the order in which the
+contents of the categories are typeset.
+
+\begin{example}
+  \chemsetup[reactants]{reactant-output-style=name-main-other}
+  \reactant[volume=5, amount=4]{dichloropentane}\par
+  \chemsetup[reactants]{reactant-output-style=main-name-other}
+  \reactant[volume=5, amount=4]{dichloropentane}\par
+  \chemsetup[reactants]{reactant-output-style=main-other-name}
+  \reactant[volume=5, amount=4]{dichloropentane}
+  
+  \chemsetup[reactants]{solvent-output-style=name-main}
+  \solvent[volume=5]{thf}\par
+  \chemsetup[reactants]{solvent-output-style=main-name}
+  \solvent[volume=5]{thf}
+\end{example}
+
+\begin{options}
+  \keychoice{main}{default,amount,equiv}\Module{reactants}\Default{default}
+    By default, only \code{mass} and \code{volume} are assigned to the
+    \code{main} category. Using the \option{main} option,  \code{equiv} or
+    \code{amount} can be added to the main category. 
+\end{options}
+\chemsetup[reactants]{reactant-output-style=main-name-other}
+  
+\begin{example}
+  \chemsetup[reactants]{main=amount}
+  \reactant[equiv=2.0, amount=5]{dichloropentane}\par
+  \chemsetup[reactants]{main=equiv}
+  \reactant[equiv=2.0, amount=5]{dichloropentane}\par
+  \chemsetup[reactants]{main=default}
+  \reactant[equiv=2.0, amount=5]{dichloropentane}
+\end{example}
+
+\begin{options}
+  \keybool{equivalents}\Module{reactants}\Default{true}
+    Can be used to prevent \code{equiv} from being output while still keeping
+    the corresponding information in the input code. If you used the
+    \keyis{main}{equiv} option, the \keyis{equivalents}{false} option will be
+    ignored for the corresponding entries.
+\end{options}
+
+\subsection{Use in Section Headings}\label{sec:reactants-in-headings}
+
+Using the \cs{reactants} command inside of section headings or captions can
+mess up the order in which the molecules are numbered, especially when also
+using a table of contents and/or a list of figures/tables. To prevent this,
+the \module{reactants} module offers the \code{+} suffixed variant of
+\cs{reactants}, comparably to \pkg{chemnum}'s \cs{cmpd+} command.
+
+\begin{commands}
+  \command{reactant+}[\oarg{data and units}\marg{ID}]
+    This command is used to insert name, number, and, if present, data of a
+    predefined reactant with the \meta{ID} in a section heading or caption.
+\end{commands}
+
+If you also use the \pkg{hyperref} package in combination with \ac{pdf}
+bookmarks, you might want to use the optional \option{bookmark} property of
+\cs{DeclareChemReactant} to supply an alternative text to \option{name} to be
+displayed inside of the \ac{pdf} bookmarks. To later use such a predefined
+solvent or reactant, use one of the following three commands, that are defined
+analogously to \pkg{chemnum}`s \cs{cmpdplain}. All three commands also exist
+in the upper case variant (\cs{Reactantplain}, \cs{Sumbainreactantplain} and
+\cs{Solventplain}) which can be used to display the upper case version of a
+reactant or solvent's name. he upper case version of the name must be declared
+previously through \cs{DeclareChemReactant}'s \option{upper-name} and
+\option{upper-bookmark} options.
+
+\begin{commands}
+  \command{reactantplain}[\marg{ID}]
+    Outputs the value of \option{bookmark} inside of the \ac{pdf} bookmark,
+    while using the reactant's \option{name} inside of the  section headings.
+  \command{submainreactantplain}[\marg{mainID}\marg{subID}]
+     Outputs the value of \option{bookmark} inside of the \ac{pdf} bookmark,
+     while using the reactant's \option{name} inside of the  section
+     headings. Must be used if your \meta{ID} consists of a \meta{mainID}
+    and a \meta{subID}   part. 
+  \command{solventplain}[\marg{ID}]
+    Outputs the value of \option{bookmark} inside of the \ac{pdf} bookmark,
+    while using the solvent's \option{name} inside of the  section headings.
+\end{commands}
+
+
+\subsection{Acronyms as Reactant/Solvent Names}\label{sec:acronyms-in-reactants}
+
+In order to integrate solvent/reactant acronyms into one combined list of
+acronyms, the reactants module offers two different options. While using
+either of these two options, the user can also explicitly decide if the
+\option{name} or the \option{short} version of the reactant/solvent should be
+used in the text. Inspired by the \cs{acs} and \cs{acl} commands from the
+\pkg{acro} or the \pkg{glossaries-extra} package, the \module{reactants}
+module also offers the following \code{s} and \code{l} suffixed variants:
+
+\begin{commands}
+  \command{reactants}[\marg{ID}]
+    Output the \option{short} version of the reactant's name.
+  \command{reactantl}[\marg{ID}]
+    Output the \option{name} version of the reactant's name.
+  \command{solvents}[\marg{ID}]
+    Output the \option{short} version of the solvent's name.
+  \command{solventl}[\marg{ID}]
+    Output the \option{name} version of the solvent's name.
+\end{commands}
+
+\begin{options}
+  \keychoice{acronym-support}{acro,glossaries,none}\Module{reactants}\Default{none}
+    Can be used to select, which of the two packages \pkg{acro} or
+    \pkg{glossaries-extra} is used in the background in order to format and
+    sort acronyms.
+\end{options}
+
+\begin{example}
+  % in the preamble:
+  % \DeclareChemReactant{dcm}{name={dichloromethane}, short={DCM}}
+  \solvent{dcm}\par
+  \solventl{dcm}\par
+  \solvents{dcm}
+\end{example}
+
+\subsection{List of Reactants}\label{sec:list-of-reactants}
+As mentioned before, \cs{printreactants} can be used to print a list of all
+used reactants and their numbers. The \module{reactants} module internally
+uses either \pkg{longtable} or \pkg{xltabular} to typeset this list:
+\begin{options}
+  \keychoice{printreactants-style}{xltabular,longtable,none}\Module{reactants}\Default{none}
+    Can be used to switch between \pkg{longtable} and \pkg{xltabular} which
+    are responsible for formatting the list of reactants. Be aware that with
+    \code{longtable}, the column widths are hard coded, thus you could
+    experience overfull box warnings if you use exceptionally long \meta{ID}s
+    in combination with the starred variant \cs{printreactants*}, which is
+    responsible for adding the \meta{ID} in resulting list, as well.
+\end{options}
+
+\section{The \chemmodule*{redox} Module}\label{sec:redox-module}
+
 The \chemmodule{redox} module loads the modules \chemmodule{tikz} and
 \chemmodule{xfrac}. It also loads the packages
 \pkg{mathtools}~\cite{pkg:mathtools} and \pkg{relsize}~\cite{pkg:relsize}.
 
-\subsubsection{Oxidation Numbers}\label{sec:oxidation-numbers}
+\subsection{Oxidation Numbers}\label{sec:oxidation-numbers}
 
 Regarding the typesetting of oxidation numbers
 \citetitle{iupac:greenbook}~\cite{iupac:greenbook} says the following:
@@ -2559,7 +2356,7 @@
 package~\cite{bnd:l3packages}.  For more details on how \chemmacros\ uses it
 read section~\vref{sec:xfrac-module}.
 
-\subsubsection{Redox Reactions}\label{sec:redox-reactions}
+\subsection{Redox Reactions}\label{sec:redox-reactions}
 
 \chemmacros\ provides two commands to visualize the transfer of electrons in
 redox reactions.  Both commands are using \TikZ.
@@ -2626,7 +2423,7 @@
   \OX{a,Na} $\rightarrow$ \OX{b,Na}\pch\redox(a,b)[->,red]{ox}
 \end{example}
 
-\paragraph{Examples}
+\subsection{Examples}
 \begin{example}
   \vspace{7mm}
   \ch{
@@ -2673,7 +2470,7 @@
   \vspace{7mm}
 \end{example}
 
-\subsection{The \chemmodule*{scheme} Module}\label{sec:scheme-module}
+\section{The \chemmodule*{scheme} Module}\label{sec:scheme-module}
 
 The \chemmodule{scheme} module loads the \pkg{chemnum}
 package~\cite{pkg:chemnum} and defines a floating environment
@@ -2716,12 +2513,12 @@
 \env{scheme} environment (or rather its captions) are supported already.  For
 \pkg{fancyref} use the prefix \code{sch}.
 
-\subsection{The \chemmodule*{spectroscopy} Module}\label{sec:spectroscopy-module}
+\section{The \chemmodule*{spectroscopy} Module}\label{sec:spectroscopy-module}
 
 The \chemmodule{spectroscopy} module loads the \chemmodule{chemformula} module
 and the \pkg{siunitx} package~\cite{pkg:siunitx}.
 
-\subsubsection{The \cs*{NMR} Command}
+\subsection{The \cs*{NMR} Command}
 
 When you're trying to find out if a compound is the one you think it is often
 NMR spectroscopy is used.  The experimental data are typeset similar to this:
@@ -2752,7 +2549,7 @@
   \NMR{13,C}
 \end{example}
 
-The second argument sets the frequency (in \si{\mega\hertz}):
+The second argument sets the frequency (in \unit{\mega\hertz}):
 \begin{example}[side-by-side]
   \NMR(400)
 \end{example}
@@ -2771,7 +2568,7 @@
   \NMR[CDCl3]
 \end{example}
 
-\subsubsection{Short Cuts}
+\subsection{Short Cuts}
 
 It is possible to define short cut commands for specific nuclei.
 \begin{commands}
@@ -2798,7 +2595,7 @@
   \HNMR*(400)
 \end{example}
 
-\subsubsection{An Environment to Typeset Experimental Data}
+\subsection{An Environment to Typeset Experimental Data}
 
 The \chemmodule{spectroscopy} module provides an environment to ease the input
 of experimental data.
@@ -2840,11 +2637,10 @@
   \end{experimental}
 \end{example}
 
-\paragraph{Customization}\label{sec:experimental-customization}
+\subsection{Customization}\label{sec:experimental-customization}
 
 The output of the environment and of the NMR commands can be customized be a
-number of options.  For historical reasons they all belong to the module
-\module{nmr}.
+number of options.  
 \begin{options}
   \keyval{unit}{unit}\Module{spectroscopy}\Default{\cs*{mega}\cs*{hertz}}
     The used default unit.
@@ -2890,11 +2686,11 @@
   \keyval{delta}{tokens}\Module{spectroscopy}\Default
     The \meta{tokens} are added after $\delta$.
   \keybool{list}\Module{spectroscopy}\Default{false}
-    The environment \env{nmr}[<options>]{} is formatted as a list
+    The environment \env{experimental} is formatted as a list
   \keyval{list-setup}{setup}\Module{spectroscopy}
     Setup of the list. See below for the default settings.
   \keybool{use-equal}\Module{spectroscopy}\Default{false}
-    Add egual sign after \cs{NMR} and \cs{data}.
+    Add equal sign after \cs{NMR} and \cs{data}.
 \end{options}
 
 The default setup of the list:
@@ -2923,7 +2719,7 @@
   \end{experimental}
 \end{example}
 
-\paragraph{An Example}
+\subsection{An Example}
 The code below is shown with different specifications for \meta{options}.
 Of course options can also be chosen with \cs{chemsetup}.
 
@@ -2930,10 +2726,10 @@
 \begin{sourcecode}
   \sisetup{separate-uncertainty,per-mode=symbol,detect-all,range-phrase=--}
   \begin{experimental}[<optionen>]
-    \data*{yield} \SI{17}{\milli\gram} yellow needles (\SI{0.04}{\milli\mole},
-      \SI{13}{\percent}).
+    \data*{yield} \qty{17}{\milli\gram} yellow needles (\qty{0.04}{\milli\mole},
+      \qty{13}{\percent}).
     %
-    \data{mp.} \SI{277}{\celsius} (DSC).
+    \data{mp.} \qty{277}{\celsius} (DSC).
     %
     \NMR(600)[CDCl3] \val{2.01} (s, \#{24}, \pos{5}), \val{2.31} (s, \#{12},
     \pos{1}), \val{6.72--6.74} (m, \#{2}, \pos{11}), \val{6.82} (s, \#{8},
@@ -2947,10 +2743,10 @@
     \pos{2}), \val{140.6} (q, \#{2}, \pos{10}), \val{140.8} (q, \#{8}, \pos{4}),
     \val{141.8} (q, \#{4}, \pos{6}), \val{145.6} (q, \#{2}, \pos{7}).
     %
-    \data{MS}[DCP, EI, \SI{60}{\electronvolt}] \val{703} (2, \ch{M+}), \val{582}
+    \data{MS}[DCP, EI, \qty{60}{\electronvolt}] \val{703} (2, \ch{M+}), \val{582}
     (1), \val{462} (1), \val{249} (13), \val{120} (41), \val{105} (100).
     %
-    \data{MS}[\ch{MeOH + H2O + KI}, ESI, \SI{10}{\electronvolt}] \val{720} (100,
+    \data{MS}[\ch{MeOH + H2O + KI}, ESI, \qty{10}{\electronvolt}] \val{720} (100,
     \ch{M+ + OH-}), \val{368} (\ch{M+ + 2 OH-}).
     %
     \data{IR}[KBr] \val{3443} (w), \val{3061} (w), \val{2957} (m), \val{2918}
@@ -2962,14 +2758,14 @@
     (w), \val{724} (m), \val{663} (w), \val{586} (w), \val{562} (w), \val{515}
     (w).
     %
-    \data*{UV-Vis} \SI{386}{\nano\metre} ($\varepsilon = \val{65984}$),
-    \SI{406}{\nano\metre} ($\varepsilon = \val{65378}$).
+    \data*{UV-Vis} \qty{386}{\nano\metre} ($\varepsilon = \val{65984}$),
+    \qty{406}{\nano\metre} ($\varepsilon = \val{65378}$).
     %
     \data*{quantum yield} $\Phi = \val{0.74+-0.1}$\,.
   \end{experimental}
 \end{sourcecode}
 
-\paragraph{Nearly Standard}
+\subsection{Nearly Standard}
 Output with these options:
 
 \begin{sourcecode}
@@ -2978,10 +2774,10 @@
 
 \begin{experimental}[delta=(ppm),pos-number=sub,use-equal]
   \sisetup{separate-uncertainty,per-mode=symbol,detect-all,range-phrase=--}
-  \data*{yield} \SI{17}{\milli\gram} yellow needles (\SI{0.04}{\milli\mole},
-  \SI{13}{\percent}).
+  \data*{yield} \qty{17}{\milli\gram} yellow needles (\qty{0.04}{\milli\mole},
+  \qty{13}{\percent}).
   %
-  \data{mp.} \SI{277}{\celsius} (DSC).
+  \data{mp.} \qty{277}{\celsius} (DSC).
   %
   \NMR(600)[CDCl3] \val{2.01} (s, \#{24}, \pos{5}), \val{2.31} (s, \#{12},
   \pos{1}), \val{6.72--6.74} (m, \#{2}, \pos{11}), \val{6.82} (s, \#{8},
@@ -2995,10 +2791,10 @@
   \pos{2}), \val{140.6} (q, \#{2}, \pos{10}), \val{140.8} (q, \#{8}, \pos{4}),
   \val{141.8} (q, \#{4}, \pos{6}), \val{145.6} (q, \#{2}, \pos{7}).
   %
-  \data{MS}[DCP, EI, \SI{60}{\electronvolt}] \val{703} (2, \ch{M+}), \val{582}
+  \data{MS}[DCP, EI, \qty{60}{\electronvolt}] \val{703} (2, \ch{M+}), \val{582}
   (1), \val{462} (1), \val{249} (13), \val{120} (41), \val{105} (100).
   %
-  \data{MS}[\ch{MeOH + H2O + KI}, ESI, \SI{10}{\electronvolt}] \val{720} (100,
+  \data{MS}[\ch{MeOH + H2O + KI}, ESI, \qty{10}{\electronvolt}] \val{720} (100,
   \ch{M+ + OH-}), \val{368} (\ch{M+ + 2 OH-}).
   %
   \data{IR}[KBr] \val{3443} (w), \val{3061} (w), \val{2957} (m), \val{2918}
@@ -3010,13 +2806,13 @@
   (w), \val{724} (m), \val{663} (w), \val{586} (w), \val{562} (w), \val{515}
   (w).
   %
-  \data*{UV-Vis} \SI{386}{\nano\metre} ($\varepsilon = \val{65984}$),
-  \SI{406}{\nano\metre} ($\varepsilon = \val{65378}$).
+  \data*{UV-Vis} \qty{386}{\nano\metre} ($\varepsilon = \val{65984}$),
+  \qty{406}{\nano\metre} ($\varepsilon = \val{65378}$).
   %
   \data*{quantum yield} $\Phi = \val{0.74+-0.1}$\,.
 \end{experimental}
 
-\paragraph{Formatted List}
+\subsection{Formatted List}
 Output with these options:
 
 \begin{sourcecode}
@@ -3025,10 +2821,10 @@
 
 \begin{experimental}[format=\bfseries,delta=(ppm),list=true,use-equal]
   \sisetup{separate-uncertainty,per-mode=symbol,detect-all,range-phrase=--}
-  \data*{yield} \SI{17}{\milli\gram} yellow needles (\SI{0.04}{\milli\mole},
-  \SI{13}{\percent}).
+  \data*{yield} \qty{17}{\milli\gram} yellow needles (\qty{0.04}{\milli\mole},
+  \qty{13}{\percent}).
   %
-  \data{mp.} \SI{277}{\celsius} (DSC).
+  \data{mp.} \qty{277}{\celsius} (DSC).
   %
   \NMR(600)[CDCl3] \val{2.01} (s, \#{24}, \pos{5}), \val{2.31} (s, \#{12},
   \pos{1}), \val{6.72--6.74} (m, \#{2}, \pos{11}), \val{6.82} (s, \#{8},
@@ -3042,10 +2838,10 @@
   \pos{2}), \val{140.6} (q, \#{2}, \pos{10}), \val{140.8} (q, \#{8}, \pos{4}),
   \val{141.8} (q, \#{4}, \pos{6}), \val{145.6} (q, \#{2}, \pos{7}).
   %
-  \data{MS}[DCP, EI, \SI{60}{\electronvolt}] \val{703} (2, \ch{M+}), \val{582}
+  \data{MS}[DCP, EI, \qty{60}{\electronvolt}] \val{703} (2, \ch{M+}), \val{582}
   (1), \val{462} (1), \val{249} (13), \val{120} (41), \val{105} (100).
   %
-  \data{MS}[\ch{MeOH + H2O + KI}, ESI, \SI{10}{\electronvolt}] \val{720} (100,
+  \data{MS}[\ch{MeOH + H2O + KI}, ESI, \qty{10}{\electronvolt}] \val{720} (100,
   \ch{M+ + OH-}), \val{368} (\ch{M+ + 2 OH-}).
   %
   \data{IR}[KBr] \val{3443} (w), \val{3061} (w), \val{2957} (m), \val{2918}
@@ -3057,13 +2853,13 @@
   (w), \val{724} (m), \val{663} (w), \val{586} (w), \val{562} (w), \val{515}
   (w).
   %
-  \data*{UV-Vis} \SI{386}{\nano\metre} ($\varepsilon = \val{65984}$),
-  \SI{406}{\nano\metre} ($\varepsilon = \val{65378}$).
+  \data*{UV-Vis} \qty{386}{\nano\metre} ($\varepsilon = \val{65984}$),
+  \qty{406}{\nano\metre} ($\varepsilon = \val{65378}$).
   %
   \data*{quantum yield} $\Phi = \val{0.74+-0.1}$\,.
 \end{experimental}
 
-\paragraph{Crazy}
+\subsection{Crazy}
 Output for these options:
 
 \begin{sourcecode}
@@ -3084,10 +2880,10 @@
     coupling-unit=\mega\gram\per\square\second,
     list-setup=,use-equal]
   \sisetup{separate-uncertainty,per-mode=symbol,detect-all,range-phrase=--}
-  \data*{yield} \SI{17}{\milli\gram} yellow needles (\SI{0.04}{\milli\mole},
-  \SI{13}{\percent}).
+  \data*{yield} \qty{17}{\milli\gram} yellow needles (\qty{0.04}{\milli\mole},
+  \qty{13}{\percent}).
   %
-  \data{mp.} \SI{277}{\celsius} (DSC).
+  \data{mp.} \qty{277}{\celsius} (DSC).
   %
   \NMR(600)[CDCl3] \val{2.01} (s, \#{24}, \pos{5}), \val{2.31} (s, \#{12},
   \pos{1}), \val{6.72--6.74} (m, \#{2}, \pos{11}), \val{6.82} (s, \#{8},
@@ -3101,10 +2897,10 @@
   \pos{2}), \val{140.6} (q, \#{2}, \pos{10}), \val{140.8} (q, \#{8}, \pos{4}),
   \val{141.8} (q, \#{4}, \pos{6}), \val{145.6} (q, \#{2}, \pos{7}).
   %
-  \data{MS}[DCP, EI, \SI{60}{\electronvolt}] \val{703} (2, \ch{M+}), \val{582}
+  \data{MS}[DCP, EI, \qty{60}{\electronvolt}] \val{703} (2, \ch{M+}), \val{582}
   (1), \val{462} (1), \val{249} (13), \val{120} (41), \val{105} (100).
   %
-  \data{MS}[\ch{MeOH + H2O + KI}, ESI, \SI{10}{\electronvolt}] \val{720} (100,
+  \data{MS}[\ch{MeOH + H2O + KI}, ESI, \qty{10}{\electronvolt}] \val{720} (100,
   \ch{M+ + OH-}), \val{368} (\ch{M+ + 2 OH-}).
   %
   \data{IR}[KBr] \val{3443} (w), \val{3061} (w), \val{2957} (m), \val{2918}
@@ -3116,18 +2912,18 @@
   (w), \val{724} (m), \val{663} (w), \val{586} (w), \val{562} (w), \val{515}
   (w).
   %
-  \data*{UV-Vis} \SI{386}{\nano\metre} ($\varepsilon = \val{65984}$),
-  \SI{406}{\nano\metre} ($\varepsilon = \val{65378}$).
+  \data*{UV-Vis} \qty{386}{\nano\metre} ($\varepsilon = \val{65984}$),
+  \qty{406}{\nano\metre} ($\varepsilon = \val{65378}$).
   %
   \data*{quantum yield} $\Phi = \val{0.74+-0.1}$\,.
 \end{experimental}
 
-\subsection{The \chemmodule*{thermodynamics} Module}\label{sec:thermodynamics-module}
+\section{The \chemmodule*{thermodynamics} Module}\label{sec:thermodynamics-module}
 
 The \chemmodule{thermodynamics} module loads the \pkg{siunitx}
 package~\cite{pkg:siunitx}.
 
-\subsubsection{The \cs*{state} Macro}
+\subsection{The \cs*{state} Macro}
 
 \begin{commands}
   \command{state}[\oarg{options}\marg{symbol}]
@@ -3138,7 +2934,7 @@
 \begin{example}
   \state{A}, \state[subscript-left=f]{G} ,
   \state[subscript-right=\ch{Na}]{E},
-  \state[superscript-right=\SI{1000}{\celsius}]{H}
+  \state[superscript-right=\qty{1000}{\celsius}]{H}
 \end{example}
 
 These options are available:
@@ -3161,7 +2957,7 @@
     An alias of \option{subscript-left}.
 \end{options}
 
-\subsubsection{Thermodynamic Variables}
+\subsection{Thermodynamic Variables}
 
 The \chemmodule{thermodynamics} module provides a few commands for specific
 thermodynamic variables:
@@ -3232,7 +3028,7 @@
   \enthalpy{-1234.56e3}
 \end{example}
 
-\subsubsection{Create New Variables or Redefine Existing Ones}
+\subsection{Create New Variables or Redefine Existing Ones}
 
 \begin{commands}
   \command{NewChemState}[\marg{cs}\marg{options}]
@@ -3298,7 +3094,7 @@
   \enthalpy{-12.3} \Enthalpy{-12.3}
 \end{example}
 
-\subsection{The \chemmodule*{units} Module}\label{sec:units-module}
+\section{The \chemmodule*{units} Module}\label{sec:units-module}
 
 The \chemmodule{units} module loads the \pkg{siunitx}
 package~\cite{pkg:siunitx}.
@@ -3308,38 +3104,290 @@
 \begin{commands}
   \command*{DeclareSIUnit}[\marg{cs}\marg{unit}]
     Define \meta{cs} to be a valid unit command inside \pkg{siunitx}' macros
-    \cs*{SI} and \cs*{si} which represents \meta{unit}.
+    \cs*{qty} and \cs*{unit} which represents \meta{unit}.
 \end{commands}
 to add arbitrary units.  \chemmacros\ uses that command to provide some
 units.  Like all \pkg{siunitx} units they're only valid inside
-\cs*{SI}\marg{num}\marg{unit} and \cs*{si}\marg{unit}.
+\cs*{qty}\marg{num}\marg{unit} and \cs*{unit}\marg{unit}.
 \begin{commands}
-  \command{atmosphere} \si{\atmosphere}
-  \command{atm} \si{\atm}
-  \command{calory} \si{\calory}
-  \command{cal} \si{\cal}
-  \command{cmc} \si{\cmc} \par
+  \command{atmosphere} \unit{\atmosphere}
+  \command{atm} \unit{\atm}
+  \command{calory} \unit{\calory}
+  \command{cal} \unit{\cal}
+  \command{cmc} \unit{\cmc} \par
     The units \cs{cmc}, \cs{molar}, and \cs{Molar} are defined by the
     package \pkg{chemstyle} as well.  \chemmacros\ only defines them, if
     \pkg{chemstyle} is not loaded.
-  \command{molar} \si{\molar}
-  \command{moLar} \si{\moLar}
-  \command{Molar} \si{\Molar}
-  \command{MolMass} \si{\MolMass}
-  \command{normal} \si{\normal}
-  \command{Torr} \si{\Torr}
+  \command{molar} \unit{\molar}
+  \command{moLar} \unit{\moLar}
+  \command{Molar} \unit{\Molar}
+  \command{MolMass} \unit{\MolMass}
+  \command{normal} \unit{\normal}
+  \command{torr} \unit{\torr} 
+  \par
+\sinceversion{6.0}    Since some units still frequently used in chemistry were removed from version 3 of \pkg{siunitx}, 
+   \chemmacros\ also defines these in the same way, older versions of \pkg{siunitx} used to do. 
+    These units are:
+  \command{angstrom} \unit{\angstrom}
+  \command{atomicmassunit} \unit{\atomicmassunit}
+  \command{bar} \unit{\bar}
+  \command{elementarycharge} \unit{\elementarycharge}
+  \command{mmHg} \unit{\mmHg}
 \end{commands}
 
-By the way: \cs*{mmHg} \si{\mmHg} already is defined by \pkg{siunitx}.
 
-\section{Internal Modules}
+\part{Core Modules}
 
-\subsection{The \chemmodule*{tikz} Module}\label{sec:tikz-module}
+The modules described in this part are always loaded and mainly concern module
+writers.
 
+\section{The \chemmodule*{base} Module}\label{sec:base-module}
+
+The \chemmodule{base} module is the core module of \chemmacros. It defines
+some tools which can (and should) be used in other modules.  This means this
+section is only interesting for you if you plan to write a module yourself
+(see section~\vref{sec:own-modules} for details).
+
+This module requires the packages \pkg{bm}~\cite{pkg:bm}, 
+\pkg{amstext}~\cite{pkg:amstext}, and \pkg{etoolbox}~\cite{pkg:etoolbox}.
+
+This module also provides \cs{chemsetup} and the option \option{modules}.
+
+It also provides a number of (expl3) macros which may be used in other
+modules. In the macro descriptions below \TF\ denotes that a \code{T}, an
+\code{F} and a \code{TF} variant exist.  In case of an expandable conditional
+(\expandablesymbol) also the predicate variant is available.
+\begin{commands}
+  \expandable\explcommand{chemmacros_if_loaded:nn}[\TF\
+  \Marg{package|class} \marg{name} \marg{true} \marg{false}]
+    Checks if package (or class) \meta{name} has been loaded. Also works after
+    begin document.
+  \expandable\explcommand{chemmacros_if_package_loaded:n}[\TF\ \marg{name}
+  \marg{true} \marg{false}]
+    Checks if package \meta{name} has been loaded. Also works after begin
+    document.
+  \expandable\explcommand{chemmacros_if_class_loaded:n}[\TF\ \marg{name}
+  \marg{true} \marg{false}]
+    Checks if class \meta{name} has been loaded. Also works after begin
+    document.
+  \explcommand{chemmacros_nobreak:}
+    Inserts a penalty of \num{10000}.
+  \explcommand{chemmacros_allow_break:}
+    Inserts a penalty of \num{0}.
+  \explcommand{chemmacros_skip_nobreak:N}[ \meta{skip/length variable}]
+    Insert a horizontal skip where a linebreak is disallowed.
+  \expandable\explcommand{chemmacros_if_is_int:n}[\TF\ \marg{input} \marg{true}
+  \marg{false}]
+    Checks if \meta{input} is an integer or something else.
+  \explcommand{chemmacros_if_bold:}[\TF\ \marg{true} \marg{false}]
+    Checks if the current font weight is one of \chemboldchecks{or}.
+  \explcommand{chemmacros_bold:n}[ \marg{text}]
+    Checks if the current font weight is bold and if yes places \meta{text} in
+    \cs*{textbf} if in text mode or in \cs*{bm} if in math mode.  If no
+    \meta{text} simply is placed in the input stream as is.
+  \explcommand{chemmacros_text:n}[ \marg{text}]
+    Ensures that \meta{text} is placed in text mode.
+  \explcommand{chemmacros_math:n}[ \marg{text}]
+    Ensures that \meta{text} is placed in math mode.
+  \explcommand{chemmacros_new_macroset:nnn}[ \marg{name} \marg{arg spec}
+  \marg{internal command call}]
+    \changedversion{5.3b}A command to define a set of macros
+    \cs*{NewChem\meta{name}}, \cs*{RenewChem\meta{name}},
+    \cs*{DeclareChem\meta{name}} and \cs*{ProvideChem\meta{name}} where the
+    first letter of \meta{name} is converted to uppercase, other letters are
+    kept unchanged. \meta{arg spec} is any valid argument specification for
+    \pkg{xparse}'s \\
+    \cs{DeclareDocumentCommand}~\cite{bnd:l3packages}. \meta{internal command
+      call} should be a macro which makes definitions \emph{without} error
+    checks, \ie, define new macros or redefine existing ones like \cs*{def}
+    does.  This macro just should get the arguments passed on to.  Have a look
+    at the example below.
+  \explcommand{chemmacros_new_environment_macroset:nnn}[ \marg{name} \marg{arg spec}
+  \marg{internal command call}]
+    Like \explcs{chemmacros_new_macroset:nnn} but for environments.
+  \command{NewChemMacroset}[\sarg\marg{name}\marg{arg spec}\marg{internal
+    command call}]
+    A non-expl3 version of \explcs{chemmacros_new_macroset:nnn} for \LaTeXe\
+    programmers.  The starred version calls
+    \explcs{chemmacros_new_environment_macroset:nnn}.
+  \explcommand{chemmacros_add_cleveref_support:nnnnn}[ \marg{counter}
+    \marg{singular} \marg{plural} \marg{uppercase singular} \marg{uppercase
+      plural}]
+    A\sinceversion{5.6} command to add suiting names for a counter for the
+    \pkg{cleveref} package's \cs*{cref} commands.  This command acts at the
+    end of the preamble and only if a user hasn't provided definitions with
+    \cs*{crefname} already.
+  \command{ChemCleverefSupport}[\marg{counter}\marg{singular}\oarg{uppercase
+    singular}\marg{plural}\oarg{uppercase plural}]
+    \sinceversion{5.6}\LaTeXe-version of
+    \explcs{chemmacros_add_cleveref_support:nnnnn}.
+  \explcommand{chemmacros_add_fancyref_support:nnn}[ \marg{prefix} \marg{name}
+    \marg{uppercase name}]
+    A\sinceversion{5.6} command to add suiting names for a counter for the
+    \pkg{fancyref} package's \cs*{fref} commands.  This command acts at the
+    end of the preamble and doesn't override definitions made by the users.
+  \command{ChemFancyrefSupport}[\marg{prefix}\marg{name}\oarg{uppercase name}]
+    \sinceversion{5.6}\LaTeXe-version of
+    \explcs{chemmacros_add_fancyref_support:nnnnn}.
+\end{commands}
+This is how the macros \cs{NewChemParticle}, \cs{RenewChemParticle},
+\cs{DeclareChemParticle} and \cs{ProvideChemParticle} were defined:
+\begin{sourcecode}
+  \NewChemMacroset {Particle} {mm}
+    { \chemmacros_define_particle:Nn #1 {#2} }
+\end{sourcecode}
+
+The following macros strictly speaking are not provided by the
+\chemmodule{base} module but this place fits best for their description.
+\begin{commands}
+  \expandable\explcommand{chemmacros_if_module_exist:n}[\TF\ \marg{module}
+  \marg{true} \marg{false}]
+    Checks if a file with the correct name for a module \meta{module} can be
+    found.
+  \expandable\explcommand{chemmacros_if_module_loaded:n}[\TF\ \marg{module}
+  \marg{true} \marg{false}]
+    Checks if the module \meta{module} has already been loaded or not.
+  \explcommand{chemmacros_load_module:n}[ \marg{module}]
+    Loads module \meta{module} if it hasn't been loaded, yet.
+  \explcommand{chemmacros_load_modules:n}[ \marg{csv list of modules}]
+    Loads every module in \meta{csv list of modules} if they haven't been
+    loaded, yet. This is the code level variant of \cs{usechemmodule}.
+  \explcommand{chemmacros_before_module:nn}[ \marg{module} \marg{code}]
+    Saves\sinceversion{5.1} \meta{code} and inserts it right before
+    \meta{module} is loaded.  If \meta{module} is never loaded then
+    \meta{code} is never inserted.  If \meta{module} already is loaded when
+    the command is used then \meta{code} also is never inserted.
+  \explcommand{chemmacros_after_module:nn}[ \marg{module} \marg{code}]
+    Saves\sinceversion{5.1} \meta{code} and inserts it right after
+    \meta{module} is loaded.  If \meta{module} is never loaded then
+    \meta{code} is never inserted.  If \meta{module} already is loaded when
+    the command is used then \meta{code} is inserted immediately.
+\end{commands}
+
+\section{The \chemmodule*{errorcheck} Module}\label{sec:errorcheck-module}
+The\sinceversion{5.2} \chemmodule{errorcheck} module provides some rudimentary
+support for giving users more meaningful messages when they use a command or
+environment provided by a module that they haven't loaded.
+
+\section{The \chemmodule*{lang} and \chemmodule*{translations} Modules}\label{sec:lang-module}
+
+The \chemmodule{lang} module provides language support for \chemmacros.  It
+loads the package \pkg{translations}~\cite{pkg:translations}.
+
+\subsection{Information For Users}\label{sec:information-users}
+
+This module defines the following option:
+\begin{options}
+  \keychoice{language}{auto,\meta{language}}\Default{auto}
+    If set to \code{auto} \chemmacros\ will detect the language used by
+    \pkg{babel}~\cite{pkg:babel} or \pkg{polyglossia}~\cite{pkg:polyglossia}
+    automatically, the fallback translation is English and will be used if no 
+    translation for the actual language is available.  Any language known to
+    the \pkg{translations} package is a valid value for \meta{language}.
+\end{options}
+
+The language chosen via \option{language} is used for translation of certain
+strings in different places all over \chemmacros.  They are mentioned in the
+places when the corresponding function of \chemmacros\ is explained.
+
+Translation is done with the help of the \pkg{translations} package, available
+translation keys are listed in section~\vref{sec:avail-transl-keys}.
+
+\subsection{Available Translation Keys}\label{sec:avail-transl-keys}
+
+Table~\vref{tab:translation-keys} lists all predefined translations of the
+available keys.  \emph{Some of the translations have changed in
+  version~5.6\changedversion{5.6}.} All available translations are provided 
+  by the \chemmodule{translations} module.
+  A translation key is a unique string\footnote{That is, a string
+  using the definition for strings used for expl3, i.e., converted to a series
+  of category code~12 characters..} of characters.  Each key is used to
+identify a replacement text which depends on the current language or the
+language set through the \option{language} option.  For each key at least the
+English fallback translation is provided, for most also the German translation
+is provided.  For a few keys also other translations are provided.  If you
+find that a translation for your language is missing you can provide it in the
+preamble:
+\begin{commands}
+  % \command{DeclareTranslation}[\marg{language}\marg{key}\marg{translation}]
+  %   Defines a translation of key \meta{key} for the language \meta{language}.
+  %   No error will be raised if a translation of \meta{key} already exists.
+  %   This command can only be used in the preamble and is defined by the
+  %   \pkg{translations} package.
+  \command{DeclareChemTranslation}[\marg{key}\marg{language}\marg{translation}]
+    \sinceversion{5.6}A command which makes an abstraction from the
+    \pkg{translations} package.  It should be used in documents for adding
+    missing translations that are needed.  This command can only be used in
+    the preamble.
+  \command{DeclareChemTranslations}[\marg{key}\Marg{\meta{language} =
+    \meta{translation}}]
+    \sinceversion{5.6}A command rather meant for module writers but can be
+    used by document authors as well, of course.  It gets a csv list of
+    key\slash value pairs of translations.  This command can only be used in
+    the preamble.
+\end{commands}
+If you send me an email (see section~\vref{sec:sugg-bug-reports}) with the
+translations for your language I'll gladly add them to the next release of
+\chemmacros!
+
+\emph{Please do not use \pkg{translations}' \cs{DeclareTranslation} for
+  declaring translations.}
+
+\ForAllChemTranslationsDo{
+  \appto\chemtranslationtable{\texttt{#1} & #2 & \texttt{\detokenize{#3}} \\}
+}
+
+\begin{longtable}{lll}
+    \caption{Translation keys predefined by \chemmacros\ (except
+      \code{phase-aqi}, \code{phase-cd} and \code{phase-lc} which were defined
+      in this document).}
+    \label{tab:translation-keys} \\
+    \toprule
+    \bfseries key & \bfseries language & \bfseries translation \\
+    \midrule
+  \endfirsthead
+    \toprule
+    \bfseries key & \bfseries language & \bfseries translation \\
+    \midrule
+  \endhead
+    \bottomrule
+  \endlastfoot
+    \midrule
+    & & \hfill\emph{continues} \\
+  \endfoot
+  \chemtranslationtable
+\end{longtable}
+  
+\subsection{Information For Module Writers}
+
+In addition to the commands from section~\vref{sec:avail-transl-keys} the
+following macros are available:
+\begin{commands}
+  \expandable\explcommand{chemmacros_translate:n}[ \marg{translation key}]
+    Translates the given key to the language which is detected automatically
+    or given by the user.  Should be used in \chemmacros' macros instead of
+    \pkg{translations}' \cs*{GetTranslation}.
+  \explcommand{l_chemmacros_language_tl}
+    A token list variable that holds the language which is used by
+    \explcs{chemmacros_translate:n} for translation, \emph{after begin
+      document}.
+  \command{ChemTranslate}[\marg{translation key}]
+    A version of \explcs{chemmacros_translate:n} for those who prefer
+    traditional \LaTeXe\ programming over expl3.
+  \explcommand{chemmacros_declare_translation:nnn}[\marg{language}\marg{key}%
+    \marg{translation}]
+    The expl3 version of \cs{DeclareChemTranslation}.
+  \explcommand{chemmacros_declare_translations:nn}[\marg{key}\Marg{\meta{language}
+    = \meta{translation}}]
+    The expl3 version of \cs{DeclareChemTranslations}.
+\end{commands}
+
+\section{The \chemmodule*{tikz} Module}\label{sec:tikz-module}
+
 The \chemmodule{tikz} module loads the \pkg{tikz} package~\cite{pkg:pgf} and
 the \TikZ\ library \code{calc}.
 
-\subsubsection{For Users}
+\subsection{For Users}
 The \chemmodule{tikz} module defines a few arrow tips:
 \begin{tikzcode}
   \arrowtip{el}
@@ -3362,7 +3410,7 @@
   \end{tikzpicture}
 \end{example}
 
-\subsubsection{For Module Writers}
+\subsection{For Module Writers}
 The \chemmodule{tikz} module provides some macros for common \TikZ\
 functions.  This allows to use expl3's powerful function variants for
 expansion control.
@@ -3388,7 +3436,7 @@
     Defined as \verbcode+node[{#1}]+.
 \end{commands}
 
-\subsection{The \chemmodule*{xfrac} Module}\label{sec:xfrac-module}
+\section{The \chemmodule*{xfrac} Module}\label{sec:xfrac-module}
 
 The \chemmodule{xfrac} module loads the package
 \pkg{xfrac}~\cite{bnd:l3packages}.  For the following explanations it will be
@@ -3500,10 +3548,6 @@
   \ChemModule{foo}{2015/10/14 description of foo}[5.2]
 \end{sourcecode}
 
-You should be aware that your module \emph{will not be loaded} with
-\verbcode+\usechemmodule{all}+! The pseudo-module \chemmodule{all} contains a
-manually maintained list of the modules that are loaded by it.
-
 If you decide to write your module \chemmodule*{foo} using expl3 and add
 options you want to be able to set using
 \cs{chemsetup}\Oarg{foo}\marg{options} please make sure you define (and set)
@@ -3551,9 +3595,9 @@
 Please do \emph{not} submit your module via pull request but send me the files
 directly.  In the best case you also have a short piece of documentation.
 
-\section{Suggestions, Bug Reports, Support}\label{sec:sugg-bug-reports}
+\section{Support, Suggestions and Bug Reports}\label{sec:sugg-bug-reports}
 
-\paragraph{Support}
+\subsection{Support}
 If you need support or help with anything regarding \chemmacros\ please use
 the usual support forums
 \begin{itemize}
@@ -3562,22 +3606,21 @@
   \item \url{http://www.latex-community.org/forum/} or
   \item \url{http://tex.stackexchange.com/} if you speak English
 \end{itemize}
-or go the \emph{dedicated support forum}
-\begin{itemize}
-  \item \url{http://www.mychemistry.eu/forums/forum/chemmacros/}
-\end{itemize}
-where you can be sure that I will see the question.
+You can also open an issue on
+\url{https://github.com/cgnieder/chemmacros/issues/} possibly adding the label
+\emph{support}.
   
-\paragraph{Suggestions}
-If you have any suggestions on how \chemmacros\ could be improved, adding
-missing features \etc, please feel free to contact me via
-\email{contact at mychemistry.eu}.
+\subsection{Suggestions}
+If you have any suggestions on how \chemmacros\ could be improved then please
+go to \url{https://github.com/cgnieder/chemmacros/issues/} and open a new
+issue possibly adding the label \emph{suggestion}.
 
-\paragraph{Bug reports}
+\subsection{Bug reports}
 If you find any bugs, \ie, errors (something not working as described,
 conflicts with other packages, \ldots) then please go to
 \url{https://github.com/cgnieder/chemmacros/issues/} and open a new issue
-describing the error including a minimal working example.
+describing the error including a minimal working example and possibly adding
+the label \emph{bug}.
 
 \printbibliography
 

Deleted: trunk/Master/texmf-dist/doc/latex/chemmacros/chemmacros.history
===================================================================
--- trunk/Master/texmf-dist/doc/latex/chemmacros/chemmacros.history	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/doc/latex/chemmacros/chemmacros.history	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,397 +0,0 @@
---------------------------------------------------------------------------
-the CHEMMACROS package
-
-   comprehensive support for typesetting chemistry documents
-
---------------------------------------------------------------------------
-Clemens Niederberger
---------------------------------------------------------------------------
-https://github.org/cgnieder/chemmacros/
-contact at mychemistry.eu
---------------------------------------------------------------------------
-If you have any ideas, questions, suggestions or bugs to report, please
-feel free to contact me.
---------------------------------------------------------------------------
-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.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 2008/05/04 or later.
-
-This work has the LPPL maintenance status `maintained'.
-
-The Current Maintainer of this work is Clemens Niederberger.
---------------------------------------------------------------------------
-Version history
-2011/05/15 - version 1.0   - CTAN release
-2011/06/22 - version 1.1   - "LaTeXified" whole package for safer usage
-                           - less user work required (like loading package
-                             after another)
-                           - more particle macros
-                           - latin phrases
-                           - extra units
-                           - acid/base commands
-                           - \mech
-                           - \NMR
-                           - \mhName, \setmhName, \newreaction, phases
-                           - \renewstate, \setstatesubscript
-                           - improved orbitals
-                           - simpler package options, option german, bpchem
-                           - bug fixes
-2011/10/28 - version 2.0   - rewritten in expl3
-                           - customization via \chemsetup
-                           - new commands \p, \fplus, \fminus, \fpch, \fmch,
-                             \fscrp, \fsrcm, \fdelp, \fdelm, \orbital, \chemsetup
-                           - various commands have a new syntax
-                           - removed: \setmhName, \setredoxdist,
-                             \setstatesubscript, \porb, \phorb, \pxorb, \pyorb,
-                             \pzorb, \setorbheight, \solid, \liquid
-                           - reaction environments work with hyperref and
-                             varioref
-2011/11/03 - version 2.0a  - minor bug fixes
-                           - new feature for \Nu
-                           - new command \ba
-2012/01/28 - version 3.0   - bundled with packages `formula' and `ghs'
-                           - new commands \Ka, \Kb, \Kw
-                           - commands can detect if font series is bold
-                           - new package option "detect-bold"
-                           - new package option "method" => choose between
-                             `mhchem' and `formula' for internal uses.
-                           - new package option "ghs" => load `ghs' or don't
-                           - new package option "synchronize"
-                           - new package option "strict"
-                           - new command \iupac
-                           - new command \listofreactions, reaction environments
-                             with optional argument
-                           - \cis, \trans, \tert without \xspace
-2012/01/30 - version 3.0a  - bugfix in formula.sty
-                           - renamed formula => chemformula
-                             and ghs => ghsystem to make the names unique
-                             (following a request by Karl Berry for TeXlive)
-2012/02/03 - version 3.0b  - new command \DeclareChemParticle, updated
-                             documentation
-2012/02/05 - version 3.0c  - renamed pictogram files (following a request by
-                             Karl Berry for TeXlive)
-                           - new package option "Nu"
-2012/02/10 - version 3.0d  - several bugfixes in chemformula
-                           - bugfixes with \DeclareChemParticle
-                           - new command \RenewChemParticle
-                           - new option phases / pos
-                           - new commands \DeclareChemPhase, \RenewChemPhase,
-                             \phase
-                           - changed default behaviour of phases
-                           - removed optional argument from \sld and \lqd
-                           - new arrow type <>
-2012/02/19 - version 3.1   - new commands \DeclareChemIUPAC and \RenewChemIUPAC
-                           - new option "option/iupac"
-                           - deprecated option: "option/EZ"
-                           - deprecated commands:
-                             \newreaction => \DeclareChemReaction
-                             \setnewstate => \DeclareChemState
-                             \renewstate  => \RenewChemState
-                             \Rcip        => \R
-                             \Scip        => \S
-                             \Dfi         => \D
-                             \Lfi         => \L
-                           - new arrow types -/>, </- and <o>
-                           - new commands \DeclareChemArrow, \RenewChemArrow and
-                             \ShowChemArrow
-2012/02/26 - version 3.1a  - "operator" p rewritten to follow IUPAC
-                             recommendations
-                           - new option "acid-base/p-style"
-                           - deprecated option: "option/detect-bold"
-2012/03/03 - version 3.1b  - arrow types are stored in a sequence to automate the
-                             search and replace in the right order 
-                           - new arrow type ==                                   
-                           - IUPAC compliance for stoichiometric factors
-                           - new handling of super- and subscripts to correct
-                             various flaws: clear distinction between isotope and
-                             formula
-                           - new option charge-vshift
-                           - IUPAC compliance for \Delta and \ox
-2012/03/14 - version 3.1c  - compatibility with KOMA's global option
-                             "version = <value>"
-                           - bugfix in the list of reactions
-                           - improved arrow labels
-2012/03/20 - version 3.2   - new: option input via @{<options>}
-                           - improved list of reactions: resetting the "reaction"
-                             counter now doesn't cause errors any more
-                           - \AddRxnDesc added which allows to add descriptions
-                             to each reaction in the "reactions" environment
-2012/05/07 - version 3.3   - new environment `experimental' that allows some
-                             formatting for the for displaying of measurement
-                             results
-                           - more greek letters for the \iupac command
-                           - \ch now bypasses \ref{}, \label{}, and \intertext{}
-                           - small adjustments of the iupac commands \| and \-
-                           - bug fix: option `upgreek' is now working and was
-                             renamed to `greek'
-                           - proper language support
-2012/05/13 - version 3.3a  - Italian translations of the H, EUH and P statements
-                           - \hapto and \bridge
-2012/05/18 - version 3.3b  - compatibility with MiKTeX
-2012/05/18 - version 3.3c  - fix in the `ghsystem/language' option
-2012/07/24 - version 3.3d  - additional picture file type `pdf'
-                           - default bond length set to 1.1667ex
-                           - bug fix in the bonds
-                           - added kerning to cip commands, new option
-                             `iupac/cip-kern'
-                           - bug fix: messages needed to be defined before the
-                             options
-2012/08/21 - version 3.3e  - new option ox/align=center|right
-                           - a new option to \NMR and to \J
-2012/09/11 - version 3.4   - cleaned a little, minor bug fixes
-                           - switched to internal scratch variables
-                           - new command \bond, more bond types
-                           - new commands \DeclareChemBond, \DeclareChemBondAlias,
-                             \RenewChemBond and \ShowChemBond
-                           - radical point thicker, new options `radical-style'
-                             and `radical-radius'
-2012/10/03 - version 3.4a  - bug fix in coupling constant \J
-2013/01/04 - version 3.4b  - bug fix in the sub- and superscript handling
-2013/01/28 - version 3.5   - disallow breaks at bonds
-                           - allow breaks after arrows
-                           - made some spaces in chemformulas stretch- and
-                             shrinkable
-                           - various internal code improvements
-                           - changed defaults for horizontal spaces that have in
-                             set in ex into corresponding values in em.
-                           - improvements to the placement of sub- and superscripts
-2013/02/19 - version 3.5a  - bug fix: `ghsystem' recognizes language again
-2013/02/26 - version 3.6   - support for use with the `breqn' package
-                           - chemformula: math escaping also via \(\)
-                           - chemformula internal: clearer escaping macros
-                           - new options: `radical-vshift', `radical-hshift'
-                             and `radical-space'
-                           - bug fix: `radical-...' options are now correctly set
-                           - stoichiometric factors: add leading 0 if missing
-                           - new option: `stoich-paren-parse'
-                           - internal changes: be way more rigid about protected
-                             and expandable macros
-                           - internal changes: clearer distinction between
-                             private macros and accessable module macros
-                           - internal changes: clearer distinction between
-                             document commands and module level commands
-                           - chemformula's !()() syntax now also works with babel's
-                             French
-2013/02/27 - version 3.6a  - bug fix: escaped text and math stays escaped, i.e.
-                             also arrow code like `<=>'
-2013/04/19 - version 3.6b  - chemformula: new key `arrow-min-length'
-                           - bug fix: stoichiometric fractions correctly displayed
-                           - changed appearance of \cip to use upright parentheses
-2013/07/06 - version 4.0   - `chemformula' doesn't automatically load
-                             `chemmacros' any more but can be used stand-alone
-                           - option `bpchem' has been dropped
-                           - improved detection of bold font series
-                           - changed wrongly used \mbox in definition of \Ka,
-                             \Kb and \Kw into \ensuremath
-                           - adapt \mch and \pch to match `chemformula's
-                             charges
-                           - dropped option `method=mhchem'
-                           - support for `kpfonts' and `newtxmath' upright
-                             greek letters added, greek alphabet complete both
-                             for uppercase and lowercase; this is handled by
-                             the new package in the family: `chemgreek'
-                           - \OX and \redox now work in `amsmath's environment
-                             by ignoring the measuring phase
-                           - language management with the help of the
-                             `translations' package =>
-                             recognize document language automatically and use
-                             it if it a) is known to `chemmacros' and b) has
-                             not been overwritten by the `language' option;
-                             this also made minor changes to `ghsystem'
-                             necessary; additionally this lead to changes in
-                             the way phases are defined
-                           - status of \Dfi and \Lfi changed from `deprecated'
-                             to `dropped'
-                           - new option `charges/partial-format'
-                           - fixed wrongly written contents to the lor when
-                             used together with `hyperref'
-                           - new option `reaction/list-heading'
-                           - option `charges/append' deprecated
-2013/08/07 - version 4.0a  - extra pair of braces in definition of
-                             \standardstate
-                           - added missing \exp_not:n to the definitions of
-                             \chemmacros_declare_phase:Nn and kin
-2013/08/24 - version 4.1   - changed `0' values in TikZ coordinates into `0pt'
-                             see http://tex.stackexchange.com/q/128792/5049 and
-                             http://tex.stackexchange.com/q/118467/5049 for
-                             reference
-2013/10/28 - version 4.2   - changed particles with electron pairs to use
-                             \chlewis
-                           - changed \Delta in thermodynamic state variables
-                             into \ChemDelta for IUPAC compliance and defined
-                             it as an operator
-                           - change in the syntax of \DeclareChemState and
-                             \RenewChemState and improved both internal
-                             definition and user interface
-2013/10/31 - version 4.2a  - bug bix in \hapto and \bridge
-2013/11/04 - version 4.2b  - new IUPAC commands: \fac/\mer
-2013/11/20 - version 4.2c  - step bundle version due to changes in `chemgreek'
-2013/12/15 - version 4.2d  - small changes to the translating mechansim which
-                             now seems to be more logical: `language=auto'
-                             detects the current `babel' language and
-                             `language=<lang>' overwrites to the chosen
-                             language
-                           - new options `acid-base/K-acid', `acid-base/K-base'
-                             and `acid-base/K-water'
-                           - adapt \ox to updates in `l3fp'
-2014/01/09 - version 4.2e  - step bundle version due to changes in `ghsystem'
-2014/01/24 - version 4.3   - \NewChemIUPAC, \LetChemIUPAC
-                           - \NewChemParticle
-                           - \NewChemNMR
-                           - \NewChemPhase
-                           - \NewChemReaction, \RenewChemReaction
-                           - \NewChemState
-                           - added macro names with more meaningfule names to
-                             each of the one-letter name commands
-                           - changed behaviour of \DeclareChem to match
-                             \DeclareRobustCommand, i.e., no check if command
-                             is defined; added a \NewChem variant to each that
-                             /does/ check; use \NewChem instead of \DeclareChem
-                             for definitions
-                           - new iupac command \dento
-                           - new option choice `nmr/pos=super'
-                           - bug fix in appearance of coupling nuclei
-                           - new possibilities for formatting the output of the
-                             NMR coupling constants output with \J:
-                             `coupling-pos=side/sub', `coupling-nuclei-pre',
-                             coupling-nuclei-post', `coupling-bonds-pre',
-                             coupling-bonds-post', `coupling-symbol'
-                           - internal changes to the greek letter mapping
-                             selection mechanism
-                           - deprecate package option `strict'
-                           - deprecate package option `cmversion': also all
-                             backwards compatibility for version 1 has been
-                             dropped
-                           - drop command \mhName
-2014/01/29 - version 4.4   - bug fix in the display of the coupling constant
-                           - bug fix in phase definitions (need to adapt to
-                             changes in `translations'
-                           - new option `nmr/atom-number-cs'
-                           - new option `nmr/coupling-pos-cs'
-2014/04/08 - version 4.5   - new option `acid-base/subscript'
-                           - added Dutch translations
-2014/06/30 - version 4.5a  - adapt to deprecated expl3 functions
-2014/08/08 - version 4.6   - from bundle to packages: packages `chemformula',
-                             `ghsystem' and `chemgreek' no longer belong to the
-                             bundle but now are packages of their own.
-2015/02/08 - version 4.7   - fix \iupac so active letters like | still work
-                             inside other macros (\section, ...)
-                           - Change the default subscripts of the equilibrium
-                             constants to match the usage in the IUPAC Green
-                             Book
-                           - allow \NewChemPhase and friends after \begin{document}
-                           - new optional argument to phase commands
-                           - new options `nmr/method' and `nmr/connector'
-2015/09/11 - version 5.0   - the former chemmacros.sty is now chemmacros4.sty
-                             and can be loaded through the `compatibility'
-                             option
-                           - chemmacros is now organized in separate modules
-                             which either are preloaded or can be loaded by the
-                             user with \usechemmodule
-                           - various changes, see
-                             http://www.mychemistry.eu/2015/06/chemmacros-development/
-                             and the manual section 3.4. Upgrading from version
-                             < 5.0 for details
-2015/09/23 - version 5.1   - add option `method' to `chemformula' module
-                           - make module `scheme' compatible with `floatrow'
-                           - add module hooks `before' and `after'
-2015/10/14 - version 5.2   - warn if compatibility version requested is higher
-                             than the current version number
-                           - enable to specify a minimal compatibility version
-                             for a module
-                           - add info message to `all' module
-                           - add values `newest' and `latest' to the
-                             compatibility option
-                           - check for mhchem and chemformula and choose the
-                             formula method accordingly
-                           - fixes in the module hook mechanism
-                           - fix in \chemmacros_if_module_loaded:n
-                           - new internal module `errorcheck'
-2016/01/13 - version 5.3   - removed options `german' and `ngerman' (lang)
-                           - remove deprecated pre-v5 macros (several modules)
-                           - new option `atom-number-space' (spectroscopy)
-                           - add \chemprime and ' shorthand (nomenclature)
-                           - new option `space' (particles)
-                           - TikZ decoration `wave' (tikz)
-2016/01/23 - version 5.3a  - compatibility with chemscheme package (scheme)
-                           - IUPAC shorthands only defined within \iupac
-                             (nomenclature)
-2016/02/10 - version 5.4   - \NewChemEqConstant and family, new option
-                             `eq-constant' (acid-base)
-                           - added \ignorespacesafterend to environments
-                             (reactions)
-                           - fixed erroneous definition of \NewChemMacroset
-                             (base)
-                           - new option `explicit-zero-sign' (redox)
-2016/03/08 - version 5.5   - new module `polymers'
-2016/05/02 - version 5.6   - generalization of the formula method concept, new
-                             methods `chemist' and `chemfig' (chemformula)
-                           - use `tocbasic' for the list of reactions if
-                             available (reactions)
-                           - fix reaction environments to obey \thereaction
-                             (reactions)
-                           - add cleveref and fancyref support (reactions)
-                           - add cleveref and fancyref support (scheme)
-                           - \DeclareChemTranslation and
-                             \DeclareChemTranslations 
-                           - moved translations from lang module to the
-                             corresponding modules they belong to
-2016/05/04 - version 5.6a  - fix small but annoying bugs (base and chemformula)
-2016/06/07 - version 5.7   - \iupac gets an optional argument for setting
-                             options (nomenclature)
-                           - \latin always defined by chemmacros (nomenclature)
-                           - fix conflict with `achemso' (nomenclature)
-                           - allow `chemscheme'/`chemstyle' to be loaded after
-                             chemmacros (errorcheck)
-                           - translation keys get internal prefix (translations)
-2016/06/08 - version 5.7a  - rename functions which erroneously were assigned
-                             to the `chemformula' module
-                           - correct wrong dates in module files
-2016/10/05 - version 5.7b  - small improvement of the errorcheck module
-2016/12/28 - version 5.7c  - bug fix: typo in \chemmacros_tex_if:nnTF usage
-                             (scheme)
-2017/04/17 - version 5.8   - new option `nmr-base-format' (spectroscopy)
-                           - change \hapto and \dento to follow iupacs rules
-                             according to IUPAC Red Book 2005. IR-10.2.5.2 The
-                             eta convention (p.216) and IR-9.2.4.2 The
-                             kappa convention (p.155f) (nomenclature)
-                           - fix error in \chemmacros_allow_hyphens: definition
-                             (nomenclature)
-                           - new options `cip-inner-format', `cip-outer-format'
-                             and `cip-number-format' (nomenclature)
-2017/06/13 - version 5.8a  - changes to compatibility test: it now works also
-                             for subreleases
-                           - change behaviour of \ChemCompatibilityTo and
-                             \ChemCompatibilityBetween in order to cope with
-                             the changed compatibility test; adapt all files
-                             reflecting those changes
-                           - change behaviour of
-                             \__chemmacros_break_point_insert:nnn so it does
-                             nothing as last token in \iupac (nomenclature)
-2017/08/28 - version 5.8b  - fix missing hyperref check
-2018/03/02 - version 5.8c  - fix bug in \chemmacros_p:n (acid/base)
-                           - smash sub- and superscripts of polymer delimiters
-			     (polymers)
-2019/09/23 - version 5.8d  - add some Norwegian translations (reactions, scheme)
-2019/09/27 - version 5.8e  - change `O{}' argument of reactions into `!O{}'
-                             (reactions)
-2019/09/30 - version 5.8f  - fix bug introduced in the last version
-2019/11/17 - version 5.9   - correction: torr -> Torr (units)
-                           - define latin phrases on the go instead of at begin
-                             document
-2020/01/16 - version 5.9a  - adapt to renaming of string case changing functions
-2020/02/03 - version 5.10  - define \torr as well as \Torr (units)
-                           - prefer lazy boolean evaluation
-                           - prefer the kernel commands to
-                             \chemmacros_leave_vmode: and \chemmacros_tex_if:
-2020/03/07 - version 5.11  - let \chemmacros_iupac:nn think we're in the
-                             document – fixes issue #30 (nomenclature)
-			   - add option redox/format (redox)
-2020/03/07 - version 5.11a - fix issue #34 (spectroscopy)
-                           - fix issue #41 (scheme)

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros-manual.cls
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros-manual.cls	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros-manual.cls	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,383 +0,0 @@
-% --------------------------------------------------------------------------
-% the CHEMFORMULA package
-%
-%   typeset chemical compounds and reactions
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.com/cgnieder/chemformula/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\ProvidesClass{chemmacros-manual}[2020/02/03]
-
-\LoadClass[load-preamble,add-index]{cnltx-doc}
-\RequirePackage{imakeidx}
-\RequirePackage[utf8]{inputenc}
-
-\RequirePackage[compatibility=newest]{chemmacros}
-\setcnltx{
-  package  = {chemmacros},
-  info     = {comprehensive support for typesetting chemistry documents},
-  url      = https://github.com/cgnieder/chemmacros ,
-  authors  = Clemens Niederberger ,
-  email    = contact at mychemistry.eu ,
-  abstract = {%
-    \centering
-    \includegraphics{chemmacros-logo.pdf}
-    \par
-  } ,
-  quote-format = \small\biolinumLF ,
-  add-cmds = {
-     abinitio, activatechemgreekmapping, AddRxnDesc, anti, aq, aqi,
-     ba, bond, bridge,
-    cd, ch, changechemgreeksymbol, charrow, chcpd, chemabove, chemalpha,
-      chembeta, ChemCleverefSupport, chemdelta, chemDelta,
-      ChemFancyrefSupport, chemformula at bondlength, chemgamma, ChemModule,
-      chemomega, chemphi, chemPhi, chemsetup, chlewis, chname , cip, cis, ch,
-      CNMR,
-    data, DeclareChemArrow, DeclareChemBond, DeclareChemBondAlias,
-      DeclareChemCharge, DeclareChemEqConstant, declarechemgreekmapping,
-      DeclareChemIUPAC, DeclareChemIUPACShorthand, DeclareChemLatin,
-      DeclareChemNMR, DeclareChemNucleophile, DeclareChemPartialCharge,
-      DeclareChemParticle, DeclareChemPhase, DeclareChemReaction,
-      DeclareChemState,
-      delm, delp, Delta, dexter, Dfi,
-    el, ElPot, endo, entgegen, Enthalpy, enthalpy, entropy,
-    fdelm, fdelp, fmch, fminus, fpch, fplus, fscrm, fscrp,
-    gas, ghs, ghslistall, ghspic, gibbs, gram,
-    hapto, HNMR, Helmholtz, hydrogen,
-    IfChemCompatibilityF, IfChemCompatibilityT, IfChemCompatibilityTF, insitu,
-      invacuo, isotope, iupac,
-    Ka, Kb, Kw,
-    laevus, Lfi, listofreactions, lqd,
-    makepolymerdelims, mch, mega, meta, mhName,
-    NewChemArrow, NewChemBond, NewChemBondAlias,
-      NewChemCharge, NewChemEqConstant, newchemgreekmapping, NewChemIUPAC,
-      NewChemIUPACShorthand, NewChemLatin, NewChemMacroset, NewChemNMR,
-      NewChemNucleophile, NewChemPartialCharge, NewChemParticle, NewChemPhase,
-      NewChemReaction, NewChemState,
-      newman, nitrogen, NMR, Nu, Nuc,
-    orbital, ortho, ox, OX, oxygen,
-    para, pch, per, pH, phase, phosphorus, photon, pKa, pKb, pOH, pos,
-      positron, Pot, ProvideChemArrow, ProvideChemBond, ProvideChemCharge,
-      ProvideChemEqConstant, ProvideChemIUPAC, ProvideChemIUPACShorthand,
-      ProvideChemLatin, ProvideChemNMR, ProvideChemNucleophile,
-      ProvideChemPartialCharge, ProvideChemParticle, ProvideChemPhase,
-      ProvideChemReaction,
-      ProvideChemState, prt,
-    Rad, redox, RemoveChemIUPACShorthand, RenewChemArrow, RenewChemBond,
-      RenewChemCharge, RenewChemEqConstant, renewchemgreekmapping,
-      RenewChemIUPAC, RenewChemIUPACShorthand, RenewChemLatin, RenewChemNMR,
-      RenewChemNucleophile, RenewChemPartialCharge, RenewChemParticle,
-      RenewChemPhase, RenewChemState,
-    Sf, scrm, scrp, second, selectchemgreekmapping, setchemformula,
-      ShowChemArrow, ShowChemBond, sld, Sod, state, sulfur,
-    trans,
-    usechemmodule,
-    val,
-    zusammen
-  } ,
-  add-silent-cmds = {
-    addplot,
-    bottomrule,
-    cancel, cdot, ce, cee, celsius, centering, chemfig, chemname, clap,
-      cnsetup, code, color, cstack, cstsetup,
-    DeclareInstance, DeclareSIUnit, definecolor, draw,
-    electronvolt, endtikzpicture,
-    footnotesize,
-    glqq, grqq,
-    hertz, hspace,
-    includegraphics, intertext, IUPAC,
-    joule,
-    kelvin, kilo,
-    latin, lc, lewis, Lewis, liquid, ltn,
-    metre, midrule, milli, mmHg, mole,
-    nano, nicefrac, num, numrange,
-    ominus, oplus,
-    percent, pgfarrowsdeclarealias, pgfarrowsrenewalias,
-    renewtagform, rightarrow,
-    sample, scriptscriptstyle, setchemfig, sfrac, shade,
-      shadedraw, shorthandoff, si, SI, sisetup, square, subsection,
-    textcolor, textendash, textsuperscript, tikz, tikzpicture, tiny, toprule,
-    upbeta, upeta, upgamma, usetikzlibrary,
-    volt, vphantom, vspave,
-    xspace,
-    z@, z at skip
-  } ,
-  index-setup = { othercode = \footnotesize , level = \section } ,
-  makeindex-setup = { columns = 2 , columnsep = 1em }
-}
-
-\RequirePackage{booktabs,array,longtable}
-
-\RequirePackage{chemfig,cancel,varioref,csquotes}
-
-\RequirePackage[
-  a4paper,
-  top    = .1\paperheight,
-  bottom = .1\paperheight,
-  left   = .2\paperwidth,
-  right  = .1\paperwidth
-]{geometry}
-
-\def\libertine at figurestyle{LF}
-\RequirePackage{amsmath}
-\undef\lvert \undef\lVert
-\undef\rvert \undef\rVert
-\RequirePackage[libertine]{newtxmath}
-\def\libertine at figurestyle{OsF}
-
-\RequirePackage[biblatex]{embrac}
-\ChangeEmph{[}[,.02em]{]}[.055em,-.08em]
-\ChangeEmph{(}[-.01em,.04em]{)}[.04em,-.05em]
-
-\RequirePackage[accsupp]{acro}
-\acsetup{
-  long-format  = \scshape ,
-  short-format = \scshape
-}
-
-\RequirePackage{fontawesome}
-\RequirePackage{datetime2}
-\DTMsetup{useregional=numeric,datesep=/}
-\newrobustcmd*\chemmacros at add@version[2]{%
-  \csdef{chemmacros at ver@#2}{%
-    \DTMdate{#1}%
-    \csgdef{chemmacros at ver@#2used}{}%
-    \csdef{chemmacros at ver@#2}{\DTMdate{#1}}%
-  }%
-}
-
-\newrobustcmd*\chemmacros at date[1]{%
-  \ifcsdef{chemmacros at ver@#1used}{}{ (\csuse{chemmacros at ver@#1})}}
-\newrobustcmd*\chemmacros at ifnew[1]{\ifcsstring{c_chemmacros_version_tl}{#1}}
-\newrobustcmd*\chemmacros at NEW{\faStarO\ New}
-
-\renewrobustcmd*\sinceversion[1]{%
-  \chemmacros at ifnew{#1}%
-    {\cnltx at version@note{\textcolor{red}{\chemmacros at NEW}}}%
-    {\cnltx at version@note{\GetTranslation{cnltx-introduced}~#1\chemmacros at date{#1}}}%
-}
-\renewrobustcmd*\changedversion[1]{%
-  \cnltx at version@note{\GetTranslation{cnltx-changed}~#1\chemmacros at date{#1}}%
-}
-
-\newnote*\sincechanged[2]{%
-  \GetTranslation{cnltx-introduced}~#1\chemmacros at date{#1},
-  changed with version~#2\chemmacros at date{#2}\chemmacros at ifnew{#2}{ \chemmacros 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*\chemmacros at readoptions[1]{%
-  \catcode`\^^M=13
-  \chemmacros at read@options{#1}%
-}
-
-\begingroup
-\catcode`\^^M=13
-\gdef\chemmacros at read@options#1#2^^M{%
-  \endgroup
-  \ifblank{#2}{}{\chemmacros at read@options@#2}%
-  #1%
-  \XSIMfilewritestart*{\jobname.tmp}%
-}%
-\endgroup
-\def\chemmacros at read@options@[#1]{\pgfqkeys{/cnltx}{#1}}
-
-\RenewDocumentEnvironment{sourcecode}{}
-  {%
-    \begingroup
-    \chemmacros 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
-    \chemmacros 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]
-
-\chemmacros at add@version{2012-01-28}{3.0}
-\chemmacros at add@version{2012-01-30}{3.0a}
-\chemmacros at add@version{2012-02-03}{3.0b}
-\chemmacros at add@version{2012-02-05}{3.0c}
-\chemmacros at add@version{2012-02-10}{3.0d}
-\chemmacros at add@version{2012-02-19}{3.1}
-\chemmacros at add@version{2012-02-26}{3.1a}
-\chemmacros at add@version{2012-03-03}{3.1b}
-\chemmacros at add@version{2012-03-14}{3.1c}
-\chemmacros at add@version{2012-03-20}{3.2}
-\chemmacros at add@version{2012-05-07}{3.3}
-\chemmacros at add@version{2012-05-13}{3.3a}
-\chemmacros at add@version{2012-05-18}{3.3b}
-\chemmacros at add@version{2012-05-18}{3.3c}
-\chemmacros at add@version{2012-07-24}{3.3d}
-\chemmacros at add@version{2012-08-21}{3.3e}
-\chemmacros at add@version{2012-09-11}{3.4}
-\chemmacros at add@version{2012-10-03}{3.4a}
-\chemmacros at add@version{2013-01-04}{3.4b}
-\chemmacros at add@version{2013-01-28}{3.5}
-\chemmacros at add@version{2013-02-19}{3.5a}
-\chemmacros at add@version{2013-02-26}{3.6}
-\chemmacros at add@version{2013-02-27}{3.6a}
-\chemmacros at add@version{2013-04-19}{3.6b}
-\chemmacros at add@version{2013-07-06}{4.0}
-\chemmacros at add@version{2013-08-07}{4.0a}
-\chemmacros at add@version{2013-08-24}{4.1}
-\chemmacros at add@version{2013-10-28}{4.2}
-\chemmacros at add@version{2013-10-31}{4.2a}
-\chemmacros at add@version{2013-11-04}{4.2b}
-\chemmacros at add@version{2013-11-20}{4.2c}
-\chemmacros at add@version{2013-12-15}{4.2d}
-\chemmacros at add@version{2014-01-09}{4.2e}
-\chemmacros at add@version{2014-01-24}{4.3}
-\chemmacros at add@version{2014-01-29}{4.4}
-\chemmacros at add@version{2014-04-08}{4.5}
-\chemmacros at add@version{2014-06-30}{4.5a}
-\chemmacros at add@version{2014-08-08}{4.6}
-\chemmacros at add@version{2015-02-08}{4.7}
-\chemmacros at add@version{2015-09-11}{5.0}
-\chemmacros at add@version{2015-09-23}{5.1}
-\chemmacros at add@version{2015-10-14}{5.2}
-\chemmacros at add@version{2016-01-13}{5.3}
-\chemmacros at add@version{2016-01-23}{5.3a}
-\chemmacros at add@version{2016-02-10}{5.4}
-\chemmacros at add@version{2016-03-08}{5.5}
-\chemmacros at add@version{2016-05-02}{5.6}
-\chemmacros at add@version{2016-05-04}{5.6a}
-\chemmacros at add@version{2016-06-07}{5.7}
-\chemmacros at add@version{2016-06-08}{5.7a}
-\chemmacros at add@version{2016-10-05}{5.7b}
-\chemmacros at add@version{2016-12-28}{5.7c}
-\chemmacros at add@version{2017-04-17}{5.8}
-\chemmacros at add@version{2017-06-13}{5.8a}
-\chemmacros at add@version{2017-08-28}{5.8b}
-\chemmacros at add@version{2018-03-02}{5.8c}
-\chemmacros at add@version{2019-09-23}{5.8d}
-\chemmacros at add@version{2019-09-27}{5.8e}
-\chemmacros at add@version{2019-09-30}{5.8f}
-\chemmacros at add@version{2019-11-17}{5.9}
-\chemmacros at add@version{2020-01-16}{5.9a}
-\chemmacros at add@version{2020-02-03}{5.10}
-\chemmacros at add@version{2020-03-07}{5.11}
-
-\endinput

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.acid-base.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.acid-base.code.tex	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.acid-base.code.tex	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,167 +0,0 @@
-% --------------------------------------------------------------------------
-%
-% the CHEMMACROS package -- module: `acid-base'
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\ChemModule{acid-base}{2018/02/22 acid/base}
-
-\chemmacros_load_modules:n {charges}
-
-% --------------------------------------------------------------------------
-% equilibrium constants:
-
-\tl_new:N  \l__chemmacros_equilibrium_constant_tl
-\tl_set:Nn \l__chemmacros_equilibrium_constant_tl {K}
-\prop_new:N \l__chemmacros_eq_constants_prop
-
-\prg_new_conditional:Npnn \chemmacros_if_eq_constant:Nn #1#2 {T,F,TF}
-  {
-    \cs_if_exist:NTF #1
-      {
-        \tl_if_eq:xnTF
-          { \prop_item:Nn \l__chemmacros_eq_constants_prop {#1} }
-          {#2}
-          { \prg_return_true: }
-          { \prg_return_false: }
-      }
-      { \prg_return_false: }
-  }
-\cs_generate_variant:Nn \tl_if_eq:nnTF {x}
-
-% #1: cs
-% #2: translation id and option name
-% #3: default translation
-\cs_new_protected:Npn \chemmacros_define_eq_constant:Nnn #1#2#3
-  {
-    \chemmacros_if_eq_constant:NnF {#1} {#2}
-      {
-        \cs_new_protected:Npn #1 {}
-        \prop_put:Nnn \l__chemmacros_eq_constants_prop {#1} {#2}
-        \tl_new:c {l__chemmacros_#2_tl}
-        \chemmacros_define_keys:nn {acid-base}
-          { #2 .tl_set:c = l__chemmacros_#2_tl }
-      }
-    \tl_set:cn
-      {l__chemmacros_#2_tl}
-      { \chemmacros_translate:n {#2} }
-    \chemmacros_if_compatibility:nnTF {>=} {5.7}
-      { \chemmacros_declare_translation:nnn {#2} {fallback} {#3} }
-      { \DeclareTranslationFallback {#2} {#3} }
-    \cs_set_protected:Npn #1
-      {
-        \ensuremath
-          {
-            \chemmacros_bold:n
-              {
-                \l__chemmacros_equilibrium_constant_tl
-                \c_math_subscript_token
-                  { \tl_use:c {l__chemmacros_#2_tl} }
-              }
-          }
-      }
-  }
-
-\NewChemMacroset {EqConstant} {mmm}
-  { \chemmacros_define_eq_constant:Nnn #1 {#2} {#3} }
-
-\NewChemEqConstant \Ka {K-acid}  { \mathrm{a} }
-\NewChemEqConstant \Kb {K-base}  { \mathrm{b} }
-\NewChemEqConstant \Kw {K-water} { \mathrm{w} }
-
-\chemmacros_if_compatibility:nnT {>=} {5.4}
-  {
-    \chemmacros_define_keys:nn {acid-base}
-      { eq-constant .tl_set:N = \l__chemmacros_equilibrium_constant_tl }
-  }
-
-\chemmacros_define_keys:nn {acid-base}
-  {
-    p-style           .choice: ,
-    p-style / slanted .code:n   = \cs_set_eq:NN \chemmacros_p_style:n \textsl ,
-    p-style / italics .code:n   = \cs_set_eq:NN \chemmacros_p_style:n \textit ,
-    p-style / upright .code:n   = \cs_set_eq:NN \chemmacros_p_style:n \textup ,
-    p-style           .initial:n = upright
-  }
-
-\cs_new_protected:Npn \chemmacros_p:n #1
-  {
-    \group_begin:
-      \chemmacros_if_compatibility:nnTF {<=} {5.8b}
-        { \mbox }
-        { \chemmacros_text:n }
-        {
-          \chemmacros_p_style:n {p}
-          \ensuremath {#1}
-        }
-    \group_end:
-  }
-
-\NewDocumentCommand \p  {m} { \chemmacros_p:n {#1} }
-\NewDocumentCommand \pH  {} { \chemmacros_p:n { \chemmacros_chemformula:n {H} } }
-\NewDocumentCommand \pOH {} { \chemmacros_p:n { \chemmacros_chemformula:n {OH} } }
-
-\NewDocumentCommand \pKa {o}
-  {
-    \chemmacros_p:n
-      {
-        \Ka \IfNoValueF {#1}
-          { {} \c_math_subscript_token { \chemmacros_bold:n {#1} } }
-      }
-  }
-
-\NewDocumentCommand \pKb {o}
-  {
-    \chemmacros_p:n
-      {
-        \Kb \IfNoValueF {#1}
-          { {} \c_math_subscript_token { \chemmacros_bold:n {#1} } }
-      }
-  }
-
-% --------------------------------------------------------------------------
-\ChemCompatibilityTo{5.6}
-\DeclareTranslation {English} {K-acid}  {\mathrm{a}}
-\DeclareTranslation {German}  {K-acid}  {\mathrm{s}}
-\DeclareTranslation {Dutch}   {K-acid}  {\mathrm{z}}
-
-\DeclareTranslation {English} {K-base}  {\mathrm{b}}
-
-\DeclareTranslation {English} {K-water} {\mathrm{w}}
-\EndChemCompatibility
-
-\ChemCompatibilityFrom{5.6}
-\chemmacros_declare_translations:nn {K-acid}
-  {
-    German = \mathrm {s} ,
-    Dutch  = \mathrm {z}
-  }
-\EndChemCompatibility
-% --------------------------------------------------------------------------
-\file_input_stop:
-
-2016/02/04 - \NewChemEqConstant and family, new option `eq-constant'
-2016/04/27 - moved translations from lang module to acid-base module
-2016/05/31 - adapt to changes in `lang' module
-2018/02/22 - fix bug in \chemmacros_p:n (https://tex.stackexchange.com/q/416227/)

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.all.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.all.code.tex	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.all.code.tex	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,75 +0,0 @@
-% --------------------------------------------------------------------------
-%
-% the CHEMMACROS package -- module: `all'
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\ChemModule{all}{2016/03/07 load all libraries}
-
-\msg_new:nnn {chemmacros} {all-modules}
-  {
-    You~ are~ loading~ *all*~ of~ chemmacros'~ module~ through~ the~ `all'~
-    module!~ This~ is~ fine~ but~ not~ really~ encouraged.~ Do~ really~ need~
-    all~ of~ `isotopes' ,~ `mechanisms' ,~ `newman' ,~ `nomenclature' ,~
-    `orbital' ,~ `particles' ,~ `phases' ,~ `polymers' ,~ `reactions' ,~
-    `redox' ,~ `scheme' ,~ `spectroscopy' ,~ `symbols' ,~ `thermodynamics' ,~
-    `units' ...?
-  }
-
-\chemmacros_load_modules:n
-  {
-     base ,
-     errorcheck ,
-     lang ,
-     greek ,
-     chemformula ,
-     tikz ,
-     acid-base ,
-     charges ,
-     isotopes ,
-     mechanisms ,
-     newman ,
-     nomenclature ,
-     orbital ,
-     particles ,
-     phases ,
-     polymers ,
-     reactions ,
-     redox ,
-     scheme ,
-     spectroscopy ,
-     symbols ,
-     thermodynamics ,
-     units ,
-     xfrac
-  }
-
-\msg_info:nn {chemmacros} {all-modules}
-
-% --------------------------------------------------------------------------
-\file_input_stop:
-
-2015/10/14 - add info message discouraging the usage of this module
-           - add `errorcheck' module
-2016/03/07 - add `polymer' module

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.base.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.base.code.tex	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.base.code.tex	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,487 +0,0 @@
-% --------------------------------------------------------------------------
-%
-% the CHEMMACROS package -- module: `base'
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\ChemModule{base}{2020/02/02 basic chemmacros module}
-
-% for the document hooks
-\ChemCompatibilityFrom{5.1}
-\RequirePackage {etoolbox}
-\EndChemCompatibility
-
-% --------------------------------------------------------------------------
-\msg_new:nnn {chemmacros} {command-deprecated}
-  {
-    The~ command~ \token_to_str:N #1 \c_space_tl is~ deprecated.~ Use~
-    \token_to_str:N #2 \c_space_tl instead.
-  }
-
-% define a deprecated command with hints to the corresponding new one:
-\cs_new_protected:Npn \chemmacros_define_deprecated:NN #1#2
-  {
-    \cs_set_protected:Npn #1
-      {
-        \msg_warning:nnnn {chemmacros} {command-deprecated} {#1} {#2}
-        #2
-      }
-  }
-
-\NewDocumentCommand \DeclareChemDeprecated {mm}
-  { \chemmacros_define_deprecated:NN #1 #2 }
-
-% --------------------------------------------------------------------------
-% define a macro set:
-% \NewChem... \RenewChem... \DeclareChem... \ProvideChem...
-% #1: macro names
-% #2: arg spec
-% #3: internal command call
-\cs_new_protected:Npn \chemmacros_new_macroset:nnn #1#2#3
-  {
-    \exp_args:Nc \NewDocumentCommand
-      {
-        NewChem
-        \str_uppercase:f { \tl_head:n {#1} }
-        \tl_tail:n {#1}
-      }
-      {#2}
-      {
-        \cs_if_free:NTF ##1
-          { #3 }
-          { \msg_error:nnn {chemmacros} {new-#1} {##1} }
-      }
-    \exp_args:Nc \NewDocumentCommand
-      {
-        RenewChem
-        \str_uppercase:f { \tl_head:n {#1} }
-        \tl_tail:n {#1}
-      }
-      {#2}
-      {
-        \cs_if_free:NTF ##1
-          { \msg_error:nnn {chemmacros} {renew-#1} {##1} }
-          { #3 }
-      }
-    \exp_args:Nc \NewDocumentCommand
-      {
-        DeclareChem
-        \str_uppercase:f { \tl_head:n {#1} }
-        \tl_tail:n {#1}
-      }
-      {#2}
-      {#3}
-    \exp_args:Nc \NewDocumentCommand
-      {
-        ProvideChem
-        \str_uppercase:f { \tl_head:n {#1} }
-        \tl_tail:n {#1}
-      }
-      {#2}
-      { \cs_if_free:NT ##1 { #3 } }
-    \msg_new:nnn {chemmacros} {new-#1}
-      {
-        You've~ tried~ to~ define~ a~ #1~ with~ \token_to_str:N
-        \NewChem #1 ,~ but~ the~ command~ sequence~ \token_to_str:N ##1
-        \c_space_tl already~ exists.~ Please~ choose~ another~ name.
-      }
-    \msg_new:nnn {chemmacros} {renew-#1}
-      {
-        You've~ tried~ to~ renew~ the~ #1~ \token_to_str:N ##1 ,~ but~
-        it~ doesn't~ exist.
-      }
-  }
-
-\cs_new_protected:Npn \chemmacros_new_environment_macroset:nnn #1#2#3
-  {
-    \exp_args:Nc \NewDocumentCommand {NewChem#1} {#2}
-      {
-        \bool_lazy_and:nnTF
-          { \cs_if_free_p:c {##1} }
-          { \cs_if_free_p:c {end##1} }
-          {#3}
-          { \msg_error:nnn {chemmacros} {new-#1} {##1} }
-      }
-    \exp_args:Nc \NewDocumentCommand {RenewChem#1} {#2}
-      {
-        \bool_lazy_or:nnTF
-          { \cs_if_free_p:c {##1} }
-          { \cs_if_free_p:c {end##1} }
-          { \msg_error:nnn {chemmacros} {renew-#1} {##1} }
-          {#3}
-      }
-    \exp_args:Nc \NewDocumentCommand {DeclareChem#1} {#2} {#3}
-    \exp_args:Nc \NewDocumentCommand {ProvideChem#1} {#2}
-      {
-        \bool_lazy_and:nT
-          { \cs_if_free_p:c {##1} }
-          { \cs_if_free_p:c {end##1} }
-          {#3}
-      }
-    \msg_new:nnn {chemmacros} {new-#1}
-      {
-        You've~ tried~ to~ define~ a~ #1~ with~ \token_to_str:N
-        \NewChem #1 ,~ but~ the~ command~ sequence~ \exp_not:c {##1}
-        \c_space_tl already~ exists.~ Please~ choose~ another~ name.
-      }
-    \msg_new:nnn {chemmacros} {renew-#1}
-      { You've~ tried~ to~ renew~ the~ #1~ ##1,~ but~ it~ doesn't~ exist. }
-  }
-
-\NewDocumentCommand \NewChemMacroset {smmm}
-  {
-    \IfBooleanTF {#1}
-      { \chemmacros_new_environment_macroset:nnn {#2} {#3} {#4} }
-      { \chemmacros_new_macroset:nnn {#2} {#3} {#4} }
-  }
-  
-% --------------------------------------------------------------------------
-\cs_new_protected:Npn \chemmacros_define_keys:nn #1#2
-  { \keys_define:nn {chemmacros/#1} {#2} }
-\cs_generate_variant:Nn \chemmacros_define_keys:nn {x}
-
-\cs_new_protected:Npn \chemmacros_set_keys:nn #1#2
-  { \keys_set:nn {chemmacros/#1} {#2} }
-\cs_generate_variant:Nn \chemmacros_set_keys:nn {x,nx}
-
-\cs_new_protected:Npn \chemmacros_set_keys_groups:nnn #1#2#3
-  { \keys_set_groups:nnn {chemmacros/#1} {#2} {#3} }
-
-\cs_new_protected:Npn \chemmacros_set_keys_filter:nnn #1#2#3
-  { \keys_set_filter:nnn {chemmacros/#1} {#2} {#3} }
-
-\cs_new_protected:Npn \chemmacros_define_global_keys:n #1
-  { \keys_define:nn {chemmacros} {#1} }
-
-\cs_new_protected:Npn \chemmacros_set_global_keys:n #1
-  { \keys_set:nn {chemmacros} {#1} }
-
-% --------------------------------------------------------------------------
-% basic tools:
-\cs_new:Npn \chemmacros_remove_backslash:N #1
-  { \exp_after:wN \use_none:n \token_to_str:N #1 }
-
-\cs_new_eq:NN \chemmacros_ignore_spaces: \tex_ignorespaces:D
-
-\cs_new_protected:Npn \chemmacros_nobreak:     { \tex_penalty:D 10000 \scan_stop: }
-\cs_new_protected:Npn \chemmacros_allow_break: { \tex_penalty:D \c_zero_int }
-\cs_new_protected:Npn \chemmacros_skip_nobreak:N #1
-  {
-    \chemmacros_nobreak:
-    \skip_horizontal:N #1
-    \chemmacros_nobreak:
-  }
-
-% this is used at least in the `isotope' module
-\prg_new_conditional:Npnn \chemmacros_if_is_int:n #1 {p,T,F,TF}
-  {
-    \if_charcode:w ! \if_int_compare:w 9 < 1#1 ! \else: _ \fi:
-      \prg_return_true:
-    \else:
-      \prg_return_false:
-    \fi:
-  }
-
-\prg_new_conditional:Npnn \chemmacros_if_loaded:nn #1#2 {p,T,F,TF}
-  {
-    \use:c {chemmacros_if_#1_loaded:nTF} {#2}
-      { \prg_return_true: }
-      { \prg_return_false: }
-  }
-  
-\prg_new_conditional:Npnn \chemmacros_if_package_loaded:n #1 {p,T,F,TF}
-  {
-    \cs_if_exist:cTF {ver@#1.sty}
-      { \prg_return_true: }
-      { \prg_return_false: }
-  }
-
-\prg_new_conditional:Npnn \chemmacros_if_class_loaded:n #1 {p,T,F,TF}
-  {
-    \cs_if_exist:cTF {ver@#1.cls}
-      { \prg_return_true: }
-      { \prg_return_false: }
-  }
-
-\ChemCompatibilityFrom{5.2}
-% this is still true \AtBeginDocument:
-\prg_new_conditional:Npnn \chemmacros_if_preamble: {p,T,F,TF}
-  {
-    \cs_if_eq:NNTF \@onlypreamble \@notprerr
-      { \prg_return_false: }
-      { \prg_return_true: }
-  }
-
-% this is still false \AtBeginDocument:
-\prg_new_conditional:Npnn \chemmacros_if_document: {p,T,F,TF}
-  {
-    \bool_if:NTF \l__chemmacros_in_document_bool
-      { \prg_return_true: }
-      { \prg_return_false: }
-  }
-\EndChemCompatibility
-
-\ChemCompatibilityFrom{5.6}
-\cs_new_protected:Npn \chemmacros_cs_if_free_new:Npn #1
-  {
-    \cs_if_exist:NF #1
-      { \cs_new:Npn #1 }
-  }
-\cs_generate_variant:Nn \chemmacros_cs_if_free_new:Npn {c}
-
-\cs_new_protected:Npn \chemmacros_cs_if_free_new_protected:Npn #1
-  {
-    \cs_if_exist:NF #1
-      { \cs_new_protected:Npn #1 }
-  }
-\cs_generate_variant:Nn \chemmacros_cs_if_free_new_protected:Npn {c}
-
-\RequirePackage{scrlfile}
-
-% #1: counter
-% #2: singular
-% #3: plural
-% #4: Singular
-% #5: Plural
-\cs_new_protected:Npn \chemmacros_add_cleveref_support:nnnnn #1#2#3#4#5
-  {
-    \AfterPackage* {cleveref}
-      {
-        \cs_if_exist:cF {cref@#1 at name}
-          {
-            \legacy_if:nTF {@cref at capitalise}
-              { \crefname {#1} {#4} {#5} }
-              { \crefname {#1} {#2} {#3} }
-            \Crefname {#1} {#4} {#5}
-          }
-      }
-  }
-\cs_generate_variant:Nn \chemmacros_add_cleveref_support:nnnnn {nnnx , nnnxx , nnnnx }
-  
-% #1: counter
-% #2: singular
-% #3: Singular (optional)
-% #4: plural
-% #5: Plural (optional)
-\NewDocumentCommand \ChemCleverefSupport {mmomo}
-  {
-    \IfNoValueTF {#3}
-      {
-        \IfNoValueTF {#5}
-          {
-            \chemmacros_add_cleveref_support:nnnnn
-              {#1}
-              {#2}
-              {#4}
-              { \tl_titlecase:n {#2} }
-              { \tl_titlecase:n {#4} }
-          }
-          {
-            \chemmacros_add_cleveref_support:nnnnn
-              {#1}
-              {#2}
-              {#4}
-              { \tl_titlecase:n {#2} }
-              {#5}
-          }
-      }
-      {
-        \IfNoValueTF {#5}
-          {
-            \chemmacros_add_cleveref_support:nnnnn
-              {#1}
-              {#2}
-              {#4}
-              {#3}
-              { \tl_titlecase:n {#4} }
-          }
-          { \chemmacros_add_cleveref_support:nnnnn {#1} {#2} {#4} {#3} {#5} }
-      }
-  }
-\@onlypreamble\ChemCleverefSupport
-
-% #1: id
-% #2: mid sentence
-% #3: begin sentence
-\cs_new_protected:Npn \chemmacros_add_fancyref_support:nnn #1#2#3
-  {
-    \AfterPackage* {fancyref}
-      {
-        \chemmacros_cs_if_free_new:cpn {fancyref#1labelprefix} {#1}
-        \chemmacros_cs_if_free_new:cpn {fref#1name} {#2}
-        \chemmacros_cs_if_free_new:cpn {Fref#1name} {#3}
-        \exp_args:Nnx \frefformat {vario} { \exp_not:c {fancyref#1labelprefix} }
-          { \use:c {fref#1name} \fancyrefdefaultspacing ##1##3 }
-        \exp_args:Nnx \Frefformat {vario} { \exp_not:c {fancyref#1labelprefix} }
-          { \use:c {Fref#1name} \fancyrefdefaultspacing ##1##3 }
-        \exp_args:Nnx \frefformat {plain} { \exp_not:c {fancyref#1labelprefix} }
-          { \use:c {fref#1name} \fancyrefdefaultspacing ##1 }
-        \exp_args:Nnx \Frefformat {plain} { \exp_not:c {fancyref#1labelprefix} }
-          { \use:c {Fref#1name} \fancyrefdefaultspacing ##1 }
-      }
-  }
-\cs_generate_variant:Nn \chemmacros_add_fancyref_support:nnn {nnx}
-
-% #1: id
-% #2: mid sentence
-% #3: begin sentence (optional)
-\NewDocumentCommand \ChemFancyrefSupport {mmo}
-  {
-    \IfNoValueTF {#3}
-      { \chemmacros_add_fancyref_support:nnn {#1} {#2} { \tl_titlecase:n {#3} } }
-      { \chemmacros_add_fancyref_support:nnn {#1} {#2} {#3} }
-  }
-\@onlypreamble\ChemFancyrefSupport
-\EndChemCompatibility
-
-% --------------------------------------------------------------------------
-% some checks at begin document:
-\bool_new:N \l__chemmacros_in_document_bool
-\bool_new:N \l__chemmacros_chemstyle_bool
-
-\chemmacros_if_compatibility:nnTF {>=} {5.2}
-  { \AfterEndPreamble }
-  { \AtBeginDocument }
-  { \bool_set_true:N \l__chemmacros_in_document_bool }
-
-\AtBeginDocument
-  {
-    \@ifpackageloaded { chemstyle }
-      { \bool_set_true:N \l__chemmacros_chemstyle_bool }
-      { \bool_set_false:N \l__chemmacros_chemstyle_bool }
-  }
-
-% --------------------------------------------------------------------------
-% detection and handling of bold face:
-\RequirePackage{bm}
-
-\prg_new_protected_conditional:Npnn \chemmacros_if_bold: {T,F,TF}
-  {
-    \seq_if_in:NVTF \l__chemmacros_if_bf_seq \f at series
-      { \prg_return_true: }
-      { \prg_return_false: }
-  }
-
-\seq_new:N  \l__chemmacros_if_bf_seq
-
-\seq_set_split:Nnn \l__chemmacros_if_bf_seq { , }
-  {
-    b , bc , bm , bx , bux ,
-    eb , ebc , ebx , mb ,
-    sb , sbc , sbx ,
-    ub , ubc , ubx
-  }
-
-\cs_new_protected:Npn \chemmacros_bold:n #1
-  {
-    \chemmacros_if_bold:TF
-      {
-        \mode_if_math:TF
-          { \bm {#1} }
-          { \textbf {#1} }
-      }
-      {#1}
-  }
-
-\cs_new_protected:Npn \chemmacros_detect_bold:n
-  { \error \chemmacros_bold:n }
-
-% --------------------------------------------------------------------------
-\RequirePackage{amstext}
-
-\cs_new_protected:Npn \chemmacros_text:n #1
-  { \mode_if_math:TF { \text {#1} } {#1} }
-\cs_generate_variant:Nn \chemmacros_text:n { V }
-
-\cs_new_protected:Npn \chemmacros_math:n #1
-  { \chemmacros_text:n { \c_math_toggle_token #1 \c_math_toggle_token } }
-\cs_generate_variant:Nn \chemmacros_math:n { V }
-
-% --------------------------------------------------------------------------
-% a setup command:
-\NewDocumentCommand \chemsetup {om}
-  {
-    \IfNoValueTF {#1}
-      { \keys_set:nn {chemmacros}    {#2} }
-      { \keys_set:nn {chemmacros/#1} {#2} }
-  }
-
-\chemmacros_define_global_keys:n
-  { modules .code:n = \chemmacros_load_modules:n {#1} }
-
-% --------------------------------------------------------------------------
-
-% load package #1 and add its options to chemmacros
-%   this requires that package #1 defines its options with l3keys using its
-%   name as module
-\cs_new_protected:Npn \chemmacros_integrate_package:nnn #1#2#3
-  {
-    \tl_if_blank:nTF {#3}
-      {
-        \tl_if_blank:nTF {#1}
-          { \RequirePackage {#2} }
-          { \RequirePackage [#1] {#2} }
-      }
-      {
-        \tl_if_blank:nTF {#1}
-          { \RequirePackage {#2} [#3] }
-          { \RequirePackage [#1] {#2} [#3] }
-      }
-    \chemmacros_define_global_keys:n
-      {
-        #2 .choice: ,
-        #2 / unknown .code:n =
-          \keys_set:no {#2} { \l_keys_key_tl = ##1 }
-      }
-  }
-
-% --------------------------------------------------------------------------
-
-\chemmacros_if_compatibility:nnT {>=} {5.2}
-  { \chemmacros_load_module:n {errorcheck} }
-
-% --------------------------------------------------------------------------
-
-\bool_new:N \l__chemmacros_hyperref_bool
-
-\AtEndPreamble
-  {
-    \chemmacros_if_package_loaded:nT {hyperref}
-      { \bool_set_true:N \l__chemmacros_hyperref_bool }
-  }
-
-\file_input_stop:
-
-2015/09/23 - new conditionals \chemmacros_if_preamble:TF and
-             \chemmacros_if_document:TF
-2015/10/14 - load `errorcheck' module
-2016/02/09 - starred version of \NewChemMacroset
-2016/03/07 - \chemmacros_define_keys:nn and friends
-2016/04/25 - macros for cleveref and fancyref support, \ChemCleverefSupport
-             \ChemFancyrefSupport
-2016/05/04 - fix \ChemCleverefSupport
-2017/08/28 - add missing hyperref check
-2020/01/16 - adapt to renaming of string case changing functions
-2020/02/02 - lazy boolean evaluation
-2020/11/21 - exchange \tl_mixed_case:n for \tl_titlecase:n

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.charges.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.charges.code.tex	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.charges.code.tex	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,157 +0,0 @@
-% --------------------------------------------------------------------------
-%
-% the CHEMMACROS package -- module: `charges'
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\ChemModule{charges}{2015/07/30 charges}
-
-\chemmacros_load_module:n {chemformula}
-
-% --------------------------------------------------------------------------
-% circled charge signs: they are defined in the `chemformula' package:
-% use directly:
-\cs_new_protected:Npn \fplus  { { \chemformula_fplus:  } }
-\cs_new_protected:Npn \fminus { { \chemformula_fminus: } }
-
-% change output depending on circled-option
-\bool_new:N      \l__chemmacros_circled_bool
-\bool_set_true:N \l__chemmacros_circled_bool
-\bool_new:N      \l__chemmacros_circled_formal_bool
-\bool_set_true:N \l__chemmacros_circled_formal_bool
-\bool_new:N      \l__chemmacros_circled_chem_bool
-\bool_set_true:N \l__chemmacros_circled_chem_bool
-
-
-\chemmacros_define_keys:nn {charges}
-  {
-    circletype         .choice: ,
-    circletype / math  .code:n  =
-      {
-        \bool_set_false:N \l__chemmacros_circled_chem_bool
-        \chemmacros_if_package_loaded:nT {chemformula}
-          { \bool_set_false:N \l_chemformula_formal_chem_bool }
-      } ,
-    circletype / chem  .code:n  =
-      {
-        \bool_set_true:N \l__chemmacros_circled_chem_bool
-        \chemmacros_if_package_loaded:nT {chemformula}
-          { \bool_set_true:N \l_chemformula_formal_chem_bool }
-      } ,
-    circletype         .value_required:n = true ,
-    circled            .choice: ,
-    circled / none     .code:n =
-      {
-        \bool_set_false:N \l__chemmacros_circled_bool
-        \bool_set_false:N \l__chemmacros_circled_formal_bool
-        \chemmacros_if_package_loaded:nT {chemformula}
-          { \bool_set_false:N \l_chemformula_formal_charges_bool }
-      } ,
-    circled / formal   .code:n =
-      {
-        \bool_set_true:N \l__chemmacros_circled_bool
-        \bool_set_true:N \l__chemmacros_circled_formal_bool
-        \chemmacros_if_package_loaded:nT {chemformula}
-          { \bool_set_false:N \l_chemformula_formal_charges_bool }
-      } ,
-    circled / all      .code:n =
-      {
-        \bool_set_true:N \l__chemmacros_circled_bool
-        \bool_set_false:N \l__chemmacros_circled_formal_bool
-        \chemmacros_if_package_loaded:nT {chemformula}
-          { \bool_set_true:N \l_chemformula_formal_charges_bool }
-      } ,
-    circled            .default:n  = all
-  }
-
-\cs_new_protected:Npn \chemmacros_plus:  { \chemformula_plus: }
-\cs_new_protected:Npn \chemmacros_minus: { \chemformula_minus: }
-
-\cs_new_protected:Npn \chemmacros_formal_plus: { \chemformula_formal_plus: }
-\cs_new_protected:Npn \chemmacros_formal_minus: { \chemformula_formal_minus: }
-
-\cs_new_protected:Npn \chemmacros_charge:n #1
-  { \chemmacros_chemformula:n { {}^{#1} } }
-
-\cs_new_protected:Npn \chemmacros_new_charge_command:Nn #1#2
-  {
-    \DeclareDocumentCommand #1 {o}
-      {
-        \IfNoValueTF {##1}
-          { \chemmacros_charge:n {#2} }
-          { \chemmacros_charge:n {##1#2} }
-      }
-  }
-
-\tl_new:N  \l__chemmacros_partial_charge_format_tl
-\tl_set:Nn \l__chemmacros_partial_charge_format_tl { \tiny }
-
-\cs_new_protected:Npn \chemmacros_new_partial_charge_command:Nn #1#2
-  {
-    \cs_new_protected:Npn #1
-      {
-        \mbox {
-          \l__chemmacros_partial_charge_format_tl
-          \c_math_toggle_token \delta #2 \c_math_toggle_token
-        }
-      }
-  }
-
-\NewChemMacroset {Charge} {mm}
-  { \chemmacros_new_charge_command:Nn #1 {#2} }
-  
-\NewChemMacroset {PartialCharge} {mm}
-  { \chemmacros_new_partial_charge_command:Nn #1 {#2} }
-
-\cs_new_protected:Npn \scrm
-  { \ensuremath { \scriptstyle \chemmacros_minus: } }
-\cs_new_protected:Npn \scrp
-  { \ensuremath { \scriptstyle \chemmacros_plus: } }
-\cs_new_protected:Npn \fscrm
-  { \ensuremath { \scriptstyle \chemmacros_formal_minus: } }
-\cs_new_protected:Npn \fscrp
-  { \ensuremath { \scriptstyle \chemmacros_formal_plus: } }
-\cs_new_protected:Npn \fsscrm
-  { \ensuremath { \scriptscriptstyle \chemmacros_formal_minus: } }
-\cs_new_protected:Npn \fsscrp
-  { \ensuremath { \scriptscriptstyle \chemmacros_formal_plus: } }
-
-\chemmacros_define_keys:nn {charges}
-  {
-    partial-format .tl_set:N = \l__chemmacros_partial_charge_format_tl
-  }
-
-% --------------------------------------------------------------------------
-\NewChemCharge \mch  { \chemmacros_minus: }
-\NewChemCharge \pch  { \chemmacros_plus: }
-\NewChemCharge \fmch { \chemmacros_formal_minus: }
-\NewChemCharge \fpch { \chemmacros_formal_plus: }
-
-% partial charges:
-\NewChemPartialCharge \delm  { \chemmacros_minus: }
-\NewChemPartialCharge \delp  { \chemmacros_plus: }
-\NewChemPartialCharge \fdelm { \chemmacros_formal_minus: }
-\NewChemPartialCharge \fdelp { \chemmacros_formal_plus: }
-
-% --------------------------------------------------------------------------

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.chemformula.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.chemformula.code.tex	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.chemformula.code.tex	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,243 +0,0 @@
-% --------------------------------------------------------------------------
-%
-% the CHEMMACROS package -- module: `chemformula'
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\ChemModule{chemformula}{2020/02/02 integration of chemical formulas}
-
-\RequirePackage{amstext}
-\chemmacros_load_module:n {charges}
-
-\msg_new:nnn {chemmacros} {unknown-formula-method}
-  {
-    You~ chose~ the~ formula~ method~ `#1'~ which~ is~ not~ available.~
-    I'm~ falling~ back~ to~ `chemformula'~ now.
-  }
-
-\msg_new:nnn {chemmacros} {default-formula-method}
-  {
-    You~ haven't~ chosen~ a~ formula~ method~ so~ I'm~ assuming~ the~ default~
-    method~ `chemformula'.
-  }
-
-\msg_new:nnn {chemmacros} {formula-conflict}
-  {
-    You~ have~ loaded~ multiple~ formula~ method~ packages~ but~ haven't~
-    chosen~ which~ method~ to~ use!~ I~ will~ use~ `chemformula'. \\
-    You~ should~ decide~ for~ only~ one~ of~ the~ packages~ for~ having~ a~
-    consistent~ layout.
-  }
-
-% --------------------------------------------------------------------------
-% generic functions for usage in other packages; those are to be set in each
-% method setup:  
-\cs_new_protected:Npn \chemmacros_reaction:n #1    {#1}
-\cs_new_protected:Npn \chemmacros_chemformula:n #1 {#1}
-\cs_generate_variant:Nn \chemmacros_chemformula:n { x,V }
-
-\cs_new_protected:Npn \chemmacros at formula #1  { \chemmacros_chemformula:n {#1} }
-\cs_new_protected:Npn \chemmacros at reaction #1 { \chemmacros_reaction:n {#1} }
-
-% --------------------------------------------------------------------------
-% setup, check and define each method:
-\bool_new:N \l__chemmacros_formula_method_set_bool
-
-\tl_new:N \g_chemmacros_formula_method_tl
-\tl_gset:Nn \g_chemmacros_formula_method_tl {chemformula}
-
-\prop_new:N \l__chemmacros_method_packages_prop
-    
-% #1: package/method name
-% #2: preparations
-\cs_new_protected:Npn \chemmacros_add_method_package:nn #1#2
-  { \prop_put:Nnn \l__chemmacros_method_packages_prop {#1} {#2} }
-
-\cs_new_protected:Npn \chemmacros_setup_method_package:n #1
-  {
-    \prop_item:Nn \l__chemmacros_method_packages_prop {#1}
-    \tl_gset:Nn \g_chemmacros_formula_method_tl {#1}
-  }
-
-\prg_new_conditional:Npnn \chemmacros_if_method_package:n #1 {p,T,F,TF}
-  {
-    \prop_if_in:NnTF \l__chemmacros_method_packages_prop {#1}
-      { \prg_return_true: }
-      { \prg_return_false: }
-  }
-
-\cs_new_protected:Npn \chemmacros_check_formula_method:
-  {
-    \bool_if:NF \l__chemmacros_formula_method_set_bool
-      {
-        \bool_set_false:N \l__chemmacros_tmpa_bool
-        \prop_map_inline:Nn \l__chemmacros_method_packages_prop
-          {
-            \chemmacros_if_package_loaded:nT {##1}
-              {
-                \bool_if:NTF \l__chemmacros_tmpa_bool
-                  {
-                    \msg_warning:nn {chemmacros} {formula-conflict}
-                    \chemmacros_set_formula_method:n {chemformula}
-                  }
-                  { \chemmacros_set_formula_method:n {##1} }
-                \bool_set_true:N \l__chemmacros_tmpa_bool
-              }
-            }
-        \bool_if:NF \l__chemmacros_tmpa_bool
-          {
-            \msg_info:nn {chemmacros} {default-formula-method}
-            \chemmacros_set_formula_method:n {chemformula}
-          }
-      }
-  }
-
-\cs_new_protected:Npn \chemmacros_set_formula_method:n #1
-  {
-    \chemmacros_if_method_package:nTF {#1}
-      { \chemmacros_setup_method_package:n {#1} }
-      {
-        \msg_warning:nnn {chemmacros} {unknown-formula-method} {#1}
-        \chemmacros_setup_method_package:n {chemformula}
-      }
-    \bool_set_true:N \l__chemmacros_formula_method_set_bool
-  }
-\cs_generate_variant:Nn \chemmacros_set_formula_method:n {V}
-
-% --------------------------------------------------------------------------
-% add formula methods:
-\chemmacros_add_method_package:nn {chemformula}
-  {
-    \chemmacros_integrate_package:nnn {} {chemformula} {2015/09/08}
-    \cs_set_protected:Npn \chemmacros_chemformula:n #1
-      { \chemformula_chcpd:nn {} {#1} }
-    \cs_set_protected:Npn \chemmacros_reaction:n #1
-      { \chemformula_ch:nn {} {#1} }
-  }
-  
-\chemmacros_add_method_package:nn {mhchem}
-  {
-    \chemmacros_integrate_package:nnn {version=4} {mhchem} {}
-    \cs_set_protected:Npn \chemmacros_chemformula:n #1 { \ce {#1} }
-    \cs_set_protected:Npn \chemmacros_reaction:n #1    { \ce {#1} }
-    \chemmacros_after_module:nn {charges}
-      {
-        \cs_set_protected:Npn \chemmacros_elpair:n #1 { \ce{#1} : }
-        \cs_set_protected:Npn \chemmacros_plus:  { + }
-        \cs_set_protected:Npn \chemmacros_minus: { - }
-        \cs_set_protected:Npn \chemmacros_formal_plus:  { \ensuremath{\oplus} }
-        \cs_set_protected:Npn \chemmacros_formal_minus: { \ensuremath{\ominus} }
-        \cs_set_protected:Npn \fplus  { \ensuremath{\oplus} }
-        \cs_set_protected:Npn \fminus { \ensuremath{\ominus} }
-      }
-  }
-
-\ChemCompatibilityFrom{5.6}
-\chemmacros_add_method_package:nn {chemist}
-  {
-    \RequirePackage {chemist}
-    \cs_set_protected:Npn \chemmacros_chemformula:n #1
-      { \chemmacros_text:n { \ChemForm {#1} } }
-    \cs_set_protected:Npn \chemmacros_reaction:n #1
-      { \chemmacros_text:n { \ChemForm {#1} } }
-    \chemmacros_after_module:nn {charges}
-      {
-        \cs_set_protected:Npn \chemmacros_elpair:n #1
-          { \chemmacros_text:n { \ChemForm {#1} : } }
-        \cs_set_protected:Npn \chemmacros_plus:  { + }
-        \cs_set_protected:Npn \chemmacros_minus: { - }
-        \cs_set_protected:Npn \chemmacros_formal_plus:  { \ensuremath{\oplus} }
-        \cs_set_protected:Npn \chemmacros_formal_minus: { \ensuremath{\ominus} }
-        \cs_set_protected:Npn \fplus  { \ensuremath{\oplus} }
-        \cs_set_protected:Npn \fminus { \ensuremath{\ominus} }
-      }
-  }
-
-\chemmacros_add_method_package:nn {chemfig}
-  {
-    \RequirePackage {chemfig}
-    \cs_set_protected:Npn \chemmacros_chemformula:n #1
-      { \printatom {#1} }
-    \cs_set_protected:Npn \chemmacros_reaction:n #1
-      { \printatom {#1} }
-    \chemmacros_after_module:nn {charges}
-      {
-        \cs_set_protected:Npn \chemmacros_elpair:n #1
-          { \Lewis { 0: , \printatom {#1} } }
-        \cs_set_protected:Npn \chemmacros_plus:  { + }
-        \cs_set_protected:Npn \chemmacros_minus: { - }
-        \cs_set_protected:Npn \chemmacros_formal_plus:  { \ensuremath{\oplus} }
-        \cs_set_protected:Npn \chemmacros_formal_minus: { \ensuremath{\ominus} }
-        \cs_set_protected:Npn \fplus  { \ensuremath{\oplus} }
-        \cs_set_protected:Npn \fminus { \ensuremath{\ominus} }
-      }
-  }
-\EndChemCompatibility
-
-% --------------------------------------------------------------------------
-\ChemCompatibilityTo{5.1}
-\chemmacros_set_formula_method:n {chemformula}
-\EndChemCompatibility
-
-\ChemCompatibilityFrom{5.1}
-\chemmacros_define_global_keys:n
-  { formula .code:n = \chemmacros_set_formula_method:n {#1} }
-\EndChemCompatibility
-
-\def\bla{bla}
-
-\AtEndPreamble
-  {
-    \bool_if:NF \l__chemmacros_formula_method_set_bool
-      {
-        \bool_lazy_and:nnTF
-          { \chemmacros_if_compatibility_p:nn {>=} {5.2} }
-          { \chemmacros_if_compatibility_p:nn {<} {5.6} }
-          { \chemmacros_check_formula_method: }
-          {
-            \chemmacros_if_compatibility:nnTF {>=} {5.6}
-              { \msg_info:nn {chemmacros} {default-formula-method} }
-              { \msg_warning:nn {chemmacros} {default-formula-method} }
-            \chemmacros_set_formula_method:n {chemformula}
-          }
-      }
-  }
-
-% --------------------------------------------------------------------------
-\file_input_stop:
-
-2015/09/22 - new general option `method' which allows a choice between
-             `chemformula' and `mhchem'
-2015/10/13 - add missing compatibility definitions
-           - check for `mhchem' and `chemformula' and set method accordingly
-             if possible
-2016/04/27 - further generalization of the `method' concept, new methods
-             `chemist' and `chemfig'
-           - don't automatically load an available method: load `chemformula'
-             if the users haven't decided for themselves and issue a warning
-2016/05/03 - correct wrong method check
-2020/02/02 - lazy boolean evaluation
-2020/02/29 - use \ch even for simple formulas – resolves issue #28
-2020/03/02 - undo last change: this makes problems with oxidation numbers in a
-             reaction

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.errorcheck.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.errorcheck.code.tex	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.errorcheck.code.tex	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,130 +0,0 @@
-% --------------------------------------------------------------------------
-%
-% the CHEMMACROS package -- module: `errorcheck'
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\ChemModule{errorcheck}{2016/10/05 error checking for unloaded modules}[5.2]
-
-\RequirePackage{scrlfile}
-
-\msg_new:nnn {chemmacros} {undefined}
-  {
-    The~ #1~ `#2'~ is~ undefined.~ You~ need~ to~ load~ the~
-    `#3'~ module.
-  }
-
-\cs_generate_variant:Nn \msg_error:nnnnn {nnnx}
-
-\cs_new_protected:Npn \chemmacros_requires_module:nNn #1#2#3
-  {
-    \chemmacros_if_module_loaded:nF {#3}
-      {
-        \cs_if_free:NT #2
-          {
-            \cs_set:Npn #2
-              {
-                \msg_error:nnnxn {chemmacros} {undefined}
-                  {#1}
-                  {\token_to_str:N #2}
-                  {#3}
-              }
-            \chemmacros_before_module:nn {#3} { \cs_undefine:N #2 }
-          }
-      }
-  }
-\cs_generate_variant:Nn \chemmacros_requires_module:nNn {nc}
-
-\cs_new_protected:Npn \chemmacros_command_requires_module:Nn #1#2
-  { \chemmacros_requires_module:nNn {command} #1 {#2} }
-
-\cs_new_protected:Npn \chemmacros_environment_requires_module:nn #1#2
-  { \chemmacros_requires_module:ncn {environment} {#1} {#2} }
-
-% --------------------------------------------------------------------------
-% add checking for the most common user commands and environments:
-% isotopes module
-\chemmacros_command_requires_module:Nn \isotope {isotopes}
-
-% mechanisms module
-\chemmacros_command_requires_module:Nn \mech {mechanisms}
-
-% newman module
-\chemmacros_command_requires_module:Nn \newman {newman}
-
-% orbital module
-\chemmacros_command_requires_module:Nn \orbital {orbital}
-
-% polymers module
-\chemmacros_command_requires_module:Nn \makepolymerdelims {polymers}
-
-% reactions module
-\chemmacros_environment_requires_module:nn {reaction}       {reactions}
-\chemmacros_environment_requires_module:nn {reaction*}      {reactions}
-\chemmacros_environment_requires_module:nn {reactions}      {reactions}
-\chemmacros_environment_requires_module:nn {reactions*}     {reactions}
-\chemmacros_command_requires_module:Nn     \listofreactions {reactions}
-\chemmacros_command_requires_module:Nn     \AddRxnDesc      {reactions}
-
-% redox module
-\chemmacros_command_requires_module:Nn \ox    {redox}
-\chemmacros_command_requires_module:Nn \OX    {redox}
-\chemmacros_command_requires_module:Nn \redox {redox}
-
-% scheme module
-\chemmacros_environment_requires_module:nn {scheme}        {scheme}
-\chemmacros_command_requires_module:Nn     \listschemename {scheme}
-\chemmacros_command_requires_module:Nn     \schemename     {scheme}
-\chemmacros_command_requires_module:Nn     \listofschemes  {scheme}
-
-\BeforePackage {chemscheme}
-  {
-    \cs_undefine:N \scheme
-    \cs_undefine:N \endscheme
-    \cs_undefine:N \listschemename
-    \cs_undefine:N \schemename
-    \cs_undefine:N \listofschemes
-  }
-
-% spectroscopy module
-\chemmacros_command_requires_module:Nn     \NMR           {spectroscopy}
-\chemmacros_environment_requires_module:nn {experimental} {spectroscopy}
-
-% thermodynamics module
-\chemmacros_command_requires_module:Nn \state    {thermodynamics}
-\chemmacros_command_requires_module:Nn \enthalpy {thermodynamics}
-\chemmacros_command_requires_module:Nn \entropy  {thermodynamics}
-\chemmacros_command_requires_module:Nn \gibbs    {thermodynamics}
-
-% xfrac module
-\chemmacros_command_requires_module:Nn \chemfrac {xfrac}
-
-% --------------------------------------------------------------------------
-
-\file_input_stop:
-
-2015/10/14 - first version
-2016/03/08 - add `polymers' module
-2016/05/31 - enable `chemscheme' to be loaded after chemmacros
-2016/10/06 - check if commands exist before defining them to raise errors

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.greek.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.greek.code.tex	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.greek.code.tex	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,70 +0,0 @@
-% --------------------------------------------------------------------------
-%
-% the CHEMMACROS package -- module: `greek'
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\ChemModule{greek}{2020/02/02 upright greek symbols}
-
-\RequirePackage{chemgreek}[2020/01/16]
-
-\msg_new:nnn {chemmacros} {no-greek}
-  {
-    You~ haven't~ loaded~ any~ package~ for~ upright~ Greek~ letters~ or~ no~
-    unique~ choice~ was~ possible.~ Either~ load~ one~ of~ packages~
-    specified~ in~ the~ manual~ or~ select~ a~ chemgreek~ mapping~ manually.
-  }
-
-\msg_new:nnn {chemmacros} {greek-undefined}
-  {
-    The~ chemgreek~ mapping~ `#1'~ you~ chose~ \msg_line_context: \c_space_tl
-    is~ not~ defined.~ Please~ choose~ another~ one.
-  }
-
-% chemgreek selects a mapping if an unambiguous choice is possible, otherwise
-% selects `default'. Warn the user in this case:
-\AtBeginDocument{
-  \bool_lazy_or:nnT
-    { \chemgreek_if_mapping_active_p:n {default} }
-    { \chemgreek_if_mapping_active_p:n {var-default} }
-    { \msg_warning:nn {chemmacros} {no-greek} }
-}
-
-% an option for manual selection:
-\chemmacros_define_global_keys:n
-  { greek .code:n = \chemmacros_choose_chemgreek_mapping:n {#1} }
-
-\cs_new_protected:Npn \chemmacros_choose_chemgreek_mapping:n #1
-  {
-    \chemgreek_if_mapping_exists:nTF {#1}
-      {
-        \chemgreek_load_mapping_package:n {#1}
-        \chemgreek_activate_mapping:n {#1}
-      }
-      { \msg_warning:nnn {chemmacros} {greek-undefined} {#1} }
-  }
-
-% --------------------------------------------------------------------------
-\file_input_stop:
-2020/02/02 - lazy boolean evaluation

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.isotopes.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.isotopes.code.tex	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.isotopes.code.tex	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,238 +0,0 @@
-% --------------------------------------------------------------------------
-%
-% the CHEMMACROS package -- module: `isotopes'
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\ChemModule{isotopes}{2015/07/22 a macro to easily print element isotopes}
-
-\RequirePackage{elements}
-
-\msg_new:nnn {chemmacros} {no-isotope}
-  { The~ isotope~ #2~ is~ not~ defined~ for~ element~ #1. }
-
-% --------------------------------------------------------------------------
-\tl_new:N  \l__chemmacros_isotope_tl
-\tl_new:N  \l__chemmacros_isotope_list_tl
-\seq_new:N \l__chemmacros_isotope_seq
-\seq_new:N \l__chemmacros_check_isotopes_seq
-
-% #1: atomic number|element symbol|element name
-% #2: tokenlist variable
-\cs_new_protected:Npn \chemmacros_get_atom_number:nN #1#2
-  {
-    \chemmacros_if_is_int:nTF {#1}
-      { \tl_set:Nn #2 {#1} }
-      {
-        \cs_if_exist:cTF { @elements at atom@number@ \str_lowercase:n {#1} }
-          { \tl_set:Nx #2 { \use:c { @elements at atom@number@ \str_lowercase:n {#1} } } }
-          { \tl_set:Nx #2 { \use:c { @elements at atom@name at num@ \str_lowercase:n {#1} } } }
-      }
-  }
-\cs_generate_variant:Nn \chemmacros_get_atom_number:nN { V }
-
-% #1: atomic number|element symbol|element name
-% #2: tl to store the result in
-\cs_new_protected:Npn \chemmacros_get_isotope_list:nN #1#2
-  {
-    \chemmacros_get_atom_number:nN {#1} \l__chemmacros_isotope_tl
-    \tl_set:Nx #2
-      {
-        \use:c
-          {
-            @elements at atom@isotopes@
-            \int_to_roman:n {\l__chemmacros_isotope_tl}
-          }
-      }
-  }
-
-% #1: atomic number|element symbol|element name
-% #2: tokenlist variable
-\cs_new_protected:Npn \chemmacros_get_element_symbol:nN #1#2
-  {
-    \chemmacros_get_atom_number:nN {#1} \l__chemmacros_isotope_tl
-    \tl_set:Nx #2
-      {
-        \use:c
-          {
-            @elements at atom@symbol at num@
-            \int_to_roman:n {\l__chemmacros_isotope_tl}
-          }
-      }
-  }
-
-% #1: atomic number|element symbol|element name
-% #2: isotope number
-\prg_new_protected_conditional:Npnn \chemmacros_check_isotope:nn #1#2 {T,F,TF}
-  {
-    \chemmacros_get_isotopes:nN {#1} \l__chemmacros_check_isotopes_seq
-    \seq_if_in:NnTF \l__chemmacros_check_isotopes_seq {#2}
-      { \prg_return_true: }
-      { \prg_return_false: }
-  }
-\cs_generate_variant:Nn \chemmacros_check_isotope:nnF { V }
-
-% #1: atomic number|element symbol|element name
-% #2: tl to store the result in
-\cs_new_protected:Npn \chemmacros_get_main_isotope:nN #1#2
-  {
-    \chemmacros_get_isotope_list:nN {#1} \l__chemmacros_isotope_list_tl
-    \seq_set_split:NnV \l__chemmacros_isotope_seq {,} \l__chemmacros_isotope_list_tl
-    \seq_map_inline:Nn \l__chemmacros_isotope_seq
-      {
-        \chemmacros_read_isotope:nNN {##1}
-          \l__chemmacros_tmpa_bool
-          #2
-        \bool_if:NT \l__chemmacros_tmpa_bool
-          { \seq_map_break: }
-      }
-  }
-\cs_generate_variant:Nn \chemmacros_get_main_isotope:nN { V }
-
-% #1: atomic number|element symbol|element name
-% #2: seq to store the results in
-\cs_new_protected:Npn \chemmacros_get_isotopes:nN #1#2
-  {
-    \seq_clear:N #2
-    \chemmacros_get_isotope_list:nN {#1} \l__chemmacros_tmpa_tl
-    \seq_set_split:NnV \l__chemmacros_isotope_seq {,} \l__chemmacros_tmpa_tl
-    \seq_map_inline:Nn \l__chemmacros_isotope_seq
-      {
-        \chemmacros_read_isotope:nNN {##1}
-          \l__chemmacros_tmpa_bool
-          \l__chemmacros_tmpa_tl
-        \seq_put_right:NV #2 \l__chemmacros_tmpa_tl
-      }
-  }
-
-% #1: boolean variable
-% #2: tokenlist variable
-% #3: isotope list entry
-\cs_new_protected:Npn \chemmacros_read_isotope:nNN #1#2#3
-  { \__chemmacros_read_isotope:NNw #2#3 !#1!! \q_stop }
-
-% \__chemmacros_read_isotope:NNw N N !!1!! \q_stop
-% \__chemmacros_read_isotope:NNw N N !1!! \q_stop
-\cs_new_protected:Npn \__chemmacros_read_isotope:NNw #1#2#3!#4!#5!#6 \q_stop
-  {
-    \tl_if_blank:nTF {#5}
-      {
-        \tl_set:Nn #2 {#4}
-        \bool_set_false:N #1
-      }
-      {
-        \tl_set:Nn #2 {#5}
-        \bool_set_true:N #1
-      }
-  }
-
-% --------------------------------------------------------------------------
-% #1: boolean: hide atomic number?
-% #2: nucleons, element symbol
-\cs_new_protected:Npn \chemmacros_isotope:nn #1#2
-  { \__chemmacros_isotope:nww {#1} #2,, \q_stop }
-
-\cs_new_protected:Npn \__chemmacros_isotope:nww #1#2,#3,#4 \q_stop
-  {
-    \tl_if_blank:nTF {#3}
-      {
-        \chemmacros_get_element_symbol:nN {#2} \l__chemmacros_tmpa_tl
-        \chemmacros_get_main_isotope:nN {#2} \l__chemmacros_tmpb_tl
-        \chemmacros_get_atom_number:nN {#2} \l__chemmacros_tmpc_tl
-        \bool_if:nTF {#1}
-          {
-            \chemmacros_isotope_write:VnV
-              \l__chemmacros_tmpb_tl
-              { }
-              \l__chemmacros_tmpa_tl
-          }
-          {
-            \chemmacros_isotope_write:VVV
-              \l__chemmacros_tmpb_tl
-              \l__chemmacros_tmpc_tl
-              \l__chemmacros_tmpa_tl
-          }
-      }
-      {
-        \chemmacros_get_element_symbol:nN {#3} \l__chemmacros_tmpa_tl
-        \chemmacros_get_atom_number:nN {#3} \l__chemmacros_tmpb_tl
-        \chemmacros_check_isotope:VnF
-          \l__chemmacros_tmpa_tl
-          {#2}
-          {
-            \chemmacros_get_element_symbol:nN {#3} \l__chemmacros_tmpa_tl
-            \msg_warning:nnVn {chemmacros} {no-isotope}
-              \l__chemmacros_tmpa_tl
-              {#2}
-          }
-        \chemmacros_get_element_symbol:nN {#3} \l__chemmacros_tmpa_tl
-        \bool_if:nTF {#1}
-          { \chemmacros_isotope_write:nnV {#2} { } \l__chemmacros_tmpa_tl }
-          {
-            \chemmacros_isotope_write:nVV {#2}
-              \l__chemmacros_tmpb_tl
-              \l__chemmacros_tmpa_tl
-          }
-      }
-  }
-
-\bool_new:N \l__chemmacros_isotope_super_bool
-\tl_new:N \l__chemmacros_isotope_side_connect_tl
-
-\chemmacros_define_keys:nn {isotopes}
-  {
-    format .choice: ,
-    format / super .code:n  =
-      \bool_set_true:N \l__chemmacros_isotope_super_bool ,
-    format / side .code:n   =
-      \bool_set_false:N \l__chemmacros_isotope_super_bool ,
-    format .initial:n       = super ,
-    side-connect .tl_set:N  = \l__chemmacros_isotope_side_connect_tl ,
-    side-connect .initial:n = -
-  }
-
-% #1: nucleons
-% #2: atomic number
-% #3: element symbol
-\cs_new_protected:Npn \chemmacros_isotope_write:nnn #1#2#3
-  {
-    \bool_if:NTF \l__chemmacros_isotope_super_bool
-      { \chemmacros_chemformula:n { ^{#1}_{#2}#3 } }
-      {
-        \chemmacros_chemformula:n {#3}
-        \tl_use:N \l__chemmacros_isotope_side_connect_tl
-        #1
-      }
-  }
-\cs_generate_variant:Nn \chemmacros_isotope_write:nnn { VnV , VVV , nnV , nVV }
-
-% TODO: option for the layout of the written isotope: ^{12}_6C vs C-12
-
-\NewDocumentCommand \isotope { sm }
-  { \chemmacros_isotope:nn {#1} {#2} }
-  
-% --------------------------------------------------------------------------
-\file_input_stop:
-2015/07/22 - first version
-2020/01/16 - adapt to renaming of string case changing functions

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.lang.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.lang.code.tex	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.lang.code.tex	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,177 +0,0 @@
-% --------------------------------------------------------------------------
-%
-% the CHEMMACROS package -- module: `lang'
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\ChemModule{lang}{2016/05/31 language settings for chemmacros}
-
-\RequirePackage{translations}
-
-\msg_new:nnn {chemmacros} {language-not-defined}
-  {
-    You~ chose~ the~ language~ `#1'~ which~ is~ not~ defined~ by~ chemmacros.~
-    `english'~ is~ used~ instead.~ If~ you~ just~ mistyped~ try~ again!~
-    Otherwise~ contact~ the~ author~ and~ he'll~ probably~ add~ your~ language.
-  }
-
-% --------------------------------------------------------------------------
-% language settings:
-\bool_new:N      \l__chemmacros_language_auto_bool
-\bool_set_true:N \l__chemmacros_language_auto_bool
-% this token list will hold the chosen language for chemmacros; since the
-% language is either chosen automatically or by option it is only available at
-% begin document
-\tl_new:N  \l_chemmacros_language_tl
-\tl_set:Nn \l_chemmacros_language_tl {english}
-\tl_new:N  \l__chemmacros_current_language_tl
-
-\tl_const:Nx \c__chemmacros_keyword_prefix_tl
-  { \chemmacros_if_compatibility:nnT {>=} {5.7} {chem-keyword-} }
-
-\prop_new:N \g_chemmacros_translations_prop
-
-% translate the key #1
-\cs_new:Npn \chemmacros_translate:n #1
-  {
-    \bool_if:NTF \l__chemmacros_language_auto_bool
-      { \GetTranslation { \c__chemmacros_keyword_prefix_tl #1 } }
-      {
-        \GetTranslationFor
-          {\l_chemmacros_language_tl}
-          { \c__chemmacros_keyword_prefix_tl #1 }
-      }
-  }
-
-\DeclareExpandableDocumentCommand \ChemTranslate {m}
-  { \chemmacros_translate:n {#1} }
-
-\chemmacros_define_global_keys:n
-  {
-    language .value_required:n = true ,
-    language .code:n =
-      \tl_if_eq:nnTF {#1} {auto}
-        { \bool_set_true:N \l__chemmacros_language_auto_bool }
-        {
-          \bool_set_false:N \l__chemmacros_language_auto_bool
-          \tl_set:Nn \l__chemmacros_current_language_tl {#1}
-        } ,
-    language .initial:n = auto
-  }
-
-\ChemCompatibilityTo{5.3}
-\chemmacros_define_global_keys:n
-  {
-    german   .meta:n = { language = german } ,
-    ngerman  .meta:n = { language = ngerman }
-  }
-\EndChemCompatibility
-
-\AtBeginDocument{
-  \bool_if:NTF \l__chemmacros_language_auto_bool
-    {
-      \tl_set:Nx \l_chemmacros_language_tl
-        { \@trnslt at language{\@trnslt at current@language} }
-    }
-    {
-      \tl_set_eq:NN
-        \l_chemmacros_language_tl
-        \l__chemmacros_current_language_tl
-    }   
-}
-
-% --------------------------------------------------------------------------
-\cs_new_protected:Npn \__chemmacros_declare_translation:nw #1#2=#3\q_stop
-  {
-    \tl_set:Nx \l__chemmacros_tmpa_tl { \tl_trim_spaces:n {#2} }
-    \tl_set:Nx \l__chemmacros_tmpb_tl { \tl_trim_spaces:n {#3} }
-    \use:x
-      {
-        \chemmacros_declare_translation:nnn
-          { \exp_not:n {#1} }
-          { \exp_not:V \l__chemmacros_tmpa_tl }
-          { \exp_not:V \l__chemmacros_tmpb_tl }
-      }
-  }
-
-% #1: key
-% #2: lang
-% #3: translation
-\cs_new_protected:Npn \chemmacros_declare_translation:nnn #1#2#3
-  {
-    \declaretranslation
-      {#2}
-      { \c__chemmacros_keyword_prefix_tl #1 }
-      {#3}
-    \prop_gput:Nnn \g_chemmacros_translations_prop {#1(#2)} {#3}
-  }
-\cs_generate_variant:Nn \chemmacros_declare_translation:nnn {V}
-
-% #1: key
-% #2: csv list: { <lang1> = <translation1> , <lang2> = <translation2> }
-\cs_new_protected:Npn \chemmacros_declare_translations:nn #1#2
-  {
-    \clist_map_inline:nn {#2}
-      { \__chemmacros_declare_translation:nw {#1} ##1 \q_stop }
-  }
-
-\NewDocumentCommand \DeclareChemTranslations {mm}
-  { \chemmacros_declare_translations:nn {#1} {#2} }
-\@onlypreamble \DeclareChemTranslations
-  
-\NewDocumentCommand \DeclareChemTranslation {mmm}
-  { \chemmacros_declare_translation:nnn {#1} {#2} {#3} }
-\@onlypreamble \DeclareChemTranslation
-
-\cs_new:Npn \__chemmacros_parse_translate_list_entry:nnn #1#2#3 {}
-
-\cs_new_protected:Npn \__chemmacros_parse_translate_list_entry:www #1(#2)\q_mark#3\q_stop
-  { \__chemmacros_parse_translate_list_entry:nnn {#1} {#2} {#3} }
-
-\cs_new_protected:Npn \chemmacros_for_all_translations_do:n #1
-  {
-    \cs_set:Npn \__chemmacros_parse_translate_list_entry:nnn ##1##2##3 {#1}
-    \prop_map_inline:Nn \g_chemmacros_translations_prop
-      { \__chemmacros_parse_translate_list_entry:www ##1 \q_mark ##2 \q_stop }
-  }
-
-\ChemCompatibilityFrom{5.7}
-\NewDocumentCommand \ForAllChemTranslationsDo {+m}
-  { \chemmacros_for_all_translations_do:n {#1} }
-\EndChemCompatibility
-
-% --------------------------------------------------------------------------
-\file_input_stop:
-
-2015/11/17 - remove options `german' and `ngerman', starting with v5.3
-2016/02/03 - adapt to changes in `acid-base' module
-2016/04/27 - additions/changes to reaction and scheme translations
-           - \chemmacros_declare_translation:nnn and
-             \chemmacros_declare_translations:nn
-           - \DeclareChemTranslation and \DeclareChemTranslations
-           - moved translations from lang module to the corresponding modules
-             they belong to
-2016/05/31 - add prefix string to translation keywords
-           - add logging of translation keywords
-           - \ForAllChemTranslationsDo

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.mechanisms.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.mechanisms.code.tex	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.mechanisms.code.tex	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,165 +0,0 @@
-% --------------------------------------------------------------------------
-%
-% the CHEMMACROS package -- module: `mechanisms'
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\ChemModule{mechanisms}{2015/06/09 reaction mechanisms}
-
-\RequirePackage{amstext}
-
-% --------------------------------------------------------------------------
-% reaction mechanisms
-% \mech[<type>]
-% <type> - substitutions: {}, 1, 2, se, 1e, 2e, ar
-%        - eliminations:  e, e1, e2, cb
-\tl_new:N \l__chemmacros_mechanisms_type_tl
-\tl_new:N \l__chemmacros_mechanisms_mol_tl
-\tl_new:N \l__chemmacros_mechanisms_ar_tl
-
-\cs_new_protected:Npn \__chemmacros_set_mechanisms:nnn #1#2#3
-  {
-    \tl_set:Nn \l__chemmacros_mechanisms_type_tl {#1}
-    \tl_set:Nn \l__chemmacros_mechanisms_mol_tl  {#2}
-    \tl_set:Nn \l__chemmacros_mechanisms_ar_tl   {#3}
-  }
-
-\chemmacros_define_keys:nn {mechanisms}
-  {
-    type      .choice: ,
-    type /    .code:n    =
-      {
-        \__chemmacros_set_mechanisms:nnn {S}
-          {
-            \c_math_toggle_token
-              \c_math_subscript_token { \text {N} }
-            \c_math_toggle_token
-          }
-          { }
-      } ,
-    type / 1  .code:n    =
-      {
-        \__chemmacros_set_mechanisms:nnn {S}
-          {
-            \c_math_toggle_token
-              \c_math_subscript_token { \text {N} }
-            \c_math_toggle_token
-            1
-          }
-          { }
-      } ,
-    type / 2  .code:n    =
-      {
-        \__chemmacros_set_mechanisms:nnn {S}
-          {
-            \c_math_toggle_token
-              \c_math_subscript_token { \text {N} }
-            \c_math_toggle_token
-            2
-          }
-          { }
-      } ,
-    type / se .code:n    =
-      {
-        \__chemmacros_set_mechanisms:nnn {S}
-          {
-            \c_math_toggle_token
-              \c_math_subscript_token { \text {E} }
-            \c_math_toggle_token
-          }
-          { }
-      } ,
-    type / 1e .code:n    =
-      {
-        \__chemmacros_set_mechanisms:nnn {S}
-          {
-            \c_math_toggle_token
-              \c_math_subscript_token { \text {E} }
-            \c_math_toggle_token
-            1
-          }
-          { }
-      } ,
-    type / 2e .code:n    =
-      {
-        \__chemmacros_set_mechanisms:nnn {S}
-          {
-            \c_math_toggle_token
-              \c_math_subscript_token { \text {E} }
-            \c_math_toggle_token
-            2
-          }
-          { }
-      } ,
-    type / ar .code:n    =
-      {
-        \__chemmacros_set_mechanisms:nnn {S}
-          {
-            \c_math_toggle_token
-              \c_math_subscript_token { \text {E} }
-            \c_math_toggle_token
-          }
-          { Ar - }
-      } ,
-    type / e  .code:n    =
-      { \__chemmacros_set_mechanisms:nnn {E} { } { } } ,
-    type / e1 .code:n    =
-      { \__chemmacros_set_mechanisms:nnn {E} {1} { } } ,
-    type / e2 .code:n    =
-      { \__chemmacros_set_mechanisms:nnn {E} {2} { } } ,
-    type / cb .code:n    =
-      {
-        \__chemmacros_set_mechanisms:nnn {E}
-          {
-            1
-            \c_math_toggle_token
-              \c_math_subscript_token { \text {cb} }
-            \c_math_toggle_token
-          }
-          { }
-      } ,
-    type      .default:n = 
-  }
-
-\cs_new_protected:Npn \chemmacros_mechanisms:n #1
-  {
-    \tl_if_blank:nTF {#1}
-      { \chemmacros_set_keys:nn {mechanisms} { type } }
-      { \chemmacros_set_keys:nn {mechanisms} { type = #1 } }
-    \mbox
-      {
-        \tl_use:N \l__chemmacros_mechanisms_ar_tl
-        \tl_use:N \l__chemmacros_mechanisms_type_tl
-        \tl_use:N \l__chemmacros_mechanisms_mol_tl
-      }
-  }
-
-\NewDocumentCommand \mech {o}
-  {
-    \IfNoValueTF {#1}
-      { \chemmacros_mechanisms:n { } }
-      { \chemmacros_mechanisms:n {#1} }
-  }
-
-% --------------------------------------------------------------------------

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.newman.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.newman.code.tex	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.newman.code.tex	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,212 +0,0 @@
-% --------------------------------------------------------------------------
-%
-% the CHEMMACROS package -- module: `newman'
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\ChemModule{newman}{2016/04/23 newman projections}
-
-\chemmacros_load_module:n {tikz}
-
-% Newman projections
-\fp_new:N  \l__chemmacros_newman_rel_angle_fp
-\fp_zero:N \l__chemmacros_newman_rel_angle_fp
-\fp_new:N  \l__chemmacros_newman_tmp_angle_fp
-\fp_new:N  \l__chemmacros_newman_abs_angle_fp
-\fp_zero:N \l__chemmacros_newman_abs_angle_fp
-\fp_new:N  \l__chemmacros_newman_scale_fp
-\fp_set:Nn \l__chemmacros_newman_scale_fp {1}
-\fp_new:N  \l__chemmacros_newman_x_fp
-\fp_new:N  \l__chemmacros_newman_y_fp
-
-\tl_new:N \l__chemmacros_newman_tikz_ring_tl
-\tl_new:N \l__chemmacros_newman_tikz_front_tl
-\tl_new:N \l__chemmacros_newman_tikz_back_tl
-
-\bool_new:N \l__chemmacros_newman_tikz_back_bool
-
-\chemmacros_define_keys:nn {newman}
-  {
-    ring       .tl_set:N  = \l__chemmacros_newman_tikz_ring_tl ,
-    atoms      .tl_set:N  = \l__chemmacros_newman_tikz_front_tl ,
-    back-atoms .code:n    =
-      {
-        \bool_set_true:N \l__chemmacros_newman_tikz_back_bool
-        \tl_set:Nn \l__chemmacros_newman_tikz_back_tl { #1 }
-      } ,
-    scale       .fp_set:N  = \l__chemmacros_newman_scale_fp ,
-    scale       .default:n = 1 ,
-    angle       .fp_set:N  = \l__chemmacros_newman_abs_angle_fp ,
-    angle       .default:n = 0
-  }
-
-% \newman[<keyval>](<angle>){<1>,<2>,<3>,<4>,<5>,<6>}
-\NewDocumentCommand \newman {od()m}
-  {
-    \group_begin:
-      \IfNoValueF  {#1} { \chemmacros_set_keys:nn {newman} {#1} }
-      \IfNoValueTF {#2}
-        { \chemmacros_newman:nn {  } {#3} }
-        { \chemmacros_newman:nn {#2} {#3} }
-    \group_end:
-  }
-
-% #1: angle
-% #2: csv list of atoms
-\cs_new_protected:Npn \chemmacros_newman:nn #1#2
-  { \__chemmacros_newman_feed_atoms:nw {#1}#2 ,,,,,, \q_stop }
-
-\cs_new_protected:Npn \__chemmacros_newman_feed_atoms:nw #1#2,#3,#4,#5,#6,#7,#8 \q_stop
-  { \chemmacros_newman_atoms:nnnnnnn {#1} {#2} {#3} {#4} {#5} {#6} {#7} }
-
-% place atoms:
-% #1: angle
-% #2 - #7: atoms
-\cs_new_protected:Npn \chemmacros_newman_atoms:nnnnnnn #1#2#3#4#5#6#7
-  {
-    \tl_if_blank:nTF {#1}
-      {
-        \fp_set_eq:NN
-          \l__chemmacros_newman_rel_angle_fp
-          \l__chemmacros_newman_abs_angle_fp
-      }
-      { \fp_set:Nn \l__chemmacros_newman_rel_angle_fp {#1} }
-    \chemmacros_tikz_picture:xn
-      {
-        scale = \fp_to_decimal:N \l__chemmacros_newman_scale_fp ,
-        chemmacros_newman_atom_front / .style =
-          {
-            inner~sep = 0pt ,
-            outer~sep = 0pt ,
-            \exp_not:V \l__chemmacros_newman_tikz_front_tl
-          },
-        chemmacros_newman_atom_back / .style =
-          {
-            inner~sep = 0pt ,
-            outer~sep = 0pt ,
-            \bool_if:NTF \l__chemmacros_newman_tikz_back_bool
-              { \exp_not:V \l__chemmacros_newman_tikz_back_tl }
-              { \exp_not:V \l__chemmacros_newman_tikz_front_tl }
-          }
-      }
-      {
-        \chemmacros_tikz_draw:x
-          { \exp_not:V \l__chemmacros_newman_tikz_ring_tl }
-          (0pt,0pt) circle (\fp_to_dim:N \l__chemmacros_newman_scale_fp * 15) ;
-        \chemmacros_newman_back_node:nn  {30}  {#6}
-        \chemmacros_newman_back_node:nn  {150} {#7}
-        \chemmacros_newman_back_node:nn  {270} {#5}
-        \chemmacros_newman_front_node:nn {90}  {#2}
-        \chemmacros_newman_front_node:nn {210} {#3}
-        \chemmacros_newman_front_node:nn {330} {#4}
-    }
-  }
-
-% provide cartesian coordiantes from polar coordinates
-% #1: fp variable for x
-% #2: fp variable for y
-% #3: angle
-% #4: radius
-\cs_new_protected:Npn \chemmacros_polar_to_cartesian:NNnn #1#2#3#4
-  {
-    \fp_set:Nn #1 { #4 * cos( #3 / 180 * pi ) }% x
-    \fp_set:Nn #2 { #4 * sin( #3 / 180 * pi ) }% y
-  }
-
-% place back nodes
-\cs_new_protected:Npn \chemmacros_newman_back_node:nn #1#2
-  {
-    \group_begin:
-      \fp_add:Nn \l__chemmacros_newman_rel_angle_fp { #1 }
-      \chemmacros_polar_to_cartesian:NNnn
-        \l__chemmacros_newman_x_fp
-        \l__chemmacros_newman_y_fp
-        { \l__chemmacros_newman_rel_angle_fp }
-        { \l__chemmacros_newman_scale_fp }
-      \chemmacros_tikz_draw:x
-        { \exp_not:V \l__chemmacros_newman_tikz_ring_tl }
-        (
-          15 * \fp_to_dim:N \l__chemmacros_newman_x_fp ,
-          15 * \fp_to_dim:N \l__chemmacros_newman_y_fp
-        )
-        --
-        (
-          30 * \fp_to_dim:N \l__chemmacros_newman_x_fp ,
-          30 * \fp_to_dim:N \l__chemmacros_newman_y_fp
-        ) ;
-      \chemmacros_polar_to_cartesian:NNnn
-        \l__chemmacros_newman_x_fp
-        \l__chemmacros_newman_y_fp
-        { \l__chemmacros_newman_rel_angle_fp }
-        { \l__chemmacros_newman_scale_fp }
-      \chemmacros_tikz_node:x
-        {
-          chemmacros_newman_atom_back,
-          anchor = -180 + \fp_to_int:N \l__chemmacros_newman_rel_angle_fp
-        }
-        at
-        (
-          31 * \fp_to_dim:N \l__chemmacros_newman_x_fp ,
-          31 * \fp_to_dim:N \l__chemmacros_newman_y_fp
-        )
-        { #2 } ;
-    \group_end:
-  }
-\cs_generate_variant:Nn \chemmacros_newman_back_node:nn { nf }
-
-% place front nodes:
-\cs_new_protected:Npn \chemmacros_newman_front_node:nn #1#2
-  {
-    \chemmacros_polar_to_cartesian:NNnn
-      \l__chemmacros_newman_x_fp
-      \l__chemmacros_newman_y_fp
-      { #1 }
-      { \l__chemmacros_newman_scale_fp }
-    \chemmacros_tikz_draw:x
-      { \exp_not:V \l__chemmacros_newman_tikz_ring_tl }
-      (0pt,0pt) -- ++
-      (
-        30 * \fp_to_dim:N \l__chemmacros_newman_x_fp ,
-        30 * \fp_to_dim:N \l__chemmacros_newman_y_fp
-      ) ;
-    \chemmacros_polar_to_cartesian:NNnn
-      \l__chemmacros_newman_x_fp
-      \l__chemmacros_newman_y_fp
-      { #1 }
-      { \l__chemmacros_newman_scale_fp }
-    \chemmacros_tikz_node:x
-      { chemmacros_newman_atom_front, anchor = -180 + #1 }
-      at
-      (
-        31 * \fp_to_dim:N \l__chemmacros_newman_x_fp ,
-        31 * \fp_to_dim:N \l__chemmacros_newman_y_fp
-      )
-      { #2 } ;
-  }
-\cs_generate_variant:Nn \chemmacros_newman_front_node:nn { nf }
-
-% --------------------------------------------------------------------------
-\file_input_stop:
-
-2016/04/23 - some changes on how \newman is processed internally

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.nomenclature.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.nomenclature.code.tex	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.nomenclature.code.tex	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,978 +0,0 @@
-% --------------------------------------------------------------------------
-%
-% the CHEMMACROS package -- module: `nomenclature'
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\ChemModule{nomenclature}{2017/06/11 chemical names}
-
-\RequirePackage{scrlfile}
-
-\chemmacros_load_module:n {tikz}
-
-\bool_new:N      \l__chemmacros_iupac_restricted_bool
-\bool_new:N      \l__chemmacros_iupac_strict_bool
-
-\msg_new:nnn {chemmacros} {new-iupac}
-  {
-    You've~ tried~ to~ define~ a~ iupac~ naming~ command~ with~
-    \token_to_str:N \NewChemIUPAC ,~ but~ the~ iupac~ command~
-    \token_to_str:N #1 \c_space_tl already~ exists.~ Choose~ another~ name~
-    or~ use~ \token_to_str:N \RenewChemIUPAC .
-  }
-
-\msg_new:nnn {chemmacros} {renew-iupac}
-  {
-    You've~ tried~ to~ renew~ the~ iupac~ command~ \token_to_str:N #1 ,~ but~
-    it~ doesn't~ exist.~ Use~ \token_to_str:N \NewChemIUPAC \c_space_tl
-    instead.
-  }
-
-\msg_new:nnn {chemmacros} {let-iupac}
-  {
-    You've~ tried~ to~ let~ the~ iupac~ command~ \token_to_str:N #1
-    \c_space_tl to~ the~ iupac~ command~ \token_to_str:N #2 ,~ but~ the~
-    latter~ doesn't~ exist.~  Use~ \token_to_str:N \NewChemIUPAC \c_space_tl
-    instead~ or~declare~ \token_to_str:N #2 \c_space_tl first.
-  }
-
-\msg_new:nnn {chemmacros} {new-iupac-shorthand}
-  {
-    You've~ tried~ to~ define~ a~ iupac~ shorthand~ with~ \token_to_str:N
-    \NewChemIUPACShorthand ,~ but~ the~ shorthand~ \token_to_str:N #1
-    \c_space_tl already~ exists.~ Please~ choose~ another~ token.
-  }
-
-\msg_new:nnn {chemmacros} {renew-iupac-shorthand}
-  {
-    You've~ tried~ to~ renew~ the~ iupac~ shorthand~ \token_to_str:N #1 ,~
-    but~ this~ shorthand~ doesn't~ exist,~ yet.
-  }
-
-\msg_new:nnn {chemmacros} {show-iupac}
-  { \\ >~ \token_to_str:N #1=iupac~macro: \\ -> #2 }
-
-\msg_new:nnn {chemmacros} {no-iupac-command}
-  { \\ >~ \token_to_str:N #1=not~ defined~ as~ iupac~ macro }
-
-\cs_generate_variant:Nn \msg_show:nnnn {nnnV}
-
-% --------------------------------------------------------------------------
-\prop_new:N \l__chemmacros_iupac_prop
-
-\cs_new_protected:Npn \__chemmacros_iupac_name:NN #1#2
-  { \str_set:Nx #2 { \chemmacros_remove_backslash:N #1 } }
-
-\cs_new_protected:Npn \__chemmacros_define_iupac:Nn #1#2
-  {
-    \__chemmacros_iupac_name:NN #1 \l__chemmacros_tmpa_str
-    \prop_put:NVn \l__chemmacros_iupac_prop
-      \l__chemmacros_tmpa_str
-      {#2}
-    \chemmacros_make_iupac:
-  }
-\cs_generate_variant:Nn \__chemmacros_define_iupac:Nn {NV}
-
-\cs_new_protected:Npn \__chemmacros_let_iupac:NN #1#2
-  {
-    \__chemmacros_iupac_name:NN #1 \l__chemmacros_tmpa_str
-    \__chemmacros_iupac_name:NN #2 \l__chemmacros_tmpb_str
-    \tl_set:Nx \l__chemmacros_tmpa_tl
-      { \prop_item:NV \l__chemmacros_iupac_prop \l__chemmacros_tmpb_str }
-    \__chemmacros_define_iupac:NV #1 \l__chemmacros_tmpa_tl
-  }
-
-\cs_new_protected:Npn \chemmacros_show_iupac:N #1
-  {
-    \group_begin:
-      \__chemmacros_iupac_name:NN #1 \l__chemmacros_tmpa_str
-      \tl_set:Nx \l__chemmacros_tmpa_tl
-        { \prop_item:NV \l__chemmacros_iupac_prop \l__chemmacros_tmpa_str }
-      \tl_if_empty:NTF \l__chemmacros_tmpa_tl
-        { \msg_show:nnn {chemmacros} {no-iupac-command} {#1} }
-        { \msg_show:nnnV {chemmacros} {show-iupac} {#1} \l__chemmacros_tmpa_tl }
-    \group_end:
-  }
-
-\prg_new_protected_conditional:Npnn \chemmacros_if_iupac:N #1 {T,F,TF}
-  {
-    \__chemmacros_iupac_name:NN #1 \l__chemmacros_tmpa_str
-    \prop_if_in:NVTF \l__chemmacros_iupac_prop \l__chemmacros_tmpa_str
-      { \prg_return_true: }
-      { \prg_return_false: }
-  }
-
-\cs_new_protected:Npn \chemmacros_new_iupac:Nn #1#2
-  {
-    \chemmacros_if_iupac:NTF #1
-      { \msg_error:nnn {chemmacros} {new-iupac} {#1} }
-      { \__chemmacros_define_iupac:Nn #1 {#2} }
-  }
-
-\cs_new_protected:Npn \chemmacros_provide_iupac:Nn #1#2
-  {
-    \chemmacros_if_iupac:NF #1
-      { \__chemmacros_define_iupac:Nn #1 {#2} }
-  }
-
-\cs_new_protected:Npn \chemmacros_define_iupac:Nn #1#2
-  { \__chemmacros_define_iupac:Nn #1 {#2} }
-
-\cs_new_protected:Npn \chemmacros_renew_iupac:Nn #1#2
-  {
-    \chemmacros_if_iupac:NTF #1
-      { \__chemmacros_define_iupac:Nn #1 {#2} }
-      { \msg_error:nnn {chemmacros} {renew-iupac} {#1} }
-  }
-
-\cs_new_protected:Npn \chemmacros_let_iupac:NN #1#2
-  {
-    \chemmacros_if_iupac:NTF #2
-      { \__chemmacros_let_iupac:NN #1#2 }
-      { \msg_error:nnnn {chemmacros} {let-iupac} {#1} {#2} }
-  }
-
-\ChemCompatibilityTo{5.2}
-\cs_new_protected:Npn \chemmacros_make_iupac:
-  {
-    \bool_if:NT \l__chemmacros_in_document_bool
-      {
-        \bool_if:NTF \l__chemmacros_inside_iupac_bool
-          {
-            \prop_map_inline:Nn \l__chemmacros_iupac_prop
-              { \cs_set_protected:cpn {##1} {##2} }
-          }
-          {
-            \bool_if:NF \l__chemmacros_iupac_restricted_bool
-              {
-                \bool_if:NTF \l__chemmacros_iupac_strict_bool
-                  {
-                    \prop_map_inline:Nn \l__chemmacros_iupac_prop
-                      { \cs_set_protected:cpn {##1} {##2} }
-                  }
-                  {
-                    \prop_map_inline:Nn \l__chemmacros_iupac_prop
-                      {
-                        \cs_if_exist:cF {##1}
-                          { \cs_set_protected:cpn {##1} {##2} }
-                      }
-                  }
-              }
-          }
-      }    
-  }
-\AtBeginDocument { \chemmacros_make_iupac: }
-\EndChemCompatibility
-
-\ChemCompatibilityFrom{5.2}
-\cs_new_protected:Npn \chemmacros_make_iupac:
-  {
-    \chemmacros_if_document:T
-      {
-        \bool_if:NTF \l__chemmacros_inside_iupac_bool
-          {
-            \prop_map_inline:Nn \l__chemmacros_iupac_prop
-              { \cs_set_protected:cpn {##1} {##2} }
-          }
-          {
-            \bool_if:NF \l__chemmacros_iupac_restricted_bool
-              {
-                \bool_if:NTF \l__chemmacros_iupac_strict_bool
-                  {
-                    \prop_map_inline:Nn \l__chemmacros_iupac_prop
-                      { \cs_set_protected:cpn {##1} {##2} }
-                  }
-                  {
-                    \prop_map_inline:Nn \l__chemmacros_iupac_prop
-                      {
-                        \cs_if_exist:cF {##1}
-                          { \cs_set_protected:cpn {##1} {##2} }
-                      }
-                  }
-              }
-          }
-      }    
-  }
-\AfterEndPreamble { \chemmacros_make_iupac: }
-\EndChemCompatibility
-
-\NewDocumentCommand \DeclareChemIUPAC {mm}
-  { \chemmacros_define_iupac:Nn #1 {#2} }
-
-\NewDocumentCommand \NewChemIUPAC {mm}
-  { \chemmacros_new_iupac:Nn #1 {#2} }
-
-\NewDocumentCommand \RenewChemIUPAC {mm}
-  { \chemmacros_renew_iupac:Nn #1 {#2} }
-
-\NewDocumentCommand \ProvideChemIUPAC {mm}
-  { \chemmacros_provide_iupac:Nn #1 {#2} }
-
-\NewDocumentCommand \LetChemIUPAC {mm}
-  { \chemmacros_let_iupac:NN #1 #2 }
-
-% --------------------------------------------------------------------------
-\chemmacros_define_keys:nn {nomenclature}
-  {
-    iupac              .choice: ,
-    iupac / restricted .code:n     =
-      \bool_set_true:N \l__chemmacros_iupac_restricted_bool
-      \bool_set_false:N \l__chemmacros_iupac_strict_bool ,
-    iupac / auto       .code:n     =
-      \bool_set_false:N \l__chemmacros_iupac_restricted_bool
-      \bool_set_false:N \l__chemmacros_iupac_strict_bool ,
-    iupac / strict     .code:n     =
-      \bool_set_false:N \l__chemmacros_iupac_restricted_bool
-      \bool_set_true:N \l__chemmacros_iupac_strict_bool ,
-  }
-
-% --------------------------------------------------------------------------
-% stereo descriptors and other nomenclature commands
-% Cahn-Ingold-Prelog
-\dim_new:N  \l__chemmacros_cip_kern_dim
-\dim_set:Nn \l__chemmacros_cip_kern_dim {.075em}
-
-\chemmacros_define_keys:nn {nomenclature}
-  { cip-kern .dim_set:N = \l__chemmacros_cip_kern_dim }
-
-\ChemCompatibilityTo{5.2}
-\cs_new_protected:Npn \chemmacros_cip:n #1
-  { \textit{#1} \tex_kern:D \l__chemmacros_cip_kern_dim }
-
-\NewDocumentCommand \cip {m}
-  { \chemmacros_cip:n {#1} }
-\EndChemCompatibility
-
-\ChemCompatibilityBetween{5.2}{5.8}
-\cs_new_protected:Npn \chemmacros_cip:n #1
-  {
-    \int_zero:N \l__chemmacros_tmpa_int
-    \textup{(}
-    \clist_map_inline:nn
-      {#1}
-      {
-        \int_incr:N \l__chemmacros_tmpa_int
-        \textit{##1}
-        \int_compare:nT
-          { \l__chemmacros_tmpa_int < \clist_count:n {#1} }
-          { \textup{,} }
-      }
-    \textup{)}
-    \tex_kern:D \l__chemmacros_cip_kern_dim
-  }
-\DeclareChemIUPAC \cip { \chemmacros_cip:n }
-\EndChemCompatibility
-
-\ChemCompatibilityFrom{5.8}
-\tl_new:N \l__chemmacros_cip_inner_tl
-\tl_new:N \l__chemmacros_cip_outer_tl
-\tl_new:N \l__chemmacros_cip_number_tl
-
-\chemmacros_define_keys:nn {nomenclature}
-  {
-    cip-inner-format  .tl_set:N  = \l__chemmacros_cip_inner_tl ,
-    cip-inner-format  .initial:n = \itshape ,
-    cip-outer-format  .tl_set:N  = \l__chemmacros_cip_outer_tl ,
-    cip-outer-format  .initial:n = \upshape ,
-    cip-number-format .tl_set:N  = \l__chemmacros_cip_number_tl ,
-    cip-number-format .initial:n = \itshape
-  }
-  
-\cs_new_protected:Npn \__chemmacros_cip:n #1
-  {
-    \tl_set:Nn \l__chemmacros_tmpa_tl {#1}
-    \int_step_inline:nnnn {0} {1} {9}
-      {
-        \tl_replace_all:Nnn \l__chemmacros_tmpa_tl
-          {##1}
-          { { \l__chemmacros_cip_number_tl ##1} }
-      }
-    { \l__chemmacros_cip_inner_tl \l__chemmacros_tmpa_tl }
-  }
-
-\cs_new_protected:Npn \chemmacros_cip:n #1
-  {
-    \int_zero:N \l__chemmacros_tmpa_int
-    \group_begin:
-      \l__chemmacros_cip_outer_tl (
-      \clist_map_inline:nn
-        {#1}
-        {
-          \int_incr:N \l__chemmacros_tmpa_int
-          \__chemmacros_cip:n {##1}
-          \int_compare:nT
-            { \l__chemmacros_tmpa_int < \clist_count:n {#1} }
-            { , }
-        }
-      )
-    \group_end:
-    \tex_kern:D \l__chemmacros_cip_kern_dim
-  }
-\DeclareChemIUPAC \cip { \chemmacros_cip:n }
-\EndChemCompatibility
-
-% remember: TikZ needs : to be other
-\cs_new_protected:Npn \chemmacros_sconf:n #1
-  {
-    \group_begin:
-      \chemmacros_tikz:nn
-        { baseline,text~ height=1.5ex,text~ depth=.25ex }
-        {
-          \chemmacros_tikz_node:n {anchor=base} (chemmacros@@Sconf) {#1} ;
-          \chemmacros_tikz_draw:n {->,thick,rotate=90}
-            ($(chemmacros@@Sconf.center)+(20\c_chemmacros_other_colon_tl.8em)$)
-            arc (20\c_chemmacros_other_colon_tl340\c_chemmacros_other_colon_tl.8em);
-        }
-    \group_end:
-  }
-
-\cs_new_protected:Npn \chemmacros_rconf:n #1
-  {
-    \group_begin:
-      \tikz[baseline,text~ height=1.5ex,text~ depth=.25ex]
-        {
-          \chemmacros_tikz_node:n {anchor=base} (chemmacros@@Rconf) {#1} ;
-          \chemmacros_tikz_draw:n {<-,thick,rotate=90}
-            ($(chemmacros@@Rconf.center)+(20\c_chemmacros_other_colon_tl.8em)$)
-            arc (20\c_chemmacros_other_colon_tl340\c_chemmacros_other_colon_tl.8em) ;
-        }
-    \group_end:
-  }
-
-\NewDocumentCommand \Sconf { O{S} } { \chemmacros_sconf:n {#1} }
-\NewDocumentCommand \Rconf { O{R} } { \chemmacros_rconf:n {#1} }
-
-% coordination chemistry
-\bool_new:N \l__chemmacros_bridge_super_bool
-
-\chemmacros_define_keys:nn {nomenclature}
-  {
-    bridge-number         .choice: ,
-    bridge-number / sub   .code:n     =
-      \bool_set_false:N \l__chemmacros_bridge_super_bool ,
-    bridge-number / super .code:n     =
-      \bool_set_true:N \l__chemmacros_bridge_super_bool ,
-    coord-use-hyphen      .bool_set:N = \l__chemmacros_coord_use_hyphen_bool ,
-    coord-use-hyphen      .initial:n  = true
-  }
-
-% #1: boolean - if true hyphen is turned on
-% #2: boolean - if true superscript will be used
-% #3: symbol
-% #4: sub-/superscript
-\cs_new_protected:Npn \chemmacros_coordination_symbol:nnnn #1#2#3#4
-  {
-    \chemmacros_chemformula:n {#3}
-    \tl_if_blank:nF {#4}
-      {
-        \bool_if:nTF {#2}
-          { \chemmacros_chemformula:n { {}^{#4} } }
-          { \chemmacros_chemformula:n { {}_{#4} } }
-      }
-    \bool_if:nT
-      {#1}
-      { \chemmacros_break_point_hyphen: }
-  }
-
-\cs_new_protected:Npn \chemmacros_hapto:n #1
-  {
-    \chemmacros_coordination_symbol:nnnn
-      { \l__chemmacros_coord_use_hyphen_bool }
-      {
-        \chemmacros_if_compatibility:nnTF {>} {5.7}
-          { \c_true_bool }
-          { \c_false_bool }
-      }
-      { \chemeta }
-      {#1}
-  }
-
-\cs_new_protected:Npn \chemmacros_dento:n #1
-  {
-    \chemmacros_coordination_symbol:nnnn
-      { \l__chemmacros_coord_use_hyphen_bool }
-      {
-        \chemmacros_if_compatibility:nnTF {>} {5.7}
-          { \c_true_bool }
-          { \c_false_bool }
-      }
-      { \chemkappa }
-      {#1}
-  }
-
-\cs_new_protected:Npn \chemmacros_bridge:n #1
-  {
-    \chemmacros_coordination_symbol:nnnn
-      { \l__chemmacros_coord_use_hyphen_bool }
-      { \l__chemmacros_bridge_super_bool }
-      { \chemmu }
-      {#1}
-  }
-
-% \iupac (basically the same as bpchem's \IUPAC)
-% - allows multiple breaking points as compound names can get really long and
-%   especially in multicolumn documents can span more than two lines
-% - add a (very) little space before the hyphen and a little negative space
-%   after it
-% - add a little space at breaking points if not broken
-% - enables all naming commands regardless if they're definied otherwise or not
-\cs_new_protected:Npn \chemmacros_allow_hyphens:
-  {
-    \chemmacros_nobreak:
-    \chemmacros_if_compatibility:nnTF {<=} {5.7}
-      { \skip_horizontal:N \c_zero_dim }
-      { \skip_horizontal:N \c_zero_skip }
-  }
-
-% #1: pre break
-% #2: post break
-% #3: no break
-\ChemCompatibilityTo{5.1}
-\cs_new_protected:Npn \__chemmacros_break_point_insert:nnn #1#2#3
-  {
-    \chemmacros_nobreak:
-    \tex_discretionary:D { - } { } {#3}
-    \chemmacros_allow_hyphens:
-  }
-\EndChemCompatibility
-
-\ChemCompatibilityBetween{5.1}{5.8}
-\cs_new_protected:Npn \__chemmacros_break_point_insert:nnn #1#2#3
-  {
-    \mode_if_math:TF
-      {#3}
-      {      
-        \chemmacros_nobreak:
-        \tex_discretionary:D {#1} {#2} {#3}
-        \chemmacros_allow_hyphens:
-      }
-  }
-\EndChemCompatibility
-
-\ChemCompatibility{5.8a}
-\cs_new_protected:Npn \__chemmacros_break_point_insert:nnn #1#2#3
-  {
-    \mode_if_math:TF
-      {#3}
-      {
-        \peek_meaning:NTF \group_end:
-          {#3}
-          {
-            \chemmacros_nobreak:
-            \tex_discretionary:D {#1} {#2} {#3}
-            \chemmacros_allow_hyphens:
-          }
-      }
-  }
-\EndChemCompatibility
-
-\ChemCompatibilityFrom{5.8b}
-\cs_new_protected:Npn \__chemmacros_peek_if_dash:TF #1#2
-  {
-    \peek_charcode:NTF -
-      {#1}
-      {#2}
-  }
-
-\cs_new_protected:Npn \__chemmacros_peek_if_paren:TF #1#2
-  { % (
-    \peek_charcode:NTF )
-      {#1}
-      { % [
-        \peek_charcode:NTF ]
-          {#1}
-          {#2}
-      }
-  }
-  
-\cs_new_protected:Npn \__chemmacros_break_point_insert:nnn #1#2#3
-  {
-    \mode_if_math:TF
-      {#3}
-      {
-        \peek_meaning:NTF \group_end:
-          {#3}
-          {
-            \__chemmacros_peek_if_dash:TF
-              {#3}
-              {
-                \__chemmacros_peek_if_paren:TF
-                  {#3}
-                  {
-                    \chemmacros_nobreak:
-                    \tex_discretionary:D {#1} {#2} {#3}
-                    \chemmacros_allow_hyphens:
-                  }
-              }
-          }
-      }
-  }
-\EndChemCompatibility
-
-\dim_new:N  \l__chemmacros_iupac_hyphen_pre_dim
-\dim_set:Nn \l__chemmacros_iupac_hyphen_pre_dim { .01em }
-\dim_new:N  \l__chemmacros_iupac_hyphen_post_dim
-\dim_set:Nn \l__chemmacros_iupac_hyphen_post_dim { -.03em }
-\dim_new:N  \l__chemmacros_iupac_break_dim
-\dim_set:Nn \l__chemmacros_iupac_break_dim { .03em }
-\skip_new:N  \l__chemmacros_iupac_break_skip
-\skip_set:Nn \l__chemmacros_iupac_break_skip { .03em plus .07em }
-
-\chemmacros_define_keys:nn {nomenclature}
-  {
-    hyphen-pre-space  .dim_set:N = \l__chemmacros_iupac_hyphen_pre_dim ,
-    hyphen-post-space .dim_set:N = \l__chemmacros_iupac_hyphen_post_dim ,
-    break-space       .skip_set:N = \l__chemmacros_iupac_break_skip
-  }
-
-\ChemCompatibilityTo{5.2}
-\cs_new_protected:Npn \chemmacros_break_point_hyphen:
-  {
-    \__chemmacros_break_point_insert:nnn
-      {-}
-      { }
-      {
-        \tex_kern:D \l__chemmacros_iupac_hyphen_pre_dim
-        -
-        \tex_kern:D \l__chemmacros_iupac_hyphen_post_dim
-      }
-  }
-\EndChemCompatibility
-
-\ChemCompatibilityFrom{5.2}
-\cs_new_protected:Npn \chemmacros_break_point_hyphen:
-  {
-    \__chemmacros_break_point_insert:nnn
-      { \tex_kern:D \l__chemmacros_iupac_hyphen_pre_dim - }
-      { }
-      {
-        \tex_kern:D \l__chemmacros_iupac_hyphen_pre_dim
-        -
-        \tex_kern:D \l__chemmacros_iupac_hyphen_post_dim
-      }
-  }
-\EndChemCompatibility
-
-\cs_new_protected:Npn \chemmacros_break_point:
-  {
-    \__chemmacros_break_point_insert:nnn
-      {-}
-      { }
-      {
-        \mode_if_math:TF
-          { | }
-          { \tex_kern:D \l__chemmacros_iupac_break_dim }
-      }
-  }
-  
-\cs_new_protected:Npn \chemmacros_break_point_opening_paren:
-  { \__chemmacros_break_point_insert:nnn { - } { ( } { ( } }
-
-\cs_new_protected:Npn \chemmacros_break_point_closing_paren:
-  { \__chemmacros_break_point_insert:nnn { )- } { } { ) } }
-
-\cs_new_protected:Npn \chemmacros_break_point_opening_bracket:
-  { \__chemmacros_break_point_insert:nnn { - } { [ } { [ } }
-
-\cs_new_protected:Npn \chemmacros_break_point_closing_bracket:
-  { \__chemmacros_break_point_insert:nnn { ]- } { } { ] } }
-  
-\cs_new_protected:Npn \chemmacros_superscript:n #1
-  { \mode_if_math:TF { \sp {#1} } { \textsuperscript {#1} } }
-  
-\bool_new:N \l__chemmacros_inside_iupac_bool
-
-\seq_new:N  \l__chemmacros_iupac_shorthands_seq
-\prop_new:N \l__chemmacros_iupac_shorthands_prop
-
-% #1: token
-% #2: definition
-\cs_new_protected:Npn \chemmacros_define_iupac_shorthand:NN #1#2
-  {
-    \seq_if_in:NnF \l__chemmacros_iupac_shorthands_seq {#1}
-      { \seq_put_right:Nn \l__chemmacros_iupac_shorthands_seq {#1} }
-    \prop_put:Nnn \l__chemmacros_iupac_shorthands_prop {#1}
-      { \char_set_active_eq:NN #1#2 }
-  }
-
-\cs_new_protected:Npn \chemmacros_remove_shorthand:N #1
-  {
-    \chemmacros_define_iupac_shorthand:NN #1 \c_empty_tl
-    \seq_remove_all:Nn \l__chemmacros_iupac_shorthands_seq {#1}
-    \prop_remove:Nn \l__chemmacros_iupac_shorthands_prop {#1}
-  }
-
-\prg_new_conditional:Npnn \chemmacros_if_iupac_shorthand:N #1 {p,T,F,TF}
-  {
-    \seq_if_in:NnTF \l__chemmacros_iupac_shorthands_seq {#1}
-      { \prg_return_true: }
-      { \prg_return_false: }
-  }
-
-\cs_new_protected:Npn \chemmacros_for_all_iupac_shorthands_do:n #1
-  { \seq_map_inline:Nn \l__chemmacros_iupac_shorthands_seq {#1} }
-
-\cs_new_protected:Npn \chemmacros_activate_iupac_shorthand:N #1
-  { \chemmacros_if_iupac_shorthand:NT #1 { \char_set_catcode_active:N #1 } }
-
-\cs_new_protected:Npn \chemmacros_activate_iupac_shorthands:n #1
-  { \tl_map_inline:nn {#1} { \chemmacros_activate_iupac_shorthand:N ##1 } }
-
-\cs_new_protected:Npn \chemmacros_activate_all_iupac_shorthands:
-  {
-    \chemmacros_for_all_iupac_shorthands_do:n
-      { \chemmacros_activate_iupac_shorthand:N ##1 }
-  }
-
-\cs_new_protected:Npn \chemmacros_make_shorthands:
-  {
-    \chemmacros_if_compatibility:nnT {>=} {5.2}
-      {
-        \chemmacros_if_document:T
-          {
-            \chemmacros_for_all_iupac_shorthands_do:n
-              { \prop_item:Nn \l__chemmacros_iupac_shorthands_prop {##1} }
-          }
-      }
-  }
-
-\NewDocumentCommand \ChemMakeIupacShorthands {}
-  { \chemmacros_make_shorthands: }
-
-\NewDocumentCommand \DeclareChemIUPACShorthand {mm} 
-  { \chemmacros_define_iupac_shorthand:NN #1#2 }
-
-\NewDocumentCommand \NewChemIUPACShorthand {mm} 
-  {
-    \chemmacros_if_iupac_shorthand:NTF #1
-      { \msg_error:nnn {chemmacros} {new-iupac-shorthand} {#1} }
-      { \chemmacros_define_iupac_shorthand:NN #1#2 }
-  }
-
-\NewDocumentCommand \ProvideChemIUPACShorthand {mm} 
-  {
-    \chemmacros_if_iupac_shorthand:NTF #1
-      { \chemmacros_define_iupac_shorthand:NN #1#2 }
-  }
-
-\NewDocumentCommand \RenewChemIUPACShorthand {mm} 
-  {
-    \chemmacros_if_iupac_shorthand:NTF #1
-      { \chemmacros_define_iupac_shorthand:NN #1#2 }
-      { \msg_error:nnn {chemmacros} {renew-iupac-shorthand} {#1} }
-  }
-
-\NewDocumentCommand \RemoveChemIUPACShorthand {m} 
-  { \chemmacros_remove_shorthand:N #1 }
-
-\NewChemIUPACShorthand ^ \chemmacros_superscript:n
-\NewChemIUPACShorthand | \chemmacros_break_point:
-\NewChemIUPACShorthand - \chemmacros_break_point_hyphen:
-
-\ChemCompatibilityFrom{5.1}
-  \NewChemIUPACShorthand ( \chemmacros_break_point_opening_paren:
-  \NewChemIUPACShorthand ) \chemmacros_break_point_closing_paren:
-  \NewChemIUPACShorthand [ \chemmacros_break_point_opening_bracket:
-  \NewChemIUPACShorthand ] \chemmacros_break_point_closing_bracket:
-\EndChemCompatibility
-
-\ChemCompatibilityFrom{5.3}
-  \NewChemIUPAC \chemprime { \ensuremath {{}^{\prime}} }
-  \NewChemIUPACShorthand ' \chemprime
-\EndChemCompatibility
-
-\ChemCompatibilityFrom{5.8c}
-  \NewChemIUPAC \nonbreakinghyphen { \mbox{-} \nobreak \hspace{0pt} }
-  \NewChemIUPACShorthand = \nonbreakinghyphen
-\EndChemCompatibility
-
-\cs_new_protected:Npn \chemmacros_iupac:nn #1#2
-  {
-    \group_begin:
-      \bool_set_true:N \l__chemmacros_inside_iupac_bool
-      \chemmacros_if_compatibility:nnT {>} {5.10}
-        { \bool_set_true:N \l__chemmacros_in_document_bool }
-      \chemmacros_set_keys:nn {nomenclature} {#1}
-      \chemmacros_make_iupac:
-      \chemmacros_make_shorthands:
-      % \prop_show:N \l__chemmacros_iupac_shorthands_prop
-      \chemmacros_if_compatibility:nnT {<=} {5.2}
-        { \chemmacros_define_deprecated:NN \- - }
-      \tl_set_rescan:Nnn \l__chemmacros_tmpa_tl
-        { \chemmacros_activate_all_iupac_shorthands: }
-        {#2}
-      % \tl_analysis_show:N
-      \l__chemmacros_tmpa_tl
-    \group_end:
-  }
-
-\cs_new_protected:Npn \chemmacros_iupac:n #1 { \chemmacros_iupac:nn {} {#1} }
-
-\ChemCompatibilityTo{5.3}
-% Thanks to Joseph Wright and Enrico Gregorio for the help on the curious
-% redefinition of \- and the end of the compilation
-% see http://tex.stackexchange.com/q/42405/5049 for reference
-\cs_set_protected:Npx \- { \exp_not:o { \- } }
-\cs_set_eq:NN \@dischyph \-
-\EndChemCompatibility
-
-\NewDocumentCommand \iupac {O{}m} { \chemmacros_iupac:nn {#1} {#2} }
-
-% --------------------------------------------------------------------------
-% R(ectus)/S(inister):
-\NewChemIUPAC \rectus   { \cip {R} }
-\NewChemIUPAC \sinister { \cip {S} }
-
-\LetChemIUPAC \R \rectus
-\LetChemIUPAC \S \sinister
-
-% E(ntgegen)/Z(usammen)
-\NewChemIUPAC \entgegen { \cip {E} }
-\NewChemIUPAC \zusammen { \cip {Z} }
-
-\LetChemIUPAC \E \entgegen
-\LetChemIUPAC \Z \zusammen
-
-% cis/trans
-\NewChemIUPAC \cis   { \textit {cis} }
-\NewChemIUPAC \trans { \textit {trans} }
-
-% fac/mer
-\NewChemIUPAC \fac { \textit {fac} }
-\NewChemIUPAC \mer { \textit {mer} }
-
-% tert
-\NewChemIUPAC \tert  { \textit {tert} }
-
-% Italian descriptors - I forgot what they mean
-\NewChemIUPAC \sin { \textit {sin} }
-\NewChemIUPAC \ter { \textit {ter} }
-
-% Fischer
-\NewChemIUPAC \dexter { \textsc {d} }
-\NewChemIUPAC \laevus { \textsc {l} }
-
-\LetChemIUPAC \D \dexter
-\LetChemIUPAC \L \laevus
-
-% ortho/meta/para
-\NewChemIUPAC \ortho { \textit {o} }
-\NewChemIUPAC \meta  { \textit {m} }
-\NewChemIUPAC \para  { \textit {p} }
-
-% syn/anti
-\NewChemIUPAC \syn  { \textit {syn} }
-\NewChemIUPAC \anti { \textit {anti} }
-
-% coordination chemistry:
-\NewChemIUPAC \hapto  { \chemmacros_hapto:n }
-\NewChemIUPAC \dento  { \chemmacros_dento:n }
-\NewChemIUPAC \bridge { \chemmacros_bridge:n }
-
-% attachments to heteroatoms / added hydrogen
-\NewChemIUPAC \hydrogen   { \textit {H} }
-\NewChemIUPAC \oxygen     { \textit {O} }
-\NewChemIUPAC \nitrogen   { \textit {N} }
-\NewChemIUPAC \sulfur     { \textit {S} }
-\NewChemIUPAC \phosphorus { \textit {P} }
-
-% atoms:
-\LetChemIUPAC \H  \hydrogen
-\LetChemIUPAC \O  \oxygen
-\LetChemIUPAC \N  \nitrogen
-\LetChemIUPAC \Sf \sulfur
-\LetChemIUPAC \P  \phosphorus
-
-% greek letters
-\NewChemIUPAC \a { \chemalpha }
-\NewChemIUPAC \b { \chembeta }
-\NewChemIUPAC \g { \chemgamma }
-\NewChemIUPAC \d { \chemdelta }
-\NewChemIUPAC \k { \chemkappa }
-\NewChemIUPAC \m { \chemmu }
-\NewChemIUPAC \n { \chemeta }
-\NewChemIUPAC \w { \chemomega }
-
-% --------------------------------------------------------------------------
-% latin phrases
-\tl_new:N   \l__chemmacros_latin_format_tl
-  
-\NewChemMacroset {Latin} {mm}
-  { \chemmacros_define_latin:Nn #1 {#2} }
-
-\ChemCompatibilityTo{5.7}
-\chemmacros_define_keys:nn {nomenclature}
-  {
-    latin-format .tl_set:N  = \l__chemmacros_latin_format_tl ,
-    latin-format .initial:n = \textit ,
-  }
-
-\cs_new_protected:Npn \chemmacros_latin:n #1
-  { { \l__chemmacros_latin_format_tl {#1} } }
-  
-\cs_new_protected:Npn \chemmacros_define_latin:Nn #1#2
-  { \cs_set_protected:Npn #1 { \chemmacros_latin:n {#2} } }
-  
-\AtBeginDocument
-  {
-    % if chemstyle is loaded use chemstyle's definition:
-    \chemmacros_if_package_loaded:nT {chemstyle}
-      {
-        \AfterPackage* {chemstyle}
-          {
-            \cs_undefine:N \invacuo
-            \cs_set_eq:NN \chemmacros_latin:n \cst at latin
-          }
-      }
-    \cs_if_exist:NTF \latin
-      { \cs_set_eq:NN  \latin \chemmacros_latin:n }
-      { \cs_new_eq:NN  \latin \chemmacros_latin:n }
-    \NewChemLatin \insitu   {in~situ}
-    \NewChemLatin \abinitio {ab~initio}
-    \NewChemLatin \invacuo  {in~vacuo}
-  }
-\EndChemCompatibility
-  
-\ChemCompatibilityFrom{5.7}
-\chemmacros_define_keys:nn {nomenclature}
-  {
-    format .tl_set:N  = \l__chemmacros_latin_format_tl ,
-    format .initial:n = \emph ,
-  }
-  
-\cs_new_protected:Npn \chemmacros_write_latin:n #1
-  {
-    \group_begin:
-      \l__chemmacros_latin_format_tl {#1}
-    \group_end:
-  }
-
-\cs_new_protected:Npn \chemmacros_latin:n #1
-  { \chemmacros_write_latin:n {#1} }
-
-\cs_new_protected:Npn \chemmacros_define_latin:Nn #1#2
-  { \DeclareDocumentCommand #1 {O{}} { \latin [##1] {#2} } }
-
-\NewDocumentCommand \latin {O{}m}
-  {
-    \group_begin:
-      \chemmacros_set_keys:nn {nomenclature} {#1}
-      \chemmacros_latin:n {#2}
-    \group_end:
-  }
-\EndChemCompatibility
-
-\ChemCompatibilityBetween{5.7}{5.9}
-\AtBeginDocument
-  {
-    \AfterPackage* {chemstyle} { \cs_undefine:N \invacuo }
-    \NewChemLatin \insitu   {in~situ}
-    \NewChemLatin \abinitio {ab~initio}
-    \NewChemLatin \invacuo  {in~vacuo}
-  }
-\EndChemCompatibility
-
-\ChemCompatibilityFrom{5.9}
-\cs_undefine:N \invacuo
-\NewChemLatin \invacuo  {in~vacuo}
-\NewChemLatin \abinitio {ab~initio}
-\NewChemLatin \insitu   {in~situ}
-\EndChemCompatibility
-
-% --------------------------------------------------------------------------
-% hyperref support
-% ?? unsure about adding IUPAC commands
-\AfterPackage* {hyperref}
-  {
-    \pdfstringdefDisableCommands
-      {
-        % \cs_set:Npn \- { - } % maybe not a good idea...
-        % \cs_set:Npn \| { }
-        % \cs_set:Npn \pH { pH }
-        % \cs_set:Npn \pOH { pOH }
-        \cs_set:Npn \iupac #1 {#1}
-        \cs_set:Npn \cip   #1 {(#1)}
-        \cs_set:Npn \cis   {cis}
-        \cs_set:Npn \trans {trans}
-        \cs_set:Npn \tert  {tert}
-        \cs_set:Npn \ortho {o}
-        \cs_set:Npn \meta  {m}
-        \cs_set:Npn \para  {p}
-        \cs_set:Npn \syn   {syn}
-        \cs_set:Npn \anti  {anti}
-        \cs_set:Npn \R     {(R)}
-        \cs_set:Npn \S     {(S)}
-        \cs_set:Npn \E     {(E)}
-        \cs_set:Npn \Z     {(Z)}
-        \cs_set:Npn \D     {D}
-        \cs_set:Npn \L     {L}
-        \cs_set:Npn \H     {H}
-        \cs_set:Npn \O     {O}
-        \cs_set:Npn \N     {N}
-        \cs_set:Npn \Sf    {S}
-        \cs_set:Npn \P     {P}
-        \cs_set:Npn \dexter     {D}
-        \cs_set:Npn \laevus     {L}
-        \cs_set:Npn \rectus     {(R)}
-        \cs_set:Npn \sinister   {(S)}
-        \cs_set:Npn \entgegen   {(E)}
-        \cs_set:Npn \zusammen   {(Z)}
-        \cs_set:Npn \hydrogen   {H}
-        \cs_set:Npn \oxygen     {O}
-        \cs_set:Npn \nitrogen   {N}
-        \cs_set:Npn \sulfur     {S}
-        \cs_set:Npn \phosphorus {P}
-        \cs_set:Npn \chemprime  {'}
-      }
-  }
-  
-% --------------------------------------------------------------------------
-\file_input_stop:
-
-2015/10/01 - use new function \chemmacros_if_document:TF for
-             \chemmacros_make_iupac:
-           - \cip only italicizes elements of csv list
-           - fix bug in \RemoveChemIUPACShorthand
-2016/01/02 - \chemprime
-2016/01/23 - give shorthand definitions only inside \iupac
-2016/01/25 - small improvements (?) of the shorthand code
-2016/05/08 - check if \latin is already defined (eg by achemso) and overwrite
-             definition
-2016/05/10 - define \chemmacros_hapto:n and friends in terms of
-             \chemmacros_coordination_symbol:nnnn
-           - \iupac gets an optional argument for setting options
-2016/05/31 - overwrite any \latin definition -- or rather: just define \latin
-           - \latin and all macros defined with \NewChemLatin get an optional
-             argument for setting options
-2016/06/07 - rename functions which erroneously were assigned to the
-             `chemformula' module
-2017/04/17 - fix erroneous definition of \chemmacros_allow_hyphens:
-           - new options `cip-inner-format', `cip-outer-format' and
-             `cip-number-format'
-2017/06/11 - change behaviour of \__chemmacros_break_point_insert:nnn so
-             it does nothing as last token in \iupac
-2020/01/02 - \chemmacros_show_iupac:N
-           - \chemmacros_if_iupac:NTF
-2020/02/29 - let \chemmacros_iupac:nn think we're in the document – fixes
-             issue #30

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.orbital.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.orbital.code.tex	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.orbital.code.tex	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,576 +0,0 @@
-% --------------------------------------------------------------------------
-%
-% the CHEMMACROS package -- module: `orbital'
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\ChemModule{orbital}{2015/07/14 drawing orbital shapes}
-
-\chemmacros_load_module:n {tikz}
-
-% \orbital[<keyval>]{<type>}
-% variables:
-\bool_new:N      \l__chemmacros_orbital_type_s_bool
-\bool_new:N      \l__chemmacros_orbital_type_p_bool
-\bool_new:N      \l__chemmacros_orbital_type_sp_bool
-\bool_new:N      \l__chemmacros_orbital_type_sptwo_bool
-\bool_new:N      \l__chemmacros_orbital_type_spthree_bool
-\bool_new:N      \l__chemmacros_orbital_s_phase_bool
-\bool_set_true:N \l__chemmacros_orbital_s_phase_bool
-\bool_new:N      \l__chemmacros_orbital_p_phase_bool
-\bool_set_true:N \l__chemmacros_orbital_p_phase_bool
-\bool_new:N      \l__chemmacros_orbital_sp_phase_bool
-\bool_set_true:N \l__chemmacros_orbital_sp_phase_bool
-\bool_new:N      \l__chemmacros_orbital_sptwo_phase_bool
-\bool_set_true:N \l__chemmacros_orbital_sptwo_phase_bool
-\bool_new:N      \l__chemmacros_orbital_spthree_phase_bool
-\bool_set_true:N \l__chemmacros_orbital_spthree_phase_bool
-\bool_new:N      \l__chemmacros_orbital_p_half_bool
-\bool_new:N      \l__chemmacros_orbital_overlay_bool
-\bool_new:N      \l__chemmacros_orbital_opacity_bool
-
-\tl_new:N  \l__chemmacros_orbital_s_color_tl
-\tl_set:Nn \l__chemmacros_orbital_s_color_tl { black }
-\tl_new:N  \l__chemmacros_orbital_s_phase_color_tl
-\tl_new:N  \l__chemmacros_orbital_p_color_tl
-\tl_set:Nn \l__chemmacros_orbital_p_color_tl { black }
-\tl_new:N  \l__chemmacros_orbital_p_pphase_color_tl
-\tl_new:N  \l__chemmacros_orbital_p_mphase_color_tl
-\tl_new:N  \l__chemmacros_orbital_sp_color_tl
-\tl_set:Nn \l__chemmacros_orbital_sp_color_tl { black }
-\tl_new:N  \l__chemmacros_orbital_sp_pphase_color_tl
-\tl_new:N  \l__chemmacros_orbital_sp_mphase_color_tl
-\tl_new:N  \l__chemmacros_orbital_sptwo_color_tl
-\tl_set:Nn \l__chemmacros_orbital_sptwo_color_tl { black }
-\tl_new:N  \l__chemmacros_orbital_sptwo_pphase_color_tl
-\tl_new:N  \l__chemmacros_orbital_sptwo_mphase_color_tl
-\tl_new:N  \l__chemmacros_orbital_spthree_color_tl
-\tl_set:Nn \l__chemmacros_orbital_spthree_color_tl { black }
-\tl_new:N  \l__chemmacros_orbital_spthree_pphase_color_tl
-\tl_new:N  \l__chemmacros_orbital_spthree_mphase_color_tl
-\tl_new:N  \l__chemmacros_orbital_s_scale_tl
-\tl_set:Nn \l__chemmacros_orbital_s_scale_tl { 1 }
-\tl_new:N  \l__chemmacros_orbital_p_scale_tl
-\tl_set:Nn \l__chemmacros_orbital_p_scale_tl { 1 }
-\tl_new:N  \l__chemmacros_orbital_sp_scale_tl
-\tl_set:Nn \l__chemmacros_orbital_sp_scale_tl { 1 }
-\tl_new:N  \l__chemmacros_orbital_sptwo_scale_tl
-\tl_set:Nn \l__chemmacros_orbital_sptwo_scale_tl { 1 }
-\tl_new:N  \l__chemmacros_orbital_spthree_scale_tl
-\tl_set:Nn \l__chemmacros_orbital_spthree_scale_tl { 1 }
-
-\fp_new:N  \l__chemmacros_orbital_angle_fp
-\fp_set:Nn \l__chemmacros_orbital_angle_fp { 90 }
-\fp_new:N  \l__chemmacros_orbital_opacity_fp
-\fp_set:Nn \l__chemmacros_orbital_opacity_fp { 0.5 }
-
-\cs_new:Npn \__chemmacros_orbital_options:
-  {
-    \__chemmacros_orbital_overlay: , \__chemmacros_orbital_opacity: ,
-    inner~sep=0 , outer~sep=0 , line~width=.2pt ,
-    rotate = { \fp_use:N \l__chemmacros_orbital_angle_fp - 90 } ,
-    baseline ,
-    minimum~size = 0
-  }
-
-\cs_new:Npn \__chemmacros_orbital_overlay:
-  { \bool_if:NT \l__chemmacros_orbital_overlay_bool { overlay } }
-
-\cs_new:Npn \__chemmacros_orbital_opacity:
-  {
-    \bool_if:NT \l__chemmacros_orbital_opacity_bool
-      { opacity = { \fp_use:N \l__chemmacros_orbital_opacity_fp } }
-  }
-
-% --------------------------------------------------------------------------
-% s-orbitals
-\cs_new_protected:Npn \__chemmacros_orbital_type_s:
-  {
-    \bool_set_true:N \l__chemmacros_orbital_type_s_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_p_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_sp_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_sptwo_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_spthree_bool
-  }
-
-\chemmacros_define_keys:nn {orbital/s}
-  {
-    phase .choice: ,
-    phase / + .code:n =
-      { \bool_set_true:N \l__chemmacros_orbital_s_phase_bool } ,
-    phase / - .code:n =
-      { \bool_set_false:N \l__chemmacros_orbital_s_phase_bool } ,
-    scale .tl_set:N   = \l__chemmacros_orbital_s_scale_tl ,
-    color .tl_set:N   = \l__chemmacros_orbital_s_color_tl
-  }
-
-\cs_new_protected:Npn \__chemmacros_orbital_s_draw:n #1
-  {
-    \chemmacros_set_keys:nn {orbital/s} {#1}
-    \bool_if:NTF \l__chemmacros_orbital_s_phase_bool
-      {
-        \tl_if_in:NnTF \l__chemmacros_orbital_s_color_tl { ! }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_s_phase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_s_color_tl }
-          }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_s_phase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_s_color_tl ! 90 }
-          }
-      }
-      {
-        \tl_set:Nn \l__chemmacros_orbital_s_phase_color_tl
-          { black ! 5 }
-      }
-    \chemmacros_tikz_picture:xn
-      { \__chemmacros_orbital_options: }
-      {
-        \chemmacros_tikz_shade:x
-          { ball~color = \exp_not:V \l__chemmacros_orbital_s_phase_color_tl }
-          (0pt,0pt) circle (\exp_not:V \l__chemmacros_orbital_s_scale_tl * .6em) ;
-      }
-  }
-
-% --------------------------------------------------------------------------
-% p-orbitals
-\cs_new_protected:Npn \__chemmacros_orbital_type_p:
-  {
-    \bool_set_false:N \l__chemmacros_orbital_type_s_bool
-    \bool_set_true:N  \l__chemmacros_orbital_type_p_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_sp_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_sptwo_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_spthree_bool
-  }
-
-\chemmacros_define_keys:nn {orbital/p}
-  {
-    phase .choice: ,
-    phase / + .code:n =
-      { \bool_set_true:N \l__chemmacros_orbital_p_phase_bool } ,
-    phase / - .code:n =
-      { \bool_set_false:N \l__chemmacros_orbital_p_phase_bool } ,
-    scale .tl_set:N   = \l__chemmacros_orbital_p_scale_tl ,
-    angle .fp_set:N   = \l__chemmacros_orbital_angle_fp ,
-    color .tl_set:N   = \l__chemmacros_orbital_p_color_tl ,
-    half  .bool_set:N = \l__chemmacros_orbital_p_half_bool ,
-    half  .default:n  = true
-  }
-
-\cs_new_protected:Npn \__chemmacros_orbital_p_draw:n #1
-  {
-    \chemmacros_set_keys:nn {orbital/p} {#1}
-    \bool_if:NTF \l__chemmacros_orbital_p_phase_bool
-      {
-        \tl_if_in:NnTF \l__chemmacros_orbital_p_color_tl { ! }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_p_pphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_p_color_tl }
-          }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_p_pphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_p_color_tl ! 90 }
-          }
-        \tl_set:Nn \l__chemmacros_orbital_p_mphase_color_tl
-          { black ! 5 }
-        
-      }
-      {
-        \tl_if_in:NnTF \l__chemmacros_orbital_p_color_tl { ! }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_p_mphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_p_color_tl }
-          }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_p_mphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_p_color_tl ! 90 }
-          }
-        \tl_set:Nn \l__chemmacros_orbital_p_pphase_color_tl
-          { black ! 5 }
-      }
-    \chemmacros_tikz_picture:xn
-      { \__chemmacros_orbital_options: }
-      {
-        \chemmacros_tikz_shadedraw:x
-          {
-            draw = \exp_not:V \l__chemmacros_orbital_p_pphase_color_tl ,
-            ball~color = \exp_not:V \l__chemmacros_orbital_p_pphase_color_tl
-          }
-          (0pt,0pt) .. controls ++
-          (
-            - \l__chemmacros_orbital_p_scale_tl * 2em ,
-            \l__chemmacros_orbital_p_scale_tl * 2em
-          )
-          and ++
-          (
-            \l__chemmacros_orbital_p_scale_tl * 2em ,
-            \l__chemmacros_orbital_p_scale_tl * 2em
-          )
-          .. (0pt,0pt);
-        \bool_if:NF \l__chemmacros_orbital_p_half_bool
-          {
-            \chemmacros_tikz_shadedraw:x
-              {
-                draw = \exp_not:V \l__chemmacros_orbital_p_mphase_color_tl ,
-                ball~color = \exp_not:V \l__chemmacros_orbital_p_mphase_color_tl
-              }
-              (0pt,0pt) .. controls ++
-              (
-                - \l__chemmacros_orbital_p_scale_tl * 2em ,
-                - \l__chemmacros_orbital_p_scale_tl * 2em
-              )
-              and ++
-              (
-                \l__chemmacros_orbital_p_scale_tl * 2em ,
-                - \l__chemmacros_orbital_p_scale_tl * 2em
-              )
-              .. (0pt,0pt);
-          }
-      }
-  }
-
-% --------------------------------------------------------------------------
-% sp-orbitals
-\cs_new_protected:Npn \__chemmacros_orbital_type_sp:
-  {
-    \bool_set_false:N \l__chemmacros_orbital_type_s_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_p_bool
-    \bool_set_true:N  \l__chemmacros_orbital_type_sp_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_sptwo_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_spthree_bool
-  }
-
-\chemmacros_define_keys:nn {orbital/sp}
-  {
-    phase .choice: ,
-    phase / + .code:n =
-      { \bool_set_true:N \l__chemmacros_orbital_sp_phase_bool } ,
-    phase / - .code:n =
-      { \bool_set_false:N \l__chemmacros_orbital_sp_phase_bool } ,
-    scale .tl_set:N   = \l__chemmacros_orbital_sp_scale_tl ,
-    angle .fp_set:N   = \l__chemmacros_orbital_angle_fp ,
-    color .tl_set:N   = \l__chemmacros_orbital_sp_color_tl
-  }
-
-\cs_new_protected:Npn \__chemmacros_orbital_sp_draw:n #1
-  {
-    \chemmacros_set_keys:nn {orbital/sp} {#1}
-    \bool_if:NTF \l__chemmacros_orbital_sp_phase_bool
-      {
-        \tl_if_in:NnTF \l__chemmacros_orbital_sp_color_tl { ! }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_sp_pphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_sp_color_tl }
-          }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_sp_pphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_sp_color_tl ! 90 }
-          }
-        \tl_set:Nn \l__chemmacros_orbital_sp_mphase_color_tl
-          { black ! 5 }
-        
-      }
-      {
-        \tl_if_in:NnTF \l__chemmacros_orbital_sp_color_tl { ! }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_sp_mphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_sp_color_tl }
-          }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_sp_mphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_sp_color_tl ! 90 }
-          }
-        \tl_set:Nn \l__chemmacros_orbital_sp_pphase_color_tl
-          { black ! 5 }
-      }
-    \chemmacros_tikz_picture:xn
-      { \__chemmacros_orbital_options: }
-      {
-        \chemmacros_tikz_shadedraw:x
-          {
-            draw = \exp_not:V \l__chemmacros_orbital_sp_pphase_color_tl ,
-            ball~color = \exp_not:V \l__chemmacros_orbital_sp_pphase_color_tl
-          }
-          (0pt,0pt) .. controls ++
-          (
-            - \l__chemmacros_orbital_sp_scale_tl * 2em ,
-            \l__chemmacros_orbital_sp_scale_tl * 2em
-          )
-          and ++
-          (
-            \l__chemmacros_orbital_sp_scale_tl * 2em ,
-            \l__chemmacros_orbital_sp_scale_tl * 2em
-          )
-          .. (0pt,0pt);
-        \chemmacros_tikz_shadedraw:x
-          {
-            draw = \exp_not:V \l__chemmacros_orbital_sp_mphase_color_tl ,
-            ball~color = \exp_not:V \l__chemmacros_orbital_sp_mphase_color_tl
-          }
-          (0pt,0pt) .. controls ++
-          (
-            - \l__chemmacros_orbital_sp_scale_tl * .6em ,
-            - \l__chemmacros_orbital_sp_scale_tl * .6em
-          )
-          and ++
-          (
-            \l__chemmacros_orbital_sp_scale_tl * .6em ,
-            - \l__chemmacros_orbital_sp_scale_tl * .6em
-          )
-          .. (0pt,0pt);
-      }
-  }
-
-% --------------------------------------------------------------------------
-% sp2-orbitals
-\cs_new_protected:Npn \__chemmacros_orbital_type_sptwo:
-  {
-    \bool_set_false:N \l__chemmacros_orbital_type_s_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_p_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_sp_bool
-    \bool_set_true:N  \l__chemmacros_orbital_type_sptwo_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_spthree_bool
-  }
-
-\chemmacros_define_keys:nn {orbital/sp2}
-  {
-    phase .choice: ,
-    phase / + .code:n =
-      { \bool_set_true:N \l__chemmacros_orbital_sptwo_phase_bool } ,
-    phase / - .code:n =
-      { \bool_set_false:N \l__chemmacros_orbital_sptwo_phase_bool } ,
-    scale .tl_set:N   = \l__chemmacros_orbital_sptwo_scale_tl ,
-    angle .fp_set:N   = \l__chemmacros_orbital_angle_fp ,
-    color .tl_set:N   = \l__chemmacros_orbital_sptwo_color_tl
-  }
-
-\cs_new_protected:Npn \__chemmacros_orbital_sptwo_draw:n #1
-  {
-    \chemmacros_set_keys:nn {orbital/sp2} {#1}
-    \bool_if:NTF \l__chemmacros_orbital_sptwo_phase_bool
-      {
-        \tl_if_in:NnTF \l__chemmacros_orbital_sptwo_color_tl { ! }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_sptwo_pphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_sptwo_color_tl }
-          }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_sptwo_pphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_sptwo_color_tl ! 90 }
-          }
-        \tl_set:Nn \l__chemmacros_orbital_sptwo_mphase_color_tl
-          { black ! 5 }
-        
-      }
-      {
-        \tl_if_in:NnTF \l__chemmacros_orbital_sptwo_color_tl { ! }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_sptwo_mphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_sptwo_color_tl }
-          }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_sptwo_mphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_sptwo_color_tl ! 90 }
-          }
-        \tl_set:Nn \l__chemmacros_orbital_sptwo_pphase_color_tl
-          { black ! 5 }
-      }
-    \chemmacros_tikz_picture:xn
-      { \__chemmacros_orbital_options: }
-      {
-        \chemmacros_tikz_shadedraw:x
-          {
-            draw = \exp_not:V \l__chemmacros_orbital_sptwo_pphase_color_tl ,
-            ball~color = \exp_not:V \l__chemmacros_orbital_sptwo_pphase_color_tl
-          }
-          (0pt,0pt) .. controls ++
-          (
-            - \l__chemmacros_orbital_sptwo_scale_tl * 2em ,
-            \l__chemmacros_orbital_sptwo_scale_tl * 2em
-          )
-          and ++
-          (
-            \l__chemmacros_orbital_sptwo_scale_tl * 2em ,
-            \l__chemmacros_orbital_sptwo_scale_tl * 2em
-          )
-          .. (0pt,0pt);
-        \chemmacros_tikz_shadedraw:x
-          {
-            draw = \exp_not:V \l__chemmacros_orbital_sptwo_mphase_color_tl ,
-            ball~color = \exp_not:V \l__chemmacros_orbital_sptwo_mphase_color_tl
-          }
-          (0pt,0pt) .. controls ++
-          (
-            - \l__chemmacros_orbital_sptwo_scale_tl * .8em ,
-            - \l__chemmacros_orbital_sptwo_scale_tl * .8em
-          )
-          and ++
-          (
-            \l__chemmacros_orbital_sptwo_scale_tl * .8em ,
-            - \l__chemmacros_orbital_sptwo_scale_tl * .8em
-          )
-          .. (0pt,0pt);
-      }
-  }
-
-% --------------------------------------------------------------------------
-% sp3-orbitals
-\cs_new_protected:Npn \__chemmacros_orbital_type_spthree:
-  {
-    \bool_set_false:N \l__chemmacros_orbital_type_s_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_p_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_sp_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_sptwo_bool
-    \bool_set_true:N  \l__chemmacros_orbital_type_spthree_bool
-  }
-
-\chemmacros_define_keys:nn {orbital/sp3}
-  {
-    phase .choice: ,
-    phase / + .code:n =
-      { \bool_set_true:N \l__chemmacros_orbital_spthree_phase_bool } ,
-    phase / - .code:n =
-     { \bool_set_false:N \l__chemmacros_orbital_spthree_phase_bool } ,
-    scale .tl_set:N   = \l__chemmacros_orbital_spthree_scale_tl ,
-    angle .fp_set:N   = \l__chemmacros_orbital_angle_fp ,
-    color .tl_set:N   = \l__chemmacros_orbital_spthree_color_tl
-  }
-
-\cs_new_protected:Npn \__chemmacros_orbital_spthree_draw:n #1
-  {
-    \chemmacros_set_keys:nn {orbital/sp3} {#1}
-    \bool_if:NTF \l__chemmacros_orbital_spthree_phase_bool
-      {
-        \tl_if_in:NnTF \l__chemmacros_orbital_spthree_color_tl { ! }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_spthree_pphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_spthree_color_tl }
-          }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_spthree_pphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_spthree_color_tl ! 90 }
-          }
-        \tl_set:Nn \l__chemmacros_orbital_spthree_mphase_color_tl
-          { black ! 5 }
-        
-      }
-      {
-        \tl_if_in:NnTF \l__chemmacros_orbital_spthree_color_tl { ! }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_spthree_mphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_spthree_color_tl }
-          }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_spthree_mphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_spthree_color_tl ! 90 }
-          }
-        \tl_set:Nn \l__chemmacros_orbital_spthree_pphase_color_tl
-          { black ! 5 }
-      }
-    \chemmacros_tikz_picture:xn
-      { \__chemmacros_orbital_options: }
-      {
-        \chemmacros_tikz_shadedraw:x
-          {
-            draw = \exp_not:V \l__chemmacros_orbital_spthree_pphase_color_tl ,
-            ball~color = \exp_not:V \l__chemmacros_orbital_spthree_pphase_color_tl
-          }
-          (0pt,0pt) .. controls ++
-          (
-            - \l__chemmacros_orbital_spthree_scale_tl * 2em ,
-            \l__chemmacros_orbital_spthree_scale_tl * 2em
-          )
-          and ++
-          (
-            \l__chemmacros_orbital_spthree_scale_tl * 2em ,
-            \l__chemmacros_orbital_spthree_scale_tl * 2em
-          )
-          .. (0pt,0pt);
-        \chemmacros_tikz_shadedraw:x
-          {
-            draw = \exp_not:V \l__chemmacros_orbital_spthree_mphase_color_tl ,
-            ball~color = \exp_not:V \l__chemmacros_orbital_spthree_mphase_color_tl
-          }
-          (0pt,0pt) .. controls ++
-          (
-            - \l__chemmacros_orbital_spthree_scale_tl * 1em ,
-            - \l__chemmacros_orbital_spthree_scale_tl * 1em
-          )
-          and ++
-          (
-            \l__chemmacros_orbital_spthree_scale_tl * 1em ,
-            - \l__chemmacros_orbital_spthree_scale_tl * 1em
-          )
-          .. (0pt,0pt);
-      }
-  }
-
-% --------------------------------------------------------------------------
-% main command
-\chemmacros_define_keys:nn {orbital}
-  {
-    overlay .bool_set:N = \l__chemmacros_orbital_overlay_bool ,
-    overlay .default:n  = true ,
-    opacity .code:n     =
-      {
-        \fp_compare:nTF { #1 = 1 }
-          { \bool_set_false:N \l__chemmacros_orbital_opacity_bool }
-          { \bool_set_true:N \l__chemmacros_orbital_opacity_bool }
-        \fp_set:Nn \l__chemmacros_orbital_opacity_fp { #1 }
-      }
-  }
-
-\chemmacros_define_keys:nn {orbital/type}
-  {
-    s   .code:n = { \__chemmacros_orbital_type_s: } ,
-    p   .code:n = { \__chemmacros_orbital_type_p: } ,
-    sp  .code:n = { \__chemmacros_orbital_type_sp: } ,
-    sp2 .code:n = { \__chemmacros_orbital_type_sptwo: } ,
-    sp3 .code:n = { \__chemmacros_orbital_type_spthree: }
-  }
-
-\cs_new_protected:Npn \chemmacros_orbital:n #1
-  {
-    \bool_if:NT \l__chemmacros_orbital_type_s_bool
-      { \__chemmacros_orbital_s_draw:n { #1 } }
-    \bool_if:NT \l__chemmacros_orbital_type_p_bool
-      { \__chemmacros_orbital_p_draw:n { #1 } }
-    \bool_if:NT \l__chemmacros_orbital_type_sp_bool
-      { \__chemmacros_orbital_sp_draw:n { #1 } }
-    \bool_if:NT \l__chemmacros_orbital_type_sptwo_bool
-      { \__chemmacros_orbital_sptwo_draw:n { #1 } }
-    \bool_if:NT \l__chemmacros_orbital_type_spthree_bool
-      { \__chemmacros_orbital_spthree_draw:n { #1 } }
-  }
-
-\NewDocumentCommand \orbital {om}
-  {
-    \group_begin:
-      \chemmacros_set_keys:nn {orbital/type} {#2}
-      \IfNoValueTF {#1}
-        { \chemmacros_orbital:n {  } }
-        { \chemmacros_orbital:n {#1} }
-    \group_end:
-  }
-% --------------------------------------------------------------------------  

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.particles.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.particles.code.tex	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.particles.code.tex	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,141 +0,0 @@
-% --------------------------------------------------------------------------
-%
-% the CHEMMACROS package -- module: `particles'
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\ChemModule{particles}{2016/04/02 particles}
-  
-\chemmacros_load_modules:n {charges,chemformula}
-
-% --------------------------------------------------------------------------
-% particles
-\cs_new_protected:Nn \chemmacros_define_particle:Nn
-  {
-    \tl_set_rescan:Nnn \l__chemmacros_tmpa_tl { \ExplSyntaxOff } {#2}
-    \use:x
-      {
-        \cs_set_protected:Npn \exp_not:N #1
-          { \chemmacros_chemformula:n { \exp_not:V \l__chemmacros_tmpa_tl } }
-      }
-  }
-
-\NewChemMacroset {Particle} {mm}
-  { \chemmacros_define_particle:Nn #1 {#2} }
-
-% --------------------------------------------------------------------------
-% nucleophiles
-\cs_new_protected:Npn \chemmacros_elpair:n #1
-  {
-    \bool_if:NTF \l__chemmacros_elpair_dots_bool
-      { \chlewis { 0: } {#1} }
-      { \chlewis { 0| } {#1} }
-  }
-
-\bool_new:N \l__chemmacros_nucleophile_elpair_bool
-\bool_new:N \l__chemmacros_elpair_dots_bool
-
-\ChemCompatibilityFrom{5.3}
-\dim_new:N  \l__chemmacros_nucleophile_dim
-\dim_set:Nn \l__chemmacros_nucleophile_dim { .1em }
-
-\chemmacros_define_keys:nn {particles}
-  {
-    space .dim_set:N = \l__chemmacros_nucleophile_dim
-  }
-\EndChemCompatibility
-
-\chemmacros_define_keys:nn {particles}
-  {
-    elpair         .choice: ,
-    elpair / false .code:n    =
-      { \bool_set_false:N \l__chemmacros_nucleophile_elpair_bool } ,
-    elpair / dots  .code:n    =
-      {
-        \bool_set_true:N \l__chemmacros_nucleophile_elpair_bool
-        \bool_set_true:N \l__chemmacros_elpair_dots_bool
-      } ,
-    elpair / dash  .code:n    =
-      {
-        \bool_set_true:N \l__chemmacros_nucleophile_elpair_bool
-        \bool_set_false:N \l__chemmacros_elpair_dots_bool
-      } ,
-    elpair         .default:n = dots
-  }
-
-\cs_new_protected:Npn \chemmacros_declare_nucleophile:Nn #1#2
-  {
-    \cs_set_protected:cpn {__chemmacros_ \chemmacros_remove_backslash:N #1:}
-      {
-        \bool_if:NTF \l__chemmacros_nucleophile_elpair_bool
-          {
-            \chemmacros_elpair:n { #2 }
-            \chemmacros_if_compatibility:nnT {>=} {5.3}
-              { \skip_horizontal:N \l__chemmacros_nucleophile_dim }
-            \chemmacros_chemformula:n { {}^{-} }
-          }
-          { \chemmacros_chemformula:n { #2^{-} } }
-      }
-    \DeclareDocumentCommand #1 {o}
-      {
-        \group_begin:
-          \IfNoValueF {##1}
-            { \chemmacros_set_keys:nn {particles} {##1} }
-          \use:c {__chemmacros_ \chemmacros_remove_backslash:N #1:}
-        \group_end:
-      }
-  }
-
-\NewChemMacroset {Nucleophile} {mm}
-  { \chemmacros_declare_nucleophile:Nn #1 {#2} }
-
-% --------------------------------------------------------------------------
-% particles:
-\NewChemParticle \el  { e^- }
-\NewChemParticle \prt { p^+ }
-\NewChemParticle \ntr { n^0 }
-
-% ions, molecules
-% proton, hydroxide, hydronium/oxonium, water:
-\NewChemParticle \Hpl   { H^+ }
-\NewChemParticle \Hyd   { OH^- }
-\NewChemParticle \Oxo   { H_3O^+ }
-\NewChemParticle \water { H_2O }
-
-% electrophile:
-\NewChemParticle \El  { E^+ }
-
-% nucleophiles:
-\NewChemNucleophile \Nuc {Nu}
-\NewChemNucleophile \ba  {ba}
-
-\ChemCompatibilityTo{5.3}
-  \DeclareChemDeprecated \Hto \Oxo
-  \DeclareChemDeprecated \Nu \Nuc
-\EndChemCompatibility
-
-% --------------------------------------------------------------------------
-\file_input_stop:
-2016/01/13 - new option particles/space
-2016/04/02 - adapt to formula methods `chemist' and `chemfig'

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.phases.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.phases.code.tex	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.phases.code.tex	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,140 +0,0 @@
-% --------------------------------------------------------------------------
-%
-% the CHEMMACROS package -- module: `phases'
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\ChemModule{phases}{2016/05/31 phase descriptors}
-
-\chemmacros_load_module:n {chemformula}
-
-\bool_new:N \l__chemmacros_phases_sub_bool
-\dim_new:N  \l__chemmacros_phases_space_dim
-\dim_set:Nn \l__chemmacros_phases_space_dim { .1333 em }
-
-\chemmacros_define_keys:nn {phases}
-  {
-    pos        .choice: ,
-    pos / sub  .code:n    = \bool_set_true:N \l__chemmacros_phases_sub_bool ,
-    pos / side .code:n    = \bool_set_false:N \l__chemmacros_phases_sub_bool ,
-    space      .dim_set:N = \l__chemmacros_phases_space_dim
-  }
-
-\NewChemMacroset {Phase} {mm}
-  { \chemmacros_define_phase:Nn #1 {#2} }
-
-\ChemCompatibilityTo{5.7}
-\cs_new_protected:Npn \chemmacros_define_phase:Nn #1#2
-  {
-    \tl_set:Nx \l__chemmacros_tmpa_tl { phase-\chemmacros_remove_backslash:N #1 }
-    \exp_args:NV \@trnslt at declare@translation
-      \l__chemmacros_tmpa_tl
-      {fallback}
-      {#2}
-    \__chemmacros_define_phase:Nx #1
-      { \exp_not:N \chemmacros_translate:n { \exp_not:V \l__chemmacros_tmpa_tl } }
-  }
-\EndChemCompatibility
-
-\ChemCompatibilityFrom{5.7}
-\cs_new_protected:Npn \chemmacros_define_phase:Nn #1#2
-  {
-    \tl_set:Nx \l__chemmacros_tmpa_tl { phase-\chemmacros_remove_backslash:N #1 }
-    \chemmacros_declare_translation:Vnn
-      \l__chemmacros_tmpa_tl
-      {fallback}
-      {#2}
-    \__chemmacros_define_phase:Nx #1
-      { \exp_not:N \chemmacros_translate:n { \exp_not:V \l__chemmacros_tmpa_tl } }
-  }
-\EndChemCompatibility
-
-\cs_new_protected:Npn \__chemmacros_define_phase:Nn #1#2
-  {
-    \cs_if_exist:NF #1 { \cs_new:Npn #1 {} }
-    \DeclareDocumentCommand #1 {o}
-      { \chemmacros_phase:n { #2 \IfNoValueF {##1} {,~##1} } }
-  }
-\cs_generate_variant:Nn \__chemmacros_define_phase:Nn { Nx }
-
-\cs_new_protected:Npn \chemmacros_phase:n #1
-  {
-    \mode_leave_vertical:
-    \bool_if:NTF \l__chemmacros_phases_sub_bool
-      { \chemformula_subscript:n { (#1) } }
-      {
-        \skip_horizontal:N \l__chemmacros_phases_space_dim
-        \chemmacros_text:n { (#1) }
-      }
-  }
-
-% --------------------------------------------------------------------------
-\NewDocumentCommand \phase {m} { \chemmacros_phase:n {#1} }
-
-\NewChemPhase \sld {s}
-\NewChemPhase \lqd {l}
-\NewChemPhase \gas {g}
-\NewChemPhase \aq  {aq}
-
-% --------------------------------------------------------------------------
-\ChemCompatibilityTo{5.6}
-\DeclareTranslation {English} {phase-sld} {s}
-\DeclareTranslation {German}  {phase-sld} {f}
-
-\DeclareTranslation {English} {phase-lqd} {l}
-\DeclareTranslation {German}  {phase-lqd} {f\/l}
-
-\DeclareTranslation {English} {phase-gas} {g}
-\DeclareTranslation {German}  {phase-gas} {g}
-
-\DeclareTranslation {English} {phase-aq} {aq}
-\DeclareTranslation {German}  {phase-aq} {aq}
-\EndChemCompatibility
-
-\ChemCompatibilityFrom{5.6}
-\chemmacros_declare_translations:nn {phase-sld}
-  {
-    fallback = s ,
-    German   = f
-  }
-
-\chemmacros_declare_translations:nn {phase-lqd}
-  {
-    fallback = l ,
-    German   = f\/l
-  }
-
-\chemmacros_declare_translations:nn {phase-gas}
-  { fallback = g }
-
-\chemmacros_declare_translations:nn {phase-aq}
-  { fallback = aq }
-\EndChemCompatibility
-
-% --------------------------------------------------------------------------
-\file_input_stop:
-
-2015/06/09 - first version
-2016/04/27 - moved translations from lang module to phases module
-2016/05/31 - adapt to changes in `lang' module

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.polymers.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.polymers.code.tex	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.polymers.code.tex	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,182 +0,0 @@
-% --------------------------------------------------------------------------
-%
-% the CHEMMACROS package -- module: `polymers'
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\ChemModule{polymers}{2018/03/02 polymers}
-
-\chemmacros_load_modules:n {nomenclature,tikz}
-
-% --------------------------------------------------------------------------
-% copolymers
-\NewChemIUPAC \copolymer { \textit {co} }
-\LetChemIUPAC \co \copolymer
-
-\NewChemIUPAC \statistical { \textit {stat} }
-\LetChemIUPAC \stat \statistical
-
-\NewChemIUPAC \random { \textit {ran} }
-\LetChemIUPAC \ran \random
-
-\NewChemIUPAC \alternating { \textit {alt} }
-\LetChemIUPAC \alt \alternating
-
-\NewChemIUPAC \periodic { \textit {per} }
-\LetChemIUPAC \per \periodic
-
-\NewChemIUPAC \block { \textit {block} }
-\NewChemIUPAC \graft { \textit {graft} }
-
-% --------------------------------------------------------------------------
-% non-linear (co)polymers
-\NewChemIUPAC \blend { \textit {blend} }
-\NewChemIUPAC \comb { \textit {comb} }
-
-\NewChemIUPAC \complex { \textit {compl} }
-\LetChemIUPAC \compl \complex
-
-\NewChemIUPAC \cyclic { \textit {cyclo} }
-\LetChemIUPAC \cyclo \cyclic
-
-\NewChemIUPAC \branch { \textit {branch} }
-\NewChemIUPAC \network { \textit {net} }
-\LetChemIUPAC \net \network
-
-\NewChemIUPAC \ipnetwork { \textit {ipn} }
-\LetChemIUPAC \ipn \ipnetwork
-
-\NewChemIUPAC \sipnetwork { \textit {sipn} }
-\LetChemIUPAC \sipn \sipnetwork
-
-\NewChemIUPAC \star { \textit {star} }
-
-% --------------------------------------------------------------------------
-
-\tl_new:N \l__chemmacros_polymer_delimiter_left_tl
-\tl_new:N \l__chemmacros_polymer_delimiter_right_tl
-
-\tl_new:N \l__chemmacros_polymer_subscript_tl
-\tl_new:N \l__chemmacros_polymer_superscript_tl
-
-\dim_new:N \l__chemmacros_polymer_delimiter_height_dim
-\dim_new:N \l__chemmacros_polymer_delimiter_depth_dim
-
-\cs_new_protected:Npn \__chemmacros_set_polymer_delimiters:NN #1#2
-  {
-    \tl_set:Nn \l__chemmacros_polymer_delimiter_left_tl  {#1}
-    \tl_set:Nn \l__chemmacros_polymer_delimiter_right_tl {#2}
-  }
-
-% #1: height
-% #2: depth
-% #3: opening node
-% #4: closing node
-% #5: subscript
-% #6: superscript 
-\cs_new_protected:Npn \chemmacros_make_polymer_braces:nnnnnn #1#2#3#4#5#6
-  {
-    \dim_set:Nn \l__chemmacros_polymer_delimiter_height_dim { (#1+#2)/2 }
-    \dim_set:Nn \l__chemmacros_polymer_delimiter_depth_dim  { (#1-#2)/2 }
-    \chemmacros_tikz_picture:nn {remember~ picture, overlay }
-      {
-        \chemmacros_tikz_node:n
-          { at = (#3) , yshift = \l__chemmacros_polymer_delimiter_depth_dim }
-          {
-            \c_math_toggle_token
-              \tex_left:D \l__chemmacros_polymer_delimiter_left_tl
-              \tex_vrule:D
-                height \l__chemmacros_polymer_delimiter_height_dim
-                depth \l__chemmacros_polymer_delimiter_height_dim
-                width \c_zero_dim
-              \tex_right:D .
-            \c_math_toggle_token
-          } ;
-        \chemmacros_tikz_node:n
-          { at = (#4) , yshift = \l__chemmacros_polymer_delimiter_depth_dim }
-          {
-            \c_math_toggle_token
-              \tex_left:D .
-              \tex_vrule:D
-                height \l__chemmacros_polymer_delimiter_height_dim
-                depth \l__chemmacros_polymer_delimiter_height_dim
-                width \c_zero_dim
-              \tex_right:D \l__chemmacros_polymer_delimiter_right_tl
-              \c_math_subscript_token
-                {
-                  \hbox_overlap_right:n
-                    {
-                      \chemmacros_if_compatibility:nnTF {>} {5.8b}
-                        { \smash {#5} }
-                        {#5}
-                    }
-                }
-              \c_math_superscript_token
-                {
-                  \hbox_overlap_right:n
-                    {
-                      \chemmacros_if_compatibility:nnTF {>} {5.8b}
-                        { \smash {#6} }
-                        {#6}
-                    }
-                }
-            \c_math_toggle_token
-          } ;
-      }
-  }
-\cs_generate_variant:Nn \chemmacros_make_polymer_braces:nnnnnn {nnnnVV}
-
-\chemmacros_define_keys:nn {polymers}
-  {
-    delimiters  .code:n = \__chemmacros_set_polymer_delimiters:NN #1 ,
-    delimiters  .initial:n = [] ,
-    superscript .tl_set:N = \l__chemmacros_polymer_superscript_tl ,
-    subscript   .tl_set:N = \l__chemmacros_polymer_subscript_tl ,
-    subscript   .initial:n = $n$
-  }
-
-\NewDocumentCommand \makepolymerdelims {O{}momm}
-  {
-    \group_begin:
-      \chemmacros_set_keys:nn {polymers} {#1}
-      \IfNoValueTF {#3}
-        {
-          \chemmacros_make_polymer_braces:nnnnVV {#2} {#2} {#4} {#5}
-            \l__chemmacros_polymer_subscript_tl
-            \l__chemmacros_polymer_superscript_tl
-        }
-        {
-          \chemmacros_make_polymer_braces:nnnnVV {#2} {#3} {#4} {#5}
-            \l__chemmacros_polymer_subscript_tl
-            \l__chemmacros_polymer_superscript_tl
-        }
-    \group_end:
-  }
-  
-% --------------------------------------------------------------------------
-\file_input_stop:
-
-2016/03/07 - first version
-2016/03/08 - \makepolymerdelims
-2018/03/02 - smash sub- and superscripts of polymer delimiters

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.reactions.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.reactions.code.tex	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.reactions.code.tex	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,445 +0,0 @@
-% --------------------------------------------------------------------------
-%
-% the CHEMMACROS package -- module: `reactions'
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\ChemModule{reactions}{2020/02/02 reaction environments}
-
-\chemmacros_load_module:n {chemformula}
-
-\RequirePackage{mathtools}
-
-% --------------------------------------------------------------------------
-\cs_new_protected:Npn \__chemmacros_record_for_lor:nnnnn #1#2#3#4#5
-  {
-    \tl_if_eq:nnT {#1} {reaction}
-      {
-        \group_begin:
-          % we need to prevent \Hy at make@anchor from being written to the lor
-          % file:
-          \bool_if:NT \l__chemmacros_hyperref_bool
-            { \cs_set:Npn \Hy at make@anchor {} }
-          \addcontentsline {lor} {reaction}
-            {
-              \tl_use:N \l__chemmacros_reaction_lorname_tl
-              \tl_use:N \c_space_tl
-              #2 #3 #4 #5
-              \tl_use:N \g__chemmacros_reaction_description_tl
-            }
-          \tl_gclear:N \g__chemmacros_reaction_description_tl
-        \group_end:
-      }
-  }
-
-% redefine mathtools' command \MT_define_tagform:nwnn to ensure we add an
-% entry to the list of reactions even if the user redefines the reaction tag
-% this should probably be done via patching...
-\AfterPackage* { mathtools }
-  {
-    \cs_set_protected:Npn \MT_define_tagform:nwnn #1[#2]#3#4
-      {
-        \@namedef{MT_tagform_#1:n}##1
-          {
-            % this is the original part:
-            \maketag@@@{#3\ignorespaces#2{##1}\unskip\@@italiccorr#4}
-            % this is added => this disturbs hyperref:
-            \__chemmacros_record_for_lor:nnnnn
-              {#1} {#3} {#2} {##1} {#4}
-          }
-      }
-  }
-
-\tl_new:N \g__chemmacros_reaction_description_tl
-
-\cs_new_protected:Npn \chemmacros_add_reaction_description:n #1
-  {
-    \tl_if_blank:nF {#1}
-      { \tl_gset:Nn \g__chemmacros_reaction_description_tl {:~#1} }
-  }
-
-\NewDocumentCommand \AddRxnDesc {m}
-  { \chemmacros_add_reaction_description:n {#1} }
-
-% define \listofreactions
-\tl_new:N  \l__chemmacros_reaction_lorname_tl
-\tl_new:N  \reactionlistname
-\tl_new:N  \l__chemmacros_reaction_heading_tl
-
-\cs_new:Npn \__chemmacros_reaction_heading:n #1
-  { \l__chemmacros_reaction_heading_tl {#1} }
-\cs_generate_variant:Nn \__chemmacros_reaction_heading:n { V }
-
-\ChemCompatibilityTo{5.6}
-\tl_set:Nn \l__chemmacros_reaction_lorname_tl
-  { \chemmacros_translate:n {reaction} }
-\EndChemCompatibility
-\ChemCompatibilityFrom{5.6}
-\tl_set:Nn \l__chemmacros_reaction_lorname_tl
-  { \chemmacros_translate:n {Reaction} }
-\EndChemCompatibility
-
-\tl_set:Nn \reactionlistname { \chemmacros_translate:n {list-of-reactions} }
-
-\chemmacros_define_keys:nn {reactions}
-  {
-    list-name .tl_set:N = \reactionlistname ,
-    list-entry .tl_set:N = \l__chemmacros_reaction_lorname_tl ,
-  }
-\ChemCompatibilityFrom{5.2}
-\chemmacros_define_keys:nn {reactions}
-  {
-    list-heading-cmd .code:n =
-      \cs_set_protected:Npn \__chemmacros_reaction_heading:n ##1 {#1}
-  }
-\EndChemCompatibility
-
-\cs_if_exist:NTF \chapter
-  {
-    \chemmacros_if_compatibility:nnTF {>=} {5.2}
-      {
-        \chemmacros_set_keys:nn {reactions}
-          { list-heading-cmd = \chapter* {#1} }
-      }
-      { \cs_set_protected:Npn \__chemmacros_reaction_heading:n { \chapter* } }
-  }
-  {
-    \chemmacros_if_compatibility:nnTF {>=} {5.2}
-      {
-        \chemmacros_set_keys:nn {reactions}
-          { list-heading-cmd = \section* {#1} }
-      }
-      { \cs_set_protected:Npn \__chemmacros_reaction_heading:n { \section* } }
-  }
-
-\cs_new_protected:Npn \listofreactions
-  {
-    \__chemmacros_reaction_heading:V \reactionlistname
-    \@starttoc {lor}
-  }
-
-\ChemCompatibilityTo{5.6}
-\cs_new_protected:Npn \l at reaction #1#2
-  { \@dottedtocline {1} {1.5em} {2.3em} {#1} {#2} }
-\EndChemCompatibility
-
-\ChemCompatibilityFrom{5.6}
-\cs_new_eq:NN \l at reaction \l at figure
-
-\bool_new:N \l__chemmacros_reactions_tocbasic_bool
-\cs_if_exist:NT \KOMAClassName
-  { \bool_set_true:N \l__chemmacros_reactions_tocbasic_bool }
-
-\tl_new:N \l__chemmacros_reactions_tag_open_tl
-\tl_new:N \l__chemmacros_reactions_tag_close_tl
-\tl_new:N \l__chemmacros_reactions_before_tag_tl
-
-\chemmacros_define_keys:nn {reactions}
-  {
-    tocbasic   .bool_set:N = \l__chemmacros_reactions_tocbasic_bool ,
-    tag-open   .tl_set:N   = \l__chemmacros_reactions_tag_open_tl ,
-    tag-open   .initial:n  = \{ ,
-    tag-close  .tl_set:N   = \l__chemmacros_reactions_tag_close_tl ,
-    tag-close  .initial:n  = \} ,
-    before-tag .tl_set:N   = \l__chemmacros_reactions_before_tag_tl
-  }
-
-\AtEndPreamble
-  {
-    \bool_lazy_or:nnT
-      { \chemmacros_if_package_loaded_p:n {tocbasic} }
-      { \l__chemmacros_reactions_tocbasic_bool }
-      {
-        \RequirePackage {tocbasic}
-        \addtotoclist [float] {lor}
-        \cs_set_protected:Npn \listofreactions { \listoftoc {lor} }
-        \cs_new:Npn \listoflorname { \reactionlistname }
-      }
-  }
-
-\ChemCleverefSupport {reaction}
-  { \chemmacros_translate:n {reaction} }
-  [ \chemmacros_translate:n {Reaction} ]
-  { \chemmacros_translate:n {reactions} }
-  [ \chemmacros_translate:n {Reactions} ]
-
-\AfterPackage* {cleveref}
-  {
-    \creflabelformat {reaction}
-      {
-        #2
-        \l__chemmacros_reactions_tag_open_tl
-        #1
-        \l__chemmacros_reactions_tag_close_tl
-        #3
-      }
-  }
-
-\ChemFancyrefSupport {rct}
-  { \chemmacros_translate:n {reaction} }
-  [ \chemmacros_translate:n {Reaction} ]
-\EndChemCompatibility
-  
-% create new tagform
-\ChemCompatibilityTo{5.6}
-\newtagform {reaction} {\{} {\}}
-\EndChemCompatibility
-\ChemCompatibilityFrom{5.6}
-\newtagform {reaction}
-  [\l__chemmacros_reactions_before_tag_tl]
-  {\l__chemmacros_reactions_tag_open_tl}
-  {\l__chemmacros_reactions_tag_close_tl}
-\EndChemCompatibility
-\newcounter {chemmacros_save_reaction}
-\newcounter {reaction}
-
-\ChemCompatibilityTo{5.6}
-\cs_new_protected:Npn \__chemmacros_begin_reaction:
-  {
-    % create individual names for `hyperref':
-    \bool_if:NT \l__chemmacros_hyperref_bool
-      {
-        \cs_set:Npn \theHequation
-          { R . \theHsection . \arabic {reaction} }
-      }
-    % enable labelformat `reaction':
-    \bool_if:NT \l__chemmacros_varioref_bool
-      { \cs_set_eq:NN \p at equation \p at reaction }
-    \setcounter {chemmacros_save_reaction} { \value {equation} }
-    \setcounter {equation} { \value {reaction} }
-    \usetagform {reaction}
-  }
-\EndChemCompatibility
-
-\ChemCompatibilityFrom{5.6}
-\cs_new_protected:Npn \__chemmacros_begin_reaction:
-  {
-    \patchcmd \thereaction {reaction} {equation} {} {}
-    \cs_set_eq:NN \theequation \thereaction
-    \cs_set_eq:NN \r at equation \r at reaction
-    \cs_set_eq:NN \p at equation \p at reaction
-    \cs_set:Npn \theHequation { R . \theHsection . \theequation }
-    \setcounter {chemmacros_save_reaction} { \value {equation} }
-    \setcounter {equation} { \value {reaction} }
-    \chemmacros_if_package_loaded:nT {cleveref}
-      { \crefalias {equation} {reaction} }
-    \usetagform {reaction}
-  }
-\EndChemCompatibility
-
-% switch back to equation tags
-\cs_new_protected:Npn \__chemmacros_end_reaction:
-  {
-    \setcounter {reaction} { \value {equation} }
-    \setcounter {equation} { \value {chemmacros_save_reaction} }
-  }
-
-\tl_new:N \l__chemmacros_reactions_args_tl
-
-\cs_new_protected:Npn \__chemmacros_reactions_build_args:n #1
-  { \tl_put_right:Nn \l__chemmacros_reactions_args_tl { {## #1} } }
-
-\cs_new_protected:Npn \chemmacros_define_reaction:nnn #1#2#3
-  {
-    \int_compare:nNnT {#3+0} > {0}
-      {
-        \tl_clear:N \l__chemmacros_reactions_args_tl
-        \int_step_function:nnnN {2} {1} {#3+1} \__chemmacros_reactions_build_args:n
-      }
-    \chemmacros_declare_reaction_env:nnnV {#1} {#2} {#3} \l__chemmacros_reactions_args_tl
-  }
-
-% #1: chem
-% #2: math
-% #3: args number
-% #4: argument list ({#2}{#3}...)
-\cs_new_protected:Npn \chemmacros_declare_reaction_env:nnnn #1#2#3#4
-  {
-    \exp_args:Nnx \DeclareDocumentEnvironment {#1}
-      { \int_compare:nT { #3+0 = 0 } {!} O{} \prg_replicate:nn {#3+0} {m} }
-      {
-        \chemmacros_add_reaction_description:n {##1}
-        \__chemmacros_begin_reaction:
-        \chemmacros_reaction_read:nnw {#2} {#4}
-      }
-      {
-        \__chemmacros_end_reaction:
-        \ignorespacesafterend
-      }
-  }
-\cs_generate_variant:Nn \chemmacros_declare_reaction_env:nnnn {nnnV}
-
-\ChemCompatibilityTo{5.6}
-\cs_new_protected:Npn \chemmacros_reaction_read:nnw #1#2#3 \end
-  {
-    \begin{#1}#2
-      \chemmacros_reaction:n {#3}
-    \end{#1}
-    \end
-  }
-\EndChemCompatibility
-
-\ChemCompatibilityFrom{5.6}
-\cs_new_protected:Npn \chemmacros_reaction_read:nnw #1#2#3 \end
-  {
-    \tl_clear:N \l__chemmacros_tmpa_tl
-    \seq_clear:N \l__chemmacros_tmpc_seq
-    \seq_set_split:Nnn \l__chemmacros_tmpa_seq {\\} {#3}
-    \int_set:Nn \l__chemmacros_tmpa_int
-      { \seq_count:N \l__chemmacros_tmpa_seq }
-    \int_zero:N \l__chemmacros_tmpb_int
-    \seq_map_inline:Nn \l__chemmacros_tmpa_seq
-      {
-        \int_incr:N \l__chemmacros_tmpb_int
-        \seq_clear:N \l__chemmacros_tmpc_seq
-        \seq_set_split:Nnn \l__chemmacros_tmpb_seq {&} {##1}
-        \seq_map_inline:Nn \l__chemmacros_tmpb_seq
-          {
-            \seq_put_right:Nn \l__chemmacros_tmpc_seq
-              { \chemmacros_reaction:n {####1} }
-          }
-        \tl_put_right:Nx \l__chemmacros_tmpa_tl
-          { \seq_use:Nn \l__chemmacros_tmpc_seq {&} }
-        \int_compare:nF
-          { \l__chemmacros_tmpa_int = \l__chemmacros_tmpb_int }
-          { \tl_put_right:Nn \l__chemmacros_tmpa_tl {\\} }
-      }
-    \chemmacros_reaction_write:nnV {#1} {#2} \l__chemmacros_tmpa_tl
-    \end
-  }
-
-\cs_new_protected:Npn \chemmacros_reaction_write:nnn #1#2#3
-  {
-    \begin{#1}#2
-      #3
-    \end{#1}
-  }
-\cs_generate_variant:Nn \chemmacros_reaction_write:nnn { nnV }
-\EndChemCompatibility
-
-\NewChemMacroset* {Reaction} {mO{}m}
-  { \chemmacros_define_reaction:nnn {#1} {#3} {#2} }
-
-\NewChemReaction {reaction}   {equation}
-\NewChemReaction {reaction*}  {equation*}
-\NewChemReaction {reactions}  {align}
-\NewChemReaction {reactions*} {align*}
-
-% --------------------------------------------------------------------------
-\ChemCompatibilityTo{5.6}
-\DeclareTranslationFallback     {list-of-reactions} {List~ of~ Reactions}
-\DeclareTranslation {English}   {list-of-reactions} {List~ of~ Reactions}
-\DeclareTranslation {German}    {list-of-reactions} {Reaktionsverzeichnis}
-\DeclareTranslation {Italian}   {list-of-reactions} {Elenco~ delle~ reazioni}
-\DeclareTranslation {French}    {list-of-reactions} {Table~ des~ r\'{e}actions}
-\DeclareTranslation {Dutch}     {list-of-reactions} {Lijst~ van~ reacties}
-
-\DeclareTranslationFallback     {reaction} {Reaction}
-\DeclareTranslation {English}   {reaction} {Reaction}
-\DeclareTranslation {German}    {reaction} {Reaktion}
-\DeclareTranslation {Italian}   {reaction} {Reazione}
-\DeclareTranslation {French}    {reaction} {R\'{e}action}
-\DeclareTranslation {Dutch}     {reaction} {Reactie}
-\EndChemCompatibility
-
-\ChemCompatibilityFrom{5.6}
-\chemmacros_declare_translations:nn {list-of-reactions}
-  {
-    fallback  = List~ of~ Reactions ,
-    English   = List~ of~ Reactions ,
-    German    = Reaktionsverzeichnis ,
-    Italian   = Elenco~ delle~ reazioni ,
-    French    = Table~ des~ r\'{e}actions ,
-    Dutch     = Lijst~ van~ reacties ,
-    Norwegian = Reaksjonsliste ,
-    Nynorsk   = Reaksjonsliste
-  }
-
-\chemmacros_declare_translations:nn {reaction}
-  {
-    fallback  = reaction ,
-    English   = reaction ,
-    German    = Reaktion ,
-    Italian   = reazione ,
-    French    = r\'{e}action ,
-    Dutch     = reactie ,
-    Norwegian = reaksjon ,
-    Nynorsk   = reaksjon
-  }
-
-\chemmacros_declare_translations:nn {reactions}
-  {
-    fallback  = reactions ,
-    English   = reactions ,
-    German    = Reaktionen ,
-    Italian   = reazioni ,
-    French    = r\'{e}actions ,
-    Dutch     = reacties ,
-    Norwegian = reaksjoner ,
-	Nynorsk   = reaksjonar
-  }
-
-\chemmacros_declare_translations:nn {Reaction}
-  {
-    fallback  = Reaction ,
-    English   = Reaction ,
-    German    = Reaktion ,
-    Italian   = Reazione ,
-    French    = R\'{e}action ,
-    Dutch     = Reactie ,
-    Norwegian = Reaksjon ,
-    Nynorsk   = Reaksjon
-  }
-
-\chemmacros_declare_translations:nn {Reactions}
-  {
-    fallback = Reactions ,
-    English  = Reactions ,
-    German   = Reaktionen ,
-    Italian  = Reazioni ,
-    French   = R\'{e}actions ,
-    Dutch    = Reacties ,
-    Norwegian = Reaksjoner ,
-    Nynorsk   = Reaksjonar
- }
-\EndChemCompatibility
-% --------------------------------------------------------------------------
-\file_input_stop:
-
-2015/09/15 - adapt to `method' option => do not use chemformula's macros
-             directly
-2015/10/14 - new option `list-heading-cmd'
-2016/02/09 - added \ignorespacesafterend to environments
-2016/03/17 - tocbasic integration of lor
-           - add missing compatibility check for the usage of the
-             `list-heading-cmd' option
-2016/04/02 - adapt to new formula methods
-2016/04/27 - correct \__chemmacros_begin_reaction: so tags obey \thereaction
-           - add cleveref support
-           - add fancyref support
-           - moved translations from lang module to reactions module
-2016/05/04 - options `tag-open', `tag-close' and `before-tag'
-2019/09/23 - added Norwegian translations
-2019/09/27 - change `O{}' argument of reactions into `!O{}'
-2020/02/02 - lazy boolean evaluation

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.redox.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.redox.code.tex	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.redox.code.tex	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,458 +0,0 @@
-% --------------------------------------------------------------------------
-%
-% the CHEMMACROS package -- module: `redox'
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\ChemModule{redox}{2020/02/02 oxidation numbers, redox reactions}
-
-\chemmacros_load_modules:n {tikz,xfrac}
-
-\RequirePackage{mathtools,relsize}
-
-\msg_new:nnn {chemmacros} {redox}
-  { \token_to_str:N #1 \c_space_tl : ~ #2 ~ \msg_line_context: . }
-
-
-% --------------------------------------------------------------------------
-% oxidation numbers
-% \ox{<number>,<atom>}
-\bool_new:N \l__chemmacros_ox_sign_bool
-\bool_new:N \l__chemmacros_ox_integer_bool
-\bool_new:N \l__chemmacros_ox_explicit_sign_bool
-\ChemCompatibilityFrom{5.2}
-\bool_new:N \l__chemmacros_ox_explicit_zero_sign_bool
-\EndChemCompatibility
-\bool_new:N \l__chemmacros_ox_format_roman_bool
-\bool_new:N \l__chemmacros_ox_decimal_marker_comma_bool
-\bool_new:N \l__chemmacros_ox_parse_bool
-\bool_new:N \l__chemmacros_ox_side_bool
-\bool_new:N \l__chemmacros_ox_super_bool
-\bool_new:N \l__chemmacros_ox_top_bool
-\bool_new:N \l__chemmacros_ox_align_center_bool
-
-\ChemCompatibilityFrom{5.11}
-\tl_new:N \l__chemmacros_ox_format_tl
-\EndChemCompatibility
-
-\int_new:N \l__chemmacros_ox_number_int
-\fp_new:N  \l__chemmacros_ox_number_fp
-
-\cs_new_protected:Npn \__chemmacros_ox_format:n #1
-  {
-    \chemmacros_if_compatibility:nnTF {>=} {5.11}
-    { { \l__chemmacros_ox_format_tl {#1} } }
-    { \use:n {#1} }
-  }
-
-\cs_new_protected:Npn \__chemmacros_ox_process_number:n #1
-  {
-    \bool_if:NTF \l__chemmacros_ox_parse_bool
-      {
-        \tl_if_in:nnTF {#1} { / }
-          { \__chemmacros_ox_fraction:w #1 \q_stop }
-          {
-            \__chemmacros_ox_sign:n  {#1}
-            \__chemmacros_ox_value:n {#1}
-          }
-      }
-      {#1}
-  }
-
-\cs_new_protected:Npn \__chemmacros_ox_fraction:w #1/#2 \q_stop
-  {
-    \group_begin:
-      \bool_set_false:N \l__chemmacros_ox_format_roman_bool
-      \__chemmacros_ox_sign:n {#1}
-      \bool_if:NTF \l__chemmacros_ox_side_bool
-        { \chemmacros_ox_text_frac:nn }
-        { \chemmacros_ox_super_frac:nn }
-        { \__chemmacros_ox_value:n {#1} }
-        {#2}
-    \group_end:
-  }
-
-\ChemCompatibilityTo{5.4}
-\cs_new_protected:Npn \__chemmacros_ox_sign:n #1
-  {
-    \bool_lazy_and:nnT
-      { \fp_compare_p:n { #1 > 0 } }
-      { \l__chemmacros_ox_explicit_sign_bool }
-      { \c_math_toggle_token + \c_math_toggle_token }
-    \bool_lazy_and:nnT
-      { \fp_compare_p:n { #1 = 0 } }
-      { \l__chemmacros_ox_explicit_sign_bool }
-      { \c_math_toggle_token \pm \c_math_toggle_token }
-    \fp_compare:nT { #1 < 0 }
-      { \c_math_toggle_token - \c_math_toggle_token }
-  }
-\EndChemCompatibility
-\ChemCompatibilityFrom{5.4}
-\cs_new_protected:Npn \__chemmacros_ox_sign:n #1
-  {
-    \bool_lazy_and:nnT
-      { \fp_compare_p:n { #1 > 0 } }
-      { \l__chemmacros_ox_explicit_sign_bool }
-      { \c_math_toggle_token + \c_math_toggle_token }
-    \bool_lazy_all:nT
-      {
-        { \fp_compare_p:n { #1 = 0 } }
-        { \l__chemmacros_ox_explicit_sign_bool }
-        { \l__chemmacros_ox_explicit_zero_sign_bool }
-      }
-      { \c_math_toggle_token \pm \c_math_toggle_token }
-    \fp_compare:nT { #1 < 0 }
-      { \c_math_toggle_token - \c_math_toggle_token }
-  }
-\EndChemCompatibility
-
-\cs_new_protected:Npn \__chemmacros_ox_value:n #1
-  {
-    \fp_set:Nn \l__chemmacros_ox_number_fp { abs(#1) }
-    \__chemmacros_ox_is_integer:n { \l__chemmacros_ox_number_fp }
-    \bool_if:NTF \l__chemmacros_ox_format_roman_bool
-      { \__chemmacros_fp_to_Roman:n { \l__chemmacros_ox_number_fp } }
-      {
-        \bool_if:NTF \l__chemmacros_ox_integer_bool
-          {
-            \c_math_toggle_token
-              \__chemmacros_fp_to_arabic:n { \l__chemmacros_ox_number_fp }
-            \c_math_toggle_token
-          }
-          {
-            \c_math_toggle_token
-              \fp_use:N \l__chemmacros_ox_number_fp
-            \c_math_toggle_token
-          }
-      }
-  }
-
-\cs_new_protected:Npn \__chemmacros_ox_is_integer:n #1
-  {
-    \fp_compare:nNnTF {#1} = { round((#1) + 1 , 0 ) - 1 }
-      { \bool_set_true:N \l__chemmacros_ox_integer_bool }
-      {
-        \bool_set_false:N \l__chemmacros_ox_integer_bool
-        \bool_set_false:N \l__chemmacros_ox_format_roman_bool
-      }
-  }
-
-\cs_new_protected:Npn \__chemmacros_fp_to_Roman:n #1
-  {
-    \group_begin:
-      \fp_compare:nNnTF {#1} = { 0 }
-        {0}
-        { \int_to_Roman:n { \fp_to_int:n {#1} } }
-    \group_end:
-  }
-
-\cs_new_protected:Npn \__chemmacros_fp_to_arabic:n #1
-  {
-    \group_begin:
-      \bool_if:NTF \l__chemmacros_ox_decimal_marker_comma_bool
-        {
-          \tl_set:Nx \l__chemmacros_tmpa_tl { \fp_to_decimal:n {#1} }
-          \tl_replace_once:Nnn \l__chemmacros_tmpa_tl {.} { {,} }
-          \tl_use:N \l__chemmacros_tmpa_tl
-        }
-        { \fp_to_decimal:n {#1} }
-    \group_end:
-  }
-
-\tl_new:N \l__chemmacros_ox_side_connect_tl
-
-\cs_new_protected:Npn \__chemmacros_ox_write:nn #1#2
-  {
-    \tl_if_blank:nT {#1}
-      { \msg_error:nnn {chemmacros} {redox} {\ox} {oxidation~number~missing} }
-    \tl_if_blank:nT {#2}
-      { \msg_error:nnn {chemmacros} {redox} {\ox} {oxidation-atom~missing} }
-    \hbox_set:Nn \l__chemmacros_tmpa_box
-      {
-        \chemmacros_text:n
-          {
-            \__chemmacros_ox_format:n
-              { \relsize {-3} \__chemmacros_ox_process_number:n {#1} }
-          }
-      }
-    \hbox_set:Nn \l__chemmacros_tmpb_box { \chemmacros_chemformula:n {#2} }
-    \chemmacros_math:n
-      {
-        \bool_if:NT \l__chemmacros_ox_super_bool
-          {
-            \box_use:N \l__chemmacros_tmpb_box
-            \c_math_superscript_token { \box_use:N \l__chemmacros_tmpa_box }
-          }
-        \bool_if:NT \l__chemmacros_ox_side_bool
-          {
-            \chemmacros_text:n
-              {
-                \box_use:N \l__chemmacros_tmpb_box
-                \tl_use:N \l__chemmacros_ox_side_connect_tl
-                (
-                  \__chemmacros_ox_format:n
-                    { \__chemmacros_ox_process_number:n {#1} }
-                )
-              }
-          }
-        \bool_if:NT \l__chemmacros_ox_top_bool
-          {
-            \bool_if:NF \l__chemmacros_ox_align_center_bool
-              { 
-                \hbox_set_to_wd:Nnn \l__chemmacros_tmpa_box
-                  { \box_wd:N \l__chemmacros_tmpb_box }
-                  { \rlap { \hbox_unpack:N \l__chemmacros_tmpa_box } \hfil }
-              }
-            \overset
-              {
-                \bool_if:NTF \l__chemmacros_ox_align_center_bool
-                  { \clap }
-                  { \use:n }
-                { \box_use:N \l__chemmacros_tmpa_box }
-              }
-              { \box_use:N \l__chemmacros_tmpb_box }
-          }
-      }
-  }
-
-\cs_new_protected:Npn \__chemmacros_ox_pos_top:
-  {
-    \bool_set_true:N  \l__chemmacros_ox_top_bool
-    \bool_set_false:N \l__chemmacros_ox_super_bool
-    \bool_set_false:N \l__chemmacros_ox_side_bool
-  }
-
-\cs_new_protected:Npn \__chemmacros_ox_pos_super:
-  {
-    \bool_set_false:N \l__chemmacros_ox_top_bool
-    \bool_set_true:N  \l__chemmacros_ox_super_bool
-    \bool_set_false:N \l__chemmacros_ox_side_bool
-  }
-
-\cs_new_protected:Npn \__chemmacros_ox_pos_side:
-  {
-    \bool_set_false:N \l__chemmacros_ox_top_bool
-    \bool_set_false:N \l__chemmacros_ox_super_bool
-    \bool_set_true:N  \l__chemmacros_ox_side_bool
-  }
-
-\chemmacros_define_keys:nn {redox}
-  {
-    pos            .choice: ,
-    pos / top      .code:n     = \__chemmacros_ox_pos_top: ,
-    pos / super    .code:n     = \__chemmacros_ox_pos_super: ,
-    pos / side     .code:n     = \__chemmacros_ox_pos_side: ,
-    pos            .initial:n  = super ,
-    side-connect   .tl_set:N   = \l__chemmacros_ox_side_connect_tl ,
-    side-connect   .initial:n  = \, ,
-    text-frac      .code:n     =
-      \cs_set_protected:Npn \chemmacros_ox_text_frac:nn ##1##2 {#1} ,
-    text-frac      .initial:n  = \chemfrac[text]{#1}{#2} ,
-    super-frac     .code:n     =
-      \cs_set_protected:Npn \chemmacros_ox_super_frac:nn ##1##2 {#1} ,
-    super-frac     .initial:n  = \chemfrac[superscript]{#1}{#2} ,
-    roman          .bool_set:N = \l__chemmacros_ox_format_roman_bool ,
-    roman          .default:n  = true ,
-    roman          .initial:n  = true ,
-    parse          .bool_set:N = \l__chemmacros_ox_parse_bool ,
-    parse          .default:n  = true ,
-    parse          .initial:n  = true ,
-    explicit-sign  .bool_set:N = \l__chemmacros_ox_explicit_sign_bool ,
-    explicit-sign  .default:n  = true ,
-    decimal-marker .choice: ,
-    decimal-marker / comma .code:n =
-      { \bool_set_true:N \l__chemmacros_ox_decimal_marker_comma_bool } ,
-    decimal-marker / point .code:n =
-      { \bool_set_false:N \l__chemmacros_ox_decimal_marker_comma_bool } ,
-    decimal-marker .initial:n = point ,
-    align          .choice: ,
-    align / center .code:n    =
-      \bool_set_true:N \l__chemmacros_ox_align_center_bool ,
-    align / right  .code:n    =
-      \bool_set_false:N \l__chemmacros_ox_align_center_bool ,
-    align          .initial:n = center
-  }
-
-\ChemCompatibilityFrom{5.4}
-\chemmacros_define_keys:nn {redox}
-  {
-    explicit-zero-sign .bool_set:N = \l__chemmacros_ox_explicit_zero_sign_bool ,
-    explicit-zero-sign .default:n  = true
-  }
-\EndChemCompatibility
-
-\ChemCompatibilityFrom{5.11}
-\chemmacros_define_keys:nn {redox}
-  { format .tl_set:N = \l__chemmacros_ox_format_tl }
-\EndChemCompatibility
-
-% \ox[<keyval>]{<num>,<atom>}
-% \ox*[<keyval>]{<num>,<atom>} => always number on the top
-\cs_new_protected:Npn \chemmacros_ox:nnnn #1#2#3#4
-  {
-    \group_begin:
-      \chemmacros_set_keys:nn {redox} {#2}
-      \tl_if_blank:nF {#1} { \__chemmacros_ox_pos_top: }
-      \__chemmacros_ox_write:nn {#3} {#4}
-    \group_end:
-  }
-
-\NewDocumentCommand \ox { sO{}>{\SplitArgument{1}{,}}m }
-  {
-    \IfBooleanTF {#1}
-      { \chemmacros_ox:nnnn {#1} {#2} #3 }
-      { \chemmacros_ox:nnnn {  } {#2} #3 }
-  }
-
-% ---------------------------------------------------------------------------
-% redox reactions
-\tl_new:N   \l__chemmacros_redox_begin_tl
-\tl_new:N   \l__chemmacros_redox_end_tl
-\tl_new:N   \l__chemmacros_redox_tikz_tl
-\tl_new:N   \l__chemmacros_redox_shift_tl
-\tl_new:N   \l__chemmacros_redox_anchor_tl
-\tl_new:N   \l__chemmacros_redox_side_tl
-
-\fp_new:N   \l__chemmacros_redox_shift_fp
-
-\dim_new:N  \l__chemmacros_redox_sep_dim
-\dim_new:N  \l__chemmacros_redox_sep_default_dim
-\dim_set:Nn \l__chemmacros_redox_sep_default_dim {.2em}
-\dim_new:N  \l__chemmacros_redox_dist_dim
-\dim_set:Nn \l__chemmacros_redox_dist_dim {.6em}
-
-% place and name nodes:
-% \OX{<name>,<atom>}
-\NewDocumentCommand \OX { >{\SplitArgument{1}{,}}m }
-  { \chemmacros_redox_partner:nn #1 }
-
-% TODO: add option to make `#2' be parsed as chem formula
-\cs_new_protected:Npn \chemmacros_redox_partner:nn #1#2
-  {
-    \legacy_if:nTF {measuring@}
-      {
-        \group_begin:
-          \tikz[baseline=(#1.base)] { \node [inner~sep=0pt] (#1) {#2} ; }
-        \group_end:
-      }
-      {
-        \tl_if_blank:nT {#1}
-          { \msg_error:nnnn {chemmacros} {redox} {\OX} {node~name~missing} }
-        \tl_if_blank:nT {#2}
-          { \msg_error:nnnn {chemmacros} {redox} {\OX} {atom~missing} }
-        \tikz[baseline=(#1.base),remember~picture]
-          { \node [inner~sep=0pt] (#1) {#2} ; }
-      }
-  }
-
-\cs_new_protected:Npn \__chemmacros_redox_coordinates:nn #1#2
-  {
-    \tl_set:Nn \l__chemmacros_redox_begin_tl {#1}
-    \tl_set:Nn \l__chemmacros_redox_end_tl   {#2}
-  }
-
-\cs_new_protected:Npn \chemmacros_redox:nnnnn #1#2#3#4#5
-  {
-    \tl_clear:N \l__chemmacros_redox_begin_tl
-    \tl_clear:N \l__chemmacros_redox_end_tl
-    \tl_clear:N \l__chemmacros_redox_tikz_tl
-    \__chemmacros_redox_coordinates:nn {#1} {#2}
-    \tl_if_blank:nF {#3}
-      { \tl_set:Nn \l__chemmacros_redox_tikz_tl {#3} }
-    \tl_if_blank:nTF {#4}
-      {
-        \fp_set:Nn \l__chemmacros_redox_shift_fp  {1}
-        \tl_set:Nn \l__chemmacros_redox_anchor_tl {above}
-        \tl_set:Nn \l__chemmacros_redox_side_tl   {north}
-        \dim_set_eq:NN
-          \l__chemmacros_redox_sep_dim
-          \l__chemmacros_redox_sep_default_dim
-      }
-      {
-        \fp_compare:nNnTF {#4} < {0}
-          {
-            \tl_set:Nn \l__chemmacros_redox_anchor_tl {below}
-            \tl_set:Nn \l__chemmacros_redox_side_tl   {south}
-            \exp_args:NNo \dim_set:Nn \l__chemmacros_redox_sep_dim
-              { - \l__chemmacros_redox_sep_default_dim }
-          }
-          {
-            \tl_set:Nn \l__chemmacros_redox_anchor_tl {above}
-            \tl_set:Nn \l__chemmacros_redox_side_tl   {north}
-            \dim_set_eq:NN
-              \l__chemmacros_redox_sep_dim
-              \l__chemmacros_redox_sep_default_dim
-          }
-        \fp_set:Nn \l__chemmacros_redox_shift_fp {#4}
-      }
-      \tl_set:Nx \l__chemmacros_redox_shift_tl
-        { \fp_to_decimal:N \l__chemmacros_redox_shift_fp }
-    \tikz[remember~picture,overlay]
-      {
-        \chemmacros_tikz_draw:x { \exp_not:V \l__chemmacros_redox_tikz_tl }
-        ($
-          (\l__chemmacros_redox_begin_tl .
-          \l__chemmacros_redox_side_tl)+(0,\l__chemmacros_redox_sep_dim)
-        $)
-        -- 
-        ++(0,\l__chemmacros_redox_shift_tl * \l__chemmacros_redox_dist_dim) -|
-        node [pos=.25,\l__chemmacros_redox_anchor_tl] { {#5} }
-        ($
-          (\l__chemmacros_redox_end_tl .
-          \l__chemmacros_redox_side_tl)+(0,\l__chemmacros_redox_sep_dim)
-        $) ;
-      }
-  }
-
-\NewDocumentCommand \redox { >{\SplitArgument{1}{,}}r()ooG{} }
-  {
-    \IfNoValueT {#1}
-      {
-        \msg_error:nnnn {chemmacros} {redox} {\redox}
-          {You~need~to~specify~coordinates}
-      }
-    \IfNoValueTF {#2}
-      { \chemmacros_redox:nnnnn #1 { } { } {#4} }
-      {
-        \IfNoValueTF {#3}
-          { \chemmacros_redox:nnnnn #1 {#2} {  } {#4} }
-          { \chemmacros_redox:nnnnn #1 {#2} {#3} {#4} }
-      }
-  }
-
-% redox-keys
-\chemmacros_define_keys:nn {redox}
-  {
-    dist .dim_set:N = \l__chemmacros_redox_dist_dim ,
-    dist .initial:n = {.6em} ,
-    sep  .dim_set:N = \l__chemmacros_redox_sep_default_dim ,
-    sep  .initial:n = {.2em}
-  }
-
-% --------------------------------------------------------------------------
-\file_input_stop:
-2015/09/30 - new option `explicit-zero-sign'
-2020/02/02 - lazy boolean evaluation
-           - prefer \legacy_if:nTF over \chemmacros_if_tex:nnTF
-2020/03/02 - add option redox/format

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.scheme.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.scheme.code.tex	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.scheme.code.tex	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,333 +0,0 @@
-% --------------------------------------------------------------------------
-%
-% the CHEMMACROS package -- module: `scheme'
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\ChemModule{scheme}{2020/11/21 a scheme floating environment}
-
-\RequirePackage {chemnum}
-
-\bool_new:N \l__chemmacros_float_def_bool
-\tl_new:N   \l__chemmacros_float_method_tl
-\seq_new:N  \l__chemmacros_float_methods_seq
-\prop_new:N \l__chemmacros_float_methods_prop
-\prop_new:N \l__chemmacros_float_definitions_prop
-
-\msg_new:nnn {chemmacros} {float-method}
-  { Detected~ float~ defining~ method~ `#1'. }
-
-% --------------------------------------------------------------------------
-% #1: name
-% #2: check
-\cs_new_protected:Npn \chemmacros_define_float_method:nnn #1#2#3
-  {
-    \seq_put_right:Nn \l__chemmacros_float_methods_seq {#1}
-    \prop_put:Nnn \l__chemmacros_float_methods_prop {#1} {#2}
-    \prop_put:Nnn \l__chemmacros_float_definitions_prop {#1}
-      { \cs_set_protected:Npn \__chemmacros_define_float:nn ##1##2 {#3} }
-  }
-
-% the order in which the methods are defined determines in which order the
-% methods will be checked at begin document:
-\chemmacros_define_float_method:nnn {KOMA}
-  { \cs_if_exist_p:N \KOMAClassName }
-  {
-    \DeclareNewTOC[
-      type  = #1 ,
-      types = #1s ,
-      float ,
-      name = \chemmacros_translate:n {#1-name} ,
-      listname = {\exp_not:N \chemmacros_translate:n {#1-list}}
-    ]{#2}
-  }
-
-\chemmacros_define_float_method:nnn {memoir}
-  { \chemmacros_if_class_loaded_p:n {memoir} }
-  {
-    \newfloat [chapter] {#1} {#2} {\chemmacros_translate:n {#1-name}}
-    \cs_set:cpn {the#1} {\thechapter.\arabic {#1}}
-    \newlistof {listof#1s} {#2} {\chemmacros_translate:n {#1-list}}
-    \newlistentry [chapter] {#1} {#2} {0}
-    \cftsetindents {#1} {0em} {2.3em}
-    \tl_put_right:Nn \@memfront at floats
-      { \counterwithout {#1} {chapter} }
-    \tl_put_right:Nn \@memmain at floats
-      { \counterwithin {#1} {chapter} }
-    \tl_put_right:Nn \@memback at floats
-      {
-        \counterwithin {#1} {chapter}
-        \setcounter {#1} {0}
-      }
-    \legacy_if:nT {artopt}
-      { \counterwithout {#1} {chapter} }
-  }
-
-\chemmacros_define_float_method:nnn {tocbasic}
-  { \chemmacros_if_package_loaded_p:n {tocbasic} }
-  {
-    \DeclareNewTOC[
-      type  = #1 ,
-      types = #1s ,
-      float ,
-      name = \chemmacros_translate:n {#1-name} ,
-      listname = {\exp_not:N \chemmacros_translate:n {#1-list}}
-    ]{#2}
-  }
-
-\chemmacros_define_float_method:nnn {newfloat}
-  { \chemmacros_if_package_loaded_p:n {newfloat} }
-  {
-    \DeclareFloatingEnvironment[{
-      fileext = #2 ,
-      listname = {\exp_not:N \chemmacros_translate:n {#1-list}} ,
-      name = \chemmacros_translate:n {#1-name}
-    }]{#1}
-  }
-
-\ChemCompatibilityFrom{5.1}
-\chemmacros_define_float_method:nnn {floatrow}
-  { \chemmacros_if_package_loaded_p:n {floatrow} }
-  {
-    \DeclareNewFloatType{#1}{%
-      fileext   = #2,
-      placement = htp,
-      name      = \chemmacros_translate:n {#1-name}
-    }
-    \cs_new_protected:cpn {listof#1s}
-      { \listof {#1} {\chemmacros_translate:n {#1-list}} }
-  }
-\EndChemCompatibility
-
-\chemmacros_define_float_method:nnn {float}
-  { \chemmacros_if_package_loaded_p:n {float} }
-  {
-    \newfloat {#1} {htp} {#2}
-    \floatname {#1} {\chemmacros_translate:n {#1-name}}
-    \cs_new_protected:cpn {listof#1s}
-      { \listof {#1} {\chemmacros_translate:n {#1-list}} }
-  }
-
-% --------------------------------------------------------------------------
-% checks if one of the above defined methods is active.  The first one found
-% will be used.
-\cs_new_protected:Npn \chemmacros_check_float_method:n #1
-  {
-    \prop_get:NnNT \l__chemmacros_float_methods_prop {#1}
-      \l__chemmacros_tmpa_tl
-      {
-        \bool_lazy_and:nnT
-          { !\l__chemmacros_float_def_bool }
-          { \l__chemmacros_tmpa_tl }
-          {
-            \bool_set_true:N \l__chemmacros_float_def_bool
-            \tl_set:Nn \l__chemmacros_float_method_tl {#1}
-            \msg_info:nnn {chemmacros} {float-method} {#1}
-          }
-      }
-  }
-
-\cs_new_protected:Npn \chemmacros_check_float_methods:
-  {
-    \seq_map_function:NN
-      \l__chemmacros_float_methods_seq
-      \chemmacros_check_float_method:n
-  }
-
-\AtEndPreamble
-  {
-    % the check is there since v5.3a -- let's wait and see if we actually need
-    % a compatibility check here:
-    \chemmacros_if_package_loaded:nF {chemscheme}
-      {
-        \chemmacros_check_float_methods:
-        \chemmacros_define_float:nn {scheme} {los}
-      }
-  }
-
-% --------------------------------------------------------------------------
-\ChemCompatibilityFrom{5.6}
-\ChemCleverefSupport {scheme}
-  { \chemmacros_translate:n {scheme} }
-  [ \chemmacros_translate:n {Scheme} ]
-  { \chemmacros_translate:n {schemes} }
-  [ \chemmacros_translate:n {Schemes} ]
-
-\ChemFancyrefSupport {sch}
-  { \chemmacros_translate:n {scheme} }
-  [ \chemmacros_translate:n {Scheme} ]
-\EndChemCompatibility
-
-% --------------------------------------------------------------------------
-% #1: env name
-\cs_new_protected:Npn \chemmacros_define_float:nn #1#2
-  {
-    \bool_lazy_and:nnT
-      { !\cs_if_exist_p:c {#1} }
-      { !\cs_if_exist_p:c {end#1} }
-      {
-        \bool_if:NTF \l__chemmacros_float_def_bool
-          {
-            \prop_get:NVN \l__chemmacros_float_definitions_prop
-              \l__chemmacros_float_method_tl
-              \l__chemmacros_tmpa_tl
-            \tl_use:N \l__chemmacros_tmpa_tl
-            \__chemmacros_define_float:nn {#1} {#2}
-          }
-          {
-            \newcounter {#1}
-            \cs_set:cpn {the#1}      {\arabic{#1}}
-            \cs_new:cpn {fps@#1}     {tbp}
-            \cs_new:cpn {ftype@#1}   {8}
-            \cs_new:cpn {ext@#1}     {#2}
-            \cs_new:cpx {fnum@#1}    {
-              \exp_not:c {#1name}
-              \exp_not:N \nobreakspace
-              \exp_not:c {the#1}}
-            \cs_new:cpn {#1name}     {\chemmacros_translate:n {#1-name}}
-            \cs_new:cpn {list#1name} {\chemmacros_translate:n {#1-list}}
-            \newenvironment {#1}
-              {\@float{#1}}
-              {\end at float}
-            \newenvironment {#1*}
-              {\@dblfloat{#1}}
-              {\end at dblfloat}
-            \bool_lazy_or:nnTF
-              { \chemmacros_if_class_loaded_p:n {book} }
-              { \chemmacros_if_class_loaded_p:n {report} }
-              {
-                \cs_new_protected:cpn {listof#1s}
-                  {
-                    \legacy_if:nTF {@twocolumn}
-                      { \@restonecoltrue\onecolumn }
-                      { \@restonecolfalse }
-                    \chapter* { \use:c {list#1name} }
-                    \use:x
-                      {  
-                        \exp_not:N \@mkboth
-                          { \exp_not:N \MakeUppercase \exp_not:c {list#1name} }
-                          { \exp_not:N \MakeUppercase \exp_not:c {list#1name} }
-                      }
-                    \@starttoc {#2}
-                    \legacy_if:nT {@restonecol} { \twocolumn }
-                  }
-              }
-              {
-                \cs_new_protected:cpn {listof#1s}
-                  {
-                    \section* {\use:c {list#1name}}
-                    \use:x
-                      {  
-                        \exp_not:N \@mkboth
-                          { \exp_not:N \MakeUppercase \exp_not:c {list#1name} }
-                          { \exp_not:N \MakeUppercase \exp_not:c {list#1name} }
-                      }
-                    \@starttoc {#2}
-                  }
-              }
-            \cs_new_eq:cN {l@#1} \l at figure
-          }
-      }
-    \cs_set:cpn {#1name}     {\chemmacros_translate:n {#1-name}}
-    \cs_set:cpn {list#1name} {\chemmacros_translate:n {#1-list}}
-  }
-
-% --------------------------------------------------------------------------
-\ChemCompatibilityTo{5.6}
-\DeclareTranslationFallback     {scheme-name} {Scheme}
-\DeclareTranslation {English}   {scheme-name} {Scheme}
-\DeclareTranslation {German}    {scheme-name} {Schema}
-
-\DeclareTranslationFallback      {scheme-list} {List~ of~ Schemes}
-\DeclareTranslation {English}    {scheme-list} {List~ of~ Schemes}
-\DeclareTranslation {German}     {scheme-list} {Verzeichnis~ der~ Schemata}
-\EndChemCompatibility
-
-\ChemCompatibilityFrom{5.6}
-\chemmacros_declare_translations:nn {scheme-name}
-  {
-    fallback = Scheme ,
-    English  = Scheme ,
-    German   = Schema ,
-    Norwegian = Skjema ,
-    Nynorsk   = Skjema
-  }
-
-\chemmacros_declare_translations:nn {scheme-list}
-  {
-    fallback    = List~ of~ Schemes ,
-    English     = List~ of~ Schemes ,
-    German      = Verzeichnis~ der~ Schemata,
-    Norwegian   = Skjemaliste,
-    Nynorsk     = Skjemaliste
-  }
-
-\chemmacros_declare_translations:nn {scheme}
-  {
-    fallback  = scheme ,
-    English   = scheme ,
-    German    = Schema ,
-    Norwegian = skjema ,
-    Nynorsk   = skjema
-  }
-
-\chemmacros_declare_translations:nn {Scheme}
-  {
-    fallback  = Scheme ,
-    English   = Scheme ,
-    German    = Schema ,
-    Norwegian = Skjema ,
-    Nynorsk   = Skjema
-  }
-
-\chemmacros_declare_translations:nn {schemes}
-  {
-    fallback = schemes ,
-    English  = schemes ,
-    German   = Schemata ,
-    Norwegian = skjema ,
-    Nynorsk   = skjema
-  }
-
-\chemmacros_declare_translations:nn {Schemes}
-  {
-    fallback = Schemes ,
-    English  = Schemes ,
-    German   = Schemata ,
-    Norwegian = Skjema ,
-    Nynorsk   = Skjema
-  }
-\EndChemCompatibility
-
-\file_input_stop:
-% --------------------------------------------------------------------------
-2015/09/19 - make the module compatible with floatrow
-2015/10/23 - add info message to float method detection
-2016/01/23 - make the module compatible with chemscheme
-2016/04/25 - cleveref and fancyref support
-2016/12/28 - bug fix: typo in \chemmacros_if_tex:nnTF usage
-2019/03/23 - added Norwegian translations
-2020/02/03 - lazy boolean evaluation
-           - prefer \legacy_if:nTF over \chemmacros_if_tex:nnTF
-2020/11/21 - fix issue #41

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.spectroscopy.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.spectroscopy.code.tex	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.spectroscopy.code.tex	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,515 +0,0 @@
-% --------------------------------------------------------------------------
-%
-% the CHEMMACROS package -- module: `spectroscopy'
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\ChemModule{spectroscopy}{2020/11/21 environment for spectroscopic data}
-
-\chemmacros_load_modules:n {chemformula}
-\RequirePackage{siunitx}
-
-% spectroscopy
-\tl_new:N  \g__chemmacros_nmr_isotope_tl
-\tl_new:N  \l__chemmacros_nmr_isotope_default_tl
-\tl_set:Nn \l__chemmacros_nmr_isotope_default_tl { 1 }
-\tl_new:N  \l__chemmacros_nmr_coupling_nuclei_tl
-\tl_new:N  \l__chemmacros_nmr_coupling_nuclei_pre_tl
-\tl_set:Nn \l__chemmacros_nmr_coupling_nuclei_pre_tl { ( }
-\tl_new:N  \l__chemmacros_nmr_coupling_nuclei_post_tl
-\tl_set:Nn \l__chemmacros_nmr_coupling_nuclei_post_tl { ) }
-\tl_new:N  \l__chemmacros_nmr_coupling_bonds_tl
-\tl_new:N  \l__chemmacros_nmr_coupling_bonds_pre_tl
-\tl_new:N  \l__chemmacros_nmr_coupling_bonds_post_tl
-\tl_set:Nn \l__chemmacros_nmr_coupling_bonds_pre_tl { }
-\tl_set:Nn \l__chemmacros_nmr_coupling_bonds_post_tl { \! }
-\tl_new:N  \l__chemmacros_nmr_coupling_symbol_tl
-\tl_set:Nn \l__chemmacros_nmr_coupling_symbol_tl { J }
-\tl_new:N  \g__chemmacros_nmr_element_coupled_tl
-\tl_new:N  \g__chemmacros_nmr_element_tl
-\tl_new:N  \l__chemmacros_nmr_element_default_tl
-\tl_set:Nn \l__chemmacros_nmr_element_default_tl { H }
-\tl_new:N  \l__chemmacros_nmr_format_tl
-\tl_new:N  \l__chemmacros_nmr_delta_tl
-\tl_new:N  \l__chemmacros_nmr_coupling_unit_tl
-\tl_set:Nn \l__chemmacros_nmr_coupling_unit_tl { \hertz }
-\tl_new:N  \l__chemmacros_nmr_unit_tl
-\tl_set:Nn \l__chemmacros_nmr_unit_tl { \mega\hertz }
-\tl_new:N  \l__chemmacros_nmr_list_setup_tl
-\tl_set:Nn \l__chemmacros_nmr_list_setup_tl
-  {
-    \topsep\z at skip \partopsep\z at skip 
-    \itemsep\z@ \parsep\z@ \itemindent\z@
-    \leftmargin\z@
-  }
-\tl_new:N  \l__chemmacros_nmr_position_tl
-\tl_new:N  \l__chemmacros_nmr_element_method_connector_tl
-\tl_set:Nn \l__chemmacros_nmr_element_method_connector_tl {-}
-\tl_new:N  \l__chemmacros_nmr_method_tl
-\tl_set:Nn \l__chemmacros_nmr_method_tl {NMR}
-
-\bool_new:N      \l__chemmacros_nmr_coupling_nuclei_sub_bool
-\bool_new:N      \l__chemmacros_nmr_frequency_bool
-\bool_new:N      \l__chemmacros_nmr_solvent_bool
-\bool_new:N      \l__chemmacros_nmr_delimiters_bool
-\bool_new:N      \l__chemmacros_nmr_comma_bool
-\bool_new:N      \l__chemmacros_nmr_inner_bool
-\bool_new:N      \l__chemmacros_nmr_position_side_bool
-\bool_new:N      \l__chemmacros_nmr_parse_bool
-\bool_set_true:N \l__chemmacros_nmr_parse_bool
-\bool_new:N      \l__chemmacros_nmr_list_bool
-\bool_new:N      \l__chemmacros_nmr_use_equal_bool
-\bool_new:N      \l__chemmacros_nmr_custom_command_active_bool
-\bool_new:N      \l__chemmacros_nmr_custom_command_used_bool
-
-\skip_new:N \l__chemmacros_nmr_space_skip
-\skip_set:Nn \l__chemmacros_nmr_space_skip { .16667em }
-
-\cs_new_protected:Npn \__chemmacros_nmr_nucleus:nn #1#2
-  {
-    \tl_gset:Nn \g__chemmacros_nmr_isotope_tl {#1}
-    \tl_if_in:nnTF {#2} {[} % ]
-      { \__chemmacros_nmr_element:w #2 \q_stop }
-      {
-        \tl_gset:No \g__chemmacros_nmr_element_tl {#2}
-        \tl_gclear:N \g__chemmacros_nmr_element_coupled_tl
-      }
-  }
-\cs_generate_variant:Nn \__chemmacros_nmr_nucleus:nn { VV }
-
-\cs_new_protected:Npn \__chemmacros_nmr_nucleus:w #1,#2 \q_stop
-  {
-    \tl_gset:Nn \g__chemmacros_nmr_isotope_tl {#1}
-    \tl_if_in:nnTF {#2} {[} % ]
-      { \__chemmacros_nmr_element:w #2 \q_stop }
-      {
-        \tl_gset:No \g__chemmacros_nmr_element_tl {#2}
-        \tl_gclear:N \g__chemmacros_nmr_element_coupled_tl
-      }
-  }
-
-\cs_new_protected:Npn \__chemmacros_nmr_element:w #1[#2] \q_stop
-  {
-    \tl_gset:Nn \g__chemmacros_nmr_element_tl {#1}
-    \tl_gset:Nn \g__chemmacros_nmr_element_coupled_tl {#2}
-  }
-
-\cs_new_protected:Npn \__chemmacros_nmr_default_nucleus:w #1,#2 \q_stop
-  {
-    \tl_set:Nn \l__chemmacros_nmr_isotope_default_tl {#1}
-    \tl_set:Nn \l__chemmacros_nmr_element_default_tl {#2}
-  }
-
-\ChemCompatibilityTo{5.8}
-\cs_new_protected:Npn \__chemmacros_nmr_base:nn #1#2
-  {
-    \tl_if_blank:VF \g__chemmacros_nmr_element_coupled_tl
-      {
-        \tl_put_left:Nn \g__chemmacros_nmr_element_coupled_tl { \{ }
-        \tl_put_right:Nn \g__chemmacros_nmr_element_coupled_tl { \} }
-      }
-    \tl_put_left:Nn \g__chemmacros_nmr_element_coupled_tl {#2}
-    \chemmacros_chemformula:n { ^{#1} }
-    \bool_if:NTF \l__chemmacros_nmr_parse_bool
-      { \chemmacros_chemformula:V \g__chemmacros_nmr_element_coupled_tl }
-      { \g__chemmacros_nmr_element_coupled_tl }
-    \tl_use:N \l__chemmacros_nmr_element_method_connector_tl
-    \tl_use:N \l__chemmacros_nmr_method_tl
-  }
-\EndChemCompatibility
-\ChemCompatibilityFrom{5.8}
-\tl_new:N \l__chemmacros_nmr_base_format_tl
-
-\chemmacros_define_keys:nn {spectroscopy}
-  { nmr-base-format .tl_set:N = \l__chemmacros_nmr_base_format_tl }
-
-\cs_new_protected:Npn \__chemmacros_nmr_base:nn #1#2
-  {
-    \group_begin:
-      \tl_use:N \l__chemmacros_nmr_base_format_tl
-      \tl_if_blank:VF \g__chemmacros_nmr_element_coupled_tl
-        {
-          \tl_put_left:Nn \g__chemmacros_nmr_element_coupled_tl { \{ }
-          \tl_put_right:Nn \g__chemmacros_nmr_element_coupled_tl { \} }
-        }
-      \tl_put_left:Nn \g__chemmacros_nmr_element_coupled_tl {#2}
-      \chemmacros_chemformula:n { ^{#1} }
-      \tl_if_blank:VF \g__chemmacros_nmr_element_coupled_tl
-        {
-          \bool_if:NTF \l__chemmacros_nmr_parse_bool
-            { \chemmacros_chemformula:V \g__chemmacros_nmr_element_coupled_tl }
-            { \g__chemmacros_nmr_element_coupled_tl }
-        }
-      \tl_use:N \l__chemmacros_nmr_element_method_connector_tl
-      \tl_use:N \l__chemmacros_nmr_method_tl
-    \group_end:
-  }
-\EndChemCompatibility
-
-\cs_generate_variant:Nn \__chemmacros_nmr_base:nn { VV }
-
-\cs_new_protected:Npn \__chemmacros_nmr_frequency:n #1
-  {
-    \tl_if_in:nnTF {#1} {,}
-      { \__chemmacros_nmr_frequency_aux_i:w #1 \q_stop }
-      { \__chemmacros_nmr_frequency_aux_ii:n {#1} }
-  }
-
-\cs_new_protected:Npn \__chemmacros_nmr_frequency_aux_i:w #1,#2 \q_stop
-  { \SI {#1} {#2} }
-
-\cs_new_protected:Npn \__chemmacros_nmr_frequency_aux_ii:n #1
-  { \SI {#1} { \tl_use:N \l__chemmacros_nmr_unit_tl } }
-
-\cs_new_eq:NN \__chemmacros_nmr_number:n \use:n
-\cs_new_eq:NN \__chemmacros_nmr_position:n \use:n
-
-\chemmacros_define_keys:nn {spectroscopy}
-  {
-    unit          .tl_set:N      = \l__chemmacros_nmr_unit_tl ,
-    unit          .default:n     = \mega\hertz ,
-    nucleus       .code:n        =
-      { \__chemmacros_nmr_default_nucleus:w #1 \q_stop } ,
-    nucleus       .default:n     = {1,H} ,
-    format        .tl_set:N      = \l__chemmacros_nmr_format_tl ,
-    method        .tl_set:N      = \l__chemmacros_nmr_method_tl ,
-    connector     .tl_set:N      = \l__chemmacros_nmr_element_method_connector_tl ,
-    pos-number    .choice: ,
-    pos-number / sub  .code:n =
-      \tl_set:Nn \l__chemmacros_nmr_position_tl {_}
-      \bool_set_false:N \l__chemmacros_nmr_position_side_bool ,
-    pos-number / super .code:n =
-      \tl_set:Nn \l__chemmacros_nmr_position_tl {^}
-      \bool_set_false:N \l__chemmacros_nmr_position_side_bool ,
-    pos-number / side .code:n =
-      \tl_set:Nn \l__chemmacros_nmr_position_tl {-}
-      \bool_set_true:N \l__chemmacros_nmr_position_side_bool ,
-    pos-number /  .initial:n  = side ,
-    coupling-unit .tl_set:N   = \l__chemmacros_nmr_coupling_unit_tl ,
-    coupling-pos  .choice: ,
-    coupling-pos / sub .code:n =
-      \bool_set_true:N \l__chemmacros_nmr_coupling_nuclei_sub_bool ,
-    coupling-pos / side .code:n =
-      \bool_set_false:N \l__chemmacros_nmr_coupling_nuclei_sub_bool ,
-    coupling-nuclei-pre  .tl_set:N =
-      \l__chemmacros_nmr_coupling_nuclei_pre_tl ,
-    coupling-nuclei-post .tl_set:N =
-      \l__chemmacros_nmr_coupling_nuclei_post_tl ,
-    coupling-bonds-pre   .tl_set:N =
-      \l__chemmacros_nmr_coupling_bonds_pre_tl ,
-    coupling-bonds-post  .tl_set:N =
-      \l__chemmacros_nmr_coupling_bonds_post_tl ,
-    coupling-symbol .tl_set:N    =
-      \l__chemmacros_nmr_coupling_symbol_tl ,
-    atom-number-cs .code:n       =
-      \cs_set_eq:NN \__chemmacros_nmr_number:n #1 ,
-    \chemmacros_if_compatibility:nnT {>=} {5.3}
-      { atom-number-space .skip_set:N = \l__chemmacros_nmr_space_skip , }
-    coupling-pos-cs .code:n      =
-      \cs_set_eq:NN \__chemmacros_nmr_position:n #1 ,
-    parse         .bool_set:N    = \l__chemmacros_nmr_parse_bool ,
-    delta         .code:n        =
-      \tl_set:Nn \l__chemmacros_nmr_delta_tl {\,#1} ,
-    list          .bool_set:N    = \l__chemmacros_nmr_list_bool ,
-    list          .default:n     = true ,
-    list-setup    .tl_set:N      = \l__chemmacros_nmr_list_setup_tl ,
-    use-equal     .bool_set:N    = \l__chemmacros_nmr_use_equal_bool ,
-    use-equal     .default:n     = true
-  }
-
-\cs_new_protected:Npn \chemmacros_define_nmr:Nn #1#2
-  {
-    \cs_if_exist:NTF #1
-      {
-        \RenewDocumentCommand #1 {s}
-          { \IfBooleanTF {##1} { \NMR*{#2} } { \NMR{#2} } }
-      }
-      {
-        \NewDocumentCommand #1 {s}
-          { \IfBooleanTF {##1} { \NMR*{#2} } { \NMR{#2} } }
-      }
-  }
-
-\NewChemMacroset {NMR} {mm}
-  { \chemmacros_define_nmr:Nn #1 {#2} }
-
-\NewDocumentCommand \NMR { sG{}D(){}O{} }
-  {
-    \IfBooleanTF {#1}
-      { \chemmacros_nmr:nnnn {*} {#2} {#3} {#4} }
-      { \chemmacros_nmr:nnnn { } {#2} {#3} {#4} }
-  }
-
-\AtBeginDocument
-  {
-    % \NMR{<num>,<elem>}(<num>,<unit>)[<solvent>] ALL arguments are optional
-    % \NMR* same but without ": $\delta$" at end
-    \cs_new_protected:Npn \chemmacros_nmr:nnnn #1#2#3#4
-      {
-        \bool_if:NT \l__chemmacros_nmr_list_bool { \item \scan_stop: }
-        \group_begin:
-          \mode_leave_vertical:
-          \bool_set_false:N \l__chemmacros_nmr_frequency_bool
-          \bool_set_false:N \l__chemmacros_nmr_solvent_bool
-          \tl_if_empty:nF {#3}
-            { \bool_set_true:N \l__chemmacros_nmr_frequency_bool }
-          \tl_if_empty:nF {#4}
-            { \bool_set_true:N \l__chemmacros_nmr_solvent_bool }
-          \bool_lazy_or:nnT
-            { \l__chemmacros_nmr_frequency_bool }
-            { \l__chemmacros_nmr_solvent_bool }
-            { \bool_set_true:N \l__chemmacros_nmr_delimiters_bool }
-          \bool_lazy_and:nnT
-            { \l__chemmacros_nmr_frequency_bool }
-            { \l__chemmacros_nmr_solvent_bool }
-            { \bool_set_true:N \l__chemmacros_nmr_comma_bool }
-          \tl_if_empty:nTF {#2}
-            {
-              \__chemmacros_nmr_nucleus:VV
-                \l__chemmacros_nmr_isotope_default_tl
-                \l__chemmacros_nmr_element_default_tl
-            }
-            { \__chemmacros_nmr_nucleus:w #2 \q_stop }
-          \mode_if_math:TF
-            {
-              \text
-                {
-                  \group_begin:
-                    \tl_use:N \l__chemmacros_nmr_format_tl
-                    \__chemmacros_nmr_base:VV
-                      \g__chemmacros_nmr_isotope_tl
-                      \g__chemmacros_nmr_element_tl
-                    \bool_if:NT \l__chemmacros_nmr_delimiters_bool
-                      { ~ ( }
-                    \bool_if:NT \l__chemmacros_nmr_frequency_bool
-                      { \__chemmacros_nmr_frequency:n {#3} }
-                    \bool_if:NT \l__chemmacros_nmr_comma_bool
-                      { , ~ }
-                    \bool_if:NT \l__chemmacros_nmr_solvent_bool
-                      { \chemmacros_chemformula:n {#4} }
-                    \bool_if:NT \l__chemmacros_nmr_delimiters_bool
-                      { ) }
-                    \tl_if_blank:nT {#1} {:~}
-                  \group_end:
-                }
-              \tl_if_blank:nT {#1}
-                {
-                  \delta
-                  \text { \l__chemmacros_nmr_delta_tl }
-                  \bool_if:NT \l__chemmacros_nmr_use_equal_bool {=}
-                }
-            }
-            {
-              \group_begin:
-                \tl_use:N \l__chemmacros_nmr_format_tl
-                \__chemmacros_nmr_base:VV
-                  \g__chemmacros_nmr_isotope_tl
-                  \g__chemmacros_nmr_element_tl
-                \bool_if:NT \l__chemmacros_nmr_delimiters_bool
-                  {~(}
-                \bool_if:NT \l__chemmacros_nmr_frequency_bool
-                  { \__chemmacros_nmr_frequency:n {#3} }
-                \bool_if:NT \l__chemmacros_nmr_comma_bool
-                  {,~}
-                \bool_if:NT \l__chemmacros_nmr_solvent_bool
-                  {
-                    \bool_if:NTF \l__chemmacros_nmr_parse_bool
-                      { \chemmacros_chemformula:n {#4} }
-                      {#4}
-                  }
-                \bool_if:NT \l__chemmacros_nmr_delimiters_bool
-                  {)}
-                \tl_if_blank:nT {#1} {:}
-              \group_end:
-              \tl_if_blank:nT {#1}
-                {
-                  \tl_use:N \c_space_tl
-                  \c_math_toggle_token
-                    \delta
-                  \c_math_toggle_token
-                  \l__chemmacros_nmr_delta_tl
-                  \bool_if:NT \l__chemmacros_nmr_use_equal_bool {~=}
-                }
-            }
-        \group_end:
-      }
-  }
-
-\NewDocumentCommand \chemmacros_data:w { smo }
-  {
-    \bool_if:NT \l__chemmacros_nmr_list_bool { \item }
-      {
-        \tl_use:N \l__chemmacros_nmr_format_tl #2
-        \IfNoValueF {#3} { ~ ( #3 ) }
-        \IfBooleanT {#1} { \bool_if:NT \l__chemmacros_nmr_use_equal_bool { : } }
-      }
-    \IfBooleanF {#1} { \bool_if:NT \l__chemmacros_nmr_use_equal_bool { ~ = } }
-  }
-
-\cs_new_protected:Npn \chemmacros_val:n #1
-  {
-    \tl_if_in:nnTF {#1} {--}
-      { \chemmacros_val_aux:w #1 \q_nil }
-      { \num {#1} }
-  }
-
-\cs_new_protected:Npn \chemmacros_val_aux:w #1--#2 \q_nil
-  { \numrange {#1} {#2} }
-
-\NewDocumentEnvironment {experimental} {o}
-  {
-    \group_begin:
-    \IfNoValueF {#1} { \chemmacros_set_keys:nn {spectroscopy} {#1} }
-    \bool_set_true:N \l__chemmacros_nmr_inner_bool
-    \cs_set_eq:NN \#    \chemmacros_nmr_number:n
-    \cs_set_eq:NN \pos  \chemmacros_nmr_position:n
-    \cs_set_eq:NN \J    \chemmacros_nmr_coupling:w
-    \cs_set_eq:NN \data \chemmacros_data:w
-    \cs_set_eq:NN \val  \chemmacros_val:n
-    \bool_if:NT \l__chemmacros_nmr_list_bool
-      { \list {} { \l__chemmacros_nmr_list_setup_tl } }
-  }
-  {
-    \bool_if:NT \l__chemmacros_nmr_list_bool
-      { \endlist }
-    \group_end:
-    \chemmacros_ignore_spaces:
-  }
-
-\cs_new_protected:Npn \chemmacros_nmr_number:n #1
-  {
-    \__chemmacros_nmr_number:n {#1}
-    \chemmacros_if_compatibility:nnTF {>=} {5.8c}
-      { \chemmacros_skip_nobreak:N }
-      { \skip_horizontal:N }
-    \l__chemmacros_nmr_space_skip
-    \chemmacros_chemformula:V \g__chemmacros_nmr_element_tl
-  }
-
-\cs_new_protected:Npn \chemmacros_nmr_position:n #1
-  {
-    \chemmacros_chemformula:x
-      {
-        \exp_not:V \g__chemmacros_nmr_element_tl
-        \bool_if:NF \l__chemmacros_nmr_position_side_bool
-          {
-            \exp_not:V \l__chemmacros_nmr_position_tl
-            \exp_not:n { _{#1} }
-          }
-      }
-    \bool_if:NT \l__chemmacros_nmr_position_side_bool
-      {
-        \tl_use:N \l__chemmacros_nmr_position_tl
-        \__chemmacros_nmr_position:n {#1}
-      }
-  }
-
-\cs_new_protected:Npn \chemmacros_nmr_coupling:w
-  {
-    \tl_clear:N \l__chemmacros_nmr_coupling_nuclei_tl
-    \tl_clear:N \l__chemmacros_nmr_coupling_bonds_tl
-    \peek_meaning:NTF (
-      { \__chemmacros_nmr_coupling:w }
-      { \__chemmacros_nmr_coupling_aux_i:w }
-  }
-
-\cs_new_protected:Npn \__chemmacros_nmr_coupling:w (#1;#2)
-  {
-    \tl_set:Nn \l__chemmacros_nmr_coupling_bonds_tl
-      {
-        \l__chemmacros_nmr_coupling_bonds_pre_tl
-        #1
-        \l__chemmacros_nmr_coupling_bonds_post_tl
-      }
-    \bool_if:NTF \l__chemmacros_nmr_coupling_nuclei_sub_bool
-      {
-        \tl_set:Nn \l__chemmacros_nmr_coupling_nuclei_tl
-          {
-            \c_math_subscript_token
-              {
-                \l__chemmacros_nmr_coupling_nuclei_pre_tl
-                \chemmacros_chemformula:n {#2}
-                \l__chemmacros_nmr_coupling_nuclei_post_tl
-              }
-          }
-      }
-      {
-        \tl_set:Nn \l__chemmacros_nmr_coupling_nuclei_tl
-          {
-            \l__chemmacros_nmr_coupling_nuclei_pre_tl
-            \chemmacros_chemformula:n {#2}
-            \l__chemmacros_nmr_coupling_nuclei_post_tl
-          }
-      }
-    \__chemmacros_nmr_coupling_aux_i:w
-  }
-
-\cs_new_protected:Npn \__chemmacros_nmr_coupling_aux_i:w
-  {
-    \peek_meaning:NTF [
-      { \__chemmacros_nmr_coupling_aux_ii:w }
-      { \__chemmacros_nmr_coupling_aux_iii:n }
-  }
-
-\cs_new_protected:Npn \__chemmacros_nmr_coupling_aux_ii:w [#1]#2
-  {
-    \group_begin:
-      \sisetup
-        {
-          list-final-separator={,~},
-          list-pair-separator={,~},
-          list-units=single
-        }
-      \c_math_toggle_token
-        ^{ \l__chemmacros_nmr_coupling_bonds_tl }
-        \l__chemmacros_nmr_coupling_symbol_tl
-        \l__chemmacros_nmr_coupling_nuclei_tl = \SIlist {#2} {#1}
-      \c_math_toggle_token
-    \group_end:
-  }
-
-\cs_new_protected:Npn \__chemmacros_nmr_coupling_aux_iii:n #1
-  {
-    \group_begin:
-      \sisetup
-        {
-          list-final-separator={,~},
-          list-pair-separator={,~},
-          list-units=single
-        }
-      \c_math_toggle_token
-         ^{ \l__chemmacros_nmr_coupling_bonds_tl }
-         \l__chemmacros_nmr_coupling_symbol_tl
-         \l__chemmacros_nmr_coupling_nuclei_tl
-         = \exp_args:Nno \SIlist {#1} { \l__chemmacros_nmr_coupling_unit_tl }
-      \c_math_toggle_token
-    \group_end:
-  }
-
-% --------------------------------------------------------------------------
-\file_input_stop:
-2015/12/31 - new option `atom-number-space'
-2017/01/27 - new option `nmr-base-format'
-2020/02/02 - lazy boolean evaluation
-2020/11/21 - fix issue #34

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.symbols.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.symbols.code.tex	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.symbols.code.tex	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,89 +0,0 @@
-% --------------------------------------------------------------------------
-%
-% the CHEMMACROS package -- module: `symbols'
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\ChemModule{symbols}{2015/06/09 symbols}
-
-\RequirePackage{amstext}
-
-% ---------------------------------------------------------------------------
-% transition state symbol
-\cs_new_protected:Npn \__chemmacros_transition_state:
-  {
-    \text
-      {
-        \skip_horizontal:n { .1ex }
-        \hbox_overlap_right:n
-          { \rule { .6ex } { 0pt } \rule { .05ex } { 1.3ex } }
-        \hbox_overlap_right:n { \rule [ .4ex ] { 1.3ex } { .05ex } }
-        \rule [ .85ex ] { 1.3ex } { .05ex }
-        \skip_horizontal:n { .1ex }
-      }
-  }
-
-\cs_new_protected:Npn \chemmacros_transition_state:
-  {
-    \ensuremath
-      {
-        \mathchoice
-          { \displaystyle }
-          { \textstyle }
-          { \scriptstyle }
-          { \scriptscriptstyle }
-        \__chemmacros_transition_state:
-      }
-  }
-
-% \DeclareDocumentCommand?
-\cs_new_eq:NN \transitionstatesymbol \chemmacros_transition_state:
-
-% \standardstate as defined by the chemstyle package. Thanks to Joseph Wright
-% the `chemstyle' provides it with \providecommand so it doesn't matter which
-% package defines it first
-\ProvideDocumentCommand \standardstate {}
-  { { \ensuremath { \chemmacros_standardstate: } } }
-
-\cs_new_protected:Npn \chemmacros_standardstate:
-  { \mathpalette \chemmacros_standardstate_aux: \circ }
-
-\cs_new_protected:Npn \chemmacros_standardstate_aux: #1#2
-  {
-    \ooalign
-      {
-        \tex_hfil:D
-        \c_math_toggle_token #1- \c_math_toggle_token
-        \tex_hfil:D
-        \tex_cr:D
-        \tex_hfil:D
-        \c_math_toggle_token #1#2 \c_math_toggle_token
-        \tex_hfil:D
-        \tex_cr:D
-      }
-  }
-
-\cs_new_protected:Npn \changestate { \ensuremath { \mathop{} \! \chemDelta } }
-
-% --------------------------------------------------------------------------

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.thermodynamics.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.thermodynamics.code.tex	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.thermodynamics.code.tex	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,147 +0,0 @@
-% --------------------------------------------------------------------------
-%
-% the CHEMMACROS package -- module: `thermodynamics'
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\ChemModule{thermodynamics}{2015/06/09 thermodynamics}
-
-\RequirePackage {siunitx}
-
-\tl_new:N \l__chemmacros_state_pre_tl
-\tl_new:N \l__chemmacros_state_post_tl
-\tl_new:N \l__chemmacros_state_sp_left_tl
-\tl_new:N \l__chemmacros_state_sb_left_tl
-\tl_new:N \l__chemmacros_state_sp_right_tl
-\tl_new:N \l__chemmacros_state_sb_right_tl
-\tl_new:N \l__chemmacros_state_sb_pos_tl
-\tl_new:N \l__chemmacros_state_symbol_tl
-\tl_new:N \l__chemmacros_state_unit_tl
-
-\tl_set:Nn \l__chemmacros_state_pre_tl { \changestate }
-\tl_set:Nn \l__chemmacros_state_sp_right_tl { \standardstate }
-\tl_set:Nn \l__chemmacros_state_sb_pos_tl {left}
-
-\chemmacros_define_keys:nn {thermodynamics}
-  {
-    pre               .tl_set:N   = \l__chemmacros_state_pre_tl ,
-    post              .tl_set:N   = \l__chemmacros_state_post_tl ,
-    superscript-left  .tl_set:N   = \l__chemmacros_state_sp_left_tl ,
-    superscript-right .tl_set:N   = \l__chemmacros_state_sp_right_tl ,
-    superscript       .meta:n     = { superscript-right = #1 } ,
-    subscript-left    .tl_set:N   = \l__chemmacros_state_sb_left_tl ,
-    subscript-right   .tl_set:N   = \l__chemmacros_state_sb_right_tl ,
-    subscript         .meta:n     = { subscript-left = #1 } ,
-    unit              .tl_set:N   = \l__chemmacros_state_unit_tl ,
-    unit              .groups:n   = {variables}
-  }
-
-\cs_new_protected:Npn \chemmacros_state:nn #1#2
-  {
-    % pre (\Delta)
-    % post
-    % superscript-left
-    % superscript-right (\standardstate)
-    % subscript-left
-    % subscript-right
-    \group_begin:
-      \chemmacros_set_keys:nn {thermodynamics} {#1}
-      \ensuremath
-        {
-          \chemmacros_text:V \l__chemmacros_state_pre_tl
-          \c_math_superscript_token
-            { \chemmacros_text:V \l__chemmacros_state_sp_left_tl }
-          \c_math_subscript_token
-            { \chemmacros_text:V \l__chemmacros_state_sb_left_tl }
-          #2
-          \c_math_superscript_token
-            { \chemmacros_text:V \l__chemmacros_state_sp_right_tl }
-          \c_math_subscript_token
-            { \chemmacros_text:V \l__chemmacros_state_sb_right_tl }
-          \chemmacros_text:V \l__chemmacros_state_post_tl
-        }
-    \group_end:
-  }
-\cs_generate_variant:Nn \chemmacros_state:nn { nV }
-
-\DeclareDocumentCommand \state { O{}m }
-  { \chemmacros_state:nn {#1} {#2} }
-
-\cs_new_protected:Npn \chemmacros_declare_state:Nn #1#2
-  {
-    \chemmacros_define_keys:xn
-      {thermodynamics/\chemmacros_remove_backslash:N #1}
-      {
-        pre               .meta:nn = {chemmacros/thermodynamics} { pre = ##1 } ,
-        post              .meta:nn = {chemmacros/thermodynamics} { post = ##1 } ,
-        superscript-left  .meta:nn = {chemmacros/thermodynamics} { superscript-left = ##1 } ,
-        superscript-right .meta:nn = {chemmacros/thermodynamics} { superscript-right = ##1 } ,
-        superscript       .meta:n  = { superscript-right = ##1 } ,
-        subscript-left    .meta:nn = {chemmacros/thermodynamics} { subscript-left = ##1 } ,
-        subscript-right   .meta:nn = {chemmacros/thermodynamics} { subscript-right = ##1 } ,
-        subscript         .meta:n     = { subscript-left = ##1 } ,
-        subscript-pos     .choices:nn =
-          { left , right }
-          { \tl_set_eq:NN \l__chemmacros_state_sb_pos_tl \l_keys_choice_tl } ,
-        symbol            .tl_set:N = \l__chemmacros_state_symbol_tl ,
-        unit              .tl_set:N = \l__chemmacros_state_unit_tl
-      }
-    \DeclareDocumentCommand #1 { sO{}D(){}m }
-      {
-        \group_begin:
-          \chemmacros_set_keys:xn
-            {thermodynamics/\chemmacros_remove_backslash:N #1}
-            {#2}
-          \tl_if_blank:nF {##3}
-            {
-              \chemmacros_set_keys:nx {thermodynamics}
-                { subscript-\l__chemmacros_state_sb_pos_tl = \exp_not:n {##3} }
-            }
-          \ensuremath
-            {
-              \chemmacros_state:nV {##2} \l__chemmacros_state_symbol_tl
-              \chemmacros_set_keys_groups:nnn {thermodynamics} {variables} {##2}
-              \IfBooleanF {##1} { = \SI {##4} { \l__chemmacros_state_unit_tl } }
-            }
-        \group_end:
-      }
-  }
-
-\NewChemMacroset {State} {mm}
-  { \chemmacros_declare_state:Nn #1 {#2} }
-
-% --------------------------------------------------------------------------
-% predefined:
-\NewChemState \enthalpy { symbol = H , unit = \kilo\joule\per\mole }
-\NewChemState \entropy  { symbol = S , unit = \joule\per\kelvin\per\mole , pre = }
-\NewChemState \gibbs    { symbol = G , unit = \kilo\joule\per\mole }
-
-\ChemCompatibilityTo{5.3}
-  \DeclareChemDeprecated \State    \state
-  \DeclareChemDeprecated \Enthalpy \enthalpy
-  \DeclareChemDeprecated \Entropy  \entropy
-  \DeclareChemDeprecated \Gibbs    \gibbs
-\EndChemCompatibility
-
-% --------------------------------------------------------------------------

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.tikz.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.tikz.code.tex	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.tikz.code.tex	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,187 +0,0 @@
-% --------------------------------------------------------------------------
-%
-% the CHEMMACROS package -- module: `tikz'
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\ChemModule*{tikz}{2015/10/26 upright greek symbols}
-
-\RequirePackage{tikz}
-\usetikzlibrary{calc,decorations.pathmorphing}
-
-\ExplSyntaxOn
-
-\tl_const:Nx \c_chemmacros_other_colon_tl { \token_to_str:N : }
-
-% --------------------------------------------------------------------------
-% TikZ drawings - helper macros
-\cs_new_protected:Npn \chemmacros_tikz_picture:nn #1#2
-  { \tikzpicture[{#1}] #2 \endtikzpicture }
-\cs_new_protected:Npn \chemmacros_tikz:nn #1#2           { \tikz[{#1}] {#2} }
-\cs_new_protected:Npn \chemmacros_tikz_draw:n #1         { \draw[{#1}] }
-\cs_new_protected:Npn \chemmacros_tikz_node:n #1         { \node[{#1}] }
-\cs_new_protected:Npn \chemmacros_tikz_shade:n #1        { \shade[{#1}] }
-\cs_new_protected:Npn \chemmacros_tikz_shadedraw:n #1    { \shadedraw[{#1}] }
-\cs_new_protected:Npn \chemmacros_tikz_node_in_draw:n #1 { node[{#1}] }
-
-\cs_generate_variant:Nn \chemmacros_tikz_picture:nn     { xn }
-\cs_generate_variant:Nn \chemmacros_tikz_draw:n         { x }
-\cs_generate_variant:Nn \chemmacros_tikz_node:n         { x }
-\cs_generate_variant:Nn \chemmacros_tikz_shade:n        { x }
-\cs_generate_variant:Nn \chemmacros_tikz_shadedraw:n    { x }
-\cs_generate_variant:Nn \chemmacros_tikz_node_in_draw:n { x }
-
-% --------------------------------------------------------------------------
-% arrow tips for electron movement
-\dim_new:N \l__chemmacros_el_length_dim
-
-% full tip for pairs
-\pgfarrowsdeclare { el } { el }
-  {
-    \dim_set:Nn \l__chemmacros_el_length_dim
-      { 2.5pt + 2.5\pgflinewidth }
-    \pgfarrowsleftextend { -\l__chemmacros_el_length_dim }
-    \pgfarrowsrightextend { .5\pgflinewidth }
-  }
-  {
-    \dim_set:Nn \l__chemmacros_el_length_dim
-      { 2.5pt + 2.5\pgflinewidth }
-    \pgfsetdash {} { 0pt }
-    \pgfsetroundjoin
-    \pgfsetroundcap
-    \pgfpathmoveto { \pgfpoint { 0pt } { 0pt } }
-    \pgfpathlineto
-      {
-        \pgfpoint
-          { -\l__chemmacros_el_length_dim }
-          { .3\l__chemmacros_el_length_dim }
-      }
-    \pgfpathlineto
-      { \pgfpoint { -.5\l__chemmacros_el_length_dim } { 0pt } }
-    \pgfpathlineto
-      {
-        \pgfpoint
-          { -\l__chemmacros_el_length_dim }
-          { -.3\l__chemmacros_el_length_dim }
-      }
-    \pgfpathlineto { \pgfpoint { 0pt } { 0pt } }
-    \pgfusepathqfillstroke
-  }
-
-% half tip on the left
-\pgfarrowsdeclare { left~el } { left~el }
-  {
-    \dim_set:Nn \l__chemmacros_el_length_dim
-      { 2.5pt + 2.5\pgflinewidth }
-    \pgfarrowsleftextend { -\l__chemmacros_el_length_dim }
-    \pgfarrowsrightextend { .5\pgflinewidth }
-  }
-  {
-    \dim_set:Nn \l__chemmacros_el_length_dim
-      { 2.5pt + 2.5\pgflinewidth }
-    \pgfsetdash {} { 0pt }
-    \pgfsetroundjoin
-    \pgfsetroundcap
-    \pgfpathmoveto { \pgfpoint { 0pt } { 0pt } }
-    \pgfpathlineto
-      {
-        \pgfpoint
-          { -\l__chemmacros_el_length_dim }
-          { .3\l__chemmacros_el_length_dim }
-      }
-    \pgfpathlineto { \pgfpoint { -.5\l__chemmacros_el_length_dim } { 0pt } }
-    \pgfpathlineto { \pgfpoint { 0pt } { 0pt } }
-    \pgfusepathqfillstroke
-  }
-
-% half tip in the right
-\pgfarrowsdeclare { right~el } { right~el }
-  {
-    \dim_set:Nn \l__chemmacros_el_length_dim
-      { 2.5pt + 2.5\pgflinewidth }
-    \pgfarrowsleftextend { -\l__chemmacros_el_length_dim }
-    \pgfarrowsrightextend { .5\pgflinewidth }
-  }
-  {
-    \dim_set:Nn \l__chemmacros_el_length_dim
-      { 2.5pt + 2.5\pgflinewidth }
-    \pgfsetdash {} { 0pt }
-    \pgfsetroundjoin
-    \pgfsetroundcap
-    \pgfpathmoveto { \pgfpoint { 0pt } { 0pt } }
-    \pgfpathlineto
-      {
-        \pgfpoint
-          { -\l__chemmacros_el_length_dim }
-          { -.3\l__chemmacros_el_length_dim }
-      }
-    \pgfpathlineto { \pgfpoint { -.5\l__chemmacros_el_length_dim } { 0pt } }
-    \pgfpathlineto { \pgfpoint { 0pt } { 0pt } }
-    \pgfusepathqfillstroke
-  }
-% --------------------------------------------------------------------------
-% http://tex.stackexchange.com/a/25689/
-\ChemCompatibilityFrom{5.3}
-\pgfdeclaredecoration{wave}{initial}{
-  \state{initial}[
-    width = +0pt ,
-    next~ state = sine,
-    persistent~ precomputation = {
-      \pgfmathsetmacro\matchinglength{
-        \pgfdecoratedinputsegmentlength /
-        int(\pgfdecoratedinputsegmentlength/\pgfdecorationsegmentlength)
-      }
-      \setlength{\pgfdecorationsegmentlength}{\matchinglength pt}
-    }
-  ]{}
-  \state{sine}[width=\pgfdecorationsegmentlength]{
-    \pgfpathsine{
-      \pgfpoint
-        {0.25\pgfdecorationsegmentlength}
-        {0.5\pgfdecorationsegmentamplitude}
-      }
-    \pgfpathcosine{
-      \pgfpoint
-        {0.25\pgfdecorationsegmentlength}
-        {-0.5\pgfdecorationsegmentamplitude}
-      }
-    \pgfpathsine{
-      \pgfpoint
-        {0.25\pgfdecorationsegmentlength}
-        {-0.5\pgfdecorationsegmentamplitude}
-      }
-    \pgfpathcosine{
-      \pgfpoint
-        {0.25\pgfdecorationsegmentlength}
-        {0.5\pgfdecorationsegmentamplitude}
-      }
-  }
-  \state{final}{}
-}
-\EndChemCompatibility
-
-% --------------------------------------------------------------------------
-\file_input_stop:
-
-2015/10/26 - add decoration `wave' (complete sines)

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.units.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.units.code.tex	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.units.code.tex	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,68 +0,0 @@
-% --------------------------------------------------------------------------
-%
-% the CHEMMACROS package -- module: `units'
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\ChemModule{units}{2020/02/02 chemical units}
-
-\RequirePackage{siunitx}
-
-% --------------------------------------------------------------------------
-\DeclareSIUnit \atm        {atm}
-\DeclareSIUnit \atmosphere {atm}
-\DeclareSIUnit \calory     {cal}
-\DeclareSIUnit \cal        {cal}
-\DeclareSIUnit \moLar      {\mole\per\liter}
-\DeclareSIUnit \MolMass    {\gram\per\mole}
-\DeclareSIUnit \normal     {\textsc{n}}
-
-\ChemCompatibilityTo{5.8g}
-  \DeclareSIUnit \torr {torr}
-\EndChemCompatibility
-
-\ChemCompatibilityFrom{5.8h}
-  \DeclareSIUnit \Torr {Torr}
-\EndChemCompatibility
-
-\ChemCompatibilityFrom{5.10}
-  \DeclareSIUnit \torr {Torr}
-\EndChemCompatibility
-
-\AtEndPreamble
-  {
-    \chemmacros_if_package_loaded:nF {chemstyle}
-      {
-        \DeclareSIUnit {\cmc  } {\cubic\centi\metre}
-        \DeclareSIUnit {\molar} {\mole\per\cubic\deci\metre}
-        \DeclareSIUnit {\Molar} {\textsc{m}}
-      }
-  }
-
-% --------------------------------------------------------------------------
-\file_input_stop:
-
-2015/09/28 - change \AtBeginDocument into \AtEndPreamble
-2019/11/07 - correction torr -> Torr
-

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.xfrac.code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.xfrac.code.tex	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.module.xfrac.code.tex	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,137 +0,0 @@
-% --------------------------------------------------------------------------
-%
-% the CHEMMACROS package -- module: `xfrac'
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\ChemModule{xfrac}{2015/07/22 use xfrac package with chemmacros}
-
-\RequirePackage{xfrac}
-
-% --------------------------------------------------------------------------
-
-% #1: type
-% #2: numerator
-% #3: denominator
-\cs_new_protected:Npn \chemmacros_frac:nnn #1#2#3
-  {
-    \IfInstanceExistTF {xfrac} {chemmacros-frac-\f at family-#1}
-      { \sfrac [chemmacros-frac-\f at family-#1] {#2} {#3} }
-      { \sfrac [chemmacros-frac-default-#1]{#2} {#3} }
-  }
-
-\NewDocumentCommand \chemfrac {O{text}mm}
-  { \chemmacros_frac:nnn {#1} {#2} {#3} }
-
-% --------------------------------------------------------------------------
-
-% default:
-\DeclareInstance {xfrac} {chemmacros-frac-cmr-superscript} {text}
-  {
-    numerator-top-sep   = -.1ex ,
-    slash-left-kern     = -.2em ,
-    slash-right-kern    = -.2em ,
-    slash-symbol-font   = cmr
-  }
-
-\DeclareInstance {xfrac} {chemmacros-frac-cmr-text} {text}
-  {
-    numerator-top-sep   = 0ex ,
-    slash-left-kern     = -.2em ,
-    slash-right-kern    = -.2em ,
-    slash-symbol-font   = cmr
-  }
-
-% computer modern (same as default):
-\DeclareInstance {xfrac} {chemmacros-frac-cmr-superscript} {text}
-  {
-    numerator-top-sep   = -.1ex ,
-    slash-left-kern     = -.2em ,
-    slash-right-kern    = -.2em ,
-    slash-symbol-font   = cmr
-  }
-
-\DeclareInstance {xfrac} {chemmacros-frac-cmr-text} {text}
-  {
-    numerator-top-sep   = 0ex ,
-    slash-left-kern     = -.2em ,
-    slash-right-kern    = -.2em ,
-    slash-symbol-font   = cmr
-  }
-
-% Linux Libertine T lining:
-\DeclareInstance {xfrac} {chemmacros-frac-LinuxLibertineT-TLF-text} {text}
-  {
-    numerator-top-sep   = 0ex ,
-    slash-left-kern     = 0em ,
-    slash-right-kern    = .05em ,
-    slash-symbol-font   = LinuxLibertineT-TLF
-  }
-
-\DeclareInstance {xfrac} {chemmacros-frac-LinuxLibertineT-TLF-superscript} {text}
-  {
-    scale-factor        = 1.2 ,
-    denominator-bot-sep = -.1ex ,
-    numerator-top-sep   = -.1ex ,
-    slash-left-kern     = .1em ,
-    slash-right-kern    = .1em ,
-    slash-symbol-font   = LinuxLibertineT-TLF
-  }
-
-% Linux Libertine T oldstyle:
-\DeclareInstance {xfrac} {chemmacros-frac-LinuxLibertineT-TOsF-text} {text}
-  {
-    denominator-bot-sep = .1ex ,
-    numerator-top-sep   = -.2ex ,
-    slash-left-kern     = 0em ,
-    slash-right-kern    = 0em ,
-    slash-symbol-font   = LinuxLibertineT-TOsF
-  }
-
-\DeclareInstance {xfrac} {chemmacros-frac-LinuxLibertineT-TOsF-superscript} {text}
-  {
-    scale-factor        = 1.2 ,
-    denominator-bot-sep = -.1ex ,
-    numerator-top-sep   = -.2ex ,
-    slash-left-kern     = 0em ,
-    slash-right-kern    = .1em ,
-    slash-symbol-font   = LinuxLibertineT-TOsF
-  }
-
-% lmodern:
-\DeclareInstance {xfrac} {chemmacros-frac-lmr-superscript} {text}
-  {
-    slash-left-kern     = -.2em ,
-    slash-right-kern    = -.2em ,
-    slash-symbol-font   = lmr
-  }
-
-\DeclareInstance {xfrac} {chemmacros-frac-lmr-text} {text}
-  {
-    slash-left-kern     = -.2em ,
-    slash-right-kern    = -.2em ,
-    slash-symbol-font   = lmr
-  }
-
-% --------------------------------------------------------------------------

Modified: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.sty	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros.sty	2022-01-17 20:55:11 UTC (rev 61631)
@@ -12,29 +12,29 @@
 % If you have any ideas, questions, suggestions or bugs to report, please
 % feel free to contact me.
 % --------------------------------------------------------------------------
-% Copyright 2011--2020 Clemens Niederberger
+% Copyright 2011--2022 Clemens Niederberger
 %
 % This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3c
+% 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.3c or later is part of all distributions of LaTeX
-% version 2008/05/04 or later.
+% 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.
 % --------------------------------------------------------------------------
-\RequirePackage{expl3,xparse,l3keys2e}
+\RequirePackage{l3keys2e}
 \ExplSyntaxOn
 
 % --------------------------------------------------------------------------
 % package information:
-\tl_const:Nn \c_chemmacros_date_tl {2020/11/21}
-\tl_const:Nn \c_chemmacros_version_major_number_tl {5}
-\tl_const:Nn \c_chemmacros_version_minor_number_tl {11}
-\tl_const:Nn \c_chemmacros_version_subrelease_tl   {a}
+\tl_const:Nn \c_chemmacros_date_tl {2022/01/16}
+\tl_const:Nn \c_chemmacros_version_major_number_tl {6}
+\tl_const:Nn \c_chemmacros_version_minor_number_tl {0}
+\tl_const:Nn \c_chemmacros_version_subrelease_tl   {}
 \tl_const:Nx \c_chemmacros_version_number_tl
   {
     \c_chemmacros_version_major_number_tl .
@@ -55,218 +55,6730 @@
   {\c_chemmacros_info_tl \c_space_tl (CN)}
 
 % --------------------------------------------------------------------------
-% set compatibility
-\tl_new:N \l__chemmacros_compatibility_version_tl
-\tl_set_eq:NN \l__chemmacros_compatibility_version_tl \c_chemmacros_version_tl
+% variants of kernel functions:
+\cs_generate_variant:Nn \tl_if_eq:nnTF {x,xx,V}
+\cs_generate_variant:Nn \tl_replace_once:Nnn {NnV}
+\cs_generate_variant:Nn \tl_tail:n {e}
 
-\keys_define:nn {chemmacros/compatibility}
+\cs_generate_variant:Nn \seq_set_split:Nnn {Nnx}
+\cs_generate_variant:Nn \seq_item:Nn {cV,NV}
+\cs_generate_variant:Nn \seq_put_right:Nn {Ne}
+
+\cs_generate_variant:Nn \prop_item:Nn {NV}
+\cs_generate_variant:Nn \prop_gput:Nnn {cxx,NVf}
+
+\cs_generate_variant:Nn \int_to_arabic:n {V}
+
+\cs_generate_variant:Nn \msg_error:nnnnn {nnnx}
+\cs_generate_variant:Nn \msg_error:nnnn {nnnx}
+\cs_generate_variant:Nn \msg_error:nnn {nnV}
+\cs_generate_variant:Nn \msg_warning:nnn {nnV}
+\cs_generate_variant:Nn \msg_warning:nnnn {nnV}
+\cs_generate_variant:Nn \msg_show:nnnn {nnnV}
+
+\cs_generate_variant:Nn \vbox_set:Nn {NV}
+
+\cs_generate_variant:Nn \keys_define:nn {x} 
+\cs_generate_variant:Nn \keys_set:nn {x,nx}
+
+\cs_generate_variant:Nn \str_if_eq:nnF {xx}
+
+% --------------------------------------------------------------------------
+% load-time messages:
+\msg_new:nnn {chemmacros} {load-time-option}
   {
-    compatibility .code:n =
-      \str_case:nnTF {#1}
+    `#1'~ is~ a~ load-time~ option! \\
+    You~ cannot~ set~ it~ with~ \token_to_str:N \chemsetup ! \\
+    You~ need~ to~ use~ \token_to_str:N \usepackage [#1] {chemmacros} .
+  }
+
+\msg_new:nnn {chemmacros} {unknown-option}
+  {
+    Unknown~ option~ `#1' \\
+    I~ dont'~ know~ the~ option~ `#1'.~ Please~ make~ sure~ there~ is~ no~
+    typo.~ Check~ the~ manual~ for~ help.
+  }
+
+\msg_new:nnn {chemmacros} {module-mechanism}
+  {
+    The~ module~ mechanism~ has~ changed~ with~ v6! \\
+    ==== ======= ========== ==== ======== ===== === \\
+    *~ All~ modules~ have~ been~ integrated~ into~ \\
+    the~ main~ package~ and~ thus~ are~ preloaded~ \\
+    already~ (unless~ you~ have~ loaded~ \\
+    `chemmacros'~ with~ the~ `minimal'~ option). \\
+    *~ The~ new~ default~ corresponds~ to~ the~ \\
+    earlier~ setting~ `modules=all'.
+    \tl_if_blank:nF {#1}
+      { \\ The~ command~ \token_to_str:N #1 is~ deprecated. }
+  }
+
+\cs_new_protected:Npn \__chemmacros_loadtime_error:n #1
+   { \msg_error:nnV {chemmacros} {#1} \l_keys_key_str }
+
+\cs_new_protected:Npn \__chemmacros_loadtime_warning:n #1
+   { \msg_warning:nnV {chemmacros} {#1} \l_keys_key_str }
+
+\clist_new:N \l_chemmacros_modules_clist
+\clist_set:Nn \l_chemmacros_modules_clist
+  {
+    base, errorcheck, lang, greek, chemformula, charges, acid-base, symbols,
+    particles, phases, nomenclature, tikz, xfrac, translations
+  }
+
+\clist_const:Nn \c_chemmacros_all_modules_clist
+  {
+    base, errorcheck, lang, greek, chemformula, charges, acid-base, symbols,
+    particles, phases, nomenclature, tikz, isotopes, mechanisms, newman,
+    orbital, polymers, reactions, redox, xfrac, scheme, spectroscopy,
+    thermodynamics, units, reactants, translations
+  }
+
+\keys_define:nn {chemmacros/package-options}
+  {
+    minimal .bool_set:N = \l__chemmacros_minimal_bool ,
+    minimal .initial:n  = false ,
+    modules .code:n     =
+      \clist_if_in:NF \l_chemmacros_modules_clist
+        { \clist_put_right:Nn \l_chemmacros_modules_clist {#1} } ,
+    unknown .code:n     = \__chemmacros_loadtime_warning:n {unknown-option}
+  }
+
+\ProcessKeysPackageOptions {chemmacros/package-options}
+
+\keys_define:nn {chemmacros}
+  {
+    minimal .code:n = \__chemmacros_loadtime_error:n {load-time-option} ,
+    modules .code:n =
+      \msg_warning:nn {chemmacros} {module-mechanism}
+      \__chemmacros_loadtime_warning:n {load-time-option} ,
+    package-options / minimal .meta:nn = {chemmacros} {minimal} ,
+    package-options / modules .meta:nn = {chemmacros} {modules}
+  }
+
+\NewDocumentCommand \usechemmodule {m}
+  { \msg_warning:nnn {chemmacros} {module-mechanism} {\usechemmodule} }
+
+\bool_if:NF \l__chemmacros_minimal_bool
+  {
+    \clist_set_eq:NN
+      \l_chemmacros_modules_clist
+      \c_chemmacros_all_modules_clist
+  }
+
+% --------------------------------------------------------------------------
+% temporary variables:
+\tl_new:N    \l__chemmacros_tmpa_tl
+\tl_new:N    \l__chemmacros_tmpb_tl
+\tl_new:N    \l__chemmacros_tmpc_tl
+\tl_new:N    \l__chemmacros_tmpd_tl
+
+\bool_new:N  \l__chemmacros_tmpa_bool
+\bool_new:N  \l__chemmacros_tmpb_bool
+\bool_new:N  \l__chemmacros_tmpc_bool
+
+\dim_new:N   \l__chemmacros_tmpa_dim
+\dim_new:N   \l__chemmacros_tmpb_dim
+\dim_new:N   \l__chemmacros_tmpc_dim
+
+\seq_new:N   \l__chemmacros_tmpa_seq
+\seq_new:N   \l__chemmacros_tmpb_seq
+\seq_new:N   \l__chemmacros_tmpc_seq
+
+\int_new:N   \l__chemmacros_tmpa_int
+\int_new:N   \l__chemmacros_tmpb_int
+\int_new:N   \l__chemmacros_tmpc_int
+
+\box_new:N   \l__chemmacros_tmpa_box
+\box_new:N   \l__chemmacros_tmpb_box
+\box_new:N   \l__chemmacros_tmpc_box
+
+\clist_new:N \l__chemmacros_tmpa_clist
+\clist_new:N \l__chemmacros_tmpb_clist
+\clist_new:N \l__chemmacros_tmpc_clist
+
+\str_new:N   \l__chemmacros_tmpa_str
+\str_new:N   \l__chemmacros_tmpb_str
+\str_new:N   \l__chemmacros_tmpc_str
+
+% ----------------------------------------------------------------------------
+% module mechanism:
+\msg_new:nnn {chemmacros} {module-missing}
+  {
+    You've~ requested~ the~ chemmacros~ 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 {chemmacros} {loading-module}
+  { Loading~ the~ chemmacros~ module~ `#1'~ ... }
+
+\msg_new:nnn {chemmacros} {wrong-module-name}
+  { The~ module~ file~ name~ is~ `#2'~ but~ it~ provides~ module~ `#1'. }
+
+\msg_new:nnn {chemmacros} {forbidden-module}
+  {
+    You've~ requested~ the~ chemmacros~ module~ `modules'~ \msg_line_context: .~
+  This~ module~ is~ a~ pseudo~ module~ which~ may~ not~ be~ loaded~ through~
+  the~ module~ loading~ mechansim.
+  }
+
+% ----------------------------------------------------------------------------
+\prg_new_conditional:Npnn \chemmacros_package_if_loaded:n #1 {p,T,F,TF}
+  {
+    \cs_if_exist:cTF {ver@#1.sty}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+% ----------------------------------------------------------------------------
+% this is for external file modules called "styles":
+\tl_const:Nn \c__chemmacros_module_extension_tl {code.tex}
+\tl_const:Nn \c__chemmacros_module_prefix_tl    {chemmacros}
+
+\tl_new:N \g__chemmacros_modules_loaded_tl
+
+\cs_new_protected:Npn \chemmacros_modules_load:n #1
+  { \clist_map_inline:nn {#1} { \chemmacros_module_load:n {##1} } }
+
+\cs_new_protected:Npn \chemmacros_module_load:n #1
+  {
+    \tl_set:Nx \l_tmpa_tl { \tl_trim_spaces:n {#1} }
+    \str_if_eq:VnTF \l_tmpa_tl {modules}
+      { \msg_error:nn {chemmacros} {forbidden-module} }
+      {  \__chemmacros_module_load:V \l_tmpa_tl }
+  }
+
+\cs_new_protected:Npn \__chemmacros_module_load:n #1
+  {
+    \chemmacros_module_if_loaded:nF {#1}
+      {
+        \chemmacros_module_if_exist:nTF {#1}
+          {
+            \__chemmacros_module_hook_use:nn {#1} {before}
+            \msg_info:nnn {chemmacros} {loading-module} {#1}
+            \@onefilewithoptions
+              {\c__chemmacros_module_prefix_tl.#1}[][]
+              \c__chemmacros_module_extension_tl
+            \__chemmacros_module_hook_use:nn {#1} {after}
+          }
+          { \msg_error:nnn {chemmacros} {module-missing} {#1} }
+      }
+  }
+\cs_generate_variant:Nn \__chemmacros_module_load:n {V}
+
+\prg_new_conditional:Npnn \chemmacros_module_if_loaded:n #1 {p,T,F,TF}
+  {
+    \tl_if_in:NnTF \g__chemmacros_modules_loaded_tl {#1}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+\prg_new_conditional:Npnn \chemmacros_module_if_exist:n #1 {p,T,F,TF}
+  {
+    \file_if_exist:nTF
+      {\c__chemmacros_module_prefix_tl.#1.\c__chemmacros_module_extension_tl}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+% --------------------------------------------------------------------------
+% module hooks:
+% #1: module
+% #2: code
+\cs_new_protected:Npn \chemmacros_module_after:nn #1#2
+  {
+    \chemmacros_module_if_loaded:nTF {#1}
+      {#2}
+      { \__chemmacros_add_to_module_hook:nnn {#1} {after} {#2} }
+  }
+
+% #1: module
+% #2: code
+\cs_new_protected:Npn \chemmacros_module_before:nn #1#2
+  {
+    % TODO: error in T case?
+    \chemmacros_module_if_loaded:nF {#1}
+      { \__chemmacros_add_to_module_hook:nnn {#1} {before} {#2} }
+  }
+
+% #1: module
+% #2: hook name
+% #3: code
+\cs_new_protected:Npn \__chemmacros_add_to_module_hook:nnn #1#2#3
+  {
+    \chemmacros_module_if_loaded:nF {#1}
+      {
+        \tl_if_exist:cF {g__chemmacros_module_hook_#1_#2_tl}
+          { \tl_new:c {g__chemmacros_module_hook_#1_#2_tl} }
+        \tl_gput_right:cn {g__chemmacros_module_hook_#1_#2_tl} {#3}
+      }
+  }
+
+% #1: module
+% #2: hook name
+\cs_new_protected:Npn \__chemmacros_module_hook_use:nn #1#2
+  {
+    \tl_if_exist:cT {g__chemmacros_module_hook_#1_#2_tl}
+      {
+        \tl_use:c {g__chemmacros_module_hook_#1_#2_tl}
+        \tl_gclear:c {g__chemmacros_module_hook_#1_#2_tl}
+      }
+  }
+\cs_generate_variant:Nn \__chemmacros_module_hook_use:nn {V}
+
+% --------------------------------------------------------------------------
+\tl_new:N \l__chemmacros_module_date_tl
+\tl_new:N \l__chemmacros_module_version_tl
+
+\tl_set_eq:NN \l__chemmacros_module_date_tl \c_chemmacros_date_tl
+\tl_set_eq:NN \l__chemmacros_module_version_tl \c_chemmacros_version_tl
+
+\cs_new_protected:Npn \__chemmacros_module:nn #1#2
+  {
+    \tl_gput_right:Nn \g__chemmacros_modules_loaded_tl {{#1}}
+    \str_if_eq:xxF
+      {\c__chemmacros_module_prefix_tl.#1.\c__chemmacros_module_extension_tl}
+      {\@currname.\@currext}
+      {
+        \msg_error:nnnxx {chemmacros} {wrong-module-name}
+          {#1}
+          {\@currname.\@currext}
+      }
+    \ProvidesFile
+      {\c__chemmacros_module_prefix_tl.#1.\c__chemmacros_module_extension_tl}
+      [
+        \l__chemmacros_module_date_tl
+        \c_space_tl
+        v \l__chemmacros_module_version_tl
+        \c_space_tl
+        chemmacros~ style~ file~ `#1'~ (#2)
+      ]
+  }
+
+% --------------------------------------------------------------------------
+% define internal chemmacros modules:
+\tl_new:N \g_chemmacros_module_tl
+\tl_new:N \g__chemmacros_module_stop_tl
+
+\cs_new_protected:Npn \chemmacros_stop_module:n #1
+  { \tl_gput_right:Nn \g__chemmacros_module_stop_tl {{#1}} }
+
+% #1: name
+% #2: description
+\cs_new_protected:Npn \ChemModule #1#2
+  {
+    \str_if_in:NnT \g__chemmacros_module_stop_tl {{#1}}
+      { \__chemmacros_gobble_module:w }
+    \msg_log:nnnn {chemmacros} {loading-module} {#1} {#2}
+    \msg_term:nnnn {chemmacros} {loading-module} {#1} {#2}
+    \tl_gput_right:Nn \g__chemmacros_modules_loaded_tl {{#1}}
+    \tl_gset:Nn \g_chemmacros_module_tl {#1}
+    \__chemmacros_module_hook_use:nn {#1} {before}
+  }
+
+\cs_new_protected:Npn \ChemModuleEnd
+  { \__chemmacros_module_hook_use:Vn \g_chemmacros_module_tl {after} }
+
+\cs_new_protected:Npn \__chemmacros_gobble_module:w #1 \ChemModuleEnd {}
+
+\clist_map_inline:Nn \c_chemmacros_all_modules_clist
+  {
+    \clist_if_in:NnF \l_chemmacros_modules_clist {#1}
+      { \chemmacros_stop_module:n {#1} }
+  }
+
+% --------------------------------------------------------------------------
+\ChemModule{base}{2022/01/10 basic chemmacros module}
+
+% --------------------------------------------------------------------------
+\msg_new:nnn {chemmacros} {command-deprecated}
+  {
+    The~ command~ \token_to_str:N #1 \c_space_tl is~ deprecated.~ Use~
+    \token_to_str:N #2 \c_space_tl instead.
+  }
+
+% define a deprecated command with hints to the corresponding new one:
+\cs_new_protected:Npn \chemmacros_define_deprecated:NN #1#2
+  {
+    \cs_set_protected:Npn #1
+      { \msg_warning:nnnn {chemmacros} {command-deprecated} {#1} {#2} #2 }
+  }
+
+\NewDocumentCommand \DeclareChemDeprecated {mm}
+  { \chemmacros_define_deprecated:NN #1 #2 }
+
+% --------------------------------------------------------------------------
+% define a macro set:
+% \NewChem... \RenewChem... \DeclareChem... \ProvideChem...
+% #1: macro names
+% #2: arg spec
+% #3: internal command call
+\cs_new_protected:Npn \chemmacros_new_macroset:nnn #1#2#3
+  {
+    \exp_args:Nc \NewDocumentCommand
+      {
+        NewChem
+        \str_uppercase:f { \tl_head:n {#1} }
+        \tl_tail:n {#1}
+      }
+      {#2}
+      {
+        \cs_if_free:NTF ##1
+          { #3 }
+          { \msg_error:nnn {chemmacros} {new-#1} {##1} }
+      }
+    \exp_args:Nc \NewDocumentCommand
+      {
+        RenewChem
+        \str_uppercase:f { \tl_head:n {#1} }
+        \tl_tail:n {#1}
+      }
+      {#2}
+      {
+        \cs_if_free:NTF ##1
+          { \msg_error:nnn {chemmacros} {renew-#1} {##1} }
+          { #3 }
+      }
+    \exp_args:Nc \NewDocumentCommand
+      {
+        DeclareChem
+        \str_uppercase:f { \tl_head:n {#1} }
+        \tl_tail:n {#1}
+      }
+      {#2}
+      {#3}
+    \exp_args:Nc \NewDocumentCommand
+      {
+        ProvideChem
+        \str_uppercase:f { \tl_head:n {#1} }
+        \tl_tail:n {#1}
+      }
+      {#2}
+      { \cs_if_free:NT ##1 { #3 } }
+    \msg_new:nnn {chemmacros} {new-#1}
+      {
+        You've~ tried~ to~ define~ a~ #1~ with~ \token_to_str:N
+        \NewChem #1 ,~ but~ the~ command~ sequence~ \token_to_str:N ##1
+        \c_space_tl already~ exists.~ Please~ choose~ another~ name.
+      }
+    \msg_new:nnn {chemmacros} {renew-#1}
+      {
+        You've~ tried~ to~ renew~ the~ #1~ \token_to_str:N ##1 ,~ but~
+        it~ doesn't~ exist.
+      }
+  }
+
+\cs_new_protected:Npn \chemmacros_new_environment_macroset:nnn #1#2#3
+  {
+    \exp_args:Nc \NewDocumentCommand {NewChem#1} {#2}
+      {
+        \bool_lazy_and:nnTF
+          { \cs_if_free_p:c {##1} }
+          { \cs_if_free_p:c {end##1} }
+          {#3}
+          { \msg_error:nnn {chemmacros} {new-#1} {##1} }
+      }
+    \exp_args:Nc \NewDocumentCommand {RenewChem#1} {#2}
+      {
+        \bool_lazy_or:nnTF
+          { \cs_if_free_p:c {##1} }
+          { \cs_if_free_p:c {end##1} }
+          { \msg_error:nnn {chemmacros} {renew-#1} {##1} }
+          {#3}
+      }
+    \exp_args:Nc \NewDocumentCommand {DeclareChem#1} {#2} {#3}
+    \exp_args:Nc \NewDocumentCommand {ProvideChem#1} {#2}
+      {
+        \bool_lazy_and:nT
+          { \cs_if_free_p:c {##1} }
+          { \cs_if_free_p:c {end##1} }
+          {#3}
+      }
+    \msg_new:nnn {chemmacros} {new-#1}
+      {
+        You've~ tried~ to~ define~ a~ #1~ with~ \token_to_str:N
+        \NewChem #1 ,~ but~ the~ command~ sequence~ \exp_not:c {##1}
+        \c_space_tl already~ exists.~ Please~ choose~ another~ name.
+      }
+    \msg_new:nnn {chemmacros} {renew-#1}
+      { You've~ tried~ to~ renew~ the~ #1~ ##1,~ but~ it~ doesn't~ exist. }
+  }
+
+\NewDocumentCommand \NewChemMacroset {smmm}
+  {
+    \IfBooleanTF {#1}
+      { \chemmacros_new_environment_macroset:nnn {#2} {#3} {#4} }
+      { \chemmacros_new_macroset:nnn {#2} {#3} {#4} }
+  }
+  
+% --------------------------------------------------------------------------
+\cs_new_protected:Npn \chemmacros_define_keys:nn #1#2
+  { \keys_define:nn {chemmacros/#1} {#2} }
+\cs_generate_variant:Nn \chemmacros_define_keys:nn {x}
+
+\cs_new_protected:Npn \chemmacros_set_keys:nn #1#2
+  { \keys_set:nn {chemmacros/#1} {#2} }
+\cs_generate_variant:Nn \chemmacros_set_keys:nn {x,nx}
+
+\cs_new_protected:Npn \chemmacros_set_keys_groups:nnn #1#2#3
+  { \keys_set_groups:nnn {chemmacros/#1} {#2} {#3} }
+
+\cs_new_protected:Npn \chemmacros_set_keys_filter:nnn #1#2#3
+  { \keys_set_filter:nnn {chemmacros/#1} {#2} {#3} }
+
+\cs_new_protected:Npn \chemmacros_define_global_keys:n #1
+  { \keys_define:nn {chemmacros} {#1} }
+
+\cs_new_protected:Npn \chemmacros_set_global_keys:n #1
+  { \keys_set:nn {chemmacros} {#1} }
+
+% --------------------------------------------------------------------------
+% basic tools:
+\cs_new:Npn \chemmacros_remove_backslash:N #1
+  { \exp_after:wN \use_none:n \token_to_str:N #1 }
+
+\cs_new_eq:NN \chemmacros_ignore_spaces: \tex_ignorespaces:D
+
+\cs_new_protected:Npn \chemmacros_nobreak:     { \tex_penalty:D 10000 \scan_stop: }
+\cs_new_protected:Npn \chemmacros_allow_break: { \tex_penalty:D \c_zero_int }
+\cs_new_protected:Npn \chemmacros_skip_nobreak:N #1
+  {
+    \chemmacros_nobreak:
+    \skip_horizontal:N #1
+    \chemmacros_nobreak:
+  }
+
+% this is used at least in the `isotope' module
+\prg_new_conditional:Npnn \chemmacros_if_is_int:n #1 {p,T,F,TF}
+  {
+    \if_charcode:w ! \if_int_compare:w 9 < 1#1 ! \else: _ \fi:
+      \prg_return_true:
+    \else:
+      \prg_return_false:
+    \fi:
+  }
+
+\prg_new_conditional:Npnn \chemmacros_if_loaded:nn #1#2 {p,T,F,TF}
+  {
+    \use:c {chemmacros_if_#1_loaded:nTF} {#2}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+  
+\prg_new_conditional:Npnn \chemmacros_if_package_loaded:n #1 {p,T,F,TF}
+  {
+    \cs_if_exist:cTF {ver@#1.sty}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+\prg_new_conditional:Npnn \chemmacros_if_class_loaded:n #1 {p,T,F,TF}
+  {
+    \cs_if_exist:cTF {ver@#1.cls}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+% this is still true \AtBeginDocument:
+\prg_new_conditional:Npnn \chemmacros_if_preamble: {p,T,F,TF}
+  {
+    \cs_if_eq:NNTF \@onlypreamble \@notprerr
+      { \prg_return_false: }
+      { \prg_return_true: }
+  }
+
+% this is still false \AtBeginDocument:
+\prg_new_conditional:Npnn \chemmacros_if_document: {p,T,F,TF}
+  {
+    \bool_if:NTF \l__chemmacros_in_document_bool
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+\cs_new_protected:Npn \chemmacros_cs_if_free_new:Npn #1
+  {
+    \cs_if_exist:NF #1
+      { \cs_new:Npn #1 }
+  }
+\cs_generate_variant:Nn \chemmacros_cs_if_free_new:Npn {c}
+
+\cs_new_protected:Npn \chemmacros_cs_if_free_new_protected:Npn #1
+  {
+    \cs_if_exist:NF #1
+      { \cs_new_protected:Npn #1 }
+  }
+\cs_generate_variant:Nn \chemmacros_cs_if_free_new_protected:Npn {c}
+
+% #1: counter
+% #2: singular
+% #3: plural
+% #4: Singular
+% #5: Plural
+\cs_new_protected:Npn \chemmacros_add_cleveref_support:nnnnn #1#2#3#4#5
+  {
+    \hook_gput_code:nnn {package/cleveref/after} {chemmacros}
+      {
+        \cs_if_exist:cF {cref@#1 at name}
+          {
+            \legacy_if:nTF {@cref at capitalise}
+              { \crefname {#1} {#4} {#5} }
+              { \crefname {#1} {#2} {#3} }
+            \Crefname {#1} {#4} {#5}
+          }
+      }
+  }
+\cs_generate_variant:Nn \chemmacros_add_cleveref_support:nnnnn {nnnx,nnnxx,nnnnx}
+  
+% #1: counter
+% #2: singular
+% #3: Singular (optional)
+% #4: plural
+% #5: Plural (optional)
+\NewDocumentCommand \ChemCleverefSupport {mmomo}
+  {
+    \IfNoValueTF {#3}
+      {
+        \IfNoValueTF {#5}
+          {
+            \chemmacros_add_cleveref_support:nnnnn
+              {#1}
+              {#2}
+              {#4}
+              { \text_titlecase:n {#2} }
+              { \text_titlecase:n {#4} }
+          }
+          {
+            \chemmacros_add_cleveref_support:nnnnn
+              {#1}
+              {#2}
+              {#4}
+              { \text_titlecase:n {#2} }
+              {#5}
+          }
+      }
+      {
+        \IfNoValueTF {#5}
+          {
+            \chemmacros_add_cleveref_support:nnnnn
+              {#1}
+              {#2}
+              {#4}
+              {#3}
+              { \text_titlecase:n {#4} }
+          }
+          { \chemmacros_add_cleveref_support:nnnnn {#1} {#2} {#4} {#3} {#5} }
+      }
+  }
+\@onlypreamble\ChemCleverefSupport
+
+% #1: id
+% #2: mid sentence
+% #3: begin sentence
+\cs_new_protected:Npn \chemmacros_add_fancyref_support:nnn #1#2#3
+  {
+    \hook_gput_code:nnn {package/fancyref/after} {chemmacros}
+      {
+        \chemmacros_cs_if_free_new:cpn {fancyref#1labelprefix} {#1}
+        \chemmacros_cs_if_free_new:cpn {fref#1name} {#2}
+        \chemmacros_cs_if_free_new:cpn {Fref#1name} {#3}
+        \exp_args:Nnx \frefformat {vario} { \exp_not:c {fancyref#1labelprefix} }
+          { \use:c {fref#1name} \fancyrefdefaultspacing ##1##3 }
+        \exp_args:Nnx \Frefformat {vario} { \exp_not:c {fancyref#1labelprefix} }
+          { \use:c {Fref#1name} \fancyrefdefaultspacing ##1##3 }
+        \exp_args:Nnx \frefformat {plain} { \exp_not:c {fancyref#1labelprefix} }
+          { \use:c {fref#1name} \fancyrefdefaultspacing ##1 }
+        \exp_args:Nnx \Frefformat {plain} { \exp_not:c {fancyref#1labelprefix} }
+          { \use:c {Fref#1name} \fancyrefdefaultspacing ##1 }
+      }
+  }
+\cs_generate_variant:Nn \chemmacros_add_fancyref_support:nnn {nnx}
+
+% #1: id
+% #2: mid sentence
+% #3: begin sentence (optional)
+\NewDocumentCommand \ChemFancyrefSupport {mmo}
+  {
+    \IfNoValueTF {#3}
+      { \chemmacros_add_fancyref_support:nnn {#1} {#2} { \text_titlecase:n {#3} } }
+      { \chemmacros_add_fancyref_support:nnn {#1} {#2} {#3} }
+  }
+\@onlypreamble\ChemFancyrefSupport
+
+% --------------------------------------------------------------------------
+% some checks at begin document:
+\bool_new:N \l__chemmacros_in_document_bool
+\bool_new:N \l__chemmacros_chemstyle_bool
+
+\hook_gput_code:nnn {begindocument/before} {chemmacros}
+  {
+    \bool_set_true:N \l__chemmacros_in_document_bool
+    \chemmacros_if_package_loaded:nT {chemstyle}
+      { \bool_set_true:N \l__chemmacros_chemstyle_bool }
+  }
+
+% --------------------------------------------------------------------------
+% detection and handling of bold face:
+\RequirePackage{bm}
+
+\prg_new_protected_conditional:Npnn \chemmacros_if_bold: {T,F,TF}
+  {
+    \seq_if_in:NVTF \l__chemmacros_if_bf_seq \f at series
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+\seq_new:N  \l__chemmacros_if_bf_seq
+
+\seq_set_split:Nnn \l__chemmacros_if_bf_seq { , }
+  {
+    b , bc , bm , bx , bux ,
+    eb , ebc , ebx , mb ,
+    sb , sbc , sbx ,
+    ub , ubc , ubx
+  }
+
+\cs_new_protected:Npn \chemmacros_bold:n #1
+  {
+    \chemmacros_if_bold:TF
+      {
+        \mode_if_math:TF
+          { \bm {#1} }
+          { \textbf {#1} }
+      }
+      {#1}
+  }
+
+\cs_new_protected:Npn \chemmacros_detect_bold:n
+  { \error \chemmacros_bold:n }
+
+% --------------------------------------------------------------------------
+\RequirePackage{amstext}
+
+\cs_new_protected:Npn \chemmacros_text:n #1
+  { \mode_if_math:TF { \text {#1} } {#1} }
+\cs_generate_variant:Nn \chemmacros_text:n {V}
+
+\cs_new_protected:Npn \chemmacros_math:n #1
+  { \chemmacros_text:n { \c_math_toggle_token #1 \c_math_toggle_token } }
+\cs_generate_variant:Nn \chemmacros_math:n {V}
+
+% --------------------------------------------------------------------------
+% a setup command:
+\NewDocumentCommand \chemsetup {om}
+  {
+    \IfNoValueTF {#1}
+      { \keys_set:nn {chemmacros}    {#2} }
+      { \keys_set:nn {chemmacros/#1} {#2} }
+  }
+
+% --------------------------------------------------------------------------
+
+% load package #1 and add its options to chemmacros
+%   this requires that package #1 defines its options with l3keys using its
+%   name as module
+\cs_new_protected:Npn \chemmacros_integrate_package:nnn #1#2#3
+  {
+    \tl_if_blank:nTF {#3}
+      {
+        \tl_if_blank:nTF {#1}
+          { \RequirePackage {#2} }
+          { \RequirePackage [#1] {#2} }
+      }
+      {
+        \tl_if_blank:nTF {#1}
+          { \RequirePackage {#2} [#3] }
+          { \RequirePackage [#1] {#2} [#3] }
+      }
+    \chemmacros_define_global_keys:n
+      {
+        #2 .choice: ,
+        #2 / unknown .code:n =
+          \keys_set:no {#2} { \l_keys_key_tl = ##1 }
+      }
+  }
+
+% --------------------------------------------------------------------------
+
+\bool_new:N \l__chemmacros_hyperref_bool
+
+\hook_gput_code:nnn {begindocument/end} {chemmacros}
+  {
+    \chemmacros_if_package_loaded:nT {hyperref}
+      { \bool_set_true:N \l__chemmacros_hyperref_bool }
+  }
+
+\ChemModuleEnd
+\ChemModule{errorcheck}{2022/01/16 error checking for unloaded modules}
+
+\msg_new:nnn {chemmacros} {undefined}
+  {
+    The~ #1~ `#2'~ is~ undefined.~ You~ need~ to~ load~ the~
+    `#3'~ module.
+  }
+
+\cs_new_protected:Npn \chemmacros_requires_module:nNn #1#2#3
+  {
+    \chemmacros_module_if_loaded:nF {#3}
+      {
+        \cs_if_free:NT #2
+          {
+            \str_case:nn {#1}
+              {
+                {command} {
+                  \cs_set:Npn #2
+                    {
+                      \msg_error:nnnxn {chemmacros} {undefined}
+                        {#1}
+                        { \token_to_str:N #2 }
+                        {#3}
+                    }
+                  \chemmacros_module_before:nn {#3} { \cs_undefine:N #2 }
+                }
+                {environment} {
+                  \cs_set:Npn #2
+                    {
+                      \msg_error:nnnxn {chemmacros} {undefined}
+                        {#1}
+                        { \tl_tail:e { \token_to_str:N #2 } }
+                        {#3}
+                    }
+                  \chemmacros_module_before:nn {#3} { \cs_undefine:N #2 }
+                }
+              }
+          }
+      }
+  }
+\cs_generate_variant:Nn \chemmacros_requires_module:nNn {nc}
+
+\cs_new_protected:Npn \chemmacros_command_requires_module:Nn #1#2
+  { \chemmacros_requires_module:nNn {command} #1 {#2} }
+
+\cs_new_protected:Npn \chemmacros_environment_requires_module:nn #1#2
+  { \chemmacros_requires_module:ncn {environment} {#1} {#2} }
+
+% --------------------------------------------------------------------------
+% add checking for the most common user commands and environments:
+% isotopes module
+\chemmacros_command_requires_module:Nn \isotope {isotopes}
+
+% mechanisms module
+\chemmacros_command_requires_module:Nn \mech {mechanisms}
+
+% newman module
+\chemmacros_command_requires_module:Nn \newman {newman}
+
+% orbital module
+\chemmacros_command_requires_module:Nn \orbital {orbital}
+
+% polymers module
+\chemmacros_command_requires_module:Nn \makepolymerdelims {polymers}
+
+% reactions module
+\chemmacros_environment_requires_module:nn {reaction}       {reactions}
+\chemmacros_environment_requires_module:nn {reaction*}      {reactions}
+\chemmacros_environment_requires_module:nn {reactions}      {reactions}
+\chemmacros_environment_requires_module:nn {reactions*}     {reactions}
+\chemmacros_command_requires_module:Nn     \listofreactions {reactions}
+\chemmacros_command_requires_module:Nn     \AddRxnDesc      {reactions}
+
+% redox module
+\chemmacros_command_requires_module:Nn \ox    {redox}
+\chemmacros_command_requires_module:Nn \OX    {redox}
+\chemmacros_command_requires_module:Nn \redox {redox}
+
+% scheme module
+\chemmacros_environment_requires_module:nn {scheme}        {scheme}
+\chemmacros_command_requires_module:Nn     \listschemename {scheme}
+\chemmacros_command_requires_module:Nn     \schemename     {scheme}
+\chemmacros_command_requires_module:Nn     \listofschemes  {scheme}
+
+\hook_gput_code:nnn {package/chemscheme/before} {chemmacros}
+  {
+    \cs_undefine:N \scheme
+    \cs_undefine:N \endscheme
+    \cs_undefine:N \listschemename
+    \cs_undefine:N \schemename
+    \cs_undefine:N \listofschemes
+  }
+
+% spectroscopy module
+\chemmacros_command_requires_module:Nn     \NMR           {spectroscopy}
+\chemmacros_environment_requires_module:nn {experimental} {spectroscopy}
+
+% thermodynamics module
+\chemmacros_command_requires_module:Nn \state    {thermodynamics}
+\chemmacros_command_requires_module:Nn \enthalpy {thermodynamics}
+\chemmacros_command_requires_module:Nn \entropy  {thermodynamics}
+\chemmacros_command_requires_module:Nn \gibbs    {thermodynamics}
+
+% xfrac module
+\chemmacros_command_requires_module:Nn \chemfrac {xfrac}
+
+% --------------------------------------------------------------------------
+
+\ChemModuleEnd
+\ChemModule{lang}{2020/11/29 language settings for chemmacros}
+
+\RequirePackage{translations}
+
+\msg_new:nnn {chemmacros} {language-not-defined}
+  {
+    You~ chose~ the~ language~ `#1'~ which~ is~ not~ defined~ by~ chemmacros.~
+    `english'~ is~ used~ instead.~ If~ you~ just~ mistyped~ try~ again!~
+    Otherwise~ contact~ the~ author~ and~ he'll~ probably~ add~ your~ language.
+  }
+
+% --------------------------------------------------------------------------
+% language settings:
+\bool_new:N      \l__chemmacros_language_auto_bool
+\bool_set_true:N \l__chemmacros_language_auto_bool
+% this token list will hold the chosen language for chemmacros; since the
+% language is either chosen automatically or by option it is only available at
+% begin document
+\tl_new:N  \l_chemmacros_language_tl
+\tl_set:Nn \l_chemmacros_language_tl {english}
+\tl_new:N  \l__chemmacros_current_language_tl
+
+\tl_const:Nn \c__chemmacros_keyword_prefix_tl {chem-keyword-}
+
+\prop_new:N \g_chemmacros_translations_prop
+
+% translate the key #1
+\cs_new:Npn \chemmacros_translate:n #1
+  {
+    \bool_if:NTF \l__chemmacros_language_auto_bool
+      { \GetTranslation { \c__chemmacros_keyword_prefix_tl #1 } }
+      {
+        \GetTranslationFor
+          {\l_chemmacros_language_tl}
+          { \c__chemmacros_keyword_prefix_tl #1 }
+      }
+  }
+
+\DeclareExpandableDocumentCommand \ChemTranslate {m}
+  { \chemmacros_translate:n {#1} }
+
+\chemmacros_define_global_keys:n
+  {
+    language .value_required:n = true ,
+    language .code:n =
+      \tl_if_eq:nnTF {#1} {auto}
+        { \bool_set_true:N \l__chemmacros_language_auto_bool }
         {
-          {newest} {}
-          {latest} {}
+          \bool_set_false:N \l__chemmacros_language_auto_bool
+          \tl_set:Nn \l__chemmacros_current_language_tl {#1}
+        } ,
+    language .initial:n = auto
+  }
+
+\hook_gput_code:nnn {begindocument} {package/chemmacros}
+  {
+    \bool_if:NTF \l__chemmacros_language_auto_bool
+      {
+        \tl_set:Nx \l_chemmacros_language_tl
+          { \@trnslt at language{\@trnslt at current@language} }
+      }
+      {
+        \tl_set_eq:NN
+          \l_chemmacros_language_tl
+          \l__chemmacros_current_language_tl
+      }
+  }
+
+% --------------------------------------------------------------------------
+\cs_new_protected:Npn \__chemmacros_declare_translation:nw #1#2=#3\q_stop
+  {
+    \tl_set:Nx \l__chemmacros_tmpa_tl { \tl_trim_spaces:n {#2} }
+    \tl_set:Nx \l__chemmacros_tmpb_tl { \tl_trim_spaces:n {#3} }
+    \use:x
+      {
+        \chemmacros_declare_translation:nnn
+          { \exp_not:n {#1} }
+          { \exp_not:V \l__chemmacros_tmpa_tl }
+          { \exp_not:V \l__chemmacros_tmpb_tl }
+      }
+  }
+
+% #1: key
+% #2: lang
+% #3: translation
+\cs_new_protected:Npn \chemmacros_declare_translation:nnn #1#2#3
+  {
+    \declaretranslation
+      {#2}
+      { \c__chemmacros_keyword_prefix_tl #1 }
+      {#3}
+    \prop_gput:Nnn \g_chemmacros_translations_prop {#1(#2)} {#3}
+  }
+\cs_generate_variant:Nn \chemmacros_declare_translation:nnn {V}
+
+% #1: key
+% #2: csv list: { <lang1> = <translation1> , <lang2> = <translation2> }
+\cs_new_protected:Npn \chemmacros_declare_translations:nn #1#2
+  {
+    \clist_map_inline:nn {#2}
+      { \__chemmacros_declare_translation:nw {#1} ##1 \q_stop }
+  }
+
+\NewDocumentCommand \DeclareChemTranslations {mm}
+  { \chemmacros_declare_translations:nn {#1} {#2} }
+\@onlypreamble \DeclareChemTranslations
+  
+\NewDocumentCommand \DeclareChemTranslation {mmm}
+  { \chemmacros_declare_translation:nnn {#1} {#2} {#3} }
+\@onlypreamble \DeclareChemTranslation
+
+\cs_new:Npn \__chemmacros_parse_translate_list_entry:nnn #1#2#3 {}
+
+\cs_new_protected:Npn \__chemmacros_parse_translate_list_entry:www #1(#2)\q_mark#3\q_stop
+  { \__chemmacros_parse_translate_list_entry:nnn {#1} {#2} {#3} }
+
+\cs_new_protected:Npn \chemmacros_for_all_translations_do:n #1
+  {
+    \cs_set:Npn \__chemmacros_parse_translate_list_entry:nnn ##1##2##3 {#1}
+    \prop_map_inline:Nn \g_chemmacros_translations_prop
+      { \__chemmacros_parse_translate_list_entry:www ##1 \q_mark ##2 \q_stop }
+  }
+
+\NewDocumentCommand \ForAllChemTranslationsDo {+m}
+  { \chemmacros_for_all_translations_do:n {#1} }
+
+% --------------------------------------------------------------------------
+\ChemModuleEnd
+\ChemModule{greek}{2020/11/29 upright greek symbols}
+
+\DeclareHookRule {begindocument/end} {chemmacros} {after} {chemgreek}
+\RequirePackage{chemgreek}
+
+\msg_new:nnn {chemmacros} {no-greek}
+  {
+    You~ haven't~ loaded~ any~ package~ for~ upright~ Greek~ letters~ or~ no~
+    unique~ choice~ was~ possible.~ Either~ load~ one~ of~ packages~
+    specified~ in~ the~ manual~ or~ select~ a~ chemgreek~ mapping~ manually.
+  }
+
+\msg_new:nnn {chemmacros} {greek-undefined}
+  {
+    The~ chemgreek~ mapping~ `#1'~ you~ chose~ \msg_line_context: \c_space_tl
+    is~ not~ defined.~ Please~ choose~ another~ one.
+  }
+
+% chemgreek selects a mapping if an unambiguous choice is possible, otherwise
+% selects `default'. Warn the user in this case:
+
+\hook_gput_code:nnn {begindocument/end} {chemmacros}
+  {
+    \bool_lazy_or:nnT
+      { \chemgreek_if_mapping_active_p:n {default} }
+      { \chemgreek_if_mapping_active_p:n {var-default} }
+      { \msg_warning:nn {chemmacros} {no-greek} }
+  }
+
+% an option for manual selection:
+\chemmacros_define_global_keys:n
+  { greek .code:n = \chemmacros_choose_chemgreek_mapping:n {#1} }
+
+\cs_new_protected:Npn \chemmacros_choose_chemgreek_mapping:n #1
+  {
+    \chemgreek_if_mapping_exists:nTF {#1}
+      {
+        \chemgreek_load_mapping_package:n {#1}
+        \chemgreek_activate_mapping:n {#1}
+      }
+      { \msg_warning:nnn {chemmacros} {greek-undefined} {#1} }
+  }
+
+% --------------------------------------------------------------------------
+\ChemModuleEnd
+\ChemModule{chemformula}{2020/11/29 integration of chemical formulas}
+
+\RequirePackage{amstext}
+
+\msg_new:nnn {chemmacros} {unknown-formula-method}
+  {
+    You~ chose~ the~ formula~ method~ `#1'~ which~ is~ not~ available.~
+    I'm~ falling~ back~ to~ `chemformula'~ now.
+  }
+
+\msg_new:nnn {chemmacros} {default-formula-method}
+  {
+    You~ haven't~ chosen~ a~ formula~ method~ so~ I'm~ assuming~ the~ default~
+    method~ `chemformula'.
+  }
+
+\msg_new:nnn {chemmacros} {formula-conflict}
+  {
+    You~ have~ loaded~ multiple~ formula~ method~ packages~ but~ haven't~
+    chosen~ which~ method~ to~ use!~ I~ will~ use~ `chemformula'. \\
+    You~ should~ decide~ for~ only~ one~ of~ the~ packages~ for~ having~ a~
+    consistent~ layout.
+  }
+
+% --------------------------------------------------------------------------
+% generic functions for usage in other packages; those are to be set in each
+% method setup:  
+\cs_new_protected:Npn \chemmacros_reaction:n #1    {#1}
+\cs_new_protected:Npn \chemmacros_chemformula:n #1 {#1}
+\cs_generate_variant:Nn \chemmacros_chemformula:n { x,V }
+
+\cs_new_protected:Npn \chemmacros at formula #1  { \chemmacros_chemformula:n {#1} }
+\cs_new_protected:Npn \chemmacros at reaction #1 { \chemmacros_reaction:n {#1} }
+
+% --------------------------------------------------------------------------
+% setup, check and define each method:
+\bool_new:N \l__chemmacros_formula_method_set_bool
+
+\tl_new:N \g_chemmacros_formula_method_tl
+\tl_gset:Nn \g_chemmacros_formula_method_tl {chemformula}
+
+\prop_new:N \l__chemmacros_method_packages_prop
+    
+% #1: package/method name
+% #2: preparations
+\cs_new_protected:Npn \chemmacros_add_method_package:nn #1#2
+  { \prop_put:Nnn \l__chemmacros_method_packages_prop {#1} {#2} }
+
+\cs_new_protected:Npn \chemmacros_setup_method_package:n #1
+  {
+    \prop_item:Nn \l__chemmacros_method_packages_prop {#1}
+    \tl_gset:Nn \g_chemmacros_formula_method_tl {#1}
+  }
+
+\prg_new_conditional:Npnn \chemmacros_if_method_package:n #1 {p,T,F,TF}
+  {
+    \prop_if_in:NnTF \l__chemmacros_method_packages_prop {#1}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+\cs_new_protected:Npn \chemmacros_check_formula_method:
+  {
+    \bool_if:NF \l__chemmacros_formula_method_set_bool
+      {
+        \bool_set_false:N \l__chemmacros_tmpa_bool
+        \prop_map_inline:Nn \l__chemmacros_method_packages_prop
+          {
+            \chemmacros_if_package_loaded:nT {##1}
+              {
+                \bool_if:NTF \l__chemmacros_tmpa_bool
+                  {
+                    \msg_warning:nn {chemmacros} {formula-conflict}
+                    \chemmacros_set_formula_method:n {chemformula}
+                  }
+                  { \chemmacros_set_formula_method:n {##1} }
+                \bool_set_true:N \l__chemmacros_tmpa_bool
+              }
+            }
+        \bool_if:NF \l__chemmacros_tmpa_bool
+          {
+            \msg_info:nn {chemmacros} {default-formula-method}
+            \chemmacros_set_formula_method:n {chemformula}
+          }
+      }
+  }
+
+\cs_new_protected:Npn \chemmacros_set_formula_method:n #1
+  {
+    \chemmacros_if_method_package:nTF {#1}
+      { \chemmacros_setup_method_package:n {#1} }
+      {
+        \msg_warning:nnn {chemmacros} {unknown-formula-method} {#1}
+        \chemmacros_setup_method_package:n {chemformula}
+      }
+    \bool_set_true:N \l__chemmacros_formula_method_set_bool
+  }
+\cs_generate_variant:Nn \chemmacros_set_formula_method:n {V}
+
+% --------------------------------------------------------------------------
+% add formula methods:
+\chemmacros_add_method_package:nn {chemformula}
+  {
+    \chemmacros_integrate_package:nnn {} {chemformula} {2015/09/08}
+    \cs_set_protected:Npn \chemmacros_chemformula:n #1
+      { \chemformula_chcpd:nn {} {#1} }
+    \cs_set_protected:Npn \chemmacros_reaction:n #1
+      { \chemformula_ch:nn {} {#1} }
+  }
+  
+\chemmacros_add_method_package:nn {mhchem}
+  {
+    \chemmacros_integrate_package:nnn {version=4} {mhchem} {}
+    \cs_set_protected:Npn \chemmacros_chemformula:n #1 { \ce {#1} }
+    \cs_set_protected:Npn \chemmacros_reaction:n #1    { \ce {#1} }
+    \chemmacros_module_after:nn {charges}
+      {
+        \cs_set_protected:Npn \chemmacros_elpair:n #1 { \ce{#1} : }
+        \cs_set_protected:Npn \chemmacros_plus:  { + }
+        \cs_set_protected:Npn \chemmacros_minus: { - }
+        \cs_set_protected:Npn \chemmacros_formal_plus:  { \ensuremath{\oplus} }
+        \cs_set_protected:Npn \chemmacros_formal_minus: { \ensuremath{\ominus} }
+        \cs_set_protected:Npn \fplus  { \ensuremath{\oplus} }
+        \cs_set_protected:Npn \fminus { \ensuremath{\ominus} }
+      }
+  }
+
+\chemmacros_add_method_package:nn {chemist}
+  {
+    \RequirePackage {chemist}
+    \cs_set_protected:Npn \chemmacros_chemformula:n #1
+      { \chemmacros_text:n { \ChemForm {#1} } }
+    \cs_set_protected:Npn \chemmacros_reaction:n #1
+      { \chemmacros_text:n { \ChemForm {#1} } }
+    \chemmacros_module_after:nn {charges}
+      {
+        \cs_set_protected:Npn \chemmacros_elpair:n #1
+          { \chemmacros_text:n { \ChemForm {#1} : } }
+        \cs_set_protected:Npn \chemmacros_plus:  { + }
+        \cs_set_protected:Npn \chemmacros_minus: { - }
+        \cs_set_protected:Npn \chemmacros_formal_plus:  { \ensuremath{\oplus} }
+        \cs_set_protected:Npn \chemmacros_formal_minus: { \ensuremath{\ominus} }
+        \cs_set_protected:Npn \fplus  { \ensuremath{\oplus} }
+        \cs_set_protected:Npn \fminus { \ensuremath{\ominus} }
+      }
+  }
+
+\chemmacros_add_method_package:nn {chemfig}
+  {
+    \RequirePackage {chemfig}
+    \cs_set_protected:Npn \chemmacros_chemformula:n #1
+      { \printatom {#1} }
+    \cs_set_protected:Npn \chemmacros_reaction:n #1
+      { \printatom {#1} }
+    \chemmacros_module_after:nn {charges}
+      {
+        \cs_set_protected:Npn \chemmacros_elpair:n #1
+          { \Lewis { 0: , \printatom {#1} } }
+        \cs_set_protected:Npn \chemmacros_plus:  { + }
+        \cs_set_protected:Npn \chemmacros_minus: { - }
+        \cs_set_protected:Npn \chemmacros_formal_plus:  { \ensuremath{\oplus} }
+        \cs_set_protected:Npn \chemmacros_formal_minus: { \ensuremath{\ominus} }
+        \cs_set_protected:Npn \fplus  { \ensuremath{\oplus} }
+        \cs_set_protected:Npn \fminus { \ensuremath{\ominus} }
+      }
+  }
+
+% --------------------------------------------------------------------------
+\chemmacros_define_global_keys:n
+  { formula .code:n = \chemmacros_set_formula_method:n {#1} }
+
+\hook_gput_code:nnn {begindocument/before} {chemmacros}
+  {
+    \bool_if:NF \l__chemmacros_formula_method_set_bool
+      {
+        \msg_info:nn {chemmacros} {default-formula-method}
+        \chemmacros_set_formula_method:n {chemformula}
+      }
+  }
+
+% --------------------------------------------------------------------------
+\ChemModuleEnd
+\ChemModule{charges}{2020/11/29 charges}
+
+% --------------------------------------------------------------------------
+% circled charge signs: they are defined in the `chemformula' package:
+% use directly:
+\cs_new_protected:Npn \fplus  { { \chemformula_fplus:  } }
+\cs_new_protected:Npn \fminus { { \chemformula_fminus: } }
+
+% change output depending on circled-option
+\bool_new:N      \l__chemmacros_circled_bool
+\bool_set_true:N \l__chemmacros_circled_bool
+\bool_new:N      \l__chemmacros_circled_formal_bool
+\bool_set_true:N \l__chemmacros_circled_formal_bool
+\bool_new:N      \l__chemmacros_circled_chem_bool
+\bool_set_true:N \l__chemmacros_circled_chem_bool
+
+
+\chemmacros_define_keys:nn {charges}
+  {
+    circletype         .choice: ,
+    circletype / math  .code:n  =
+      {
+        \bool_set_false:N \l__chemmacros_circled_chem_bool
+        \chemmacros_if_package_loaded:nT {chemformula}
+          { \bool_set_false:N \l_chemformula_formal_chem_bool }
+      } ,
+    circletype / chem  .code:n  =
+      {
+        \bool_set_true:N \l__chemmacros_circled_chem_bool
+        \chemmacros_if_package_loaded:nT {chemformula}
+          { \bool_set_true:N \l_chemformula_formal_chem_bool }
+      } ,
+    circletype         .value_required:n = true ,
+    circled            .choice: ,
+    circled / none     .code:n =
+      {
+        \bool_set_false:N \l__chemmacros_circled_bool
+        \bool_set_false:N \l__chemmacros_circled_formal_bool
+        \chemmacros_if_package_loaded:nT {chemformula}
+          { \bool_set_false:N \l_chemformula_formal_charges_bool }
+      } ,
+    circled / formal   .code:n =
+      {
+        \bool_set_true:N \l__chemmacros_circled_bool
+        \bool_set_true:N \l__chemmacros_circled_formal_bool
+        \chemmacros_if_package_loaded:nT {chemformula}
+          { \bool_set_false:N \l_chemformula_formal_charges_bool }
+      } ,
+    circled / all      .code:n =
+      {
+        \bool_set_true:N \l__chemmacros_circled_bool
+        \bool_set_false:N \l__chemmacros_circled_formal_bool
+        \chemmacros_if_package_loaded:nT {chemformula}
+          { \bool_set_true:N \l_chemformula_formal_charges_bool }
+      } ,
+    circled            .default:n  = all
+  }
+
+\cs_new_protected:Npn \chemmacros_plus:  { \chemformula_plus: }
+\cs_new_protected:Npn \chemmacros_minus: { \chemformula_minus: }
+
+\cs_new_protected:Npn \chemmacros_formal_plus: { \chemformula_formal_plus: }
+\cs_new_protected:Npn \chemmacros_formal_minus: { \chemformula_formal_minus: }
+
+\cs_new_protected:Npn \chemmacros_charge:n #1
+  { \chemmacros_chemformula:n { {}^{#1} } }
+
+\cs_new_protected:Npn \chemmacros_new_charge_command:Nn #1#2
+  {
+    \DeclareDocumentCommand #1 {o}
+      {
+        \IfNoValueTF {##1}
+          { \chemmacros_charge:n {#2} }
+          { \chemmacros_charge:n {##1#2} }
+      }
+  }
+
+\tl_new:N  \l__chemmacros_partial_charge_format_tl
+\tl_set:Nn \l__chemmacros_partial_charge_format_tl { \tiny }
+
+\cs_new_protected:Npn \chemmacros_new_partial_charge_command:Nn #1#2
+  {
+    \cs_new_protected:Npn #1
+      {
+        \mbox {
+          \l__chemmacros_partial_charge_format_tl
+          \c_math_toggle_token \delta #2 \c_math_toggle_token
         }
+      }
+  }
+
+\NewChemMacroset {Charge} {mm}
+  { \chemmacros_new_charge_command:Nn #1 {#2} }
+  
+\NewChemMacroset {PartialCharge} {mm}
+  { \chemmacros_new_partial_charge_command:Nn #1 {#2} }
+
+\cs_new_protected:Npn \scrm
+  { \ensuremath { \scriptstyle \chemmacros_minus: } }
+\cs_new_protected:Npn \scrp
+  { \ensuremath { \scriptstyle \chemmacros_plus: } }
+\cs_new_protected:Npn \fscrm
+  { \ensuremath { \scriptstyle \chemmacros_formal_minus: } }
+\cs_new_protected:Npn \fscrp
+  { \ensuremath { \scriptstyle \chemmacros_formal_plus: } }
+\cs_new_protected:Npn \fsscrm
+  { \ensuremath { \scriptscriptstyle \chemmacros_formal_minus: } }
+\cs_new_protected:Npn \fsscrp
+  { \ensuremath { \scriptscriptstyle \chemmacros_formal_plus: } }
+
+\chemmacros_define_keys:nn {charges}
+  {
+    partial-format .tl_set:N = \l__chemmacros_partial_charge_format_tl
+  }
+
+% --------------------------------------------------------------------------
+\NewChemCharge \mch  { \chemmacros_minus: }
+\NewChemCharge \pch  { \chemmacros_plus: }
+\NewChemCharge \fmch { \chemmacros_formal_minus: }
+\NewChemCharge \fpch { \chemmacros_formal_plus: }
+
+% partial charges:
+\NewChemPartialCharge \delm  { \chemmacros_minus: }
+\NewChemPartialCharge \delp  { \chemmacros_plus: }
+\NewChemPartialCharge \fdelm { \chemmacros_formal_minus: }
+\NewChemPartialCharge \fdelp { \chemmacros_formal_plus: }
+
+% --------------------------------------------------------------------------
+\ChemModuleEnd
+\ChemModule{acid-base}{2022/01/13 acid/base}
+
+% --------------------------------------------------------------------------
+% equilibrium constants:
+
+\tl_new:N  \l__chemmacros_equilibrium_constant_tl
+\tl_set:Nn \l__chemmacros_equilibrium_constant_tl {K}
+\prop_new:N \l__chemmacros_eq_constants_prop
+
+\prg_new_conditional:Npnn \chemmacros_if_eq_constant:Nn #1#2 {T,F,TF}
+  {
+    \cs_if_exist:NTF #1
+      {
+        \tl_if_eq:xnTF
+          { \prop_item:Nn \l__chemmacros_eq_constants_prop {#1} }
+          {#2}
+          { \prg_return_true: }
+          { \prg_return_false: }
+      }
+      { \prg_return_false: }
+  }
+
+% #1: cs
+% #2: translation id and option name
+% #3: default translation
+\cs_new_protected:Npn \chemmacros_define_eq_constant:Nnn #1#2#3
+  {
+    \chemmacros_if_eq_constant:NnF {#1} {#2}
+      {
+        \cs_new_protected:Npn #1 {}
+        \prop_put:Nnn \l__chemmacros_eq_constants_prop {#1} {#2}
+        \tl_new:c {l__chemmacros_#2_tl}
+        \chemmacros_define_keys:nn {acid-base}
+          { #2 .tl_set:c = l__chemmacros_#2_tl }
+      }
+    \tl_set:cn
+      {l__chemmacros_#2_tl}
+      { \chemmacros_translate:n {#2} }
+    \chemmacros_declare_translation:nnn {#2} {fallback} {#3}
+    \cs_set_protected:Npn #1
+      {
+        \ensuremath
+          {
+            \chemmacros_bold:n
+              {
+                \l__chemmacros_equilibrium_constant_tl
+                \c_math_subscript_token
+                  { \tl_use:c {l__chemmacros_#2_tl} }
+              }
+          }
+      }
+  }
+
+\NewChemMacroset {EqConstant} {mmm}
+  { \chemmacros_define_eq_constant:Nnn #1 {#2} {#3} }
+
+\NewChemEqConstant \Ka {K-acid}  { \mathrm{a} }
+\NewChemEqConstant \Kb {K-base}  { \mathrm{b} }
+\NewChemEqConstant \Kw {K-water} { \mathrm{w} }
+
+\chemmacros_define_keys:nn {acid-base}
+  { eq-constant .tl_set:N = \l__chemmacros_equilibrium_constant_tl }
+
+\chemmacros_define_keys:nn {acid-base}
+  {
+    p-style           .choice: ,
+    p-style / slanted .code:n   = \cs_set_eq:NN \chemmacros_p_style:n \textsl ,
+    p-style / italics .code:n   = \cs_set_eq:NN \chemmacros_p_style:n \textit ,
+    p-style / upright .code:n   = \cs_set_eq:NN \chemmacros_p_style:n \textup ,
+    p-style           .initial:n = upright
+  }
+
+\cs_new_protected:Npn \chemmacros_p:n #1
+  {
+    \group_begin:
+      \chemmacros_text:n
         {
-          \tl_set_eq:NN
-            \l__chemmacros_compatibility_version_tl
-            \c_chemmacros_version_tl
+          \chemmacros_p_style:n {p}
+          \ensuremath {#1}
         }
-        { \tl_set:Nn \l__chemmacros_compatibility_version_tl {#1} } ,
-    unknown       .code:n =
-      \PassOptionsToPackage{\CurrentOption}{chemmacros4}
-      \PassOptionsToPackage{\CurrentOption}{chemmacros5}
+    \group_end:
   }
 
-\ProcessKeysPackageOptions {chemmacros/compatibility}
+\NewDocumentCommand \p  {m} { \chemmacros_p:n {#1} }
+\NewDocumentCommand \pH  {} { \chemmacros_p:n { \chemmacros_chemformula:n {H} } }
+\NewDocumentCommand \pOH {} { \chemmacros_p:n { \chemmacros_chemformula:n {OH} } }
 
+\NewDocumentCommand \pKa {o}
+  {
+    \chemmacros_p:n
+      {
+        \Ka \IfNoValueF {#1}
+          { {} \c_math_subscript_token { \chemmacros_bold:n {#1} } }
+      }
+  }
+
+\NewDocumentCommand \pKb {o}
+  {
+    \chemmacros_p:n
+      {
+        \Kb \IfNoValueF {#1}
+          { {} \c_math_subscript_token { \chemmacros_bold:n {#1} } }
+      }
+  }
+
 % --------------------------------------------------------------------------
-% compare version numbers
-% #1: version
-% #2: relation
-% #3: version
-% #4: true
-% #5: false
-\prg_new_conditional:Npnn \chemmacros_if_version:nnn #1#2#3 {p,T,F,TF}
+\ChemModuleEnd
+\ChemModule{symbols}{2020/11/29 symbols}
+
+\RequirePackage{amstext}
+
+% ---------------------------------------------------------------------------
+% transition state symbol
+\cs_new_protected:Npn \__chemmacros_transition_state:
   {
-    \fp_compare:nTF
+    \text
       {
-        (
-          \chemmacros_get_major_version:n {#1} * 1e6 +
-          \chemmacros_get_minor_version:n {#1} * 1e3 +
-          0 \chemmacros_get_subrelease:n {#1}
-        )
-        #2
-        (
-          \chemmacros_get_major_version:n {#3} * 1e6 +
-          \chemmacros_get_minor_version:n {#3} * 1e3 +
-          0 \chemmacros_get_subrelease:n {#3}
-        )
+        \skip_horizontal:n { .1ex }
+        \hbox_overlap_right:n
+          { \rule { .6ex } { 0pt } \rule { .05ex } { 1.3ex } }
+        \hbox_overlap_right:n { \rule [ .4ex ] { 1.3ex } { .05ex } }
+        \rule [ .85ex ] { 1.3ex } { .05ex }
+        \skip_horizontal:n { .1ex }
       }
+  }
+
+\cs_new_protected:Npn \chemmacros_transition_state:
+  {
+    \ensuremath
+      {
+        \mathchoice
+          { \displaystyle }
+          { \textstyle }
+          { \scriptstyle }
+          { \scriptscriptstyle }
+        \__chemmacros_transition_state:
+      }
+  }
+
+% \DeclareDocumentCommand?
+\cs_new_eq:NN \transitionstatesymbol \chemmacros_transition_state:
+
+% \standardstate as defined by the chemstyle package. Thanks to Joseph Wright
+% the `chemstyle' provides it with \providecommand so it doesn't matter which
+% package defines it first
+\ProvideDocumentCommand \standardstate {}
+  { { \ensuremath { \chemmacros_standardstate: } } }
+
+\cs_new_protected:Npn \chemmacros_standardstate:
+  { \mathpalette \chemmacros_standardstate_aux: \circ }
+
+\cs_new_protected:Npn \chemmacros_standardstate_aux: #1#2
+  {
+    \ooalign
+      {
+        \tex_hfil:D
+        \c_math_toggle_token #1- \c_math_toggle_token
+        \tex_hfil:D
+        \tex_cr:D
+        \tex_hfil:D
+        \c_math_toggle_token #1#2 \c_math_toggle_token
+        \tex_hfil:D
+        \tex_cr:D
+      }
+  }
+
+\cs_new_protected:Npn \changestate { \ensuremath { \mathop{} \! \chemDelta } }
+
+% --------------------------------------------------------------------------
+\ChemModuleEnd
+\ChemModule{particles}{2020/11/29 particles}
+
+% --------------------------------------------------------------------------
+% particles
+\cs_new_protected:Nn \chemmacros_define_particle:Nn
+  {
+    \tl_set_rescan:Nnn \l__chemmacros_tmpa_tl { \ExplSyntaxOff } {#2}
+    \use:x
+      {
+        \cs_set_protected:Npn \exp_not:N #1
+          { \chemmacros_chemformula:n { \exp_not:V \l__chemmacros_tmpa_tl } }
+      }
+  }
+
+\NewChemMacroset {Particle} {mm}
+  { \chemmacros_define_particle:Nn #1 {#2} }
+
+% --------------------------------------------------------------------------
+% nucleophiles
+\cs_new_protected:Npn \chemmacros_elpair:n #1
+  {
+    \bool_if:NTF \l__chemmacros_elpair_dots_bool
+      { \chlewis { 0: } {#1} }
+      { \chlewis { 0| } {#1} }
+  }
+
+\bool_new:N \l__chemmacros_nucleophile_elpair_bool
+\bool_new:N \l__chemmacros_elpair_dots_bool
+
+\dim_new:N  \l__chemmacros_nucleophile_dim
+\dim_set:Nn \l__chemmacros_nucleophile_dim { .1em }
+
+\chemmacros_define_keys:nn {particles}
+  { space .dim_set:N = \l__chemmacros_nucleophile_dim }
+
+\chemmacros_define_keys:nn {particles}
+  {
+    elpair         .choice: ,
+    elpair / false .code:n    =
+      { \bool_set_false:N \l__chemmacros_nucleophile_elpair_bool } ,
+    elpair / dots  .code:n    =
+      {
+        \bool_set_true:N \l__chemmacros_nucleophile_elpair_bool
+        \bool_set_true:N \l__chemmacros_elpair_dots_bool
+      } ,
+    elpair / dash  .code:n    =
+      {
+        \bool_set_true:N \l__chemmacros_nucleophile_elpair_bool
+        \bool_set_false:N \l__chemmacros_elpair_dots_bool
+      } ,
+    elpair         .default:n = dots
+  }
+
+\cs_new_protected:Npn \chemmacros_declare_nucleophile:Nn #1#2
+  {
+    \cs_set_protected:cpn {__chemmacros_ \chemmacros_remove_backslash:N #1:}
+      {
+        \bool_if:NTF \l__chemmacros_nucleophile_elpair_bool
+          {
+            \chemmacros_elpair:n { #2 }
+            \skip_horizontal:N \l__chemmacros_nucleophile_dim
+            \chemmacros_chemformula:n { {}^{-} }
+          }
+          { \chemmacros_chemformula:n { #2^{-} } }
+      }
+    \DeclareDocumentCommand #1 {o}
+      {
+        \group_begin:
+          \IfNoValueF {##1}
+            { \chemmacros_set_keys:nn {particles} {##1} }
+          \use:c {__chemmacros_ \chemmacros_remove_backslash:N #1:}
+        \group_end:
+      }
+  }
+
+\NewChemMacroset {Nucleophile} {mm}
+  { \chemmacros_declare_nucleophile:Nn #1 {#2} }
+
+% --------------------------------------------------------------------------
+% particles:
+\NewChemParticle \el  { e^- }
+\NewChemParticle \prt { p^+ }
+\NewChemParticle \ntr { n^0 }
+
+% ions, molecules
+% proton, hydroxide, hydronium/oxonium, water:
+\NewChemParticle \Hpl   { H^+ }
+\NewChemParticle \Hyd   { OH^- }
+\NewChemParticle \Oxo   { H_3O^+ }
+\NewChemParticle \water { H_2O }
+
+% electrophile:
+\NewChemParticle \El  { E^+ }
+
+% nucleophiles:
+\NewChemNucleophile \Nuc {Nu}
+\NewChemNucleophile \ba  {ba}
+
+% --------------------------------------------------------------------------
+\ChemModuleEnd
+\ChemModule{phases}{2020/11/29 phase descriptors}
+
+\bool_new:N \l__chemmacros_phases_sub_bool
+\dim_new:N  \l__chemmacros_phases_space_dim
+\dim_set:Nn \l__chemmacros_phases_space_dim { .1333 em }
+
+\chemmacros_define_keys:nn {phases}
+  {
+    pos        .choice: ,
+    pos / sub  .code:n    = \bool_set_true:N \l__chemmacros_phases_sub_bool ,
+    pos / side .code:n    = \bool_set_false:N \l__chemmacros_phases_sub_bool ,
+    space      .dim_set:N = \l__chemmacros_phases_space_dim
+  }
+
+\NewChemMacroset {Phase} {mm}
+  { \chemmacros_define_phase:Nn #1 {#2} }
+
+\cs_new_protected:Npn \chemmacros_define_phase:Nn #1#2
+  {
+    \tl_set:Nx \l__chemmacros_tmpa_tl { phase-\chemmacros_remove_backslash:N #1 }
+    \chemmacros_declare_translation:Vnn
+      \l__chemmacros_tmpa_tl
+      {fallback}
+      {#2}
+    \__chemmacros_define_phase:Nx #1
+      { \exp_not:N \chemmacros_translate:n { \exp_not:V \l__chemmacros_tmpa_tl } }
+  }
+
+\cs_new_protected:Npn \__chemmacros_define_phase:Nn #1#2
+  {
+    \cs_if_exist:NF #1 { \cs_new:Npn #1 {} }
+    \DeclareDocumentCommand #1 {o}
+      { \chemmacros_phase:n { #2 \IfNoValueF {##1} {,~##1} } }
+  }
+\cs_generate_variant:Nn \__chemmacros_define_phase:Nn { Nx }
+
+\cs_new_protected:Npn \chemmacros_phase:n #1
+  {
+    \mode_leave_vertical:
+    \bool_if:NTF \l__chemmacros_phases_sub_bool
+      { \chemformula_subscript:n { (#1) } }
+      {
+        \skip_horizontal:N \l__chemmacros_phases_space_dim
+        \chemmacros_text:n { (#1) }
+      }
+  }
+
+% --------------------------------------------------------------------------
+\NewDocumentCommand \phase {m} { \chemmacros_phase:n {#1} }
+
+\NewChemPhase \sld {s}
+\NewChemPhase \lqd {l}
+\NewChemPhase \gas {g}
+\NewChemPhase \aq  {aq}
+
+% --------------------------------------------------------------------------
+\ChemModuleEnd
+\ChemModule{nomenclature}{2022/01/10 chemical names}
+
+\bool_new:N \l__chemmacros_iupac_restricted_bool
+\bool_new:N \l__chemmacros_iupac_strict_bool
+
+\msg_new:nnn {chemmacros} {new-iupac}
+  {
+    You've~ tried~ to~ define~ a~ iupac~ naming~ command~ with~
+    \token_to_str:N \NewChemIUPAC ,~ but~ the~ iupac~ command~
+    \token_to_str:N #1 \c_space_tl already~ exists.~ Choose~ another~ name~
+    or~ use~ \token_to_str:N \RenewChemIUPAC .
+  }
+
+\msg_new:nnn {chemmacros} {renew-iupac}
+  {
+    You've~ tried~ to~ renew~ the~ iupac~ command~ \token_to_str:N #1 ,~ but~
+    it~ doesn't~ exist.~ Use~ \token_to_str:N \NewChemIUPAC \c_space_tl
+    instead.
+  }
+
+\msg_new:nnn {chemmacros} {let-iupac}
+  {
+    You've~ tried~ to~ let~ the~ iupac~ command~ \token_to_str:N #1
+    \c_space_tl to~ the~ iupac~ command~ \token_to_str:N #2 ,~ but~ the~
+    latter~ doesn't~ exist.~  Use~ \token_to_str:N \NewChemIUPAC \c_space_tl
+    instead~ or~declare~ \token_to_str:N #2 \c_space_tl first.
+  }
+
+\msg_new:nnn {chemmacros} {new-iupac-shorthand}
+  {
+    You've~ tried~ to~ define~ a~ iupac~ shorthand~ with~ \token_to_str:N
+    \NewChemIUPACShorthand ,~ but~ the~ shorthand~ \token_to_str:N #1
+    \c_space_tl already~ exists.~ Please~ choose~ another~ token.
+  }
+
+\msg_new:nnn {chemmacros} {renew-iupac-shorthand}
+  {
+    You've~ tried~ to~ renew~ the~ iupac~ shorthand~ \token_to_str:N #1 ,~
+    but~ this~ shorthand~ doesn't~ exist,~ yet.
+  }
+
+\msg_new:nnn {chemmacros} {show-iupac}
+  { \\ >~ \token_to_str:N #1=iupac~macro: \\ -> #2 }
+
+\msg_new:nnn {chemmacros} {no-iupac-command}
+  { \\ >~ \token_to_str:N #1=not~ defined~ as~ iupac~ macro }
+
+% --------------------------------------------------------------------------
+\prop_new:N \l__chemmacros_iupac_prop
+
+\cs_new_protected:Npn \__chemmacros_iupac_name:NN #1#2
+  { \str_set:Nx #2 { \chemmacros_remove_backslash:N #1 } }
+
+\cs_new_protected:Npn \__chemmacros_define_iupac:Nn #1#2
+  {
+    \__chemmacros_iupac_name:NN #1 \l__chemmacros_tmpa_str
+    \prop_put:NVn \l__chemmacros_iupac_prop
+      \l__chemmacros_tmpa_str
+      {#2}
+    \chemmacros_make_iupac:
+  }
+\cs_generate_variant:Nn \__chemmacros_define_iupac:Nn {NV}
+
+\cs_new_protected:Npn \__chemmacros_let_iupac:NN #1#2
+  {
+    \__chemmacros_iupac_name:NN #1 \l__chemmacros_tmpa_str
+    \__chemmacros_iupac_name:NN #2 \l__chemmacros_tmpb_str
+    \tl_set:Nx \l__chemmacros_tmpa_tl
+      { \prop_item:NV \l__chemmacros_iupac_prop \l__chemmacros_tmpb_str }
+    \__chemmacros_define_iupac:NV #1 \l__chemmacros_tmpa_tl
+  }
+
+\cs_new_protected:Npn \chemmacros_show_iupac:N #1
+  {
+    \group_begin:
+      \__chemmacros_iupac_name:NN #1 \l__chemmacros_tmpa_str
+      \tl_set:Nx \l__chemmacros_tmpa_tl
+        { \prop_item:NV \l__chemmacros_iupac_prop \l__chemmacros_tmpa_str }
+      \tl_if_empty:NTF \l__chemmacros_tmpa_tl
+        { \msg_show:nnn {chemmacros} {no-iupac-command} {#1} }
+        { \msg_show:nnnV {chemmacros} {show-iupac} {#1} \l__chemmacros_tmpa_tl }
+    \group_end:
+  }
+
+\prg_new_protected_conditional:Npnn \chemmacros_if_iupac:N #1 {T,F,TF}
+  {
+    \__chemmacros_iupac_name:NN #1 \l__chemmacros_tmpa_str
+    \prop_if_in:NVTF \l__chemmacros_iupac_prop \l__chemmacros_tmpa_str
       { \prg_return_true: }
       { \prg_return_false: }
   }
-\cs_generate_variant:Nn \chemmacros_if_version:nnnTF {fnf}
 
-\cs_new:Npn \__chemmacros_get_minor_version:w #1.#2.#3 \q_stop
+\cs_new_protected:Npn \chemmacros_new_iupac:Nn #1#2
   {
-    \tl_if_blank:nTF {#2} {0} {
-       \tl_map_function:nN {#2} \__chemmacros_get_minor_number:n
-    }
+    \chemmacros_if_iupac:NTF #1
+      { \msg_error:nnn {chemmacros} {new-iupac} {#1} }
+      { \__chemmacros_define_iupac:Nn #1 {#2} }
   }
 
-\cs_new:Npn \chemmacros_get_minor_version:n #1
-  { \__chemmacros_get_minor_version:w #1.. \q_stop }
+\cs_new_protected:Npn \chemmacros_provide_iupac:Nn #1#2
+  {
+    \chemmacros_if_iupac:NF #1
+      { \__chemmacros_define_iupac:Nn #1 {#2} }
+  }
 
-\cs_new:Npn \__chemmacros_get_minor_number:n #1
+\cs_new_protected:Npn \chemmacros_define_iupac:Nn #1#2
+  { \__chemmacros_define_iupac:Nn #1 {#2} }
+
+\cs_new_protected:Npn \chemmacros_renew_iupac:Nn #1#2
   {
-    \str_case:nn {#1}
+    \chemmacros_if_iupac:NTF #1
+      { \__chemmacros_define_iupac:Nn #1 {#2} }
+      { \msg_error:nnn {chemmacros} {renew-iupac} {#1} }
+  }
+
+\cs_new_protected:Npn \chemmacros_let_iupac:NN #1#2
+  {
+    \chemmacros_if_iupac:NTF #2
+      { \__chemmacros_let_iupac:NN #1#2 }
+      { \msg_error:nnnn {chemmacros} {let-iupac} {#1} {#2} }
+  }
+
+\cs_new_protected:Npn \chemmacros_make_iupac:
+  {
+    \chemmacros_if_document:T
       {
-        {0} {0}
-        {1} {1}
-        {2} {2}
-        {3} {3}
-        {4} {4}
-        {5} {5}
-        {6} {6}
-        {7} {7}
-        {8} {8}
-        {9} {9}
+        \bool_if:NTF \l__chemmacros_inside_iupac_bool
+          {
+            \prop_map_inline:Nn \l__chemmacros_iupac_prop
+              { \cs_set_protected:cpn {##1} {##2} }
+          }
+          {
+            \bool_if:NF \l__chemmacros_iupac_restricted_bool
+              {
+                \bool_if:NTF \l__chemmacros_iupac_strict_bool
+                  {
+                    \prop_map_inline:Nn \l__chemmacros_iupac_prop
+                      { \cs_set_protected:cpn {##1} {##2} }
+                  }
+                  {
+                    \prop_map_inline:Nn \l__chemmacros_iupac_prop
+                      {
+                        \cs_if_exist:cF {##1}
+                          { \cs_set_protected:cpn {##1} {##2} }
+                      }
+                  }
+              }
+          }
+      }    
+  }
+
+\hook_gput_code:nnn {begindocument/end} {chemmacros}
+  { \chemmacros_make_iupac: }
+
+\NewDocumentCommand \DeclareChemIUPAC {mm}
+  { \chemmacros_define_iupac:Nn #1 {#2} }
+
+\NewDocumentCommand \NewChemIUPAC {mm}
+  { \chemmacros_new_iupac:Nn #1 {#2} }
+
+\NewDocumentCommand \RenewChemIUPAC {mm}
+  { \chemmacros_renew_iupac:Nn #1 {#2} }
+
+\NewDocumentCommand \ProvideChemIUPAC {mm}
+  { \chemmacros_provide_iupac:Nn #1 {#2} }
+
+\NewDocumentCommand \LetChemIUPAC {mm}
+  { \chemmacros_let_iupac:NN #1 #2 }
+
+% --------------------------------------------------------------------------
+\chemmacros_define_keys:nn {nomenclature}
+  {
+    iupac .choice: ,
+    iupac / restricted .code:n =
+      \bool_set_true:N \l__chemmacros_iupac_restricted_bool
+      \bool_set_false:N \l__chemmacros_iupac_strict_bool ,
+    iupac / auto .code:n =
+      \bool_set_false:N \l__chemmacros_iupac_restricted_bool
+      \bool_set_false:N \l__chemmacros_iupac_strict_bool ,
+    iupac / strict .code:n =
+      \bool_set_false:N \l__chemmacros_iupac_restricted_bool
+      \bool_set_true:N \l__chemmacros_iupac_strict_bool ,
+    iupac .initial:n = auto
+  }
+
+% --------------------------------------------------------------------------
+% stereo descriptors and other nomenclature commands
+% Cahn-Ingold-Prelog
+\dim_new:N  \l__chemmacros_cip_kern_dim
+\dim_set:Nn \l__chemmacros_cip_kern_dim {.075em}
+
+\chemmacros_define_keys:nn {nomenclature}
+  { cip-kern .dim_set:N = \l__chemmacros_cip_kern_dim }
+
+\tl_new:N \l__chemmacros_cip_inner_tl
+\tl_new:N \l__chemmacros_cip_outer_tl
+\tl_new:N \l__chemmacros_cip_number_tl
+
+\chemmacros_define_keys:nn {nomenclature}
+  {
+    cip-inner-format  .tl_set:N  = \l__chemmacros_cip_inner_tl ,
+    cip-inner-format  .initial:n = \itshape ,
+    cip-outer-format  .tl_set:N  = \l__chemmacros_cip_outer_tl ,
+    cip-outer-format  .initial:n = \upshape ,
+    cip-number-format .tl_set:N  = \l__chemmacros_cip_number_tl ,
+    cip-number-format .initial:n = \upshape
+  }
+  
+\cs_new_protected:Npn \__chemmacros_cip:n #1
+  {
+    \tl_set:Nn \l__chemmacros_tmpa_tl {#1}
+    \int_step_inline:nnnn {0} {1} {9}
+      {
+        \tl_replace_all:Nnn \l__chemmacros_tmpa_tl
+          {##1}
+          { { \l__chemmacros_cip_number_tl ##1} }
       }
+    { \l__chemmacros_cip_inner_tl \l__chemmacros_tmpa_tl }
   }
 
-\cs_new:Npn \__chemmacros_get_major_version:w #1.#2.#3 \q_stop
-  { \tl_if_blank:nTF {#1} {0} {#1} }
+\cs_new_protected:Npn \chemmacros_cip:n #1
+  {
+    \int_zero:N \l__chemmacros_tmpa_int
+    \group_begin:
+      \l__chemmacros_cip_outer_tl (
+      \clist_map_inline:nn
+        {#1}
+        {
+          \int_incr:N \l__chemmacros_tmpa_int
+          \__chemmacros_cip:n {##1}
+          \int_compare:nT
+            { \l__chemmacros_tmpa_int < \clist_count:n {#1} }
+            { , }
+        }
+      )
+    \group_end:
+    \tex_kern:D \l__chemmacros_cip_kern_dim
+  }
 
-\cs_new:Npn \chemmacros_get_major_version:n #1
-  { \__chemmacros_get_major_version:w #1.. \q_stop }
+\DeclareChemIUPAC \cip { \chemmacros_cip:n }
 
-\cs_new:Npn \__chemmacros_get_subrelease:w #1.#2.#3 \q_stop
+% remember: TikZ needs : to be other
+\cs_new_protected:Npn \chemmacros_sconf:n #1
   {
-    \tl_if_blank:nTF {#2} {0} {
-       \tl_map_function:nN {#2} \__chemmacros_get_subrelease_number:n
-    }
+    \group_begin:
+      \chemmacros_tikz:nn
+        { baseline,text~ height=1.5ex,text~ depth=.25ex }
+        {
+          \chemmacros_tikz_node:n {anchor=base} (chemmacros@@Sconf) {#1} ;
+          \chemmacros_tikz_draw:n {->,thick,rotate=90}
+            ($(chemmacros@@Sconf.center)+(20\c_chemmacros_other_colon_tl.8em)$)
+            arc (20\c_chemmacros_other_colon_tl340\c_chemmacros_other_colon_tl.8em);
+        }
+    \group_end:
   }
 
-\cs_new:Npn \chemmacros_get_subrelease:n #1
-  { \__chemmacros_get_subrelease:w #1.. \q_stop }
+\cs_new_protected:Npn \chemmacros_rconf:n #1
+  {
+    \group_begin:
+      \tikz[baseline,text~ height=1.5ex,text~ depth=.25ex]
+        {
+          \chemmacros_tikz_node:n {anchor=base} (chemmacros@@Rconf) {#1} ;
+          \chemmacros_tikz_draw:n {<-,thick,rotate=90}
+            ($(chemmacros@@Rconf.center)+(20\c_chemmacros_other_colon_tl.8em)$)
+            arc (20\c_chemmacros_other_colon_tl340\c_chemmacros_other_colon_tl.8em) ;
+        }
+    \group_end:
+  }
 
-\cs_new:Npn \__chemmacros_get_subrelease_number:n #1
+\NewDocumentCommand \Sconf { O{S} } { \chemmacros_sconf:n {#1} }
+\NewDocumentCommand \Rconf { O{R} } { \chemmacros_rconf:n {#1} }
+
+% coordination chemistry
+\bool_new:N \l__chemmacros_bridge_super_bool
+
+\chemmacros_define_keys:nn {nomenclature}
   {
-    \str_case:nnF {#1}
+    bridge-number         .choice: ,
+    bridge-number / sub   .code:n     =
+      \bool_set_false:N \l__chemmacros_bridge_super_bool ,
+    bridge-number / super .code:n     =
+      \bool_set_true:N \l__chemmacros_bridge_super_bool ,
+    coord-use-hyphen      .bool_set:N = \l__chemmacros_coord_use_hyphen_bool ,
+    coord-use-hyphen      .initial:n  = true
+  }
+
+% #1: boolean - if true hyphen is turned on
+% #2: boolean - if true superscript will be used
+% #3: symbol
+% #4: sub-/superscript
+\cs_new_protected:Npn \chemmacros_coordination_symbol:nnnn #1#2#3#4
+  {
+    \chemmacros_chemformula:n {#3}
+    \tl_if_blank:nF {#4}
       {
-        {0} {}
-        {1} {}
-        {2} {}
-        {3} {}
-        {4} {}
-        {5} {}
-        {6} {}
-        {7} {}
-        {8} {}
-        {9} {}
+        \bool_if:nTF {#2}
+          { \chemmacros_chemformula:n { {}^{#4} } }
+          { \chemmacros_chemformula:n { {}_{#4} } }
       }
-      { \int_from_alph:n {#1} }
+    \bool_if:nT
+      {#1}
+      { \chemmacros_break_point_hyphen: }
   }
 
-% check compatibility
-% #1: relation
-% #2: number
-% #3: true
-% #4: false
-\prg_new_conditional:Npnn \chemmacros_if_compatibility:nn #1#2 {p,T,F,TF}
+\cs_new_protected:Npn \chemmacros_hapto:n #1
   {
-    \chemmacros_if_version:fnfTF
-      { \l__chemmacros_compatibility_version_tl }
+    \chemmacros_coordination_symbol:nnnn
+      { \l__chemmacros_coord_use_hyphen_bool }
+      { \c_true_bool }
+      { \chemeta }
       {#1}
+  }
+
+\cs_new_protected:Npn \chemmacros_dento:n #1
+  {
+    \chemmacros_coordination_symbol:nnnn
+      { \l__chemmacros_coord_use_hyphen_bool }
+      { \c_true_bool }
+      { \chemkappa }
+      {#1}
+  }
+
+\cs_new_protected:Npn \chemmacros_bridge:n #1
+  {
+    \chemmacros_coordination_symbol:nnnn
+      { \l__chemmacros_coord_use_hyphen_bool }
+      { \l__chemmacros_bridge_super_bool }
+      { \chemmu }
+      {#1}
+  }
+
+% \iupac (basically the same as bpchem's \IUPAC)
+% - allows multiple breaking points as compound names can get really long and
+%   especially in multicolumn documents can span more than two lines
+% - add a (very) little space before the hyphen and a little negative space
+%   after it
+% - add a little space at breaking points if not broken
+% - enables all naming commands regardless if they're definied otherwise or not
+\cs_new_protected:Npn \chemmacros_allow_hyphens:
+  {
+    \chemmacros_nobreak:
+    \skip_horizontal:N \c_zero_skip
+  }
+
+% #1: pre break
+% #2: post break
+% #3: no break
+\cs_new_protected:Npn \__chemmacros_peek_if_dash:TF #1#2
+  {
+    \peek_charcode:NTF -
+      {#1}
       {#2}
+  }
+
+\cs_new_protected:Npn \__chemmacros_peek_if_paren:TF #1#2
+  { % (
+    \peek_charcode:NTF )
+      {#1}
+      { % [
+        \peek_charcode:NTF ]
+          {#1}
+          {#2}
+      }
+  }
+  
+\cs_new_protected:Npn \__chemmacros_break_point_insert:nnn #1#2#3
+  {
+    \mode_if_math:TF
+      {#3}
+      {
+        \peek_meaning:NTF \group_end:
+          {#3}
+          {
+            \__chemmacros_peek_if_dash:TF
+              {#3}
+              {
+                \__chemmacros_peek_if_paren:TF
+                  {#3}
+                  {
+                    \chemmacros_nobreak:
+                    \tex_discretionary:D {#1} {#2} {#3}
+                    \chemmacros_allow_hyphens:
+                  }
+              }
+          }
+      }
+  }
+
+\dim_new:N  \l__chemmacros_iupac_hyphen_pre_dim
+\dim_set:Nn \l__chemmacros_iupac_hyphen_pre_dim { .01em }
+\dim_new:N  \l__chemmacros_iupac_hyphen_post_dim
+\dim_set:Nn \l__chemmacros_iupac_hyphen_post_dim { -.03em }
+\dim_new:N  \l__chemmacros_iupac_break_dim
+\dim_set:Nn \l__chemmacros_iupac_break_dim { .03em }
+\skip_new:N  \l__chemmacros_iupac_break_skip
+\skip_set:Nn \l__chemmacros_iupac_break_skip { .03em plus .07em }
+
+\chemmacros_define_keys:nn {nomenclature}
+  {
+    hyphen-pre-space  .dim_set:N = \l__chemmacros_iupac_hyphen_pre_dim ,
+    hyphen-post-space .dim_set:N = \l__chemmacros_iupac_hyphen_post_dim ,
+    break-space       .skip_set:N = \l__chemmacros_iupac_break_skip
+  }
+
+\cs_new_protected:Npn \chemmacros_break_point_hyphen:
+  {
+    \__chemmacros_break_point_insert:nnn
+      { \tex_kern:D \l__chemmacros_iupac_hyphen_pre_dim - }
+      { }
+      {
+        \tex_kern:D \l__chemmacros_iupac_hyphen_pre_dim
+        -
+        \tex_kern:D \l__chemmacros_iupac_hyphen_post_dim
+      }
+  }
+
+\cs_new_protected:Npn \chemmacros_break_point:
+  {
+    \__chemmacros_break_point_insert:nnn
+      {-}
+      { }
+      {
+        \mode_if_math:TF
+          { | }
+          { \tex_kern:D \l__chemmacros_iupac_break_dim }
+      }
+  }
+  
+\cs_new_protected:Npn \chemmacros_break_point_opening_paren:
+  { \__chemmacros_break_point_insert:nnn { - } { ( } { ( } }
+
+\cs_new_protected:Npn \chemmacros_break_point_closing_paren:
+  { \__chemmacros_break_point_insert:nnn { )- } { } { ) } }
+
+\cs_new_protected:Npn \chemmacros_break_point_opening_bracket:
+  { \__chemmacros_break_point_insert:nnn { - } { [ } { [ } }
+
+\cs_new_protected:Npn \chemmacros_break_point_closing_bracket:
+  { \__chemmacros_break_point_insert:nnn { ]- } { } { ] } }
+  
+\cs_new_protected:Npn \chemmacros_superscript:n #1
+  { \mode_if_math:TF { \sp {#1} } { \textsuperscript {#1} } }
+  
+\bool_new:N \l__chemmacros_inside_iupac_bool
+
+\seq_new:N  \l__chemmacros_iupac_shorthands_seq
+\prop_new:N \l__chemmacros_iupac_shorthands_prop
+
+% #1: token
+% #2: definition
+\cs_new_protected:Npn \chemmacros_define_iupac_shorthand:NN #1#2
+  {
+    \seq_if_in:NnF \l__chemmacros_iupac_shorthands_seq {#1}
+      { \seq_put_right:Nn \l__chemmacros_iupac_shorthands_seq {#1} }
+    \prop_put:Nnn \l__chemmacros_iupac_shorthands_prop {#1}
+      { \char_set_active_eq:NN #1#2 }
+  }
+
+\cs_new_protected:Npn \chemmacros_remove_shorthand:N #1
+  {
+    \chemmacros_define_iupac_shorthand:NN #1 \c_empty_tl
+    \seq_remove_all:Nn \l__chemmacros_iupac_shorthands_seq {#1}
+    \prop_remove:Nn \l__chemmacros_iupac_shorthands_prop {#1}
+  }
+
+\prg_new_conditional:Npnn \chemmacros_if_iupac_shorthand:N #1 {p,T,F,TF}
+  {
+    \seq_if_in:NnTF \l__chemmacros_iupac_shorthands_seq {#1}
       { \prg_return_true: }
       { \prg_return_false: }
   }
-\cs_generate_variant:Nn \chemmacros_if_compatibility:nnT {nV}
 
-% user checks:
-\NewExpandableDocumentCommand \IfChemCompatibilityTF {mm+m+m}
-  { \chemmacros_if_compatibility:nnTF {#1} {#2} {#3} {#4} }
+\cs_new_protected:Npn \chemmacros_for_all_iupac_shorthands_do:n #1
+  { \seq_map_inline:Nn \l__chemmacros_iupac_shorthands_seq {#1} }
 
-\NewExpandableDocumentCommand \IfChemCompatibilityT {mm+m}
-  { \chemmacros_if_compatibility:nnT {#1} {#2} {#3} }
+\cs_new_protected:Npn \chemmacros_activate_iupac_shorthand:N #1
+  { \chemmacros_if_iupac_shorthand:NT #1 { \char_set_catcode_active:N #1 } }
 
-\NewExpandableDocumentCommand \IfChemCompatibilityF {mm+m}
-  { \chemmacros_if_compatibility:nnF {#1} {#2} {#3} }
+\cs_new_protected:Npn \chemmacros_activate_iupac_shorthands:n #1
+  { \tl_map_inline:nn {#1} { \chemmacros_activate_iupac_shorthand:N ##1 } }
 
+\cs_new_protected:Npn \chemmacros_activate_all_iupac_shorthands:
+  {
+    \chemmacros_for_all_iupac_shorthands_do:n
+      { \chemmacros_activate_iupac_shorthand:N ##1 }
+  }
+
+\cs_new_protected:Npn \chemmacros_make_shorthands:
+  {
+    \chemmacros_if_document:T
+      {
+        \chemmacros_for_all_iupac_shorthands_do:n
+          { \prop_item:Nn \l__chemmacros_iupac_shorthands_prop {##1} }
+      }
+  }
+
+\NewDocumentCommand \ChemMakeIupacShorthands {}
+  { \chemmacros_make_shorthands: }
+
+\NewDocumentCommand \DeclareChemIUPACShorthand {mm} 
+  { \chemmacros_define_iupac_shorthand:NN #1#2 }
+
+\NewDocumentCommand \NewChemIUPACShorthand {mm} 
+  {
+    \chemmacros_if_iupac_shorthand:NTF #1
+      { \msg_error:nnn {chemmacros} {new-iupac-shorthand} {#1} }
+      { \chemmacros_define_iupac_shorthand:NN #1#2 }
+  }
+
+\NewDocumentCommand \ProvideChemIUPACShorthand {mm} 
+  {
+    \chemmacros_if_iupac_shorthand:NTF #1
+      { \chemmacros_define_iupac_shorthand:NN #1#2 }
+  }
+
+\NewDocumentCommand \RenewChemIUPACShorthand {mm} 
+  {
+    \chemmacros_if_iupac_shorthand:NTF #1
+      { \chemmacros_define_iupac_shorthand:NN #1#2 }
+      { \msg_error:nnn {chemmacros} {renew-iupac-shorthand} {#1} }
+  }
+
+\NewDocumentCommand \RemoveChemIUPACShorthand {m} 
+  { \chemmacros_remove_shorthand:N #1 }
+
+\NewChemIUPACShorthand ^ \chemmacros_superscript:n
+\NewChemIUPACShorthand | \chemmacros_break_point:
+\NewChemIUPACShorthand - \chemmacros_break_point_hyphen:
+\NewChemIUPACShorthand ( \chemmacros_break_point_opening_paren:
+\NewChemIUPACShorthand ) \chemmacros_break_point_closing_paren:
+\NewChemIUPACShorthand [ \chemmacros_break_point_opening_bracket:
+\NewChemIUPACShorthand ] \chemmacros_break_point_closing_bracket:
+\NewChemIUPAC \chemprime { \ensuremath {{}^{\prime}} }
+\NewChemIUPACShorthand ' \chemprime
+\NewChemIUPAC \nonbreakinghyphen { \mbox{-} \nobreak \hspace{0pt} }
+\NewChemIUPACShorthand = \nonbreakinghyphen
+
+\cs_new_protected:Npn \chemmacros_iupac:nn #1#2
+  {
+    \group_begin:
+      \bool_set_true:N \l__chemmacros_inside_iupac_bool
+      \bool_set_true:N \l__chemmacros_in_document_bool
+      \chemmacros_set_keys:nn {nomenclature} {#1}
+      \chemmacros_make_iupac:
+      \chemmacros_make_shorthands:
+      \tl_set_rescan:Nnn \l__chemmacros_tmpa_tl
+        { \chemmacros_activate_all_iupac_shorthands: }
+        {#2}
+      \l__chemmacros_tmpa_tl
+    \group_end:
+  }
+
+\cs_new_protected:Npn \chemmacros_iupac:n #1 { \chemmacros_iupac:nn {} {#1} }
+\cs_generate_variant:Nn \chemmacros_iupac:n {e}
+
+\NewDocumentCommand \iupac {O{}m} { \chemmacros_iupac:nn {#1} {#2} }
+
 % --------------------------------------------------------------------------
-% compatibility coding:
-\cs_new_protected:Npn \ChemCompatibility #1#2 \EndChemCompatibility
-  { \chemmacros_if_compatibility:nnT {=} {#1} {#2} }
+% R(ectus)/S(inister):
+\NewChemIUPAC \rectus   { \cip {R} }
+\NewChemIUPAC \sinister { \cip {S} }
+
+\LetChemIUPAC \R \rectus
+\LetChemIUPAC \S \sinister
+
+% E(ntgegen)/Z(usammen)
+\NewChemIUPAC \entgegen { \cip {E} }
+\NewChemIUPAC \zusammen { \cip {Z} }
+
+\LetChemIUPAC \E \entgegen
+\LetChemIUPAC \Z \zusammen
+
+% cis/trans
+\NewChemIUPAC \cis   { \textit {cis} }
+\NewChemIUPAC \trans { \textit {trans} }
+
+% fac/mer
+\NewChemIUPAC \fac { \textit {fac} }
+\NewChemIUPAC \mer { \textit {mer} }
+
+% n
+\NewChemIUPAC \normal { \textit {n} }
+
+% tert
+\NewChemIUPAC \tert  { \textit {tert} }
+
+% Italian descriptors - I forgot what they mean
+\NewChemIUPAC \sin { \textit {sin} }
+\NewChemIUPAC \ter { \textit {ter} }
+
+% Fischer
+\NewChemIUPAC \dexter { \textsc {d} }
+\NewChemIUPAC \laevus { \textsc {l} }
+
+\LetChemIUPAC \D \dexter
+\LetChemIUPAC \L \laevus
+
+% ortho/meta/para
+\NewChemIUPAC \ortho { \textit {o} }
+\NewChemIUPAC \meta  { \textit {m} }
+\NewChemIUPAC \para  { \textit {p} }
+
+% syn/anti
+\NewChemIUPAC \syn  { \textit {syn} }
+\NewChemIUPAC \anti { \textit {anti} }
+
+% coordination chemistry:
+\NewChemIUPAC \hapto  { \chemmacros_hapto:n }
+\NewChemIUPAC \dento  { \chemmacros_dento:n }
+\NewChemIUPAC \bridge { \chemmacros_bridge:n }
+
+% attachments to heteroatoms / added hydrogen
+\NewChemIUPAC \hydrogen   { \textit {H} }
+\NewChemIUPAC \oxygen     { \textit {O} }
+\NewChemIUPAC \nitrogen   { \textit {N} }
+\NewChemIUPAC \sulfur     { \textit {S} }
+\NewChemIUPAC \phosphorus { \textit {P} }
+
+% atoms:
+\LetChemIUPAC \H  \hydrogen
+\LetChemIUPAC \O  \oxygen
+\LetChemIUPAC \N  \nitrogen
+\LetChemIUPAC \Sf \sulfur
+\LetChemIUPAC \P  \phosphorus
+
+% greek letters
+\NewChemIUPAC \a { \chemalpha }
+\NewChemIUPAC \b { \chembeta }
+\NewChemIUPAC \g { \chemgamma }
+\NewChemIUPAC \d { \chemdelta }
+\NewChemIUPAC \k { \chemkappa }
+\NewChemIUPAC \m { \chemmu }
+\NewChemIUPAC \n { \chemeta }
+\NewChemIUPAC \w { \chemomega }
+
+% --------------------------------------------------------------------------
+% latin phrases
+\tl_new:N   \l__chemmacros_latin_format_tl
   
-\cs_new_protected:Npn \ChemCompatibilityFrom #1#2 \EndChemCompatibility
-  { \chemmacros_if_compatibility:nnT {>=} {#1} {#2} }
+\NewChemMacroset {Latin} {mm}
+  { \chemmacros_define_latin:Nn #1 {#2} }
 
-\cs_new_protected:Npn \ChemCompatibilityTo #1#2 \EndChemCompatibility
-  { \chemmacros_if_compatibility:nnT {<} {#1} {#2} }
+\chemmacros_define_keys:nn {nomenclature}
+  {
+    format .tl_set:N  = \l__chemmacros_latin_format_tl ,
+    format .initial:n = \emph ,
+  }
+  
+\cs_new_protected:Npn \chemmacros_write_latin:n #1
+  {
+    \group_begin:
+      \l__chemmacros_latin_format_tl {#1}
+    \group_end:
+  }
 
-\cs_new_protected:Npn \ChemCompatibilityBetween #1#2#3 \EndChemCompatibility
+\cs_new_protected:Npn \chemmacros_latin:n #1
+  { \chemmacros_write_latin:n {#1} }
+
+\cs_new_protected:Npn \chemmacros_define_latin:Nn #1#2
+  { \DeclareDocumentCommand #1 {O{}} { \latin [##1] {#2} } }
+
+\NewDocumentCommand \latin {O{}m}
   {
+    \group_begin:
+      \chemmacros_set_keys:nn {nomenclature} {#1}
+      \chemmacros_latin:n {#2}
+    \group_end:
+  }
+
+\cs_undefine:N \invacuo
+\NewChemLatin \invacuo  {in~vacuo}
+\NewChemLatin \abinitio {ab~initio}
+\NewChemLatin \insitu   {in~situ}
+
+% --------------------------------------------------------------------------
+% hyperref support
+% ?? unsure about adding IUPAC commands
+\hook_gput_code:nnn {package/hyperref/after} {chemmacros}
+  {
+    \pdfstringdefDisableCommands
+      {
+        % \cs_set:Npn \- { - } % maybe not a good idea...
+        % \cs_set:Npn \| { }
+        % \cs_set:Npn \pH { pH }
+        % \cs_set:Npn \pOH { pOH }
+        \cs_set:Npn \iupac #1 {#1}
+        \cs_set:Npn \cip   #1 {(#1)}
+        \cs_set:Npn \cis   {cis}
+        \cs_set:Npn \trans {trans}
+        \cs_set:Npn \tert  {tert}
+        \cs_set:Npn \ortho {o}
+        \cs_set:Npn \meta  {m}
+        \cs_set:Npn \para  {p}
+        \cs_set:Npn \syn   {syn}
+        \cs_set:Npn \anti  {anti}
+        \cs_set:Npn \R     {(R)}
+        \cs_set:Npn \S     {(S)}
+        \cs_set:Npn \E     {(E)}
+        \cs_set:Npn \Z     {(Z)}
+        \cs_set:Npn \D     {D}
+        \cs_set:Npn \L     {L}
+        \cs_set:Npn \H     {H}
+        \cs_set:Npn \O     {O}
+        \cs_set:Npn \N     {N}
+        \cs_set:Npn \Sf    {S}
+        \cs_set:Npn \P     {P}
+        \cs_set:Npn \dexter     {D}
+        \cs_set:Npn \laevus     {L}
+        \cs_set:Npn \rectus     {(R)}
+        \cs_set:Npn \sinister   {(S)}
+        \cs_set:Npn \entgegen   {(E)}
+        \cs_set:Npn \zusammen   {(Z)}
+        \cs_set:Npn \hydrogen   {H}
+        \cs_set:Npn \oxygen     {O}
+        \cs_set:Npn \nitrogen   {N}
+        \cs_set:Npn \sulfur     {S}
+        \cs_set:Npn \phosphorus {P}
+        \cs_set:Npn \chemprime  {'}
+      }
+  }
+  
+% --------------------------------------------------------------------------
+\ChemModuleEnd
+\ChemModule{tikz}{2020/11/29 upright greek symbols}
+
+\ExplSyntaxOff
+\RequirePackage{tikz}
+\usetikzlibrary{calc,decorations.pathmorphing}
+\ExplSyntaxOn
+
+\tl_const:Nx \c_chemmacros_other_colon_tl { \token_to_str:N : }
+
+% --------------------------------------------------------------------------
+% TikZ drawings - helper macros
+\cs_new_protected:Npn \chemmacros_tikz_picture:nn #1#2
+  { \tikzpicture[{#1}] #2 \endtikzpicture }
+\cs_new_protected:Npn \chemmacros_tikz:nn #1#2           { \tikz[{#1}] {#2} }
+\cs_new_protected:Npn \chemmacros_tikz_draw:n #1         { \draw[{#1}] }
+\cs_new_protected:Npn \chemmacros_tikz_node:n #1         { \node[{#1}] }
+\cs_new_protected:Npn \chemmacros_tikz_shade:n #1        { \shade[{#1}] }
+\cs_new_protected:Npn \chemmacros_tikz_shadedraw:n #1    { \shadedraw[{#1}] }
+\cs_new_protected:Npn \chemmacros_tikz_node_in_draw:n #1 { node[{#1}] }
+
+\cs_generate_variant:Nn \chemmacros_tikz_picture:nn     {xn}
+\cs_generate_variant:Nn \chemmacros_tikz_draw:n         {x}
+\cs_generate_variant:Nn \chemmacros_tikz_node:n         {x}
+\cs_generate_variant:Nn \chemmacros_tikz_shade:n        {x}
+\cs_generate_variant:Nn \chemmacros_tikz_shadedraw:n    {x}
+\cs_generate_variant:Nn \chemmacros_tikz_node_in_draw:n {x}
+
+% --------------------------------------------------------------------------
+% arrow tips for electron movement
+\dim_new:N \l__chemmacros_el_length_dim
+
+% full tip for pairs
+\pgfarrowsdeclare { el } { el }
+  {
+    \dim_set:Nn \l__chemmacros_el_length_dim
+      { 2.5pt + 2.5\pgflinewidth }
+    \pgfarrowsleftextend { -\l__chemmacros_el_length_dim }
+    \pgfarrowsrightextend { .5\pgflinewidth }
+  }
+  {
+    \dim_set:Nn \l__chemmacros_el_length_dim
+      { 2.5pt + 2.5\pgflinewidth }
+    \pgfsetdash {} { 0pt }
+    \pgfsetroundjoin
+    \pgfsetroundcap
+    \pgfpathmoveto { \pgfpoint { 0pt } { 0pt } }
+    \pgfpathlineto
+      {
+        \pgfpoint
+          { -\l__chemmacros_el_length_dim }
+          { .3\l__chemmacros_el_length_dim }
+      }
+    \pgfpathlineto
+      { \pgfpoint { -.5\l__chemmacros_el_length_dim } { 0pt } }
+    \pgfpathlineto
+      {
+        \pgfpoint
+          { -\l__chemmacros_el_length_dim }
+          { -.3\l__chemmacros_el_length_dim }
+      }
+    \pgfpathlineto { \pgfpoint { 0pt } { 0pt } }
+    \pgfusepathqfillstroke
+  }
+
+% half tip on the left
+\pgfarrowsdeclare { left~el } { left~el }
+  {
+    \dim_set:Nn \l__chemmacros_el_length_dim
+      { 2.5pt + 2.5\pgflinewidth }
+    \pgfarrowsleftextend { -\l__chemmacros_el_length_dim }
+    \pgfarrowsrightextend { .5\pgflinewidth }
+  }
+  {
+    \dim_set:Nn \l__chemmacros_el_length_dim
+      { 2.5pt + 2.5\pgflinewidth }
+    \pgfsetdash {} { 0pt }
+    \pgfsetroundjoin
+    \pgfsetroundcap
+    \pgfpathmoveto { \pgfpoint { 0pt } { 0pt } }
+    \pgfpathlineto
+      {
+        \pgfpoint
+          { -\l__chemmacros_el_length_dim }
+          { .3\l__chemmacros_el_length_dim }
+      }
+    \pgfpathlineto { \pgfpoint { -.5\l__chemmacros_el_length_dim } { 0pt } }
+    \pgfpathlineto { \pgfpoint { 0pt } { 0pt } }
+    \pgfusepathqfillstroke
+  }
+
+% half tip in the right
+\pgfarrowsdeclare { right~el } { right~el }
+  {
+    \dim_set:Nn \l__chemmacros_el_length_dim
+      { 2.5pt + 2.5\pgflinewidth }
+    \pgfarrowsleftextend { -\l__chemmacros_el_length_dim }
+    \pgfarrowsrightextend { .5\pgflinewidth }
+  }
+  {
+    \dim_set:Nn \l__chemmacros_el_length_dim
+      { 2.5pt + 2.5\pgflinewidth }
+    \pgfsetdash {} { 0pt }
+    \pgfsetroundjoin
+    \pgfsetroundcap
+    \pgfpathmoveto { \pgfpoint { 0pt } { 0pt } }
+    \pgfpathlineto
+      {
+        \pgfpoint
+          { -\l__chemmacros_el_length_dim }
+          { -.3\l__chemmacros_el_length_dim }
+      }
+    \pgfpathlineto { \pgfpoint { -.5\l__chemmacros_el_length_dim } { 0pt } }
+    \pgfpathlineto { \pgfpoint { 0pt } { 0pt } }
+    \pgfusepathqfillstroke
+  }
+% --------------------------------------------------------------------------
+% http://tex.stackexchange.com/a/25689/
+\pgfdeclaredecoration{wave}{initial}{
+  \state{initial}[
+    width = +0pt ,
+    next~ state = sine,
+    persistent~ precomputation = {
+      \pgfmathsetmacro\matchinglength{
+        \pgfdecoratedinputsegmentlength /
+        int(\pgfdecoratedinputsegmentlength/\pgfdecorationsegmentlength)
+      }
+      \setlength{\pgfdecorationsegmentlength}{\matchinglength pt}
+    }
+  ]{}
+  \state{sine}[width=\pgfdecorationsegmentlength]{
+    \pgfpathsine{
+      \pgfpoint
+        {0.25\pgfdecorationsegmentlength}
+        {0.5\pgfdecorationsegmentamplitude}
+      }
+    \pgfpathcosine{
+      \pgfpoint
+        {0.25\pgfdecorationsegmentlength}
+        {-0.5\pgfdecorationsegmentamplitude}
+      }
+    \pgfpathsine{
+      \pgfpoint
+        {0.25\pgfdecorationsegmentlength}
+        {-0.5\pgfdecorationsegmentamplitude}
+      }
+    \pgfpathcosine{
+      \pgfpoint
+        {0.25\pgfdecorationsegmentlength}
+        {0.5\pgfdecorationsegmentamplitude}
+      }
+  }
+  \state{final}{}
+}
+
+% --------------------------------------------------------------------------
+\ChemModuleEnd
+\ChemModule{isotopes}{2020/11/29 a macro to easily print element isotopes}
+
+\RequirePackage{elements}
+
+\msg_new:nnn {chemmacros} {no-isotope}
+  { The~ isotope~ #2~ is~ not~ defined~ for~ element~ #1. }
+
+% --------------------------------------------------------------------------
+\tl_new:N  \l__chemmacros_isotope_tl
+\tl_new:N  \l__chemmacros_isotope_list_tl
+\seq_new:N \l__chemmacros_isotope_seq
+\seq_new:N \l__chemmacros_check_isotopes_seq
+
+% #1: atomic number|element symbol|element name
+% #2: tokenlist variable
+\cs_new_protected:Npn \chemmacros_get_atom_number:nN #1#2
+  {
+    \chemmacros_if_is_int:nTF {#1}
+      { \tl_set:Nn #2 {#1} }
+      {
+        \cs_if_exist:cTF { @elements at atom@number@ \str_lowercase:n {#1} }
+          { \tl_set:Nx #2 { \use:c { @elements at atom@number@ \str_lowercase:n {#1} } } }
+          { \tl_set:Nx #2 { \use:c { @elements at atom@name at num@ \str_lowercase:n {#1} } } }
+      }
+  }
+\cs_generate_variant:Nn \chemmacros_get_atom_number:nN { V }
+
+% #1: atomic number|element symbol|element name
+% #2: tl to store the result in
+\cs_new_protected:Npn \chemmacros_get_isotope_list:nN #1#2
+  {
+    \chemmacros_get_atom_number:nN {#1} \l__chemmacros_isotope_tl
+    \tl_set:Nx #2
+      {
+        \use:c
+          {
+            @elements at atom@isotopes@
+            \int_to_roman:n {\l__chemmacros_isotope_tl}
+          }
+      }
+  }
+
+% #1: atomic number|element symbol|element name
+% #2: tokenlist variable
+\cs_new_protected:Npn \chemmacros_get_element_symbol:nN #1#2
+  {
+    \chemmacros_get_atom_number:nN {#1} \l__chemmacros_isotope_tl
+    \tl_set:Nx #2
+      {
+        \use:c
+          {
+            @elements at atom@symbol at num@
+            \int_to_roman:n {\l__chemmacros_isotope_tl}
+          }
+      }
+  }
+
+% #1: atomic number|element symbol|element name
+% #2: isotope number
+\prg_new_protected_conditional:Npnn \chemmacros_check_isotope:nn #1#2 {T,F,TF}
+  {
+    \chemmacros_get_isotopes:nN {#1} \l__chemmacros_check_isotopes_seq
+    \seq_if_in:NnTF \l__chemmacros_check_isotopes_seq {#2}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+\cs_generate_variant:Nn \chemmacros_check_isotope:nnF { V }
+
+% #1: atomic number|element symbol|element name
+% #2: tl to store the result in
+\cs_new_protected:Npn \chemmacros_get_main_isotope:nN #1#2
+  {
+    \chemmacros_get_isotope_list:nN {#1} \l__chemmacros_isotope_list_tl
+    \seq_set_split:NnV \l__chemmacros_isotope_seq {,} \l__chemmacros_isotope_list_tl
+    \seq_map_inline:Nn \l__chemmacros_isotope_seq
+      {
+        \chemmacros_read_isotope:nNN {##1}
+          \l__chemmacros_tmpa_bool
+          #2
+        \bool_if:NT \l__chemmacros_tmpa_bool
+          { \seq_map_break: }
+      }
+  }
+\cs_generate_variant:Nn \chemmacros_get_main_isotope:nN { V }
+
+% #1: atomic number|element symbol|element name
+% #2: seq to store the results in
+\cs_new_protected:Npn \chemmacros_get_isotopes:nN #1#2
+  {
+    \seq_clear:N #2
+    \chemmacros_get_isotope_list:nN {#1} \l__chemmacros_tmpa_tl
+    \seq_set_split:NnV \l__chemmacros_isotope_seq {,} \l__chemmacros_tmpa_tl
+    \seq_map_inline:Nn \l__chemmacros_isotope_seq
+      {
+        \chemmacros_read_isotope:nNN {##1}
+          \l__chemmacros_tmpa_bool
+          \l__chemmacros_tmpa_tl
+        \seq_put_right:NV #2 \l__chemmacros_tmpa_tl
+      }
+  }
+
+% #1: boolean variable
+% #2: tokenlist variable
+% #3: isotope list entry
+\cs_new_protected:Npn \chemmacros_read_isotope:nNN #1#2#3
+  { \__chemmacros_read_isotope:NNw #2#3 !#1!! \q_stop }
+
+% \__chemmacros_read_isotope:NNw N N !!1!! \q_stop
+% \__chemmacros_read_isotope:NNw N N !1!! \q_stop
+\cs_new_protected:Npn \__chemmacros_read_isotope:NNw #1#2#3!#4!#5!#6 \q_stop
+  {
+    \tl_if_blank:nTF {#5}
+      {
+        \tl_set:Nn #2 {#4}
+        \bool_set_false:N #1
+      }
+      {
+        \tl_set:Nn #2 {#5}
+        \bool_set_true:N #1
+      }
+  }
+
+% --------------------------------------------------------------------------
+% #1: boolean: hide atomic number?
+% #2: nucleons, element symbol
+\cs_new_protected:Npn \chemmacros_isotope:nn #1#2
+  { \__chemmacros_isotope:nww {#1} #2,, \q_stop }
+
+\cs_new_protected:Npn \__chemmacros_isotope:nww #1#2,#3,#4 \q_stop
+  {
+    \tl_if_blank:nTF {#3}
+      {
+        \chemmacros_get_element_symbol:nN {#2} \l__chemmacros_tmpa_tl
+        \chemmacros_get_main_isotope:nN {#2} \l__chemmacros_tmpb_tl
+        \chemmacros_get_atom_number:nN {#2} \l__chemmacros_tmpc_tl
+        \bool_if:nTF {#1}
+          {
+            \chemmacros_isotope_write:VnV
+              \l__chemmacros_tmpb_tl
+              { }
+              \l__chemmacros_tmpa_tl
+          }
+          {
+            \chemmacros_isotope_write:VVV
+              \l__chemmacros_tmpb_tl
+              \l__chemmacros_tmpc_tl
+              \l__chemmacros_tmpa_tl
+          }
+      }
+      {
+        \chemmacros_get_element_symbol:nN {#3} \l__chemmacros_tmpa_tl
+        \chemmacros_get_atom_number:nN {#3} \l__chemmacros_tmpb_tl
+        \chemmacros_check_isotope:VnF
+          \l__chemmacros_tmpa_tl
+          {#2}
+          {
+            \chemmacros_get_element_symbol:nN {#3} \l__chemmacros_tmpa_tl
+            \msg_warning:nnVn {chemmacros} {no-isotope}
+              \l__chemmacros_tmpa_tl
+              {#2}
+          }
+        \chemmacros_get_element_symbol:nN {#3} \l__chemmacros_tmpa_tl
+        \bool_if:nTF {#1}
+          { \chemmacros_isotope_write:nnV {#2} { } \l__chemmacros_tmpa_tl }
+          {
+            \chemmacros_isotope_write:nVV {#2}
+              \l__chemmacros_tmpb_tl
+              \l__chemmacros_tmpa_tl
+          }
+      }
+  }
+
+\bool_new:N \l__chemmacros_isotope_super_bool
+\tl_new:N \l__chemmacros_isotope_side_connect_tl
+
+\chemmacros_define_keys:nn {isotopes}
+  {
+    format .choice: ,
+    format / super .code:n  =
+      \bool_set_true:N \l__chemmacros_isotope_super_bool ,
+    format / side .code:n   =
+      \bool_set_false:N \l__chemmacros_isotope_super_bool ,
+    format .initial:n       = super ,
+    side-connect .tl_set:N  = \l__chemmacros_isotope_side_connect_tl ,
+    side-connect .initial:n = -
+  }
+
+% #1: nucleons
+% #2: atomic number
+% #3: element symbol
+\cs_new_protected:Npn \chemmacros_isotope_write:nnn #1#2#3
+  {
+    \bool_if:NTF \l__chemmacros_isotope_super_bool
+      { \chemmacros_chemformula:n { ^{#1}_{#2}#3 } }
+      {
+        \chemmacros_chemformula:n {#3}
+        \tl_use:N \l__chemmacros_isotope_side_connect_tl
+        #1
+      }
+  }
+\cs_generate_variant:Nn \chemmacros_isotope_write:nnn { VnV , VVV , nnV , nVV }
+
+% TODO: option for the layout of the written isotope: ^{12}_6C vs C-12
+
+\NewDocumentCommand \isotope { sm }
+  { \chemmacros_isotope:nn {#1} {#2} }
+  
+% --------------------------------------------------------------------------
+\ChemModuleEnd
+\ChemModule{mechanisms}{2020/11/29 reaction mechanisms}
+
+\RequirePackage{amstext}
+
+% --------------------------------------------------------------------------
+% reaction mechanisms
+% \mech[<type>]
+% <type> - substitutions: {}, 1, 2, se, 1e, 2e, ar
+%        - eliminations:  e, e1, e2, cb
+\tl_new:N \l__chemmacros_mechanisms_type_tl
+\tl_new:N \l__chemmacros_mechanisms_mol_tl
+\tl_new:N \l__chemmacros_mechanisms_ar_tl
+
+\cs_new_protected:Npn \__chemmacros_set_mechanisms:nnn #1#2#3
+  {
+    \tl_set:Nn \l__chemmacros_mechanisms_type_tl {#1}
+    \tl_set:Nn \l__chemmacros_mechanisms_mol_tl  {#2}
+    \tl_set:Nn \l__chemmacros_mechanisms_ar_tl   {#3}
+  }
+
+\chemmacros_define_keys:nn {mechanisms}
+  {
+    type      .choice: ,
+    type /    .code:n    =
+      {
+        \__chemmacros_set_mechanisms:nnn {S}
+          {
+            \c_math_toggle_token
+              \c_math_subscript_token { \text {N} }
+            \c_math_toggle_token
+          }
+          { }
+      } ,
+    type / 1  .code:n    =
+      {
+        \__chemmacros_set_mechanisms:nnn {S}
+          {
+            \c_math_toggle_token
+              \c_math_subscript_token { \text {N} }
+            \c_math_toggle_token
+            1
+          }
+          { }
+      } ,
+    type / 2  .code:n    =
+      {
+        \__chemmacros_set_mechanisms:nnn {S}
+          {
+            \c_math_toggle_token
+              \c_math_subscript_token { \text {N} }
+            \c_math_toggle_token
+            2
+          }
+          { }
+      } ,
+    type / se .code:n    =
+      {
+        \__chemmacros_set_mechanisms:nnn {S}
+          {
+            \c_math_toggle_token
+              \c_math_subscript_token { \text {E} }
+            \c_math_toggle_token
+          }
+          { }
+      } ,
+    type / 1e .code:n    =
+      {
+        \__chemmacros_set_mechanisms:nnn {S}
+          {
+            \c_math_toggle_token
+              \c_math_subscript_token { \text {E} }
+            \c_math_toggle_token
+            1
+          }
+          { }
+      } ,
+    type / 2e .code:n    =
+      {
+        \__chemmacros_set_mechanisms:nnn {S}
+          {
+            \c_math_toggle_token
+              \c_math_subscript_token { \text {E} }
+            \c_math_toggle_token
+            2
+          }
+          { }
+      } ,
+    type / ar .code:n    =
+      {
+        \__chemmacros_set_mechanisms:nnn {S}
+          {
+            \c_math_toggle_token
+              \c_math_subscript_token { \text {E} }
+            \c_math_toggle_token
+          }
+          { Ar - }
+      } ,
+    type / e  .code:n    =
+      { \__chemmacros_set_mechanisms:nnn {E} { } { } } ,
+    type / e1 .code:n    =
+      { \__chemmacros_set_mechanisms:nnn {E} {1} { } } ,
+    type / e2 .code:n    =
+      { \__chemmacros_set_mechanisms:nnn {E} {2} { } } ,
+    type / cb .code:n    =
+      {
+        \__chemmacros_set_mechanisms:nnn {E}
+          {
+            1
+            \c_math_toggle_token
+              \c_math_subscript_token { \text {cb} }
+            \c_math_toggle_token
+          }
+          { }
+      } ,
+    type      .default:n = 
+  }
+
+\cs_new_protected:Npn \chemmacros_mechanisms:n #1
+  {
+    \tl_if_blank:nTF {#1}
+      { \chemmacros_set_keys:nn {mechanisms} { type } }
+      { \chemmacros_set_keys:nn {mechanisms} { type = #1 } }
+    \mbox
+      {
+        \tl_use:N \l__chemmacros_mechanisms_ar_tl
+        \tl_use:N \l__chemmacros_mechanisms_type_tl
+        \tl_use:N \l__chemmacros_mechanisms_mol_tl
+      }
+  }
+
+\NewDocumentCommand \mech {o}
+  {
+    \IfNoValueTF {#1}
+      { \chemmacros_mechanisms:n { } }
+      { \chemmacros_mechanisms:n {#1} }
+  }
+
+% --------------------------------------------------------------------------
+\ChemModuleEnd
+\ChemModule{newman}{2020/11/29 newman projections}
+
+% Newman projections
+\fp_new:N  \l__chemmacros_newman_rel_angle_fp
+\fp_zero:N \l__chemmacros_newman_rel_angle_fp
+\fp_new:N  \l__chemmacros_newman_tmp_angle_fp
+\fp_new:N  \l__chemmacros_newman_abs_angle_fp
+\fp_zero:N \l__chemmacros_newman_abs_angle_fp
+\fp_new:N  \l__chemmacros_newman_scale_fp
+\fp_set:Nn \l__chemmacros_newman_scale_fp {1}
+\fp_new:N  \l__chemmacros_newman_x_fp
+\fp_new:N  \l__chemmacros_newman_y_fp
+
+\tl_new:N \l__chemmacros_newman_tikz_ring_tl
+\tl_new:N \l__chemmacros_newman_tikz_front_tl
+\tl_new:N \l__chemmacros_newman_tikz_back_tl
+
+\bool_new:N \l__chemmacros_newman_tikz_back_bool
+
+\chemmacros_define_keys:nn {newman}
+  {
+    ring       .tl_set:N  = \l__chemmacros_newman_tikz_ring_tl ,
+    atoms      .tl_set:N  = \l__chemmacros_newman_tikz_front_tl ,
+    back-atoms .code:n    =
+      {
+        \bool_set_true:N \l__chemmacros_newman_tikz_back_bool
+        \tl_set:Nn \l__chemmacros_newman_tikz_back_tl { #1 }
+      } ,
+    scale       .fp_set:N  = \l__chemmacros_newman_scale_fp ,
+    scale       .default:n = 1 ,
+    angle       .fp_set:N  = \l__chemmacros_newman_abs_angle_fp ,
+    angle       .default:n = 0
+  }
+
+% \newman[<keyval>](<angle>){<1>,<2>,<3>,<4>,<5>,<6>}
+\NewDocumentCommand \newman {od()m}
+  {
+    \group_begin:
+      \IfNoValueF  {#1} { \chemmacros_set_keys:nn {newman} {#1} }
+      \IfNoValueTF {#2}
+        { \chemmacros_newman:nn {  } {#3} }
+        { \chemmacros_newman:nn {#2} {#3} }
+    \group_end:
+  }
+
+% #1: angle
+% #2: csv list of atoms
+\cs_new_protected:Npn \chemmacros_newman:nn #1#2
+  { \__chemmacros_newman_feed_atoms:nw {#1}#2 ,,,,,, \q_stop }
+
+\cs_new_protected:Npn \__chemmacros_newman_feed_atoms:nw #1#2,#3,#4,#5,#6,#7,#8 \q_stop
+  { \chemmacros_newman_atoms:nnnnnnn {#1} {#2} {#3} {#4} {#5} {#6} {#7} }
+
+% place atoms:
+% #1: angle
+% #2 - #7: atoms
+\cs_new_protected:Npn \chemmacros_newman_atoms:nnnnnnn #1#2#3#4#5#6#7
+  {
+    \tl_if_blank:nTF {#1}
+      {
+        \fp_set_eq:NN
+          \l__chemmacros_newman_rel_angle_fp
+          \l__chemmacros_newman_abs_angle_fp
+      }
+      { \fp_set:Nn \l__chemmacros_newman_rel_angle_fp {#1} }
+    \chemmacros_tikz_picture:xn
+      {
+        scale = \fp_to_decimal:N \l__chemmacros_newman_scale_fp ,
+        chemmacros_newman_atom_front / .style =
+          {
+            inner~sep = 0pt ,
+            outer~sep = 0pt ,
+            \exp_not:V \l__chemmacros_newman_tikz_front_tl
+          },
+        chemmacros_newman_atom_back / .style =
+          {
+            inner~sep = 0pt ,
+            outer~sep = 0pt ,
+            \bool_if:NTF \l__chemmacros_newman_tikz_back_bool
+              { \exp_not:V \l__chemmacros_newman_tikz_back_tl }
+              { \exp_not:V \l__chemmacros_newman_tikz_front_tl }
+          }
+      }
+      {
+        \chemmacros_tikz_draw:x
+          { \exp_not:V \l__chemmacros_newman_tikz_ring_tl }
+          (0pt,0pt) circle (\fp_to_dim:N \l__chemmacros_newman_scale_fp * 15) ;
+        \chemmacros_newman_back_node:nn  {30}  {#6}
+        \chemmacros_newman_back_node:nn  {150} {#7}
+        \chemmacros_newman_back_node:nn  {270} {#5}
+        \chemmacros_newman_front_node:nn {90}  {#2}
+        \chemmacros_newman_front_node:nn {210} {#3}
+        \chemmacros_newman_front_node:nn {330} {#4}
+    }
+  }
+
+% provide cartesian coordiantes from polar coordinates
+% #1: fp variable for x
+% #2: fp variable for y
+% #3: angle
+% #4: radius
+\cs_new_protected:Npn \chemmacros_polar_to_cartesian:NNnn #1#2#3#4
+  {
+    \fp_set:Nn #1 { #4 * cos( #3 / 180 * pi ) }% x
+    \fp_set:Nn #2 { #4 * sin( #3 / 180 * pi ) }% y
+  }
+
+% place back nodes
+\cs_new_protected:Npn \chemmacros_newman_back_node:nn #1#2
+  {
+    \group_begin:
+      \fp_add:Nn \l__chemmacros_newman_rel_angle_fp { #1 }
+      \chemmacros_polar_to_cartesian:NNnn
+        \l__chemmacros_newman_x_fp
+        \l__chemmacros_newman_y_fp
+        { \l__chemmacros_newman_rel_angle_fp }
+        { \l__chemmacros_newman_scale_fp }
+      \chemmacros_tikz_draw:x
+        { \exp_not:V \l__chemmacros_newman_tikz_ring_tl }
+        (
+          15 * \fp_to_dim:N \l__chemmacros_newman_x_fp ,
+          15 * \fp_to_dim:N \l__chemmacros_newman_y_fp
+        )
+        --
+        (
+          30 * \fp_to_dim:N \l__chemmacros_newman_x_fp ,
+          30 * \fp_to_dim:N \l__chemmacros_newman_y_fp
+        ) ;
+      \chemmacros_polar_to_cartesian:NNnn
+        \l__chemmacros_newman_x_fp
+        \l__chemmacros_newman_y_fp
+        { \l__chemmacros_newman_rel_angle_fp }
+        { \l__chemmacros_newman_scale_fp }
+      \chemmacros_tikz_node:x
+        {
+          chemmacros_newman_atom_back,
+          anchor = -180 + \fp_to_int:N \l__chemmacros_newman_rel_angle_fp
+        }
+        at
+        (
+          31 * \fp_to_dim:N \l__chemmacros_newman_x_fp ,
+          31 * \fp_to_dim:N \l__chemmacros_newman_y_fp
+        )
+        { #2 } ;
+    \group_end:
+  }
+\cs_generate_variant:Nn \chemmacros_newman_back_node:nn { nf }
+
+% place front nodes:
+\cs_new_protected:Npn \chemmacros_newman_front_node:nn #1#2
+  {
+    \chemmacros_polar_to_cartesian:NNnn
+      \l__chemmacros_newman_x_fp
+      \l__chemmacros_newman_y_fp
+      { #1 }
+      { \l__chemmacros_newman_scale_fp }
+    \chemmacros_tikz_draw:x
+      { \exp_not:V \l__chemmacros_newman_tikz_ring_tl }
+      (0pt,0pt) -- ++
+      (
+        30 * \fp_to_dim:N \l__chemmacros_newman_x_fp ,
+        30 * \fp_to_dim:N \l__chemmacros_newman_y_fp
+      ) ;
+    \chemmacros_polar_to_cartesian:NNnn
+      \l__chemmacros_newman_x_fp
+      \l__chemmacros_newman_y_fp
+      { #1 }
+      { \l__chemmacros_newman_scale_fp }
+    \chemmacros_tikz_node:x
+      { chemmacros_newman_atom_front, anchor = -180 + #1 }
+      at
+      (
+        31 * \fp_to_dim:N \l__chemmacros_newman_x_fp ,
+        31 * \fp_to_dim:N \l__chemmacros_newman_y_fp
+      )
+      { #2 } ;
+  }
+\cs_generate_variant:Nn \chemmacros_newman_front_node:nn { nf }
+
+% --------------------------------------------------------------------------
+\ChemModuleEnd
+\ChemModule{orbital}{2020/11/29 drawing orbital shapes}
+
+% \orbital[<keyval>]{<type>}
+% variables:
+\bool_new:N      \l__chemmacros_orbital_type_s_bool
+\bool_new:N      \l__chemmacros_orbital_type_p_bool
+\bool_new:N      \l__chemmacros_orbital_type_sp_bool
+\bool_new:N      \l__chemmacros_orbital_type_sptwo_bool
+\bool_new:N      \l__chemmacros_orbital_type_spthree_bool
+\bool_new:N      \l__chemmacros_orbital_s_phase_bool
+\bool_set_true:N \l__chemmacros_orbital_s_phase_bool
+\bool_new:N      \l__chemmacros_orbital_p_phase_bool
+\bool_set_true:N \l__chemmacros_orbital_p_phase_bool
+\bool_new:N      \l__chemmacros_orbital_sp_phase_bool
+\bool_set_true:N \l__chemmacros_orbital_sp_phase_bool
+\bool_new:N      \l__chemmacros_orbital_sptwo_phase_bool
+\bool_set_true:N \l__chemmacros_orbital_sptwo_phase_bool
+\bool_new:N      \l__chemmacros_orbital_spthree_phase_bool
+\bool_set_true:N \l__chemmacros_orbital_spthree_phase_bool
+\bool_new:N      \l__chemmacros_orbital_p_half_bool
+\bool_new:N      \l__chemmacros_orbital_overlay_bool
+\bool_new:N      \l__chemmacros_orbital_opacity_bool
+
+\tl_new:N  \l__chemmacros_orbital_s_color_tl
+\tl_set:Nn \l__chemmacros_orbital_s_color_tl {black}
+\tl_new:N  \l__chemmacros_orbital_s_phase_color_tl
+\tl_new:N  \l__chemmacros_orbital_p_color_tl
+\tl_set:Nn \l__chemmacros_orbital_p_color_tl {black}
+\tl_new:N  \l__chemmacros_orbital_p_pphase_color_tl
+\tl_new:N  \l__chemmacros_orbital_p_mphase_color_tl
+\tl_new:N  \l__chemmacros_orbital_sp_color_tl
+\tl_set:Nn \l__chemmacros_orbital_sp_color_tl {black}
+\tl_new:N  \l__chemmacros_orbital_sp_pphase_color_tl
+\tl_new:N  \l__chemmacros_orbital_sp_mphase_color_tl
+\tl_new:N  \l__chemmacros_orbital_sptwo_color_tl
+\tl_set:Nn \l__chemmacros_orbital_sptwo_color_tl {black}
+\tl_new:N  \l__chemmacros_orbital_sptwo_pphase_color_tl
+\tl_new:N  \l__chemmacros_orbital_sptwo_mphase_color_tl
+\tl_new:N  \l__chemmacros_orbital_spthree_color_tl
+\tl_set:Nn \l__chemmacros_orbital_spthree_color_tl {black}
+\tl_new:N  \l__chemmacros_orbital_spthree_pphase_color_tl
+\tl_new:N  \l__chemmacros_orbital_spthree_mphase_color_tl
+\tl_new:N  \l__chemmacros_orbital_s_scale_tl
+\tl_set:Nn \l__chemmacros_orbital_s_scale_tl {1}
+\tl_new:N  \l__chemmacros_orbital_p_scale_tl
+\tl_set:Nn \l__chemmacros_orbital_p_scale_tl {1}
+\tl_new:N  \l__chemmacros_orbital_sp_scale_tl
+\tl_set:Nn \l__chemmacros_orbital_sp_scale_tl {1}
+\tl_new:N  \l__chemmacros_orbital_sptwo_scale_tl
+\tl_set:Nn \l__chemmacros_orbital_sptwo_scale_tl {1}
+\tl_new:N  \l__chemmacros_orbital_spthree_scale_tl
+\tl_set:Nn \l__chemmacros_orbital_spthree_scale_tl {1}
+
+\fp_new:N  \l__chemmacros_orbital_angle_fp
+\fp_set:Nn \l__chemmacros_orbital_angle_fp {90}
+\fp_new:N  \l__chemmacros_orbital_opacity_fp
+\fp_set:Nn \l__chemmacros_orbital_opacity_fp {0.5}
+
+\cs_new:Npn \__chemmacros_orbital_options:
+  {
+    \__chemmacros_orbital_overlay: , \__chemmacros_orbital_opacity: ,
+    inner~sep=0 , outer~sep=0 , line~width=.2pt ,
+    rotate = { \fp_use:N \l__chemmacros_orbital_angle_fp - 90 } ,
+    baseline ,
+    minimum~size = 0
+  }
+
+\cs_new:Npn \__chemmacros_orbital_overlay:
+  { \bool_if:NT \l__chemmacros_orbital_overlay_bool {overlay} }
+
+\cs_new:Npn \__chemmacros_orbital_opacity:
+  {
+    \bool_if:NT \l__chemmacros_orbital_opacity_bool
+      { opacity = { \fp_use:N \l__chemmacros_orbital_opacity_fp } }
+  }
+
+% --------------------------------------------------------------------------
+% s-orbitals
+\cs_new_protected:Npn \__chemmacros_orbital_type_s:
+  {
+    \bool_set_true:N \l__chemmacros_orbital_type_s_bool
+    \bool_set_false:N \l__chemmacros_orbital_type_p_bool
+    \bool_set_false:N \l__chemmacros_orbital_type_sp_bool
+    \bool_set_false:N \l__chemmacros_orbital_type_sptwo_bool
+    \bool_set_false:N \l__chemmacros_orbital_type_spthree_bool
+  }
+
+\chemmacros_define_keys:nn {orbital/s}
+  {
+    phase .choice: ,
+    phase / + .code:n =
+      { \bool_set_true:N \l__chemmacros_orbital_s_phase_bool } ,
+    phase / - .code:n =
+      { \bool_set_false:N \l__chemmacros_orbital_s_phase_bool } ,
+    scale .tl_set:N   = \l__chemmacros_orbital_s_scale_tl ,
+    color .tl_set:N   = \l__chemmacros_orbital_s_color_tl
+  }
+
+\cs_new_protected:Npn \__chemmacros_orbital_s_draw:n #1
+  {
+    \chemmacros_set_keys:nn {orbital/s} {#1}
+    \bool_if:NTF \l__chemmacros_orbital_s_phase_bool
+      {
+        \tl_if_in:NnTF \l__chemmacros_orbital_s_color_tl { ! }
+          {
+            \tl_set:Nn \l__chemmacros_orbital_s_phase_color_tl
+              { \tl_use:N \l__chemmacros_orbital_s_color_tl }
+          }
+          {
+            \tl_set:Nn \l__chemmacros_orbital_s_phase_color_tl
+              { \tl_use:N \l__chemmacros_orbital_s_color_tl ! 90 }
+          }
+      }
+      {
+        \tl_set:Nn \l__chemmacros_orbital_s_phase_color_tl
+          { black ! 5 }
+      }
+    \chemmacros_tikz_picture:xn
+      { \__chemmacros_orbital_options: }
+      {
+        \chemmacros_tikz_shade:x
+          { ball~color = \exp_not:V \l__chemmacros_orbital_s_phase_color_tl }
+          (0pt,0pt) circle (\exp_not:V \l__chemmacros_orbital_s_scale_tl * .6em) ;
+      }
+  }
+
+% --------------------------------------------------------------------------
+% p-orbitals
+\cs_new_protected:Npn \__chemmacros_orbital_type_p:
+  {
+    \bool_set_false:N \l__chemmacros_orbital_type_s_bool
+    \bool_set_true:N  \l__chemmacros_orbital_type_p_bool
+    \bool_set_false:N \l__chemmacros_orbital_type_sp_bool
+    \bool_set_false:N \l__chemmacros_orbital_type_sptwo_bool
+    \bool_set_false:N \l__chemmacros_orbital_type_spthree_bool
+  }
+
+\chemmacros_define_keys:nn {orbital/p}
+  {
+    phase .choice: ,
+    phase / + .code:n =
+      { \bool_set_true:N \l__chemmacros_orbital_p_phase_bool } ,
+    phase / - .code:n =
+      { \bool_set_false:N \l__chemmacros_orbital_p_phase_bool } ,
+    scale .tl_set:N   = \l__chemmacros_orbital_p_scale_tl ,
+    angle .fp_set:N   = \l__chemmacros_orbital_angle_fp ,
+    color .tl_set:N   = \l__chemmacros_orbital_p_color_tl ,
+    half  .bool_set:N = \l__chemmacros_orbital_p_half_bool ,
+    half  .default:n  = true
+  }
+
+\cs_new_protected:Npn \__chemmacros_orbital_p_draw:n #1
+  {
+    \chemmacros_set_keys:nn {orbital/p} {#1}
+    \bool_if:NTF \l__chemmacros_orbital_p_phase_bool
+      {
+        \tl_if_in:NnTF \l__chemmacros_orbital_p_color_tl { ! }
+          {
+            \tl_set:Nn \l__chemmacros_orbital_p_pphase_color_tl
+              { \tl_use:N \l__chemmacros_orbital_p_color_tl }
+          }
+          {
+            \tl_set:Nn \l__chemmacros_orbital_p_pphase_color_tl
+              { \tl_use:N \l__chemmacros_orbital_p_color_tl ! 90 }
+          }
+        \tl_set:Nn \l__chemmacros_orbital_p_mphase_color_tl
+          { black ! 5 }
+        
+      }
+      {
+        \tl_if_in:NnTF \l__chemmacros_orbital_p_color_tl { ! }
+          {
+            \tl_set:Nn \l__chemmacros_orbital_p_mphase_color_tl
+              { \tl_use:N \l__chemmacros_orbital_p_color_tl }
+          }
+          {
+            \tl_set:Nn \l__chemmacros_orbital_p_mphase_color_tl
+              { \tl_use:N \l__chemmacros_orbital_p_color_tl ! 90 }
+          }
+        \tl_set:Nn \l__chemmacros_orbital_p_pphase_color_tl
+          { black ! 5 }
+      }
+    \chemmacros_tikz_picture:xn
+      { \__chemmacros_orbital_options: }
+      {
+        \chemmacros_tikz_shadedraw:x
+          {
+            draw = \exp_not:V \l__chemmacros_orbital_p_pphase_color_tl ,
+            ball~color = \exp_not:V \l__chemmacros_orbital_p_pphase_color_tl
+          }
+          (0pt,0pt) .. controls ++
+          (
+            - \l__chemmacros_orbital_p_scale_tl * 2em ,
+            \l__chemmacros_orbital_p_scale_tl * 2em
+          )
+          and ++
+          (
+            \l__chemmacros_orbital_p_scale_tl * 2em ,
+            \l__chemmacros_orbital_p_scale_tl * 2em
+          )
+          .. (0pt,0pt);
+        \bool_if:NF \l__chemmacros_orbital_p_half_bool
+          {
+            \chemmacros_tikz_shadedraw:x
+              {
+                draw = \exp_not:V \l__chemmacros_orbital_p_mphase_color_tl ,
+                ball~color = \exp_not:V \l__chemmacros_orbital_p_mphase_color_tl
+              }
+              (0pt,0pt) .. controls ++
+              (
+                - \l__chemmacros_orbital_p_scale_tl * 2em ,
+                - \l__chemmacros_orbital_p_scale_tl * 2em
+              )
+              and ++
+              (
+                \l__chemmacros_orbital_p_scale_tl * 2em ,
+                - \l__chemmacros_orbital_p_scale_tl * 2em
+              )
+              .. (0pt,0pt);
+          }
+      }
+  }
+
+% --------------------------------------------------------------------------
+% sp-orbitals
+\cs_new_protected:Npn \__chemmacros_orbital_type_sp:
+  {
+    \bool_set_false:N \l__chemmacros_orbital_type_s_bool
+    \bool_set_false:N \l__chemmacros_orbital_type_p_bool
+    \bool_set_true:N  \l__chemmacros_orbital_type_sp_bool
+    \bool_set_false:N \l__chemmacros_orbital_type_sptwo_bool
+    \bool_set_false:N \l__chemmacros_orbital_type_spthree_bool
+  }
+
+\chemmacros_define_keys:nn {orbital/sp}
+  {
+    phase .choice: ,
+    phase / + .code:n =
+      { \bool_set_true:N \l__chemmacros_orbital_sp_phase_bool } ,
+    phase / - .code:n =
+      { \bool_set_false:N \l__chemmacros_orbital_sp_phase_bool } ,
+    scale .tl_set:N   = \l__chemmacros_orbital_sp_scale_tl ,
+    angle .fp_set:N   = \l__chemmacros_orbital_angle_fp ,
+    color .tl_set:N   = \l__chemmacros_orbital_sp_color_tl
+  }
+
+\cs_new_protected:Npn \__chemmacros_orbital_sp_draw:n #1
+  {
+    \chemmacros_set_keys:nn {orbital/sp} {#1}
+    \bool_if:NTF \l__chemmacros_orbital_sp_phase_bool
+      {
+        \tl_if_in:NnTF \l__chemmacros_orbital_sp_color_tl { ! }
+          {
+            \tl_set:Nn \l__chemmacros_orbital_sp_pphase_color_tl
+              { \tl_use:N \l__chemmacros_orbital_sp_color_tl }
+          }
+          {
+            \tl_set:Nn \l__chemmacros_orbital_sp_pphase_color_tl
+              { \tl_use:N \l__chemmacros_orbital_sp_color_tl ! 90 }
+          }
+        \tl_set:Nn \l__chemmacros_orbital_sp_mphase_color_tl
+          { black ! 5 }
+        
+      }
+      {
+        \tl_if_in:NnTF \l__chemmacros_orbital_sp_color_tl { ! }
+          {
+            \tl_set:Nn \l__chemmacros_orbital_sp_mphase_color_tl
+              { \tl_use:N \l__chemmacros_orbital_sp_color_tl }
+          }
+          {
+            \tl_set:Nn \l__chemmacros_orbital_sp_mphase_color_tl
+              { \tl_use:N \l__chemmacros_orbital_sp_color_tl ! 90 }
+          }
+        \tl_set:Nn \l__chemmacros_orbital_sp_pphase_color_tl
+          { black ! 5 }
+      }
+    \chemmacros_tikz_picture:xn
+      { \__chemmacros_orbital_options: }
+      {
+        \chemmacros_tikz_shadedraw:x
+          {
+            draw = \exp_not:V \l__chemmacros_orbital_sp_pphase_color_tl ,
+            ball~color = \exp_not:V \l__chemmacros_orbital_sp_pphase_color_tl
+          }
+          (0pt,0pt) .. controls ++
+          (
+            - \l__chemmacros_orbital_sp_scale_tl * 2em ,
+            \l__chemmacros_orbital_sp_scale_tl * 2em
+          )
+          and ++
+          (
+            \l__chemmacros_orbital_sp_scale_tl * 2em ,
+            \l__chemmacros_orbital_sp_scale_tl * 2em
+          )
+          .. (0pt,0pt);
+        \chemmacros_tikz_shadedraw:x
+          {
+            draw = \exp_not:V \l__chemmacros_orbital_sp_mphase_color_tl ,
+            ball~color = \exp_not:V \l__chemmacros_orbital_sp_mphase_color_tl
+          }
+          (0pt,0pt) .. controls ++
+          (
+            - \l__chemmacros_orbital_sp_scale_tl * .6em ,
+            - \l__chemmacros_orbital_sp_scale_tl * .6em
+          )
+          and ++
+          (
+            \l__chemmacros_orbital_sp_scale_tl * .6em ,
+            - \l__chemmacros_orbital_sp_scale_tl * .6em
+          )
+          .. (0pt,0pt);
+      }
+  }
+
+% --------------------------------------------------------------------------
+% sp2-orbitals
+\cs_new_protected:Npn \__chemmacros_orbital_type_sptwo:
+  {
+    \bool_set_false:N \l__chemmacros_orbital_type_s_bool
+    \bool_set_false:N \l__chemmacros_orbital_type_p_bool
+    \bool_set_false:N \l__chemmacros_orbital_type_sp_bool
+    \bool_set_true:N  \l__chemmacros_orbital_type_sptwo_bool
+    \bool_set_false:N \l__chemmacros_orbital_type_spthree_bool
+  }
+
+\chemmacros_define_keys:nn {orbital/sp2}
+  {
+    phase .choice: ,
+    phase / + .code:n =
+      { \bool_set_true:N \l__chemmacros_orbital_sptwo_phase_bool } ,
+    phase / - .code:n =
+      { \bool_set_false:N \l__chemmacros_orbital_sptwo_phase_bool } ,
+    scale .tl_set:N   = \l__chemmacros_orbital_sptwo_scale_tl ,
+    angle .fp_set:N   = \l__chemmacros_orbital_angle_fp ,
+    color .tl_set:N   = \l__chemmacros_orbital_sptwo_color_tl
+  }
+
+\cs_new_protected:Npn \__chemmacros_orbital_sptwo_draw:n #1
+  {
+    \chemmacros_set_keys:nn {orbital/sp2} {#1}
+    \bool_if:NTF \l__chemmacros_orbital_sptwo_phase_bool
+      {
+        \tl_if_in:NnTF \l__chemmacros_orbital_sptwo_color_tl { ! }
+          {
+            \tl_set:Nn \l__chemmacros_orbital_sptwo_pphase_color_tl
+              { \tl_use:N \l__chemmacros_orbital_sptwo_color_tl }
+          }
+          {
+            \tl_set:Nn \l__chemmacros_orbital_sptwo_pphase_color_tl
+              { \tl_use:N \l__chemmacros_orbital_sptwo_color_tl ! 90 }
+          }
+        \tl_set:Nn \l__chemmacros_orbital_sptwo_mphase_color_tl
+          { black ! 5 }
+        
+      }
+      {
+        \tl_if_in:NnTF \l__chemmacros_orbital_sptwo_color_tl { ! }
+          {
+            \tl_set:Nn \l__chemmacros_orbital_sptwo_mphase_color_tl
+              { \tl_use:N \l__chemmacros_orbital_sptwo_color_tl }
+          }
+          {
+            \tl_set:Nn \l__chemmacros_orbital_sptwo_mphase_color_tl
+              { \tl_use:N \l__chemmacros_orbital_sptwo_color_tl ! 90 }
+          }
+        \tl_set:Nn \l__chemmacros_orbital_sptwo_pphase_color_tl
+          { black ! 5 }
+      }
+    \chemmacros_tikz_picture:xn
+      { \__chemmacros_orbital_options: }
+      {
+        \chemmacros_tikz_shadedraw:x
+          {
+            draw = \exp_not:V \l__chemmacros_orbital_sptwo_pphase_color_tl ,
+            ball~color = \exp_not:V \l__chemmacros_orbital_sptwo_pphase_color_tl
+          }
+          (0pt,0pt) .. controls ++
+          (
+            - \l__chemmacros_orbital_sptwo_scale_tl * 2em ,
+            \l__chemmacros_orbital_sptwo_scale_tl * 2em
+          )
+          and ++
+          (
+            \l__chemmacros_orbital_sptwo_scale_tl * 2em ,
+            \l__chemmacros_orbital_sptwo_scale_tl * 2em
+          )
+          .. (0pt,0pt);
+        \chemmacros_tikz_shadedraw:x
+          {
+            draw = \exp_not:V \l__chemmacros_orbital_sptwo_mphase_color_tl ,
+            ball~color = \exp_not:V \l__chemmacros_orbital_sptwo_mphase_color_tl
+          }
+          (0pt,0pt) .. controls ++
+          (
+            - \l__chemmacros_orbital_sptwo_scale_tl * .8em ,
+            - \l__chemmacros_orbital_sptwo_scale_tl * .8em
+          )
+          and ++
+          (
+            \l__chemmacros_orbital_sptwo_scale_tl * .8em ,
+            - \l__chemmacros_orbital_sptwo_scale_tl * .8em
+          )
+          .. (0pt,0pt);
+      }
+  }
+
+% --------------------------------------------------------------------------
+% sp3-orbitals
+\cs_new_protected:Npn \__chemmacros_orbital_type_spthree:
+  {
+    \bool_set_false:N \l__chemmacros_orbital_type_s_bool
+    \bool_set_false:N \l__chemmacros_orbital_type_p_bool
+    \bool_set_false:N \l__chemmacros_orbital_type_sp_bool
+    \bool_set_false:N \l__chemmacros_orbital_type_sptwo_bool
+    \bool_set_true:N  \l__chemmacros_orbital_type_spthree_bool
+  }
+
+\chemmacros_define_keys:nn {orbital/sp3}
+  {
+    phase .choice: ,
+    phase / + .code:n =
+      { \bool_set_true:N \l__chemmacros_orbital_spthree_phase_bool } ,
+    phase / - .code:n =
+     { \bool_set_false:N \l__chemmacros_orbital_spthree_phase_bool } ,
+    scale .tl_set:N   = \l__chemmacros_orbital_spthree_scale_tl ,
+    angle .fp_set:N   = \l__chemmacros_orbital_angle_fp ,
+    color .tl_set:N   = \l__chemmacros_orbital_spthree_color_tl
+  }
+
+\cs_new_protected:Npn \__chemmacros_orbital_spthree_draw:n #1
+  {
+    \chemmacros_set_keys:nn {orbital/sp3} {#1}
+    \bool_if:NTF \l__chemmacros_orbital_spthree_phase_bool
+      {
+        \tl_if_in:NnTF \l__chemmacros_orbital_spthree_color_tl {!}
+          {
+            \tl_set:Nn \l__chemmacros_orbital_spthree_pphase_color_tl
+              { \tl_use:N \l__chemmacros_orbital_spthree_color_tl }
+          }
+          {
+            \tl_set:Nn \l__chemmacros_orbital_spthree_pphase_color_tl
+              { \tl_use:N \l__chemmacros_orbital_spthree_color_tl ! 90 }
+          }
+        \tl_set:Nn \l__chemmacros_orbital_spthree_mphase_color_tl {black!5}
+      }
+      {
+        \tl_if_in:NnTF \l__chemmacros_orbital_spthree_color_tl {!}
+          {
+            \tl_set:Nn \l__chemmacros_orbital_spthree_mphase_color_tl
+              { \tl_use:N \l__chemmacros_orbital_spthree_color_tl }
+          }
+          {
+            \tl_set:Nn \l__chemmacros_orbital_spthree_mphase_color_tl
+              { \tl_use:N \l__chemmacros_orbital_spthree_color_tl ! 90 }
+          }
+        \tl_set:Nn \l__chemmacros_orbital_spthree_pphase_color_tl {black!5}
+      }
+    \chemmacros_tikz_picture:xn
+      { \__chemmacros_orbital_options: }
+      {
+        \chemmacros_tikz_shadedraw:x
+          {
+            draw = \exp_not:V \l__chemmacros_orbital_spthree_pphase_color_tl ,
+            ball~color = \exp_not:V \l__chemmacros_orbital_spthree_pphase_color_tl
+          }
+          (0pt,0pt) .. controls ++
+          (
+            - \l__chemmacros_orbital_spthree_scale_tl * 2em ,
+            \l__chemmacros_orbital_spthree_scale_tl * 2em
+          )
+          and ++
+          (
+            \l__chemmacros_orbital_spthree_scale_tl * 2em ,
+            \l__chemmacros_orbital_spthree_scale_tl * 2em
+          )
+          .. (0pt,0pt);
+        \chemmacros_tikz_shadedraw:x
+          {
+            draw = \exp_not:V \l__chemmacros_orbital_spthree_mphase_color_tl ,
+            ball~color = \exp_not:V \l__chemmacros_orbital_spthree_mphase_color_tl
+          }
+          (0pt,0pt) .. controls ++
+          (
+            - \l__chemmacros_orbital_spthree_scale_tl * 1em ,
+            - \l__chemmacros_orbital_spthree_scale_tl * 1em
+          )
+          and ++
+          (
+            \l__chemmacros_orbital_spthree_scale_tl * 1em ,
+            - \l__chemmacros_orbital_spthree_scale_tl * 1em
+          )
+          .. (0pt,0pt);
+      }
+  }
+
+% --------------------------------------------------------------------------
+% main command
+\chemmacros_define_keys:nn {orbital}
+  {
+    overlay .bool_set:N = \l__chemmacros_orbital_overlay_bool ,
+    overlay .default:n  = true ,
+    opacity .code:n     =
+      {
+        \fp_compare:nTF { #1 = 1 }
+          { \bool_set_false:N \l__chemmacros_orbital_opacity_bool }
+          { \bool_set_true:N \l__chemmacros_orbital_opacity_bool }
+        \fp_set:Nn \l__chemmacros_orbital_opacity_fp {#1}
+      }
+  }
+
+\chemmacros_define_keys:nn {orbital/type}
+  {
+    s   .code:n = { \__chemmacros_orbital_type_s: } ,
+    p   .code:n = { \__chemmacros_orbital_type_p: } ,
+    sp  .code:n = { \__chemmacros_orbital_type_sp: } ,
+    sp2 .code:n = { \__chemmacros_orbital_type_sptwo: } ,
+    sp3 .code:n = { \__chemmacros_orbital_type_spthree: }
+  }
+
+\cs_new_protected:Npn \chemmacros_orbital:n #1
+  {
+    \bool_if:NT \l__chemmacros_orbital_type_s_bool
+      { \__chemmacros_orbital_s_draw:n {#1} }
+    \bool_if:NT \l__chemmacros_orbital_type_p_bool
+      { \__chemmacros_orbital_p_draw:n {#1} }
+    \bool_if:NT \l__chemmacros_orbital_type_sp_bool
+      { \__chemmacros_orbital_sp_draw:n {#1} }
+    \bool_if:NT \l__chemmacros_orbital_type_sptwo_bool
+      { \__chemmacros_orbital_sptwo_draw:n {#1} }
+    \bool_if:NT \l__chemmacros_orbital_type_spthree_bool
+      { \__chemmacros_orbital_spthree_draw:n {#1} }
+  }
+
+\NewDocumentCommand \orbital {om}
+  {
+    \group_begin:
+      \chemmacros_set_keys:nn {orbital/type} {#2}
+      \IfNoValueTF {#1}
+        { \chemmacros_orbital:n {  } }
+        { \chemmacros_orbital:n {#1} }
+    \group_end:
+  }
+% --------------------------------------------------------------------------  
+\ChemModuleEnd
+\ChemModule{polymers}{2020/11/29 polymers}
+
+% --------------------------------------------------------------------------
+% copolymers
+\NewChemIUPAC \copolymer { \textit {co} }
+\LetChemIUPAC \co \copolymer
+
+\NewChemIUPAC \statistical { \textit {stat} }
+\LetChemIUPAC \stat \statistical
+
+\NewChemIUPAC \random { \textit {ran} }
+\LetChemIUPAC \ran \random
+
+\NewChemIUPAC \alternating { \textit {alt} }
+\LetChemIUPAC \alt \alternating
+
+\NewChemIUPAC \periodic { \textit {per} }
+\LetChemIUPAC \per \periodic
+
+\NewChemIUPAC \block { \textit {block} }
+\NewChemIUPAC \graft { \textit {graft} }
+
+% --------------------------------------------------------------------------
+% non-linear (co)polymers
+\NewChemIUPAC \blend { \textit {blend} }
+\NewChemIUPAC \comb { \textit {comb} }
+
+\NewChemIUPAC \complex { \textit {compl} }
+\LetChemIUPAC \compl \complex
+
+\NewChemIUPAC \cyclic { \textit {cyclo} }
+\LetChemIUPAC \cyclo \cyclic
+
+\NewChemIUPAC \branch { \textit {branch} }
+\NewChemIUPAC \network { \textit {net} }
+\LetChemIUPAC \net \network
+
+\NewChemIUPAC \ipnetwork { \textit {ipn} }
+\LetChemIUPAC \ipn \ipnetwork
+
+\NewChemIUPAC \sipnetwork { \textit {sipn} }
+\LetChemIUPAC \sipn \sipnetwork
+
+\NewChemIUPAC \star { \textit {star} }
+
+% --------------------------------------------------------------------------
+
+\tl_new:N \l__chemmacros_polymer_delimiter_left_tl
+\tl_new:N \l__chemmacros_polymer_delimiter_right_tl
+
+\tl_new:N \l__chemmacros_polymer_subscript_tl
+\tl_new:N \l__chemmacros_polymer_superscript_tl
+
+\dim_new:N \l__chemmacros_polymer_delimiter_height_dim
+\dim_new:N \l__chemmacros_polymer_delimiter_depth_dim
+
+\cs_new_protected:Npn \__chemmacros_set_polymer_delimiters:NN #1#2
+  {
+    \tl_set:Nn \l__chemmacros_polymer_delimiter_left_tl  {#1}
+    \tl_set:Nn \l__chemmacros_polymer_delimiter_right_tl {#2}
+  }
+
+% #1: height
+% #2: depth
+% #3: opening node
+% #4: closing node
+% #5: subscript
+% #6: superscript 
+\cs_new_protected:Npn \chemmacros_make_polymer_braces:nnnnnn #1#2#3#4#5#6
+  {
+    \dim_set:Nn \l__chemmacros_polymer_delimiter_height_dim { (#1+#2)/2 }
+    \dim_set:Nn \l__chemmacros_polymer_delimiter_depth_dim  { (#1-#2)/2 }
+    \chemmacros_tikz_picture:nn {remember~ picture, overlay }
+      {
+        \chemmacros_tikz_node:n
+          { at = (#3) , yshift = \l__chemmacros_polymer_delimiter_depth_dim }
+          {
+            \c_math_toggle_token
+              \tex_left:D \l__chemmacros_polymer_delimiter_left_tl
+              \tex_vrule:D
+                height \l__chemmacros_polymer_delimiter_height_dim
+                depth \l__chemmacros_polymer_delimiter_height_dim
+                width \c_zero_dim
+              \tex_right:D .
+            \c_math_toggle_token
+          } ;
+        \chemmacros_tikz_node:n
+          { at = (#4) , yshift = \l__chemmacros_polymer_delimiter_depth_dim }
+          {
+            \c_math_toggle_token
+              \tex_left:D .
+              \tex_vrule:D
+                height \l__chemmacros_polymer_delimiter_height_dim
+                depth \l__chemmacros_polymer_delimiter_height_dim
+                width \c_zero_dim
+              \tex_right:D \l__chemmacros_polymer_delimiter_right_tl
+              \c_math_subscript_token
+                { \hbox_overlap_right:n { \smash {#5} } }
+              \c_math_superscript_token
+                { \hbox_overlap_right:n { \smash {#6} } }
+            \c_math_toggle_token
+          } ;
+      }
+  }
+\cs_generate_variant:Nn \chemmacros_make_polymer_braces:nnnnnn {nnnnVV}
+
+\chemmacros_define_keys:nn {polymers}
+  {
+    delimiters  .code:n = \__chemmacros_set_polymer_delimiters:NN #1 ,
+    delimiters  .initial:n = [] ,
+    superscript .tl_set:N = \l__chemmacros_polymer_superscript_tl ,
+    subscript   .tl_set:N = \l__chemmacros_polymer_subscript_tl ,
+    subscript   .initial:n = $n$
+  }
+
+\NewDocumentCommand \makepolymerdelims {O{}momm}
+  {
+    \group_begin:
+      \chemmacros_set_keys:nn {polymers} {#1}
+      \IfNoValueTF {#3}
+        {
+          \chemmacros_make_polymer_braces:nnnnVV {#2} {#2} {#4} {#5}
+            \l__chemmacros_polymer_subscript_tl
+            \l__chemmacros_polymer_superscript_tl
+        }
+        {
+          \chemmacros_make_polymer_braces:nnnnVV {#2} {#3} {#4} {#5}
+            \l__chemmacros_polymer_subscript_tl
+            \l__chemmacros_polymer_superscript_tl
+        }
+    \group_end:
+  }
+  
+% --------------------------------------------------------------------------
+\ChemModuleEnd
+\ChemModule{reactions}{2022/01/13 reaction environments}
+
+\RequirePackage{mathtools}
+
+% --------------------------------------------------------------------------
+\cs_new_protected:Npn \__chemmacros_record_for_lor:nnnnn #1#2#3#4#5
+  {
+    \tl_if_eq:nnT {#1} {reaction}
+      {
+        \group_begin:
+          % we need to prevent \Hy at make@anchor from being written to the lor
+          % file:
+          \bool_if:NT \l__chemmacros_hyperref_bool
+            { \cs_set:Npn \Hy at make@anchor {} }
+          \addcontentsline {lor} {reaction}
+            {
+              \tl_use:N \l__chemmacros_reaction_lorname_tl
+              \tl_use:N \c_space_tl
+              #2 #3 #4 #5
+              \tl_use:N \g__chemmacros_reaction_description_tl
+            }
+          \tl_gclear:N \g__chemmacros_reaction_description_tl
+        \group_end:
+      }
+  }
+
+% redefine mathtools' command \MT_define_tagform:nwnn to ensure we add an
+% entry to the list of reactions even if the user redefines the reaction tag
+% this should probably be done via patching...
+\hook_gput_code:nnn {package/mathtools/after} {chemmacros}
+  {
+    \cs_set_protected:Npn \MT_define_tagform:nwnn #1[#2]#3#4
+      {
+        \@namedef{MT_tagform_#1:n}##1
+          {
+            % this is the original part:
+            \maketag@@@{#3\ignorespaces#2{##1}\unskip\@@italiccorr#4}
+            % this is added => this disturbs hyperref:
+            \__chemmacros_record_for_lor:nnnnn
+              {#1} {#3} {#2} {##1} {#4}
+          }
+      }
+  }
+
+\tl_new:N \g__chemmacros_reaction_description_tl
+
+\cs_new_protected:Npn \chemmacros_add_reaction_description:n #1
+  {
+    \tl_if_blank:nF {#1}
+      { \tl_gset:Nn \g__chemmacros_reaction_description_tl {:~#1} }
+  }
+
+\NewDocumentCommand \AddRxnDesc {m}
+  { \chemmacros_add_reaction_description:n {#1} }
+
+% define \listofreactions
+\tl_new:N  \l__chemmacros_reaction_lorname_tl
+\tl_new:N  \reactionlistname
+\tl_new:N  \l__chemmacros_reaction_heading_tl
+
+\cs_new:Npn \__chemmacros_reaction_heading:n #1
+  { \l__chemmacros_reaction_heading_tl {#1} }
+\cs_generate_variant:Nn \__chemmacros_reaction_heading:n { V }
+
+\tl_set:Nn \l__chemmacros_reaction_lorname_tl
+  { \chemmacros_translate:n {Reaction} }
+
+\tl_set:Nn \reactionlistname { \chemmacros_translate:n {list-of-reactions} }
+
+\chemmacros_define_keys:nn {reactions}
+  {
+    list-name .tl_set:N = \reactionlistname ,
+    list-entry .tl_set:N = \l__chemmacros_reaction_lorname_tl ,
+    list-heading-cmd .code:n =
+      \cs_set_protected:Npn \__chemmacros_reaction_heading:n ##1 {#1}
+  }
+
+\cs_if_exist:NTF \chapter
+  { \chemmacros_set_keys:nn {reactions} { list-heading-cmd = \chapter* {#1} } }
+  { \chemmacros_set_keys:nn {reactions} { list-heading-cmd = \section* {#1} } }
+
+\cs_new_protected:Npn \listofreactions
+  {
+    \__chemmacros_reaction_heading:V \reactionlistname
+    \@starttoc {lor}
+  }
+
+\cs_new_eq:NN \l at reaction \l at figure
+
+\bool_new:N \l__chemmacros_reactions_tocbasic_bool
+\cs_if_exist:NT \KOMAClassName
+  { \bool_set_true:N \l__chemmacros_reactions_tocbasic_bool }
+
+\tl_new:N \l__chemmacros_reactions_tag_open_tl
+\tl_new:N \l__chemmacros_reactions_tag_close_tl
+\tl_new:N \l__chemmacros_reactions_before_tag_tl
+
+\chemmacros_define_keys:nn {reactions}
+  {
+    tocbasic   .bool_set:N = \l__chemmacros_reactions_tocbasic_bool ,
+    tag-open   .tl_set:N   = \l__chemmacros_reactions_tag_open_tl ,
+    tag-open   .initial:n  = \{ ,
+    tag-close  .tl_set:N   = \l__chemmacros_reactions_tag_close_tl ,
+    tag-close  .initial:n  = \} ,
+    before-tag .tl_set:N   = \l__chemmacros_reactions_before_tag_tl
+  }
+
+\hook_gput_code:nnn {package/tocbasic/after} {chemmacros}
+  {
+    \bool_lazy_or:nnT
+      { \chemmacros_if_package_loaded_p:n {tocbasic} }
+      { \l__chemmacros_reactions_tocbasic_bool }
+      {
+        \RequirePackage {tocbasic}
+        \addtotoclist [float] {lor}
+        \cs_set_protected:Npn \listofreactions { \listoftoc {lor} }
+        \cs_new:Npn \listoflorname { \reactionlistname }
+      }
+  }
+
+\ChemCleverefSupport {reaction}
+  { \chemmacros_translate:n {reaction} }
+  [ \chemmacros_translate:n {Reaction} ]
+  { \chemmacros_translate:n {reactions} }
+  [ \chemmacros_translate:n {Reactions} ]
+
+\hook_gput_code:nnn {package/cleveref/after} {chemmacros}
+  {
+    \creflabelformat {reaction}
+      {
+        #2
+        \l__chemmacros_reactions_tag_open_tl
+        #1
+        \l__chemmacros_reactions_tag_close_tl
+        #3
+      }
+  }
+
+\ChemFancyrefSupport {rct}
+  { \chemmacros_translate:n {reaction} }
+  [ \chemmacros_translate:n {Reaction} ]
+  
+% create new tagform
+\newtagform {reaction}
+  [\l__chemmacros_reactions_before_tag_tl]
+  {\l__chemmacros_reactions_tag_open_tl}
+  {\l__chemmacros_reactions_tag_close_tl}
+
+\newcounter {chemmacros_save_reaction}
+\newcounter {reaction}
+
+\cs_new_protected:Npn \__chemmacros_begin_reaction:
+  {
+    \patchcmd \thereaction {reaction} {equation} {} {}
+    \cs_set_eq:NN \theequation \thereaction
+    \cs_set_eq:NN \r at equation \r at reaction
+    \cs_set_eq:NN \p at equation \p at reaction
+    \cs_set:Npn \theHequation { R . \theHsection . \theequation }
+    \setcounter {chemmacros_save_reaction} { \value {equation} }
+    \setcounter {equation} { \value {reaction} }
+    \chemmacros_if_package_loaded:nT {cleveref}
+      { \crefalias {equation} {reaction} }
+    \usetagform {reaction}
+  }
+
+% switch back to equation tags
+\cs_new_protected:Npn \__chemmacros_end_reaction:
+  {
+    \setcounter {reaction} { \value {equation} }
+    \setcounter {equation} { \value {chemmacros_save_reaction} }
+  }
+
+\tl_new:N \l__chemmacros_reactions_args_tl
+
+\cs_new_protected:Npn \__chemmacros_reactions_build_args:n #1
+  { \tl_put_right:Nn \l__chemmacros_reactions_args_tl { {## #1} } }
+
+\cs_new_protected:Npn \chemmacros_define_reaction:nnn #1#2#3
+  {
+    \int_compare:nNnT {#3+0} > {0}
+      {
+        \tl_clear:N \l__chemmacros_reactions_args_tl
+        \int_step_function:nnnN {2} {1} {#3+1} \__chemmacros_reactions_build_args:n
+      }
+    \chemmacros_declare_reaction_env:nnnV {#1} {#2} {#3} \l__chemmacros_reactions_args_tl
+  }
+
+% #1: chem
+% #2: math
+% #3: args number
+% #4: argument list ({#2}{#3}...)
+\cs_new_protected:Npn \chemmacros_declare_reaction_env:nnnn #1#2#3#4
+  {
+    \exp_args:Nnx \DeclareDocumentEnvironment {#1}
+      { \int_compare:nT { #3+0 = 0 } {!} O{} \prg_replicate:nn {#3+0} {m} }
+      {
+        \chemmacros_add_reaction_description:n {##1}
+        \__chemmacros_begin_reaction:
+        \chemmacros_reaction_read:nnw {#2} {#4}
+      }
+      {
+        \__chemmacros_end_reaction:
+        \ignorespacesafterend
+      }
+  }
+\cs_generate_variant:Nn \chemmacros_declare_reaction_env:nnnn {nnnV}
+
+\cs_new_protected:Npn \chemmacros_reaction_read:nnw #1#2#3 \end
+  {
+    \tl_clear:N \l__chemmacros_tmpa_tl
+    \seq_clear:N \l__chemmacros_tmpc_seq
+    \seq_set_split:Nnn \l__chemmacros_tmpa_seq {\\} {#3}
+    \int_set:Nn \l__chemmacros_tmpa_int
+      { \seq_count:N \l__chemmacros_tmpa_seq }
+    \int_zero:N \l__chemmacros_tmpb_int
+    \seq_map_inline:Nn \l__chemmacros_tmpa_seq
+      {
+        \int_incr:N \l__chemmacros_tmpb_int
+        \seq_clear:N \l__chemmacros_tmpc_seq
+        \seq_set_split:Nnn \l__chemmacros_tmpb_seq {&} {##1}
+        \seq_map_inline:Nn \l__chemmacros_tmpb_seq
+          {
+            \seq_put_right:Nn \l__chemmacros_tmpc_seq
+              { \chemmacros_reaction:n {####1} }
+          }
+        \tl_put_right:Nx \l__chemmacros_tmpa_tl
+          { \seq_use:Nn \l__chemmacros_tmpc_seq {&} }
+        \int_compare:nF
+          { \l__chemmacros_tmpa_int = \l__chemmacros_tmpb_int }
+          { \tl_put_right:Nn \l__chemmacros_tmpa_tl {\\} }
+      }
+    \chemmacros_reaction_write:nnV {#1} {#2} \l__chemmacros_tmpa_tl
+    \end
+  }
+
+\cs_new_protected:Npn \chemmacros_reaction_write:nnn #1#2#3
+  {
+    \begin{#1}#2
+      #3
+    \end{#1}
+  }
+\cs_generate_variant:Nn \chemmacros_reaction_write:nnn { nnV }
+
+\NewChemMacroset* {Reaction} {mO{}m}
+  { \chemmacros_define_reaction:nnn {#1} {#3} {#2} }
+
+\NewChemReaction {reaction}   {equation}
+\NewChemReaction {reaction*}  {equation*}
+\NewChemReaction {reactions}  {align}
+\NewChemReaction {reactions*} {align*}
+
+% --------------------------------------------------------------------------
+\ChemModuleEnd
+\ChemModule{redox}{2020/11/29 oxidation numbers, redox reactions}
+
+\RequirePackage{mathtools,relsize}
+
+\msg_new:nnn {chemmacros} {redox}
+  { \token_to_str:N #1 \c_space_tl : ~ #2 ~ \msg_line_context: . }
+
+
+% --------------------------------------------------------------------------
+% oxidation numbers
+% \ox{<number>,<atom>}
+\bool_new:N \l__chemmacros_ox_sign_bool
+\bool_new:N \l__chemmacros_ox_integer_bool
+\bool_new:N \l__chemmacros_ox_explicit_sign_bool
+\bool_new:N \l__chemmacros_ox_explicit_zero_sign_bool
+\bool_new:N \l__chemmacros_ox_format_roman_bool
+\bool_new:N \l__chemmacros_ox_decimal_marker_comma_bool
+\bool_new:N \l__chemmacros_ox_parse_bool
+\bool_new:N \l__chemmacros_ox_side_bool
+\bool_new:N \l__chemmacros_ox_super_bool
+\bool_new:N \l__chemmacros_ox_top_bool
+\bool_new:N \l__chemmacros_ox_align_center_bool
+
+\tl_new:N \l__chemmacros_ox_format_tl
+
+\int_new:N \l__chemmacros_ox_number_int
+\fp_new:N  \l__chemmacros_ox_number_fp
+
+\cs_new_protected:Npn \__chemmacros_ox_format:n #1
+  { { \l__chemmacros_ox_format_tl {#1} } }
+
+\cs_new_protected:Npn \__chemmacros_ox_process_number:n #1
+  {
+    \bool_if:NTF \l__chemmacros_ox_parse_bool
+      {
+        \tl_if_in:nnTF {#1} { / }
+          { \__chemmacros_ox_fraction:w #1 \q_stop }
+          {
+            \__chemmacros_ox_sign:n  {#1}
+            \__chemmacros_ox_value:n {#1}
+          }
+      }
+      {#1}
+  }
+
+\cs_new_protected:Npn \__chemmacros_ox_fraction:w #1/#2 \q_stop
+  {
+    \group_begin:
+      \bool_set_false:N \l__chemmacros_ox_format_roman_bool
+      \__chemmacros_ox_sign:n {#1}
+      \bool_if:NTF \l__chemmacros_ox_side_bool
+        { \chemmacros_ox_text_frac:nn }
+        { \chemmacros_ox_super_frac:nn }
+        { \__chemmacros_ox_value:n {#1} }
+        {#2}
+    \group_end:
+  }
+
+\cs_new_protected:Npn \__chemmacros_ox_sign:n #1
+  {
     \bool_lazy_and:nnT
-      { \chemmacros_if_compatibility_p:nn {>=} {#1} }
-      { \chemmacros_if_compatibility_p:nn {<} {#2} }
-      {#3}
+      { \fp_compare_p:n { #1 > 0 } }
+      { \l__chemmacros_ox_explicit_sign_bool }
+      { \c_math_toggle_token + \c_math_toggle_token }
+    \bool_lazy_all:nT
+      {
+        { \fp_compare_p:n { #1 = 0 } }
+        { \l__chemmacros_ox_explicit_sign_bool }
+        { \l__chemmacros_ox_explicit_zero_sign_bool }
+      }
+      { \c_math_toggle_token \pm \c_math_toggle_token }
+    \fp_compare:nT { #1 < 0 }
+      { \c_math_toggle_token - \c_math_toggle_token }
   }
 
+\cs_new_protected:Npn \__chemmacros_ox_value:n #1
+  {
+    \fp_set:Nn \l__chemmacros_ox_number_fp { abs(#1) }
+    \__chemmacros_ox_is_integer:n { \l__chemmacros_ox_number_fp }
+    \bool_if:NTF \l__chemmacros_ox_format_roman_bool
+      { \__chemmacros_fp_to_Roman:n { \l__chemmacros_ox_number_fp } }
+      {
+        \bool_if:NTF \l__chemmacros_ox_integer_bool
+          {
+            \c_math_toggle_token
+              \__chemmacros_fp_to_arabic:n { \l__chemmacros_ox_number_fp }
+            \c_math_toggle_token
+          }
+          {
+            \c_math_toggle_token
+              \fp_use:N \l__chemmacros_ox_number_fp
+            \c_math_toggle_token
+          }
+      }
+  }
+
+\cs_new_protected:Npn \__chemmacros_ox_is_integer:n #1
+  {
+    \fp_compare:nNnTF {#1} = { round((#1) + 1 , 0 ) - 1 }
+      { \bool_set_true:N \l__chemmacros_ox_integer_bool }
+      {
+        \bool_set_false:N \l__chemmacros_ox_integer_bool
+        \bool_set_false:N \l__chemmacros_ox_format_roman_bool
+      }
+  }
+
+\cs_new_protected:Npn \__chemmacros_fp_to_Roman:n #1
+  {
+    \group_begin:
+      \fp_compare:nNnTF {#1} = { 0 }
+        {0}
+        { \int_to_Roman:n { \fp_to_int:n {#1} } }
+    \group_end:
+  }
+
+\cs_new_protected:Npn \__chemmacros_fp_to_arabic:n #1
+  {
+    \group_begin:
+      \bool_if:NTF \l__chemmacros_ox_decimal_marker_comma_bool
+        {
+          \tl_set:Nx \l__chemmacros_tmpa_tl { \fp_to_decimal:n {#1} }
+          \tl_replace_once:Nnn \l__chemmacros_tmpa_tl {.} { {,} }
+          \tl_use:N \l__chemmacros_tmpa_tl
+        }
+        { \fp_to_decimal:n {#1} }
+    \group_end:
+  }
+
+\tl_new:N \l__chemmacros_ox_side_connect_tl
+
+\cs_new_protected:Npn \__chemmacros_ox_write:nn #1#2
+  {
+    \tl_if_blank:nT {#1}
+      { \msg_error:nnn {chemmacros} {redox} {\ox} {oxidation~number~missing} }
+    \tl_if_blank:nT {#2}
+      { \msg_error:nnn {chemmacros} {redox} {\ox} {oxidation-atom~missing} }
+    \hbox_set:Nn \l__chemmacros_tmpa_box
+      {
+        \chemmacros_text:n
+          {
+            \__chemmacros_ox_format:n
+              { \relsize {-3} \__chemmacros_ox_process_number:n {#1} }
+          }
+      }
+    \hbox_set:Nn \l__chemmacros_tmpb_box { \chemmacros_chemformula:n {#2} }
+    \chemmacros_math:n
+      {
+        \bool_if:NT \l__chemmacros_ox_super_bool
+          {
+            \box_use:N \l__chemmacros_tmpb_box
+            \c_math_superscript_token { \box_use:N \l__chemmacros_tmpa_box }
+          }
+        \bool_if:NT \l__chemmacros_ox_side_bool
+          {
+            \chemmacros_text:n
+              {
+                \box_use:N \l__chemmacros_tmpb_box
+                \tl_use:N \l__chemmacros_ox_side_connect_tl
+                (
+                  \__chemmacros_ox_format:n
+                    { \__chemmacros_ox_process_number:n {#1} }
+                )
+              }
+          }
+        \bool_if:NT \l__chemmacros_ox_top_bool
+          {
+            \bool_if:NF \l__chemmacros_ox_align_center_bool
+              { 
+                \hbox_set_to_wd:Nnn \l__chemmacros_tmpa_box
+                  { \box_wd:N \l__chemmacros_tmpb_box }
+                  { \rlap { \hbox_unpack:N \l__chemmacros_tmpa_box } \hfil }
+              }
+            \overset
+              {
+                \bool_if:NTF \l__chemmacros_ox_align_center_bool
+                  { \clap }
+                  { \use:n }
+                { \box_use:N \l__chemmacros_tmpa_box }
+              }
+              { \box_use:N \l__chemmacros_tmpb_box }
+          }
+      }
+  }
+
+\cs_new_protected:Npn \__chemmacros_ox_pos_top:
+  {
+    \bool_set_true:N  \l__chemmacros_ox_top_bool
+    \bool_set_false:N \l__chemmacros_ox_super_bool
+    \bool_set_false:N \l__chemmacros_ox_side_bool
+  }
+
+\cs_new_protected:Npn \__chemmacros_ox_pos_super:
+  {
+    \bool_set_false:N \l__chemmacros_ox_top_bool
+    \bool_set_true:N  \l__chemmacros_ox_super_bool
+    \bool_set_false:N \l__chemmacros_ox_side_bool
+  }
+
+\cs_new_protected:Npn \__chemmacros_ox_pos_side:
+  {
+    \bool_set_false:N \l__chemmacros_ox_top_bool
+    \bool_set_false:N \l__chemmacros_ox_super_bool
+    \bool_set_true:N  \l__chemmacros_ox_side_bool
+  }
+
+\chemmacros_define_keys:nn {redox}
+  {
+    pos            .choice: ,
+    pos / top      .code:n     = \__chemmacros_ox_pos_top: ,
+    pos / super    .code:n     = \__chemmacros_ox_pos_super: ,
+    pos / side     .code:n     = \__chemmacros_ox_pos_side: ,
+    pos            .initial:n  = super ,
+    side-connect   .tl_set:N   = \l__chemmacros_ox_side_connect_tl ,
+    side-connect   .initial:n  = \, ,
+    text-frac      .code:n     =
+      \cs_set_protected:Npn \chemmacros_ox_text_frac:nn ##1##2 {#1} ,
+    text-frac      .initial:n  = \chemfrac[text]{#1}{#2} ,
+    super-frac     .code:n     =
+      \cs_set_protected:Npn \chemmacros_ox_super_frac:nn ##1##2 {#1} ,
+    super-frac     .initial:n  = \chemfrac[superscript]{#1}{#2} ,
+    roman          .bool_set:N = \l__chemmacros_ox_format_roman_bool ,
+    roman          .default:n  = true ,
+    roman          .initial:n  = true ,
+    parse          .bool_set:N = \l__chemmacros_ox_parse_bool ,
+    parse          .default:n  = true ,
+    parse          .initial:n  = true ,
+    explicit-sign  .bool_set:N = \l__chemmacros_ox_explicit_sign_bool ,
+    explicit-sign  .default:n  = true ,
+    decimal-marker .choice: ,
+    decimal-marker / comma .code:n =
+      { \bool_set_true:N \l__chemmacros_ox_decimal_marker_comma_bool } ,
+    decimal-marker / point .code:n =
+      { \bool_set_false:N \l__chemmacros_ox_decimal_marker_comma_bool } ,
+    decimal-marker .initial:n = point ,
+    align          .choice: ,
+    align / center .code:n    =
+      \bool_set_true:N \l__chemmacros_ox_align_center_bool ,
+    align / right  .code:n    =
+      \bool_set_false:N \l__chemmacros_ox_align_center_bool ,
+    align          .initial:n = center ,
+    explicit-zero-sign .bool_set:N = \l__chemmacros_ox_explicit_zero_sign_bool ,
+    explicit-zero-sign .default:n  = true ,
+    format .tl_set:N = \l__chemmacros_ox_format_tl
+  }
+
+
+% \ox[<keyval>]{<num>,<atom>}
+% \ox*[<keyval>]{<num>,<atom>} => always number on the top
+\cs_new_protected:Npn \chemmacros_ox:nnnn #1#2#3#4
+  {
+    \group_begin:
+      \chemmacros_set_keys:nn {redox} {#2}
+      \tl_if_blank:nF {#1} { \__chemmacros_ox_pos_top: }
+      \__chemmacros_ox_write:nn {#3} {#4}
+    \group_end:
+  }
+
+\NewDocumentCommand \ox { sO{}>{\SplitArgument{1}{,}}m }
+  {
+    \IfBooleanTF {#1}
+      { \chemmacros_ox:nnnn {#1} {#2} #3 }
+      { \chemmacros_ox:nnnn {  } {#2} #3 }
+  }
+
+% ---------------------------------------------------------------------------
+% redox reactions
+\tl_new:N   \l__chemmacros_redox_begin_tl
+\tl_new:N   \l__chemmacros_redox_end_tl
+\tl_new:N   \l__chemmacros_redox_tikz_tl
+\tl_new:N   \l__chemmacros_redox_shift_tl
+\tl_new:N   \l__chemmacros_redox_anchor_tl
+\tl_new:N   \l__chemmacros_redox_side_tl
+
+\fp_new:N   \l__chemmacros_redox_shift_fp
+
+\dim_new:N  \l__chemmacros_redox_sep_dim
+\dim_new:N  \l__chemmacros_redox_sep_default_dim
+\dim_set:Nn \l__chemmacros_redox_sep_default_dim {.2em}
+\dim_new:N  \l__chemmacros_redox_dist_dim
+\dim_set:Nn \l__chemmacros_redox_dist_dim {.6em}
+
+% place and name nodes:
+% \OX{<name>,<atom>}
+\NewDocumentCommand \OX { >{\SplitArgument{1}{,}}m }
+  { \chemmacros_redox_partner:nn #1 }
+
+% TODO: add option to make `#2' be parsed as chem formula
+\cs_new_protected:Npn \chemmacros_redox_partner:nn #1#2
+  {
+    \legacy_if:nTF {measuring@}
+      {
+        \group_begin:
+          \tikz[baseline=(#1.base)] { \node [inner~sep=0pt] (#1) {#2} ; }
+        \group_end:
+      }
+      {
+        \tl_if_blank:nT {#1}
+          { \msg_error:nnnn {chemmacros} {redox} {\OX} {node~name~missing} }
+        \tl_if_blank:nT {#2}
+          { \msg_error:nnnn {chemmacros} {redox} {\OX} {atom~missing} }
+        \tikz[baseline=(#1.base),remember~picture]
+          { \node [inner~sep=0pt] (#1) {#2} ; }
+      }
+  }
+
+\cs_new_protected:Npn \__chemmacros_redox_coordinates:nn #1#2
+  {
+    \tl_set:Nn \l__chemmacros_redox_begin_tl {#1}
+    \tl_set:Nn \l__chemmacros_redox_end_tl   {#2}
+  }
+
+\cs_new_protected:Npn \chemmacros_redox:nnnnn #1#2#3#4#5
+  {
+    \tl_clear:N \l__chemmacros_redox_begin_tl
+    \tl_clear:N \l__chemmacros_redox_end_tl
+    \tl_clear:N \l__chemmacros_redox_tikz_tl
+    \__chemmacros_redox_coordinates:nn {#1} {#2}
+    \tl_if_blank:nF {#3}
+      { \tl_set:Nn \l__chemmacros_redox_tikz_tl {#3} }
+    \tl_if_blank:nTF {#4}
+      {
+        \fp_set:Nn \l__chemmacros_redox_shift_fp  {1}
+        \tl_set:Nn \l__chemmacros_redox_anchor_tl {above}
+        \tl_set:Nn \l__chemmacros_redox_side_tl   {north}
+        \dim_set_eq:NN
+          \l__chemmacros_redox_sep_dim
+          \l__chemmacros_redox_sep_default_dim
+      }
+      {
+        \fp_compare:nNnTF {#4} < {0}
+          {
+            \tl_set:Nn \l__chemmacros_redox_anchor_tl {below}
+            \tl_set:Nn \l__chemmacros_redox_side_tl   {south}
+            \exp_args:NNo \dim_set:Nn \l__chemmacros_redox_sep_dim
+              { - \l__chemmacros_redox_sep_default_dim }
+          }
+          {
+            \tl_set:Nn \l__chemmacros_redox_anchor_tl {above}
+            \tl_set:Nn \l__chemmacros_redox_side_tl   {north}
+            \dim_set_eq:NN
+              \l__chemmacros_redox_sep_dim
+              \l__chemmacros_redox_sep_default_dim
+          }
+        \fp_set:Nn \l__chemmacros_redox_shift_fp {#4}
+      }
+      \tl_set:Nx \l__chemmacros_redox_shift_tl
+        { \fp_to_decimal:N \l__chemmacros_redox_shift_fp }
+    \tikz[remember~picture,overlay]
+      {
+        \chemmacros_tikz_draw:x { \exp_not:V \l__chemmacros_redox_tikz_tl }
+        ($
+          (\l__chemmacros_redox_begin_tl .
+          \l__chemmacros_redox_side_tl)+(0,\l__chemmacros_redox_sep_dim)
+        $)
+        -- 
+        ++(0,\l__chemmacros_redox_shift_tl * \l__chemmacros_redox_dist_dim) -|
+        node [pos=.25,\l__chemmacros_redox_anchor_tl] { {#5} }
+        ($
+          (\l__chemmacros_redox_end_tl .
+          \l__chemmacros_redox_side_tl)+(0,\l__chemmacros_redox_sep_dim)
+        $) ;
+      }
+  }
+
+\NewDocumentCommand \redox { >{\SplitArgument{1}{,}}r()oom }
+  {
+    \IfNoValueT {#1}
+      {
+        \msg_error:nnnn {chemmacros} {redox} {\redox}
+          {You~need~to~specify~coordinates}
+      }
+    \IfNoValueTF {#2}
+      { \chemmacros_redox:nnnnn #1 { } { } {#4} }
+      {
+        \IfNoValueTF {#3}
+          { \chemmacros_redox:nnnnn #1 {#2} {  } {#4} }
+          { \chemmacros_redox:nnnnn #1 {#2} {#3} {#4} }
+      }
+  }
+
+% redox-keys
+\chemmacros_define_keys:nn {redox}
+  {
+    dist .dim_set:N = \l__chemmacros_redox_dist_dim ,
+    dist .initial:n = {.6em} ,
+    sep  .dim_set:N = \l__chemmacros_redox_sep_default_dim ,
+    sep  .initial:n = {.2em}
+  }
+
 % --------------------------------------------------------------------------
-% messages:
-\msg_new:nnn {chemmacros} {too-low-compatibility}
+\ChemModuleEnd
+\ChemModule{xfrac}{2020/11/29 use xfrac package with chemmacros}
+
+\RequirePackage{xfrac}
+
+% --------------------------------------------------------------------------
+
+% #1: type
+% #2: numerator
+% #3: denominator
+\cs_new_protected:Npn \chemmacros_frac:nnn #1#2#3
   {
-    Compatibility~ for~ versions~ below~ v4.7~ is~ not~ supported!~ You~
-    requested~ version~ v #1.~ Loading~ v4.7~ instead.
+    \IfInstanceExistTF {xfrac} {chemmacros-frac-\f at family-#1}
+      { \sfrac [chemmacros-frac-\f at family-#1] {#2} {#3} }
+      { \sfrac [chemmacros-frac-default-#1]{#2} {#3} }
   }
 
-\msg_new:nnn {chemmacros} {too-high-compatibility}
+\NewDocumentCommand \chemfrac {O{text}mm}
+  { \chemmacros_frac:nnn {#1} {#2} {#3} }
+
+% --------------------------------------------------------------------------
+
+% default:
+\DeclareInstance {xfrac} {chemmacros-frac-cmr-superscript} {text}
   {
-    You~ requested~ compatibility~ mode~ v #1~ while~ the~ current~ version~
-    of~ chemmacros~ is~ v \c_chemmacros_version_tl .~ Falling~ back~
-    to~ v \c_chemmacros_version_number_tl !
+    numerator-top-sep   = -.1ex ,
+    slash-left-kern     = -.2em ,
+    slash-right-kern    = -.2em ,
+    slash-symbol-font   = cmr
   }
 
-\msg_new:nnn {chemmacros} {low-compatibility}
+\DeclareInstance {xfrac} {chemmacros-frac-cmr-text} {text}
   {
-    You~ requested~ compatibility~ mode~ v #1~ while~ the~ current~ version~
-    of~ chemmacros~ is~ v \c_chemmacros_version_tl .~ Not~ all~ features~
-    or~ fixes~ will~ be~ available!
+    numerator-top-sep   = 0ex ,
+    slash-left-kern     = -.2em ,
+    slash-right-kern    = -.2em ,
+    slash-symbol-font   = cmr
   }
 
+% computer modern (same as default):
+\DeclareInstance {xfrac} {chemmacros-frac-cmr-superscript} {text}
+  {
+    numerator-top-sep   = -.1ex ,
+    slash-left-kern     = -.2em ,
+    slash-right-kern    = -.2em ,
+    slash-symbol-font   = cmr
+  }
+
+\DeclareInstance {xfrac} {chemmacros-frac-cmr-text} {text}
+  {
+    numerator-top-sep   = 0ex ,
+    slash-left-kern     = -.2em ,
+    slash-right-kern    = -.2em ,
+    slash-symbol-font   = cmr
+  }
+
+% Linux Libertine T lining:
+\DeclareInstance {xfrac} {chemmacros-frac-LinuxLibertineT-TLF-text} {text}
+  {
+    numerator-top-sep   = 0ex ,
+    slash-left-kern     = 0em ,
+    slash-right-kern    = .05em ,
+    slash-symbol-font   = LinuxLibertineT-TLF
+  }
+
+\DeclareInstance {xfrac} {chemmacros-frac-LinuxLibertineT-TLF-superscript} {text}
+  {
+    scale-factor        = 1.2 ,
+    denominator-bot-sep = -.1ex ,
+    numerator-top-sep   = -.1ex ,
+    slash-left-kern     = .1em ,
+    slash-right-kern    = .1em ,
+    slash-symbol-font   = LinuxLibertineT-TLF
+  }
+
+% Linux Libertine T oldstyle:
+\DeclareInstance {xfrac} {chemmacros-frac-LinuxLibertineT-TOsF-text} {text}
+  {
+    denominator-bot-sep = .1ex ,
+    numerator-top-sep   = -.2ex ,
+    slash-left-kern     = 0em ,
+    slash-right-kern    = 0em ,
+    slash-symbol-font   = LinuxLibertineT-TOsF
+  }
+
+\DeclareInstance {xfrac} {chemmacros-frac-LinuxLibertineT-TOsF-superscript} {text}
+  {
+    scale-factor        = 1.2 ,
+    denominator-bot-sep = -.1ex ,
+    numerator-top-sep   = -.2ex ,
+    slash-left-kern     = 0em ,
+    slash-right-kern    = .1em ,
+    slash-symbol-font   = LinuxLibertineT-TOsF
+  }
+
+% lmodern:
+\DeclareInstance {xfrac} {chemmacros-frac-lmr-superscript} {text}
+  {
+    slash-left-kern     = -.2em ,
+    slash-right-kern    = -.2em ,
+    slash-symbol-font   = lmr
+  }
+
+\DeclareInstance {xfrac} {chemmacros-frac-lmr-text} {text}
+  {
+    slash-left-kern     = -.2em ,
+    slash-right-kern    = -.2em ,
+    slash-symbol-font   = lmr
+  }
+
 % --------------------------------------------------------------------------
-% let's see that the max number is the newest (=current) version
-\chemmacros_if_compatibility:nnT {>} { \c_chemmacros_version_tl }
+\ChemModuleEnd
+\ChemModule{scheme}{2022/01/13 a scheme floating environment}
+
+\RequirePackage {chemnum}
+\RequirePackage {etoolbox}
+
+\msg_new:nnn {chemmacros} {patch-failed}
   {
-    \tl_set_eq:NN
-      \l__chemmacros_compatibility_version_tl
-      \c_chemmacros_version_tl
+    Patching~ \token_to_str:N #1 \c_space_tl failed.~
+    Please~ inform~ the~ chemmacros~ package~ authors.
   }
 
+\bool_new:N \l__chemmacros_float_def_bool
+\tl_new:N   \l__chemmacros_float_method_tl
+\seq_new:N  \l__chemmacros_float_methods_seq
+\prop_new:N \l__chemmacros_float_methods_prop
+\prop_new:N \l__chemmacros_float_definitions_prop
+
+\msg_new:nnn {chemmacros} {float-method}
+  { Detected~ float~ defining~ method~ `#1'. }
+
 % --------------------------------------------------------------------------
-% compatibility too low:
-\chemmacros_if_compatibility:nnT {<} {4.7}
+% #1: name
+% #2: check
+\cs_new_protected:Npn \chemmacros_define_float_method:nnn #1#2#3
   {
-    \msg_warning:nnx {chemmacros} {too-low-compatibility}
-      { \l__chemmacros_compatibility_version_tl }
+    \seq_put_right:Nn \l__chemmacros_float_methods_seq {#1}
+    \prop_put:Nnn \l__chemmacros_float_methods_prop {#1} {#2}
+    \prop_put:Nnn \l__chemmacros_float_definitions_prop {#1}
+      { \cs_set_protected:Npn \__chemmacros_define_float:nn ##1##2 {#3} }
   }
+  
+% the order in which the methods are defined determines in which order the
+% methods will be checked at begin document:
+\chemmacros_define_float_method:nnn {KOMA}
+  { \cs_if_exist_p:N \KOMAClassName }
+  {
+    \bool_lazy_or:nnTF
+      { \chemmacros_if_class_loaded_p:n {scrbook} }
+      { \chemmacros_if_class_loaded_p:n {scrreprt} }
+      { \DeclareNewTOC[ counterwithin = chapter, }
+      { \DeclareNewTOC[ }
+      type  = #1 ,
+      types = #1s ,
+      float ,
+      tocentryindent = 1.5em ,
+      tocentrynumwidth = 2.3em ,
+      name = \chemmacros_translate:n {#1-name} ,
+      listname = { \exp_not:N \chemmacros_translate:n {#1-list} }
+    ]{#2}
+  }
 
-% not the newest version:
-\chemmacros_if_compatibility:nnT {<} { \c_chemmacros_version_tl }
+\chemmacros_define_float_method:nnn {memoir}
+  { \chemmacros_if_class_loaded_p:n {memoir} }
   {
-    \msg_warning:nnx {chemmacros} {low-compatibility}
-      { \l__chemmacros_compatibility_version_tl }
+    \newfloat [chapter] {#1} {#2} {\chemmacros_translate:n {#1-name}}
+    \cs_set:cpn {the#1} {\thechapter.\arabic {#1}}
+    \newlistof {listof#1s} {#2} {\chemmacros_translate:n {#1-list}}
+    \newlistentry [chapter] {#1} {#2} {0}
+    \cftsetindents {#1} {0em} {2.3em}
+    \tl_put_right:Nn \@memfront at floats
+      { \counterwithout {#1} {chapter} }
+    \tl_put_right:Nn \@memmain at floats
+      { \counterwithin {#1} {chapter} }
+    \tl_put_right:Nn \@memback at floats
+      {
+        \counterwithin {#1} {chapter}
+        \setcounter {#1} {0}
+      }
+    \legacy_if:nT {artopt}
+      { \counterwithout {#1} {chapter} }
+    \apptocmd \insertchapterspace
+      { \addtocontents {#2} { \protect \addvspace {10pt} } }
+      {}
+      {}
   }
+
+\chemmacros_define_float_method:nnn {tocbasic}
+  { \chemmacros_if_package_loaded_p:n {tocbasic} }
+  {
+    \DeclareNewTOC[
+      type  = #1 ,
+      types = #1s ,
+      float ,
+      name = \chemmacros_translate:n {#1-name} ,
+      listname = {\exp_not:N \chemmacros_translate:n {#1-list}}
+    ]{#2}
+  }
+
+\chemmacros_define_float_method:nnn {newfloat}
+  { \chemmacros_if_package_loaded_p:n {newfloat} }
+  {
+    \DeclareFloatingEnvironment[{
+      fileext = #2 ,
+      listname = {\exp_not:N \chemmacros_translate:n {#1-list}} ,
+      name = \chemmacros_translate:n {#1-name}
+    }]{#1}
+  }
+
+\chemmacros_define_float_method:nnn {floatrow}
+  { \chemmacros_if_package_loaded_p:n {floatrow} }
+  {
+    \DeclareNewFloatType{#1}{%
+      fileext   = #2,
+      placement = htp,
+      name      = \chemmacros_translate:n {#1-name}
+    }
+    \cs_new_protected:cpn {listof#1s}
+      { \listof {#1} {\chemmacros_translate:n {#1-list}} }
+  }
+
+\chemmacros_define_float_method:nnn {float}
+  { \chemmacros_if_package_loaded_p:n {float} }
+  {
+    \newfloat {#1} {htp} {#2}
+    \floatname {#1} {\chemmacros_translate:n {#1-name}}
+    \cs_new_protected:cpn {listof#1s}
+      { \listof {#1} {\chemmacros_translate:n {#1-list}} }
+  }
+
+% --------------------------------------------------------------------------
+% checks if one of the above defined methods is active.  The first one found
+% will be used.
+\cs_new_protected:Npn \chemmacros_check_float_method:n #1
+  {
+    \prop_get:NnNT \l__chemmacros_float_methods_prop {#1}
+      \l__chemmacros_tmpa_tl
+      {
+        \bool_lazy_and:nnT
+          { !\l__chemmacros_float_def_bool }
+          { \l__chemmacros_tmpa_tl }
+          {
+            \bool_set_true:N \l__chemmacros_float_def_bool
+            \tl_set:Nn \l__chemmacros_float_method_tl {#1}
+            \msg_info:nnn {chemmacros} {float-method} {#1}
+          }
+      }
+  }
+
+\cs_new_protected:Npn \chemmacros_check_float_methods:
+  {
+    \seq_map_function:NN
+      \l__chemmacros_float_methods_seq
+      \chemmacros_check_float_method:n
+  }
+
+\hook_gput_code:nnn {begindocument/before} {chemmacros}
+  {
+    \chemmacros_if_package_loaded:nF {chemscheme}
+      {
+        \chemmacros_check_float_methods:
+        \chemmacros_define_float:nn {scheme} {los}
+      }
+  }
+
+% --------------------------------------------------------------------------
+\ChemCleverefSupport {scheme}
+  { \chemmacros_translate:n {scheme} }
+  [ \chemmacros_translate:n {Scheme} ]
+  { \chemmacros_translate:n {schemes} }
+  [ \chemmacros_translate:n {Schemes} ]
+
+\ChemFancyrefSupport {sch}
+  { \chemmacros_translate:n {scheme} }
+  [ \chemmacros_translate:n {Scheme} ]
+
+% --------------------------------------------------------------------------
+% #1: env name
+\cs_new_protected:Npn \chemmacros_define_float:nn #1#2
+  {
+    \bool_lazy_and:nnT
+      { !\cs_if_exist_p:c {#1} }
+      { !\cs_if_exist_p:c {end#1} }
+      {
+        \bool_if:NTF \l__chemmacros_float_def_bool
+          {
+            \prop_get:NVN \l__chemmacros_float_definitions_prop
+              \l__chemmacros_float_method_tl
+              \l__chemmacros_tmpa_tl
+            \tl_use:N \l__chemmacros_tmpa_tl
+            \__chemmacros_define_float:nn {#1} {#2}
+          }
+          {
+            \bool_lazy_or:nnTF
+              { \chemmacros_if_class_loaded_p:n {book} }
+              { \chemmacros_if_class_loaded_p:n {report} }
+              {
+                \newcounter {#1} [chapter]
+                \cs_set:cpn {the#1}
+                  { \ifnum \c at chapter>\z@ \thechapter.\fi \arabic {#1} }
+              }
+              {
+                \newcounter {#1}
+                \cs_set:cpn {the#1} { \arabic {#1} }
+              }
+            \cs_new:cpn {fps@#1}     {tbp}
+            \cs_new:cpn {ftype@#1}   {8}
+            \cs_new:cpn {ext@#1}     {#2}
+            \cs_new:cpx {fnum@#1}    {
+              \exp_not:c {#1name}
+              \exp_not:N \nobreakspace
+              \exp_not:c {the#1}}
+            \cs_new:cpn {#1name}     {\chemmacros_translate:n {#1-name}}
+            \cs_new:cpn {list#1name} {\chemmacros_translate:n {#1-list}}
+            \newenvironment {#1}
+              {\@float{#1}}
+              {\end at float}
+            \newenvironment {#1*}
+              {\@dblfloat{#1}}
+              {\end at dblfloat}
+            \bool_lazy_or:nnTF
+              { \chemmacros_if_class_loaded_p:n {book} }
+              { \chemmacros_if_class_loaded_p:n {report} }
+              {
+                \cs_new_protected:cpn {listof#1s}
+                  {
+                    \legacy_if:nTF {@twocolumn}
+                      { \@restonecoltrue\onecolumn }
+                      { \@restonecolfalse }
+                    \chapter* { \use:c {list#1name} }
+                    \use:x
+                      {  
+                        \exp_not:N \@mkboth
+                          { \exp_not:N \MakeUppercase \exp_not:c {list#1name} }
+                          { \exp_not:N \MakeUppercase \exp_not:c {list#1name} }
+                      }
+                    \@starttoc {#2}
+                    \legacy_if:nT {@restonecol} { \twocolumn }
+                  }
+                \patchcmd \@chapter
+                  { \addtocontents }
+                  { \addtocontents {#2} { \protect \addvspace {10\p@} } \addtocontents }
+                  {}
+                  { \msg_warning:nnn {chemmacros} {patch-failed} { \@chapter } }
+              }
+              {
+                \cs_new_protected:cpn {listof#1s}
+                  {
+                    \section* {\use:c {list#1name}}
+                    \use:x
+                      {  
+                        \exp_not:N \@mkboth
+                          { \exp_not:N \MakeUppercase \exp_not:c {list#1name} }
+                          { \exp_not:N \MakeUppercase \exp_not:c {list#1name} }
+                      }
+                    \@starttoc {#2}
+                  }
+              }
+            \cs_new_eq:cN {l@#1} \l at figure
+          }
+      }
+    \cs_set:cpn {#1name}     {\chemmacros_translate:n {#1-name}}
+    \cs_set:cpn {list#1name} {\chemmacros_translate:n {#1-list}}
+  }
+
+% --------------------------------------------------------------------------
+\ChemModuleEnd
+\ChemModule{spectroscopy}{2021/07/24 environment for spectroscopic data}
+
+\RequirePackage{siunitx}
+
+% spectroscopy
+\tl_new:N  \g__chemmacros_nmr_isotope_tl
+\tl_new:N  \l__chemmacros_nmr_isotope_default_tl
+\tl_set:Nn \l__chemmacros_nmr_isotope_default_tl { 1 }
+\tl_new:N  \l__chemmacros_nmr_coupling_nuclei_tl
+\tl_new:N  \l__chemmacros_nmr_coupling_nuclei_pre_tl
+\tl_set:Nn \l__chemmacros_nmr_coupling_nuclei_pre_tl { ( }
+\tl_new:N  \l__chemmacros_nmr_coupling_nuclei_post_tl
+\tl_set:Nn \l__chemmacros_nmr_coupling_nuclei_post_tl { ) }
+\tl_new:N  \l__chemmacros_nmr_coupling_bonds_tl
+\tl_new:N  \l__chemmacros_nmr_coupling_bonds_pre_tl
+\tl_new:N  \l__chemmacros_nmr_coupling_bonds_post_tl
+\tl_set:Nn \l__chemmacros_nmr_coupling_bonds_pre_tl { }
+\tl_set:Nn \l__chemmacros_nmr_coupling_bonds_post_tl { \! }
+\tl_new:N  \l__chemmacros_nmr_coupling_symbol_tl
+\tl_set:Nn \l__chemmacros_nmr_coupling_symbol_tl { J }
+\tl_new:N  \g__chemmacros_nmr_element_coupled_tl
+\tl_new:N  \g__chemmacros_nmr_element_tl
+\tl_new:N  \l__chemmacros_nmr_element_default_tl
+\tl_set:Nn \l__chemmacros_nmr_element_default_tl { H }
+\tl_new:N  \l__chemmacros_nmr_format_tl
+\tl_new:N  \l__chemmacros_nmr_delta_tl
+\tl_new:N  \l__chemmacros_nmr_coupling_unit_tl
+\tl_set:Nn \l__chemmacros_nmr_coupling_unit_tl { \hertz }
+\tl_new:N  \l__chemmacros_nmr_unit_tl
+\tl_set:Nn \l__chemmacros_nmr_unit_tl { \mega\hertz }
+\tl_new:N  \l__chemmacros_nmr_list_setup_tl
+\tl_set:Nn \l__chemmacros_nmr_list_setup_tl
+  {
+    \topsep\z at skip \partopsep\z at skip 
+    \itemsep\z@ \parsep\z@ \itemindent\z@
+    \leftmargin\z@
+  }
+\tl_new:N  \l__chemmacros_nmr_position_tl
+\tl_new:N  \l__chemmacros_nmr_element_method_connector_tl
+\tl_set:Nn \l__chemmacros_nmr_element_method_connector_tl {-}
+\tl_new:N  \l__chemmacros_nmr_method_tl
+\tl_set:Nn \l__chemmacros_nmr_method_tl {NMR}
+
+\bool_new:N      \l__chemmacros_nmr_coupling_nuclei_sub_bool
+\bool_new:N      \l__chemmacros_nmr_frequency_bool
+\bool_new:N      \l__chemmacros_nmr_solvent_bool
+\bool_new:N      \l__chemmacros_nmr_delimiters_bool
+\bool_new:N      \l__chemmacros_nmr_comma_bool
+\bool_new:N      \l__chemmacros_nmr_inner_bool
+\bool_new:N      \l__chemmacros_nmr_position_side_bool
+\bool_new:N      \l__chemmacros_nmr_parse_bool
+\bool_set_true:N \l__chemmacros_nmr_parse_bool
+\bool_new:N      \l__chemmacros_nmr_list_bool
+\bool_new:N      \l__chemmacros_nmr_use_equal_bool
+\bool_new:N      \l__chemmacros_nmr_custom_command_active_bool
+\bool_new:N      \l__chemmacros_nmr_custom_command_used_bool
+
+\skip_new:N \l__chemmacros_nmr_space_skip
+\skip_set:Nn \l__chemmacros_nmr_space_skip { .16667em }
+
+\cs_new_protected:Npn \__chemmacros_nmr_nucleus:nn #1#2
+  {
+    \tl_gset:Nn \g__chemmacros_nmr_isotope_tl {#1}
+    \tl_if_in:nnTF {#2} {[} % ]
+      { \__chemmacros_nmr_element:w #2 \q_stop }
+      {
+        \tl_gset:No \g__chemmacros_nmr_element_tl {#2}
+        \tl_gclear:N \g__chemmacros_nmr_element_coupled_tl
+      }
+  }
+\cs_generate_variant:Nn \__chemmacros_nmr_nucleus:nn { VV }
+
+\cs_new_protected:Npn \__chemmacros_nmr_nucleus:w #1,#2 \q_stop
+  {
+    \tl_gset:Nn \g__chemmacros_nmr_isotope_tl {#1}
+    \tl_if_in:nnTF {#2} {[} % ]
+      { \__chemmacros_nmr_element:w #2 \q_stop }
+      {
+        \tl_gset:No \g__chemmacros_nmr_element_tl {#2}
+        \tl_gclear:N \g__chemmacros_nmr_element_coupled_tl
+      }
+  }
+
+\cs_new_protected:Npn \__chemmacros_nmr_element:w #1[#2] \q_stop
+  {
+    \tl_gset:Nn \g__chemmacros_nmr_element_tl {#1}
+    \tl_gset:Nn \g__chemmacros_nmr_element_coupled_tl {#2}
+  }
+
+\cs_new_protected:Npn \__chemmacros_nmr_default_nucleus:w #1,#2 \q_stop
+  {
+    \tl_set:Nn \l__chemmacros_nmr_isotope_default_tl {#1}
+    \tl_set:Nn \l__chemmacros_nmr_element_default_tl {#2}
+  }
+
+\tl_new:N \l__chemmacros_nmr_base_format_tl
+
+\chemmacros_define_keys:nn {spectroscopy}
+  { nmr-base-format .tl_set:N = \l__chemmacros_nmr_base_format_tl }
+
+\cs_new_protected:Npn \__chemmacros_nmr_base:nn #1#2
+  {
+    \group_begin:
+      \tl_use:N \l__chemmacros_nmr_base_format_tl
+      \tl_if_blank:VF \g__chemmacros_nmr_element_coupled_tl
+        {
+          \tl_put_left:Nn \g__chemmacros_nmr_element_coupled_tl { \{ }
+          \tl_put_right:Nn \g__chemmacros_nmr_element_coupled_tl { \} }
+        }
+      \tl_put_left:Nn \g__chemmacros_nmr_element_coupled_tl {#2}
+      \chemmacros_chemformula:n { ^{#1} }
+      \tl_if_blank:VF \g__chemmacros_nmr_element_coupled_tl
+        {
+          \bool_if:NTF \l__chemmacros_nmr_parse_bool
+            { \chemmacros_chemformula:V \g__chemmacros_nmr_element_coupled_tl }
+            { \g__chemmacros_nmr_element_coupled_tl }
+        }
+      \tl_use:N \l__chemmacros_nmr_element_method_connector_tl
+      \tl_use:N \l__chemmacros_nmr_method_tl
+    \group_end:
+  }
+
+\cs_generate_variant:Nn \__chemmacros_nmr_base:nn { VV }
+
+\cs_new_protected:Npn \__chemmacros_nmr_frequency:n #1
+  {
+    \tl_if_in:nnTF {#1} {,}
+      { \__chemmacros_nmr_frequency_aux_i:w #1 \q_stop }
+      { \__chemmacros_nmr_frequency_aux_ii:n {#1} }
+  }
+
+\cs_new_protected:Npn \__chemmacros_nmr_frequency_aux_i:w #1,#2 \q_stop
+  { \SI {#1} {#2} }
+
+\cs_new_protected:Npn \__chemmacros_nmr_frequency_aux_ii:n #1
+  { \SI {#1} { \tl_use:N \l__chemmacros_nmr_unit_tl } }
+
+\cs_new_eq:NN \__chemmacros_nmr_number:n \use:n
+\cs_new_eq:NN \__chemmacros_nmr_position:n \use:n
+
+\chemmacros_define_keys:nn {spectroscopy}
+  {
+    unit          .tl_set:N      = \l__chemmacros_nmr_unit_tl ,
+    unit          .default:n     = \mega\hertz ,
+    nucleus       .code:n        =
+      { \__chemmacros_nmr_default_nucleus:w #1 \q_stop } ,
+    nucleus       .default:n     = {1,H} ,
+    format        .tl_set:N      = \l__chemmacros_nmr_format_tl ,
+    method        .tl_set:N      = \l__chemmacros_nmr_method_tl ,
+    connector     .tl_set:N      = \l__chemmacros_nmr_element_method_connector_tl ,
+    pos-number    .choice: ,
+    pos-number / sub  .code:n =
+      \tl_set:Nn \l__chemmacros_nmr_position_tl {_}
+      \bool_set_false:N \l__chemmacros_nmr_position_side_bool ,
+    pos-number / super .code:n =
+      \tl_set:Nn \l__chemmacros_nmr_position_tl {^}
+      \bool_set_false:N \l__chemmacros_nmr_position_side_bool ,
+    pos-number / side .code:n =
+      \tl_set:Nn \l__chemmacros_nmr_position_tl {-}
+      \bool_set_true:N \l__chemmacros_nmr_position_side_bool ,
+    pos-number /  .initial:n  = side ,
+    coupling-unit .tl_set:N   = \l__chemmacros_nmr_coupling_unit_tl ,
+    coupling-pos  .choice: ,
+    coupling-pos / sub .code:n =
+      \bool_set_true:N \l__chemmacros_nmr_coupling_nuclei_sub_bool ,
+    coupling-pos / side .code:n =
+      \bool_set_false:N \l__chemmacros_nmr_coupling_nuclei_sub_bool ,
+    coupling-nuclei-pre  .tl_set:N =
+      \l__chemmacros_nmr_coupling_nuclei_pre_tl ,
+    coupling-nuclei-post .tl_set:N =
+      \l__chemmacros_nmr_coupling_nuclei_post_tl ,
+    coupling-bonds-pre   .tl_set:N =
+      \l__chemmacros_nmr_coupling_bonds_pre_tl ,
+    coupling-bonds-post  .tl_set:N =
+      \l__chemmacros_nmr_coupling_bonds_post_tl ,
+    coupling-symbol .tl_set:N    =
+      \l__chemmacros_nmr_coupling_symbol_tl ,
+    atom-number-cs .code:n       =
+      \cs_set_eq:NN \__chemmacros_nmr_number:n #1 ,
+    atom-number-space .skip_set:N = \l__chemmacros_nmr_space_skip ,
+    coupling-pos-cs .code:n      =
+      \cs_set_eq:NN \__chemmacros_nmr_position:n #1 ,
+    parse         .bool_set:N    = \l__chemmacros_nmr_parse_bool ,
+    delta         .code:n        =
+      \tl_set:Nn \l__chemmacros_nmr_delta_tl {\,#1} ,
+    list          .bool_set:N    = \l__chemmacros_nmr_list_bool ,
+    list          .default:n     = true ,
+    list-setup    .tl_set:N      = \l__chemmacros_nmr_list_setup_tl ,
+    use-equal     .bool_set:N    = \l__chemmacros_nmr_use_equal_bool ,
+    use-equal     .default:n     = true
+  }
+
+\cs_new_protected:Npn \chemmacros_define_nmr:Nn #1#2
+  {
+    \cs_if_exist:NTF #1
+      {
+        \RenewDocumentCommand #1 {s}
+          { \IfBooleanTF {##1} { \NMR*{#2} } { \NMR{#2} } }
+      }
+      {
+        \NewDocumentCommand #1 {s}
+          { \IfBooleanTF {##1} { \NMR*{#2} } { \NMR{#2} } }
+      }
+  }
+
+\NewChemMacroset {NMR} {mm}
+  { \chemmacros_define_nmr:Nn #1 {#2} }
+
+\NewDocumentCommand \NMR { sG{}D(){}O{} }
+  {
+    \IfBooleanTF {#1}
+      { \chemmacros_nmr:nnnn {*} {#2} {#3} {#4} }
+      { \chemmacros_nmr:nnnn { } {#2} {#3} {#4} }
+  }
+
+\hook_gput_code:nnn {begindocument} {chemmacros}
+  {
+    % \NMR{<num>,<elem>}(<num>,<unit>)[<solvent>] ALL arguments are optional
+    % \NMR* same but without ": $\delta$" at end
+    \cs_new_protected:Npn \chemmacros_nmr:nnnn #1#2#3#4
+      {
+        \bool_if:NT \l__chemmacros_nmr_list_bool { \item \scan_stop: }
+        \group_begin:
+          \mode_leave_vertical:
+          \bool_set_false:N \l__chemmacros_nmr_frequency_bool
+          \bool_set_false:N \l__chemmacros_nmr_solvent_bool
+          \tl_if_empty:nF {#3}
+            { \bool_set_true:N \l__chemmacros_nmr_frequency_bool }
+          \tl_if_empty:nF {#4}
+            { \bool_set_true:N \l__chemmacros_nmr_solvent_bool }
+          \bool_lazy_or:nnT
+            { \l__chemmacros_nmr_frequency_bool }
+            { \l__chemmacros_nmr_solvent_bool }
+            { \bool_set_true:N \l__chemmacros_nmr_delimiters_bool }
+          \bool_lazy_and:nnT
+            { \l__chemmacros_nmr_frequency_bool }
+            { \l__chemmacros_nmr_solvent_bool }
+            { \bool_set_true:N \l__chemmacros_nmr_comma_bool }
+          \tl_if_empty:nTF {#2}
+            {
+              \__chemmacros_nmr_nucleus:VV
+                \l__chemmacros_nmr_isotope_default_tl
+                \l__chemmacros_nmr_element_default_tl
+            }
+            { \__chemmacros_nmr_nucleus:w #2 \q_stop }
+          \mode_if_math:TF
+            {
+              \text
+                {
+                  \group_begin:
+                    \tl_use:N \l__chemmacros_nmr_format_tl
+                    \__chemmacros_nmr_base:VV
+                      \g__chemmacros_nmr_isotope_tl
+                      \g__chemmacros_nmr_element_tl
+                    \bool_if:NT \l__chemmacros_nmr_delimiters_bool
+                      { ~ ( }
+                    \bool_if:NT \l__chemmacros_nmr_frequency_bool
+                      { \__chemmacros_nmr_frequency:n {#3} }
+                    \bool_if:NT \l__chemmacros_nmr_comma_bool
+                      { , ~ }
+                    \bool_if:NT \l__chemmacros_nmr_solvent_bool
+                      { \chemmacros_chemformula:n {#4} }
+                    \bool_if:NT \l__chemmacros_nmr_delimiters_bool
+                      { ) }
+                    \tl_if_blank:nT {#1} {:~}
+                  \group_end:
+                }
+              \tl_if_blank:nT {#1}
+                {
+                  \delta
+                  \text { \l__chemmacros_nmr_delta_tl }
+                  \bool_if:NT \l__chemmacros_nmr_use_equal_bool {=}
+                }
+            }
+            {
+              \group_begin:
+                \tl_use:N \l__chemmacros_nmr_format_tl
+                \__chemmacros_nmr_base:VV
+                  \g__chemmacros_nmr_isotope_tl
+                  \g__chemmacros_nmr_element_tl
+                \bool_if:NT \l__chemmacros_nmr_delimiters_bool
+                  {~(}
+                \bool_if:NT \l__chemmacros_nmr_frequency_bool
+                  { \__chemmacros_nmr_frequency:n {#3} }
+                \bool_if:NT \l__chemmacros_nmr_comma_bool
+                  {,~}
+                \bool_if:NT \l__chemmacros_nmr_solvent_bool
+                  {
+                    \bool_if:NTF \l__chemmacros_nmr_parse_bool
+                      { \chemmacros_chemformula:n {#4} }
+                      {#4}
+                  }
+                \bool_if:NT \l__chemmacros_nmr_delimiters_bool
+                  {)}
+                \tl_if_blank:nT {#1} {:}
+              \group_end:
+              \tl_if_blank:nT {#1}
+                {
+                  \tl_use:N \c_space_tl
+                  \c_math_toggle_token
+                    \delta
+                  \c_math_toggle_token
+                  \l__chemmacros_nmr_delta_tl
+                  \bool_if:NT \l__chemmacros_nmr_use_equal_bool {~=}
+                }
+            }
+        \group_end:
+      }
+  }
+
+\NewDocumentCommand \chemmacros_data:w { smo }
+  {
+    \bool_if:NT \l__chemmacros_nmr_list_bool { \item }
+      {
+        \tl_use:N \l__chemmacros_nmr_format_tl #2
+        \IfNoValueF {#3} { ~ ( #3 ) }
+        \IfBooleanT {#1} { \bool_if:NT \l__chemmacros_nmr_use_equal_bool { : } }
+      }
+    \IfBooleanF {#1} { \bool_if:NT \l__chemmacros_nmr_use_equal_bool { ~ = } }
+  }
+
+\cs_new_protected:Npn \chemmacros_val:n #1
+  {
+    \tl_if_in:nnTF {#1} {--}
+      { \chemmacros_val_aux:w #1 \q_nil }
+      { \num {#1} }
+  }
+
+\cs_new_protected:Npn \chemmacros_val_aux:w #1--#2 \q_nil
+  { \numrange {#1} {#2} }
+
+\NewDocumentEnvironment {experimental} {o}
+  {
+    \group_begin:
+    \IfNoValueF {#1} { \chemmacros_set_keys:nn {spectroscopy} {#1} }
+    \bool_set_true:N \l__chemmacros_nmr_inner_bool
+    \cs_set_eq:NN \#    \chemmacros_nmr_number:n
+    \cs_set_eq:NN \pos  \chemmacros_nmr_position:n
+    \cs_set_eq:NN \J    \chemmacros_nmr_coupling:w
+    \cs_set_eq:NN \data \chemmacros_data:w
+    \cs_set_eq:NN \val  \chemmacros_val:n
+    \bool_if:NT \l__chemmacros_nmr_list_bool
+      { \list {} { \l__chemmacros_nmr_list_setup_tl } }
+  }
+  {
+    \bool_if:NT \l__chemmacros_nmr_list_bool
+      { \endlist }
+    \group_end:
+    \chemmacros_ignore_spaces:
+  }
+
+\cs_new_protected:Npn \chemmacros_nmr_number:n #1
+  {
+    \__chemmacros_nmr_number:n {#1}
+    \chemmacros_skip_nobreak:N \l__chemmacros_nmr_space_skip
+    \chemmacros_chemformula:V \g__chemmacros_nmr_element_tl
+  }
+
+\cs_new_protected:Npn \chemmacros_nmr_position:n #1
+  {
+    \chemmacros_chemformula:x
+      {
+        \exp_not:V \g__chemmacros_nmr_element_tl
+        \bool_if:NF \l__chemmacros_nmr_position_side_bool
+          {
+            \exp_not:V \l__chemmacros_nmr_position_tl
+            \exp_not:n { _{#1} }
+          }
+      }
+    \bool_if:NT \l__chemmacros_nmr_position_side_bool
+      {
+        \tl_use:N \l__chemmacros_nmr_position_tl
+        \__chemmacros_nmr_position:n {#1}
+      }
+  }
+
+\cs_new_protected:Npn \chemmacros_nmr_coupling:w
+  {
+    \tl_clear:N \l__chemmacros_nmr_coupling_nuclei_tl
+    \tl_clear:N \l__chemmacros_nmr_coupling_bonds_tl
+    \peek_meaning:NTF (
+      { \__chemmacros_nmr_coupling:w }
+      { \__chemmacros_nmr_coupling_aux_i:w }
+  }
+
+\cs_new_protected:Npn \__chemmacros_nmr_coupling:w (#1;#2)
+  {
+    \tl_set:Nn \l__chemmacros_nmr_coupling_bonds_tl
+      {
+        \l__chemmacros_nmr_coupling_bonds_pre_tl
+        #1
+        \l__chemmacros_nmr_coupling_bonds_post_tl
+      }
+    \bool_if:NTF \l__chemmacros_nmr_coupling_nuclei_sub_bool
+      {
+        \tl_set:Nn \l__chemmacros_nmr_coupling_nuclei_tl
+          {
+            \c_math_subscript_token
+              {
+                \l__chemmacros_nmr_coupling_nuclei_pre_tl
+                \chemmacros_chemformula:n {#2}
+                \l__chemmacros_nmr_coupling_nuclei_post_tl
+              }
+          }
+      }
+      {
+        \tl_set:Nn \l__chemmacros_nmr_coupling_nuclei_tl
+          {
+            \l__chemmacros_nmr_coupling_nuclei_pre_tl
+            \chemmacros_chemformula:n {#2}
+            \l__chemmacros_nmr_coupling_nuclei_post_tl
+          }
+      }
+    \__chemmacros_nmr_coupling_aux_i:w
+  }
+
+\cs_new_protected:Npn \__chemmacros_nmr_coupling_aux_i:w
+  {
+    \peek_meaning:NTF [
+      { \__chemmacros_nmr_coupling_aux_ii:w }
+      { \__chemmacros_nmr_coupling_aux_iii:n }
+  }
+
+\cs_new_protected:Npn \__chemmacros_nmr_coupling_aux_ii:w [#1]#2
+  {
+    \group_begin:
+      \sisetup
+        {
+          list-final-separator={,~},
+          list-pair-separator={,~},
+          list-units=single
+        }
+      \c_math_toggle_token
+        ^{ \l__chemmacros_nmr_coupling_bonds_tl }
+        \l__chemmacros_nmr_coupling_symbol_tl
+        \l__chemmacros_nmr_coupling_nuclei_tl = \qtylist {#2} {#1}
+      \c_math_toggle_token
+    \group_end:
+  }
+
+\cs_new_protected:Npn \__chemmacros_nmr_coupling_aux_iii:n #1
+  {
+    \group_begin:
+      \sisetup
+        {
+          list-final-separator={,~},
+          list-pair-separator={,~},
+          list-units=single
+        }
+      \c_math_toggle_token
+         ^{ \l__chemmacros_nmr_coupling_bonds_tl }
+         \l__chemmacros_nmr_coupling_symbol_tl
+         \l__chemmacros_nmr_coupling_nuclei_tl
+         = \exp_args:Nno \qtylist {#1} { \l__chemmacros_nmr_coupling_unit_tl }
+      \c_math_toggle_token
+    \group_end:
+  }
+
+% --------------------------------------------------------------------------
+\ChemModuleEnd
+\ChemModule{thermodynamics}{2021/07/24 thermodynamics}
+
+\RequirePackage {siunitx}
+
+\tl_new:N \l__chemmacros_state_pre_tl
+\tl_new:N \l__chemmacros_state_post_tl
+\tl_new:N \l__chemmacros_state_sp_left_tl
+\tl_new:N \l__chemmacros_state_sb_left_tl
+\tl_new:N \l__chemmacros_state_sp_right_tl
+\tl_new:N \l__chemmacros_state_sb_right_tl
+\tl_new:N \l__chemmacros_state_sb_pos_tl
+\tl_new:N \l__chemmacros_state_symbol_tl
+\tl_new:N \l__chemmacros_state_unit_tl
+
+\tl_set:Nn \l__chemmacros_state_pre_tl { \changestate }
+\tl_set:Nn \l__chemmacros_state_sp_right_tl { \standardstate }
+\tl_set:Nn \l__chemmacros_state_sb_pos_tl {left}
+
+\chemmacros_define_keys:nn {thermodynamics}
+  {
+    pre               .tl_set:N   = \l__chemmacros_state_pre_tl ,
+    post              .tl_set:N   = \l__chemmacros_state_post_tl ,
+    superscript-left  .tl_set:N   = \l__chemmacros_state_sp_left_tl ,
+    superscript-right .tl_set:N   = \l__chemmacros_state_sp_right_tl ,
+    superscript       .meta:n     = { superscript-right = #1 } ,
+    subscript-left    .tl_set:N   = \l__chemmacros_state_sb_left_tl ,
+    subscript-right   .tl_set:N   = \l__chemmacros_state_sb_right_tl ,
+    subscript         .meta:n     = { subscript-left = #1 } ,
+    unit              .tl_set:N   = \l__chemmacros_state_unit_tl ,
+    unit              .groups:n   = {variables}
+  }
+
+\cs_new_protected:Npn \chemmacros_state:nn #1#2
+  {
+    % pre (\Delta)
+    % post
+    % superscript-left
+    % superscript-right (\standardstate)
+    % subscript-left
+    % subscript-right
+    \group_begin:
+      \chemmacros_set_keys:nn {thermodynamics} {#1}
+      \ensuremath
+        {
+          \chemmacros_text:V \l__chemmacros_state_pre_tl
+          \c_math_superscript_token
+            { \chemmacros_text:V \l__chemmacros_state_sp_left_tl }
+          \c_math_subscript_token
+            { \chemmacros_text:V \l__chemmacros_state_sb_left_tl }
+          #2
+          \c_math_superscript_token
+            { \chemmacros_text:V \l__chemmacros_state_sp_right_tl }
+          \c_math_subscript_token
+            { \chemmacros_text:V \l__chemmacros_state_sb_right_tl }
+          \chemmacros_text:V \l__chemmacros_state_post_tl
+        }
+    \group_end:
+  }
+\cs_generate_variant:Nn \chemmacros_state:nn { nV }
+
+\DeclareDocumentCommand \state { O{}m }
+  { \chemmacros_state:nn {#1} {#2} }
+
+\cs_new_protected:Npn \chemmacros_declare_state:Nn #1#2
+  {
+    \chemmacros_define_keys:xn
+      {thermodynamics/\chemmacros_remove_backslash:N #1}
+      {
+        pre               .meta:nn = {chemmacros/thermodynamics} { pre = ##1 } ,
+        post              .meta:nn = {chemmacros/thermodynamics} { post = ##1 } ,
+        superscript-left  .meta:nn = {chemmacros/thermodynamics} { superscript-left = ##1 } ,
+        superscript-right .meta:nn = {chemmacros/thermodynamics} { superscript-right = ##1 } ,
+        superscript       .meta:n  = { superscript-right = ##1 } ,
+        subscript-left    .meta:nn = {chemmacros/thermodynamics} { subscript-left = ##1 } ,
+        subscript-right   .meta:nn = {chemmacros/thermodynamics} { subscript-right = ##1 } ,
+        subscript         .meta:n     = { subscript-left = ##1 } ,
+        subscript-pos     .choices:nn =
+          { left , right }
+          { \tl_set_eq:NN \l__chemmacros_state_sb_pos_tl \l_keys_choice_tl } ,
+        symbol            .tl_set:N = \l__chemmacros_state_symbol_tl ,
+        unit              .tl_set:N = \l__chemmacros_state_unit_tl
+      }
+    \DeclareDocumentCommand #1 { sO{}D(){}m }
+      {
+        \group_begin:
+          \chemmacros_set_keys:xn
+            {thermodynamics/\chemmacros_remove_backslash:N #1}
+            {#2}
+          \tl_if_blank:nF {##3}
+            {
+              \chemmacros_set_keys:nx {thermodynamics}
+                { subscript-\l__chemmacros_state_sb_pos_tl = \exp_not:n {##3} }
+            }
+          \ensuremath
+            {
+              \chemmacros_state:nV {##2} \l__chemmacros_state_symbol_tl
+              \chemmacros_set_keys_groups:nnn {thermodynamics} {variables} {##2}
+              \IfBooleanF {##1} { = \qty {##4} { \l__chemmacros_state_unit_tl } }
+            }
+        \group_end:
+      }
+  }
+
+\NewChemMacroset {State} {mm}
+  { \chemmacros_declare_state:Nn #1 {#2} }
+
+% --------------------------------------------------------------------------
+% predefined:
+\NewChemState \enthalpy { symbol = H , unit = \kilo\joule\per\mole }
+\NewChemState \entropy  { symbol = S , unit = \joule\per\kelvin\per\mole , pre = }
+\NewChemState \gibbs    { symbol = G , unit = \kilo\joule\per\mole }
+
+% --------------------------------------------------------------------------
+\ChemModuleEnd
+\ChemModule{units}{2022/01/16 chemical units}
+
+\RequirePackage{siunitx}
+
+% --------------------------------------------------------------------------
+\DeclareSIUnit \angstrom         {\SIUnitSymbolAngstrom}
+\DeclareSIUnit \atm              {atm}
+\DeclareSIUnit \atmosphere       {atm}
+\DeclareSIUnit \atomicmassunit   {u}
+\DeclareSIUnit \bar              {bar}
+\DeclareSIUnit \calory           {cal}
+\DeclareSIUnit \cal              {cal}
+\DeclareSIUnit \elementarycharge {\text{\ensuremath{e}}}
+\DeclareSIUnit \mmHg             {mmHg}
+\DeclareSIUnit \moLar            {\mole\per\liter}
+\DeclareSIUnit \MolMass          {\gram\per\mole}
+\DeclareSIUnit \normal           {\textsc{n}}
+\DeclareSIUnit \torr             {Torr}
+
+\hook_gput_code:nnn {begindocument/before} {chemmacros}
+  {
+    \chemmacros_if_package_loaded:nF {chemstyle}
+      {
+        \DeclareSIUnit {\cmc  } {\cubic\centi\metre}
+        \DeclareSIUnit {\molar} {\mole\per\cubic\deci\metre}
+        \DeclareSIUnit {\Molar} {\textsc{m}}
+      }
+  }
+
+% --------------------------------------------------------------------------
+\ChemModuleEnd
+\ChemModule{reactants}{2021/07/24 typeset reactants and data}
+% idea and main development of this module: Sonja K.
+
+\RequirePackage {chemnum}
+
+\cs_generate_variant:Nn \chemnum_cmpd:nnnn {nnne}
+\cs_generate_variant:Nn \chemnum_init:nn {ne}
+\cs_generate_variant:Nn \chemnum_get_subcompound:nn {nV}
+
+% --------------------------------------------------------------------------
+\msg_new:nnn {chemmacros} {reactant-name}
+  {
+    The~ reactant~ `#1'~ has~ been~ defined~ without~ a~ name!~
+    \msg_line_context:
+  }
   
+\msg_new:nnn {chemmacros} {undefined-key}
+  {
+    The~ reactant~ key~ `#1'~ has~ not~ been~ defined~ using~
+    \token_to_str:N \DeclareChemReactant \c_space_tl \msg_line_context:
+  }
+  
+\msg_new:nnn {chemmacros} {double-defined-key}
+  {
+    The~ reactant~ key~ `#1'~ has~ already~ been~ defined~ using~
+    \token_to_str:N \DeclareChemReactant \c_space_tl \msg_line_context:
+  }
+  
+\msg_new:nnn {chemmacros} {double-defined-key-acronym}
+  {
+    The~ reactant~ key~ `#1'~ has~ already~ been~ defined~ using~
+    \token_to_str:N \DeclareAcronym \c_space_tl \msg_line_context:
+  }
+  
+\msg_new:nnn {chemmacros} {incompatible-equivalents}
+  {
+    Incompatible~ options~ `equivalents=false'~ and~ `main=equiv'~ detected.~
+    `equivalents=false'~ will~ be~ ignored~ \msg_line_context:
+  }
+  
+\msg_new:nnn {chemmacros} {acronym-support}
+  {
+    \token_to_str:N #1 is~ only~ available~ when~ setting~ the~
+    `acronym-support'~ option~ accordingly~ \msg_line_context:
+  }
+  
+\msg_new:nnn {chemmacros} {missing-printreactants-style}
+  {
+    \token_to_str:N \printreactants \c_space_tl\token_to_str:N was~ used~ without~ a~ 
+    `printreactants-style'~ option,~ thus~ no~ list~ is~ printed~ \msg_line_context:
+  }
+  
+\msg_new:nnn {chemmacros} {package-not-loaded}
+  { The~ command~ \token_to_str:N #1 requires~ the~ package~ `#2'. }
+
 % --------------------------------------------------------------------------
-\chemmacros_if_compatibility:nnTF {<} {5.0}
-  { \RequirePackage{chemmacros4} }
-  { \RequirePackage{chemmacros5} }
+\seq_new:N \l__chemmacros_reactants_tmpa_seq
 
-\file_input_stop:
+\bool_new:N \l__chemmacros_reactants_switch_bool
+\bool_new:N \l__chemmacros_reactants_initiate_bool
+\bool_new:N \l__chemmacros_reactants_equivalents_bool
+
+\bool_new:N \l__chemmacros_reactants_nmo_bool
+\bool_new:N \l__chemmacros_reactants_mno_bool
+\bool_new:N \l__chemmacros_reactants_mon_bool
+
+\bool_new:N \l__chemmacros_reactants_snm_bool
+\bool_new:N \l__chemmacros_reactants_smn_bool
+
+\bool_new:N \l__chemmacros_reactants_acronym_support_bool
+\bool_new:N \l__chemmacros_reactants_printreactants_style_bool
+
+\str_new:N \l__chemmacros_reactants_acronym_support_str
+\str_new:N \l__chemmacros_reactants_printreactants_style_str
+\str_new:N \l__chemmacros_reactants_main_str
+\str_new:N \l__chemmacros_reactants_name_str
+
+\tl_new:N \l__chemmacros_mass_unit_tl
+\tl_new:N \l__chemmacros_volume_unit_tl
+\tl_new:N \l__chemmacros_amount_unit_tl
+\tl_new:N \l__chemmacros_concentration_unit_tl
+\tl_new:N \l__chemmacros_equiv_unit_tl
+\tl_new:N \l__chemmacros_fraction_unit_tl
+\tl_new:N \l__chemmacros_purity_unit_tl
+\tl_new:N \l__chemmacros_solution_name_tl
+
+\chemmacros_define_keys:nn {reactants}
+  {
+    mass-unit .tl_set:N  = \l__chemmacros_mass_unit_tl ,
+    mass-unit .initial:n = \gram ,
+    %%
+    volume-unit .tl_set:N  = \l__chemmacros_volume_unit_tl ,
+    volume-unit .initial:n = \milli\liter ,
+    %%
+    amount-unit .tl_set:N  = \l__chemmacros_amount_unit_tl ,
+    amount-unit .initial:n = \milli\mole ,
+    %%
+    concentration-unit .tl_set:N  = \l__chemmacros_concentration_unit_tl ,
+    concentration-unit .initial:n = \Molar ,
+    %%
+    equiv-unit .tl_set:N  = \l__chemmacros_equiv_unit_tl ,
+    equiv-unit .initial:n = eq ,
+    %%
+    fraction-unit .tl_set:N  = \l__chemmacros_fraction_unit_tl ,
+    fraction-unit .initial:n = w/w \percent ,
+    %%
+    purity-unit .tl_set:N  = \l__chemmacros_purity_unit_tl ,
+    purity-unit .initial:n = \percent ,
+    %%
+    solution-name .tl_set:N  = \l__chemmacros_solution_name_tl ,
+    solution-name .initial:n = \chemmacros_translate:n {solution} ,
+    %%
+    switch .bool_set:N = \l__chemmacros_reactants_switch_bool ,
+    switch .initial:n  = false ,
+    %%
+    initiate .bool_set:N = \l__chemmacros_reactants_initiate_bool ,
+    initiate .initial:n  = false ,
+    %%
+    equivalents .bool_set_inverse:N = \l__chemmacros_reactants_equivalents_bool ,
+    equivalents .initial:n  = true,
+    %%
+    reactant-output-style .choice: , 
+    reactant-output-style / name-main-other .code:n =
+      \bool_set_true:N \l__chemmacros_reactants_nmo_bool
+      \bool_set_false:N \l__chemmacros_reactants_mno_bool
+      \bool_set_false:N \l__chemmacros_reactants_mon_bool ,
+    reactant-output-style / main-name-other .code:n =
+      \bool_set_false:N \l__chemmacros_reactants_nmo_bool
+      \bool_set_true:N \l__chemmacros_reactants_mno_bool
+      \bool_set_false:N \l__chemmacros_reactants_mon_bool ,
+    reactant-output-style / main-other-name .code:n =
+      \bool_set_false:N \l__chemmacros_reactants_nmo_bool
+      \bool_set_false:N \l__chemmacros_reactants_mno_bool
+      \bool_set_true:N \l__chemmacros_reactants_mon_bool ,
+    reactant-output-style .initial:n  = name-main-other ,
+    %%
+    solvent-output-style .choice: ,
+    solvent-output-style / main-name .code:n =
+      \bool_set_false:N \l__chemmacros_reactants_snm_bool
+      \bool_set_true:N \l__chemmacros_reactants_smn_bool ,
+    solvent-output-style / name-main .code:n =
+        \bool_set_true:N \l__chemmacros_reactants_snm_bool
+        \bool_set_false:N \l__chemmacros_reactants_smn_bool ,
+    solvent-output-style .initial:n  = main-name ,
+    %%
+    main .choice: , 
+    main / amount .code:n =
+      \str_set:Nn \l__chemmacros_reactants_main_str {amount} ,
+    main / equiv .code:n = 
+      \str_set:Nn \l__chemmacros_reactants_main_str {equiv} ,
+    main / default .code:n =
+      \str_set:Nn \l__chemmacros_reactants_main_str {default} ,
+    main .initial:n  = default ,
+    %%
+    acronym-support .choice: , 
+    acronym-support / glossaries-extra .code:n =
+      \bool_set_true:N \l__chemmacros_reactants_acronym_support_bool
+      \str_set:Nn \l__chemmacros_reactants_acronym_support_str {glossaries}
+      \RequirePackage [acronyms] {glossaries-extra} ,
+    acronym-support / acro .code:n =
+      \bool_set_true:N \l__chemmacros_reactants_acronym_support_bool
+      \str_set:Nn \l__chemmacros_reactants_acronym_support_str {acro}
+      \RequirePackage {acro} ,
+    acronym-support / none .code:n =
+      \bool_set_false:N \l__chemmacros_reactants_acronym_support_bool
+      \str_clear:N \l__chemmacros_reactants_acronym_support_str ,
+    acronym-support .initial:n  = none ,
+    %%
+    printreactants-style .choice: , 
+    printreactants-style / xltabular .code:n =
+      \bool_set_true:N \l__chemmacros_reactants_printreactants_style_bool
+      \str_set:Nn \l__chemmacros_reactants_printreactants_style_str {xltabular}
+      \RequirePackage {xltabular} ,
+    printreactants-style / longtable .code:n =
+      \bool_set_true:N \l__chemmacros_reactants_printreactants_style_bool
+      \str_set:Nn \l__chemmacros_reactants_printreactants_style_str {longtable}
+      \RequirePackage {longtable} ,
+    printreactants-style / none .code:n =
+      \bool_set_false:N \l__chemmacros_reactants_printreactants_style_bool
+      \str_clear:N \l__chemmacros_reactants_printreactants_style_str ,
+    printreactants-style .initial:n  = none
+  }
+
 % --------------------------------------------------------------------------
-2020/02/03 - lazy boolean evaluation
-           - prefer the kernel commands to \chemmacros_leave_vmode: and
-             \chemmacros_tex_if:
+% #1: key
+% #2: properties
+\NewDocumentCommand \DeclareChemReactant {mm}
+  { \chemmacros_declare_reactant:nn {#1} {#2} }
+
+% #1: key
+% #2: properties
+\cs_new_protected:Npn \chemmacros_declare_reactant:nn #1#2 
+  {
+    \cs_if_exist:cT 
+      {l__chemmacros_reactants_#1_prop} 
+      {\msg_error:nnn {chemmacros} {double-defined-key} {#1} }
+    \prop_new:c {l__chemmacros_reactants_#1_prop}
+    \__chemmacros_reactants_set_properties:nn {#1} {#2}
+    % check if name given:
+    \__chemmacros_reactants_if_property:nnF {#1} {name}
+      { \msg_error:nnn {chemmacros} {reactant-name} {#1} }
+    % check if number given; else use key: 
+    \__chemmacros_reactants_if_property:nnF {#1} {number}
+      { \__chemmacros_reactants_set_properties:nn {#1} { number = #1 } }
+    \bool_if:NT \l__chemmacros_reactants_initiate_bool
+      {
+        \hook_gput_code:nnn {begindocument} {chemmacros}
+          { \chemnum_init:ne {} { \__chemmacros_reactants_item:nn {#1} {number} } }
+      }
+    \bool_if:NT \l__chemmacros_reactants_acronym_support_bool
+      {
+        \str_case:Vn \l__chemmacros_reactants_acronym_support_str
+          {
+            {glossaries}
+            {
+              \chemmacros_if_package_loaded:nTF {glossaries-extra}
+                {
+                  \__chemmacros_reactants_if_property:nnT {#1} {short}
+                    {
+                      \exp_args:Nnxx
+                      \newacronym
+                        {#1}
+                        { \__chemmacros_reactants_item:nn {#1} {short} }
+                        { \__chemmacros_reactants_item:nn {#1} {name} }
+                    }
+                }
+                {
+                  \msg_error:nnnn
+                    {chemmacros}
+                    {package-not-loaded}
+                    { \printreactants }
+                    {glossaries-extra}
+                }
+            }
+            {acro}
+            {
+              \__chemmacros_reactants_if_property:nnT {#1} {short}
+                {
+                  \chemmacros_if_package_loaded:nTF {acro}
+                    {
+                      \acro_if_defined:nT {#1}
+                        { \msg_error:nnn {chemmacros} {double-defined-key-acronym} {#1} }
+                      \exp_args:Nnx
+                      \DeclareAcronym {#1} {
+                        short = \__chemmacros_reactants_item:nn {#1} {short} ,
+                        long  = \__chemmacros_reactants_item:nn {#1} {name}
+                      }
+                    }
+                    {
+                      \msg_error:nnnn
+                        {chemmacros}
+                        {package-not-loaded}
+                        { \printreactants }
+                        {acro}
+                    }
+                }
+            }
+          }
+      }
+  }
+
+% #1: key
+% #2: properties
+\cs_new_protected:Npn \__chemmacros_reactants_set_properties:nn #1#2
+  {
+    \cs_set_protected:Npn \__chemmacros_reactants_property:nn ##1##2
+      {
+        \str_case:nnF {##1}
+          { {name} { \__chemmacros_reactants_put:nnn {#1} {##1} {##2} } }
+          { \__chemmacros_reactants_put:nnn {#1} {##1} {##2} }
+      }
+    \cs_set_protected:Npn \__chemmacros_reactants_property:n ##1
+      { \__chemmacros_reactants_put:nnn {#1} {##1} {} }
+    \keyval_parse:NNn
+      \__chemmacros_reactants_property:n
+      \__chemmacros_reactants_property:nn
+      {#2}
+  }
+
+% #1: key
+% #2: property
+\prg_new_conditional:Npnn \__chemmacros_reactants_if_property:nn #1#2 {p,T,F,TF}
+  {
+    \prop_if_in:cnTF {l__chemmacros_reactants_#1_prop} {#2}
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+
+% #1: key
+% #2: property
+\cs_new:Npn \__chemmacros_reactants_item:nn #1#2
+  { \prop_item:cn {l__chemmacros_reactants_#1_prop} {#2} }
+
+% #1: key
+% #2: property
+% #3: value
+\cs_new_protected:Npn \__chemmacros_reactants_put:nnn #1#2#3
+  { \prop_put:cnn {l__chemmacros_reactants_#1_prop} {#2} {#3} }
+  
+% --------------------------------------------------------------------------
+% #1: boolean > no name
+% #2: boolean: if true, allow no properties and use cmpd+ 
+% #3: properties and options
+% #4: key
+\NewDocumentCommand \reactant {st+O{}m}
+  {
+    \group_begin:
+      \str_set:Nn \l__chemmacros_reactants_name_str {regular}
+      \chemmacros_reactant:nnnn {#1} {#2} {#3} {#4}
+    \group_end:
+  }
+  
+% #1: boolean > no name
+% #2: boolean: if true, allow no properties and use cmpd+ 
+% #3: properties and options
+% #4: key
+\NewDocumentCommand \reactants {st+O{}m}
+  {
+    \group_begin:
+      \bool_if:NTF \l__chemmacros_reactants_acronym_support_bool
+        {
+          \str_set:Nn \l__chemmacros_reactants_name_str {short}
+          \chemmacros_reactant:nnnn {#1} {#2} {#3} {#4}
+        }
+        { \msg_error:nnn {chemmacros} {acronym-support} { \reactants } }
+    \group_end:
+  }
+  
+% #1: boolean > no name
+% #2: boolean: if true, allow no properties and use cmpd+ 
+% #3: properties and options
+% #4: key
+\NewDocumentCommand \reactantl {st+O{}m}
+  {
+    \group_begin:
+      \bool_if:NTF \l__chemmacros_reactants_acronym_support_bool
+        {
+          \str_set:Nn \l__chemmacros_reactants_name_str {long}
+          \chemmacros_reactant:nnnn {#1} {#2} {#3} {#4}
+        }
+        { \msg_error:nnn {chemmacros} {acronym-support} { \reactantl } }
+    \group_end:
+  }
+  
+% #1: boolean > no name
+% #2: boolean: if true, allow no properties and use cmpd+ 
+% #3: properties and options
+% #4: key
+\NewDocumentCommand \Reactant {st+O{}m}
+  {
+    \group_begin:
+      \str_set:Nn \l__chemmacros_reactants_name_str {upper}
+      \chemmacros_reactant:nnnn {#1} {#2} {#3} {#4}
+    \group_end:
+  }
+
+
+% #1: boolean > no name
+% #2: boolean: if true, allow no properties and use cmpd+ 
+% #3: properties and options
+% #4: key
+\cs_new_protected:Npn \chemmacros_reactant:nnnn #1#2#3#4
+  {
+    \group_begin:
+      \bool_if:NT \l__chemmacros_reactants_nmo_bool
+        {
+          \__chemmacros_reactants_set_properties:nn {#4} {#3}
+          % name:
+          \chemmacros_reactants_name:nnnn {#1} {#3} {#4} {#2}
+          \chemmacros_reactants_if_any:nT {#4} {~(}
+          % main:
+          \__chemmacros_reactants_mainproperty:nn {#3} {#4}
+          \bool_lazy_and:nnT
+            { \chemmacros_reactants_if_main_p:n {#4} }
+            { \chemmacros_reactants_if_other_p:n {#4} }
+            {,~}
+          % others:
+          \chemmacros_reactants_properties:nn {#3} {#4}
+          \chemmacros_reactants_if_any:nT {#4} {)}
+        }
+      \bool_if:NT \l__chemmacros_reactants_mno_bool
+        {
+          \__chemmacros_reactants_set_properties:nn {#4} {#3}
+          % main:
+          \__chemmacros_reactants_mainproperty:nn {#3} {#4}
+          \chemmacros_reactants_if_main:nT {#4} {~}
+          % name:
+          \chemmacros_reactants_name:nnnn {#1} {#3} {#4} {#2}
+          % others:
+          \chemmacros_reactants_if_other:nT {#4} {~(}
+          \chemmacros_reactants_properties:nn {#3} {#4}
+          \chemmacros_reactants_if_other:nT {#4} {)}
+        }
+      \bool_if:NT \l__chemmacros_reactants_mon_bool
+        {
+          \__chemmacros_reactants_set_properties:nn {#4} {#3}
+          % main:
+          \__chemmacros_reactants_mainproperty:nn {#3} {#4}
+          \chemmacros_reactants_if_main:nT {#4} {~}
+          % others:
+          \chemmacros_reactants_if_other:nT {#4} {(}
+          \chemmacros_reactants_properties:nn {#3} {#4}
+          \chemmacros_reactants_if_other:nT {#4} {)~}
+          % name
+          \chemmacros_reactants_name:nnnn {#1} {#3} {#4} {#2}
+        }
+    \group_end:
+  }
+
+% #1: key
+\prg_new_conditional:Npnn \chemmacros_reactants_if_main:n #1 {p,T,F,TF}
+  {
+    \bool_lazy_or:nnTF
+      { \__chemmacros_reactants_if_property_p:nn {#1} {mass} }
+      { \__chemmacros_reactants_if_property_p:nn {#1} {volume} }
+      { \prg_return_true: }
+      {
+        \str_case:VnF \l__chemmacros_reactants_main_str
+          {
+            {amount} {
+              \__chemmacros_reactants_if_property:nnTF {#1} {amount}
+                { \prg_return_true: }
+                { \prg_return_false: }
+            }
+            {equiv} {
+              \__chemmacros_reactants_if_property:nnTF {#1} {equiv}
+                { \prg_return_true: }
+                { \prg_return_false: }
+            }
+          }
+          { \prg_return_false: }
+      }
+  }
+
+% #1: key
+\prg_new_conditional:Npnn \chemmacros_reactants_if_other:n #1 {p,T,F,TF}
+  {
+    \bool_lazy_any:nTF
+      {
+        { \__chemmacros_reactants_if_property_p:nn {#1} {fraction} }
+        { \__chemmacros_reactants_if_property_p:nn {#1} {purity} } 
+        { \__chemmacros_reactants_if_property_p:nn {#1} {concentration} }
+        { \__chemmacros_reactants_if_property_p:nn {#1} {solvent} }
+      }
+      { \prg_return_true: }
+      {
+        \str_case:VnF \l__chemmacros_reactants_main_str
+          {
+            {default} {
+             \bool_lazy_or:nnTF
+                { \__chemmacros_reactants_if_property_p:nn {#1} {amount} }
+                {
+                  \bool_lazy_and_p:nn
+                    { \__chemmacros_reactants_if_property_p:nn {#1} {equiv} }
+                    { !\l__chemmacros_reactants_equivalents_bool }
+                }
+                { \prg_return_true: }
+                { \prg_return_false: }
+            }
+            {amount} {
+              \bool_if:NTF \l__chemmacros_reactants_equivalents_bool
+                { \prg_return_false: }
+                {
+                  \__chemmacros_reactants_if_property:nnTF {#1} {equiv}
+                    { \prg_return_true: }
+                    { \prg_return_false: }
+                }
+            }
+            {equiv} {
+              \__chemmacros_reactants_if_property:nnTF {#1} {amount}
+                { \prg_return_true: }
+                { \prg_return_false: }
+            }
+          }
+          { \prg_return_false: }
+      }
+  }
+
+% #1: key
+\prg_new_conditional:Npnn \chemmacros_reactants_if_any:n #1 {T,F,TF}
+  {
+    \bool_lazy_any:nTF
+      {
+        { \__chemmacros_reactants_if_property_p:nn {#1} {mass} }
+        { \__chemmacros_reactants_if_property_p:nn {#1} {volume} }
+        { \__chemmacros_reactants_if_property_p:nn {#1} {fraction} }
+        { \__chemmacros_reactants_if_property_p:nn {#1} {amount} }
+        { \__chemmacros_reactants_if_property_p:nn {#1} {equiv} }
+        { \__chemmacros_reactants_if_property_p:nn {#1} {purity} } 
+        { \__chemmacros_reactants_if_property_p:nn {#1} {concentration} }
+        { \__chemmacros_reactants_if_property_p:nn {#1} {solvent} }
+      }
+      { \prg_return_true: }
+      { \prg_return_false: }
+  }
+  
+% #1: boolean > no name
+% #2: options and keys
+% #3: key
+% #4: boolean: if true, allow no properties and use cmpd+ 
+\cs_new_protected:Npn \chemmacros_reactants_name:nnnn #1#2#3#4
+  {
+    \group_begin:
+      \keys_set_known:nn {chemmacros/reactants} {#2}
+      \bool_lazy_or:nnT 
+        { \bool_lazy_and_p:nn {#1} { !\l__chemmacros_reactants_switch_bool } } 
+        { !#1 }
+        {
+          \str_case:Vn \l__chemmacros_reactants_name_str
+            {
+              {regular}
+              { \__chemmacros_reactants_item:nn {#3} {name} }
+              {upper}
+              { \__chemmacros_reactants_item:nn {#3} {upper-name} }
+              {short}
+              { 
+                \str_case:Vn \l__chemmacros_reactants_acronym_support_str
+                  {
+                    {glossaries} { \glsxtrshort {#3} }
+                    {acro} { \acs {#3} }
+                  }
+              }
+              {long}
+              { 
+                \str_case:Vn \l__chemmacros_reactants_acronym_support_str
+                  {
+                    {glossaries} { \glsxtrlong {#3} }
+                    {acro} { \acl {#3} }
+                  }
+              }
+            }
+        }
+      \bool_if:nF {#1} { \nobreakspace }
+      \bool_lazy_or:nnT
+        { \bool_lazy_and_p:nn {#1} { \l__chemmacros_reactants_switch_bool } } 
+        { !#1 }
+        {
+          \chemnum_cmpd:nnne
+            { \c_false_bool }
+            {#4}
+            { }
+            { \__chemmacros_reactants_item:nn {#3} {number} }
+          % what is this for?
+          % it causes problems when #3 is a combination of main and sub:
+          % \bool_if:nF {#4}
+          %   {
+          %     \chemnum_compound_if_initiated:nF {#3}
+          %       { \msg_warning:nnn {chemmacros} {undefined-key} {#3} }
+          %   }
+        }
+    \group_end:
+  }
+
+% #1: options and properties
+% #2: key
+\cs_new_protected:Npn \chemmacros_reactants_properties:nn #1#2
+  {
+    \group_begin:
+      \seq_clear:N \l__chemmacros_tmpa_seq
+      \__chemmacros_reactants_set_properties:nn {#2} {#1}
+      \keys_set_known:nn {chemmacros/reactants} {#1}
+      \bool_lazy_any:nT
+        {
+          { \__chemmacros_reactants_if_property_p:nn {#2} {mass} }
+          { \__chemmacros_reactants_if_property_p:nn {#2} {volume} }
+          { \__chemmacros_reactants_if_property_p:nn {#2} {fraction} }
+          { \__chemmacros_reactants_if_property_p:nn {#2} {amount} }
+          { \__chemmacros_reactants_if_property_p:nn {#2} {equiv} }
+          { \__chemmacros_reactants_if_property_p:nn {#2} {purity} } 
+          { \__chemmacros_reactants_if_property_p:nn {#2} {concentration} }
+          { \__chemmacros_reactants_if_property_p:nn {#2} {solvent} }
+          { \__chemmacros_reactants_if_property_p:nn {#2} {fraction-unit} }
+          { \__chemmacros_reactants_if_property_p:nn {#2} {amount-unit} }
+          { \__chemmacros_reactants_if_property_p:nn {#2} {equiv-unit} }
+          { \__chemmacros_reactants_if_property_p:nn {#2} {purity-unit} }
+          { \__chemmacros_reactants_if_property_p:nn {#2} {concentration-unit} }
+        }
+        {
+          \__chemmacros_reactants_change_unit:nnN
+            {#2}
+            {fraction-unit}
+            \l__chemmacros_fraction_unit_tl
+          \__chemmacros_reactants_change_unit:nnN
+            {#2}
+            {amount-unit}
+            \l__chemmacros_amount_unit_tl
+          \bool_if:NF \l__chemmacros_reactants_equivalents_bool
+            {
+              \__chemmacros_reactants_change_unit:nnN
+                {#2}
+                {equiv-unit}
+                \l__chemmacros_equiv_unit_tl
+            }
+          \__chemmacros_reactants_change_unit:nnN
+            {#2}
+            {purity-unit}
+            \l__chemmacros_purity_unit_tl
+          \__chemmacros_reactants_change_unit:nnN
+            {#2}
+            {concentration-unit}
+            \l__chemmacros_concentration_unit_tl
+          \__chemmacros_reactants_add_property:NnnV \l__chemmacros_tmpa_seq
+            {#2}
+            {fraction}
+            \l__chemmacros_fraction_unit_tl
+          \str_if_eq:VnF \l__chemmacros_reactants_main_str {amount}
+            {
+              \__chemmacros_reactants_add_property:NnnV \l__chemmacros_tmpa_seq
+                {#2}
+                {amount}
+                \l__chemmacros_amount_unit_tl
+            }
+          \bool_if:NTF \l__chemmacros_reactants_equivalents_bool
+            {
+              \str_if_eq:VnT \l__chemmacros_reactants_main_str {equiv}
+                { \msg_warning:nnn {chemmacros} {incompatible-equivalents} {#1} }
+            }
+            {
+              \str_if_eq:VnF \l__chemmacros_reactants_main_str {equiv}
+                { 
+                  \__chemmacros_reactants_add_property:NnnV \l__chemmacros_tmpa_seq
+                    {#2}
+                    {equiv}
+                    \l__chemmacros_equiv_unit_tl
+                }
+            }
+          \__chemmacros_reactants_add_property:NnnV \l__chemmacros_tmpa_seq
+            {#2}
+            {purity}
+            \l__chemmacros_purity_unit_tl
+          \__chemmacros_reactants_add_property:NnnV \l__chemmacros_tmpa_seq
+            {#2}
+            {concentration}
+            \l__chemmacros_concentration_unit_tl
+          \seq_use:Nn \l__chemmacros_tmpa_seq {,~}
+          \__chemmacros_reactants_add_solvent:Nnn
+            {#2}
+            {solvent}
+          \l__chemmacros_solution_name_tl
+        }
+    \group_end:
+  }
+
+% #1: options and properties
+% #2: key
+\cs_new_protected:Npn \__chemmacros_reactants_mainproperty:nn #1#2
+  {
+    \group_begin:
+      \seq_clear:N \l__chemmacros_tmpa_seq
+      \__chemmacros_reactants_set_properties:nn {#2} {#1}
+      \keys_set_known:nn {chemmacros/reactants} {#1}
+      \bool_lazy_or:nnT
+        { \__chemmacros_reactants_if_property_p:nn {#2} {mass-unit} }
+        { \__chemmacros_reactants_if_property_p:nn {#2} {volume-unit} }
+        {
+          \__chemmacros_reactants_change_unit:nnN
+            {#2}
+            {mass-unit}
+            \l__chemmacros_mass_unit_tl
+          \__chemmacros_reactants_change_unit:nnN
+            {#2}
+            {volume-unit}
+            \l__chemmacros_volume_unit_tl
+        }
+      \bool_lazy_and:nnT
+        { \str_if_eq_p:Vn \l__chemmacros_reactants_main_str {amount} }
+        { \__chemmacros_reactants_if_property_p:nn {#2} {amount-unit} }
+        {
+          \__chemmacros_reactants_change_unit:nnN
+            {#2}
+            {amount-unit}
+            \l__chemmacros_amount_unit_tl
+        }
+      \bool_lazy_and:nnT
+        { \str_if_eq_p:Vn \l__chemmacros_reactants_main_str {equiv} }
+        { \__chemmacros_reactants_if_property_p:nn {#2} {equiv-unit} }
+        {
+          \__chemmacros_reactants_change_unit:nnN
+            {#2}
+            {equiv-unit}
+            \l__chemmacros_equiv_unit_tl
+        }
+      \__chemmacros_reactants_add_property:NnnV \l__chemmacros_tmpa_seq
+        {#2}
+        {mass}
+        \l__chemmacros_mass_unit_tl
+      \__chemmacros_reactants_add_property:NnnV \l__chemmacros_tmpa_seq
+        {#2}
+        {volume}
+        \l__chemmacros_volume_unit_tl
+      \str_if_eq:VnT \l__chemmacros_reactants_main_str {amount}
+        {
+          \__chemmacros_reactants_add_property:NnnV \l__chemmacros_tmpa_seq
+            {#2}
+            {amount}
+            \l__chemmacros_amount_unit_tl
+        }
+      \str_if_eq:VnT \l__chemmacros_reactants_main_str {equiv}
+        {
+          \__chemmacros_reactants_add_property:NnnV \l__chemmacros_tmpa_seq
+            {#2}
+            {equiv}
+            \l__chemmacros_equiv_unit_tl
+        }
+      \seq_if_empty:NF \l__chemmacros_tmpa_seq
+        { \seq_use:Nn \l__chemmacros_tmpa_seq {,~} }
+    \group_end:
+  }  
+
+% #1: seq variable
+% #2: key
+% #3: property
+% #4: unit
+\cs_new_protected:Npn \__chemmacros_reactants_add_property:Nnnn #1#2#3#4 
+  {
+    \__chemmacros_reactants_if_property:nnT {#2} {#3}
+      {
+        \seq_put_right:Ne #1 
+          { \qty { \__chemmacros_reactants_item:nn {#2} {#3} } { \exp_not:n {#4} } } 
+      }
+  }
+\cs_generate_variant:Nn \__chemmacros_reactants_add_property:Nnnn {NnnV}  
+  
+% #1: key
+% #2: property (name of solvent)
+% #3: linking text
+\cs_new_protected:Npn \__chemmacros_reactants_add_solvent:Nnn #1#2#3 
+  {
+    \__chemmacros_reactants_if_property:nnT {#1} {#2} 
+      {
+        \c_space_tl
+        \l__chemmacros_solution_name_tl
+        \c_space_tl
+        \__chemmacros_reactants_item:nn {#1} {#2}  
+      }
+  }
+\cs_generate_variant:Nn \__chemmacros_reactants_add_solvent:Nnn {NnV}
+
+% #1: key
+% #2: property 
+% #3: new unit
+\cs_new_protected:Npn \__chemmacros_reactants_change_unit:nnN #1#2#3
+  {
+    \__chemmacros_reactants_if_property:nnT {#1} {#2} 
+      { \prop_get:cnN {l__chemmacros_reactants_#1_prop} {#2} #3 }
+  }
+
+% #1: properties and options
+% #2: key
+\NewDocumentCommand \solvent {O{}m}
+  {
+    \group_begin:
+      \str_set:Nn \l__chemmacros_reactants_name_str {regular}
+      \chemmacros_solvent:nn {#1} {#2}
+    \group_end:
+  }
+  
+% #1: properties and options
+% #2: key
+\NewDocumentCommand \solvents {O{}m}
+  {
+    \group_begin:
+      \bool_if:NTF \l__chemmacros_reactants_acronym_support_bool
+        {
+          \str_set:Nn \l__chemmacros_reactants_name_str {short}
+          \chemmacros_solvent:nn {#1} {#2}
+        }
+        { \msg_error:nnn {chemmacros} {acronym-support} { \solvents } }
+    \group_end:
+  }
+ 
+% #1: properties and options
+% #2: key
+\NewDocumentCommand \solventl {O{}m}
+  {
+    \group_begin:
+      \bool_if:NTF \l__chemmacros_reactants_acronym_support_bool
+        {
+          \str_set:Nn \l__chemmacros_reactants_name_str {long}
+          \chemmacros_solvent:nn {#1} {#2}
+        }
+        { \msg_error:nnn {chemmacros} {acronym-support} { \solventl } }
+    \group_end:
+  }
+  
+% #1: properties and options
+% #2: key
+\NewDocumentCommand \Solvent {O{}m}
+  {
+    \group_begin:
+      \str_set:Nn \l__chemmacros_reactants_name_str {upper}
+      \chemmacros_solvent:nn {#1} {#2}
+    \group_end:
+  }
+
+
+% #1: options and properties
+% #3: key  
+\cs_new_protected:Npn \chemmacros_solvent:nn #1#2
+  {
+    \group_begin:
+      \bool_if:NT \l__chemmacros_reactants_snm_bool
+        {
+          \__chemmacros_reactants_set_properties:nn {#2} {#1}
+          \chemmacros_solvent_name:nn {#1} {#2}
+          \chemmacros_reactants_if_main:nT {#2} {~(}
+          \chemmacros_solvent_properties:nn {#1} {#2}
+          \chemmacros_reactants_if_main:nT {#2} {)}
+        }
+      \bool_if:NT \l__chemmacros_reactants_smn_bool
+        {
+          \__chemmacros_reactants_set_properties:nn {#2} {#1}
+          \chemmacros_solvent_properties:nn {#1} {#2}
+          \chemmacros_reactants_if_main:nT {#2} {~}
+          \chemmacros_solvent_name:nn {#1} {#2}
+        }
+    \group_end:
+  }
+  
+% #1: options and properties
+% #3: key
+\cs_new_protected:Npn \chemmacros_solvent_properties:nn #1#2
+  {
+    \group_begin:
+      \__chemmacros_reactants_set_properties:nn {#2} {#1}
+      \keys_set_known:nn {chemmacros/reactants} {#1}
+        \bool_lazy_or:nnT
+          { \__chemmacros_reactants_if_property_p:nn {#2} {volume} }
+          { \__chemmacros_reactants_if_property_p:nn {#2} {volume-unit} }
+          {
+            \__chemmacros_reactants_change_unit:nnN {#2}
+              {volume-unit}
+              \l__chemmacros_volume_unit_tl 
+            \qty
+              { \__chemmacros_reactants_item:nn {#2} {volume} }
+              { \l__chemmacros_volume_unit_tl }
+            
+          }
+      \group_end:
+  }
+
+% #1: options
+% #2: key 
+\cs_new_protected:Npn \chemmacros_solvent_name:nn #1#2
+  {
+    \group_begin:
+      \keys_set_known:nn {chemmacros/reactants} {#1}
+      \str_case:Vn \l__chemmacros_reactants_name_str
+        {
+          {regular}
+          { \__chemmacros_reactants_item:nn {#2} {name} }
+          {upper}
+          { \__chemmacros_reactants_item:nn {#2} {upper-name} }
+          {short}
+          {
+            \str_case:Vn \l__chemmacros_reactants_acronym_support_str
+              {
+                {glossaries} { \glsxtrshort {#2} }
+                {acro} { \acs {#2} }
+              }
+           }
+          {long}
+          {
+            \str_case:Vn \l__chemmacros_reactants_acronym_support_str
+              {
+                {glossaries} { \glsxtrlong {#2} }
+                {acro} { \acl {#2} }
+              }
+          }
+        }
+    \group_end:
+  }
+
+% --------------------------------------------------------------------------
+
+% #1: full ID
+\DeclareExpandableDocumentCommand \reactantplain {m}
+  { 
+    \chemmacros_if_package_loaded:nF {hyperref} 
+      {
+        \msg_expandable_error:nnnn
+          {chemmacros}
+          {package-not-loaded}
+          { \reactantplain }
+          {hyperref}
+      }
+    \__chemmacros_reactants_if_property:nnF {#1} {bookmark}
+      { \msg_expandable_error:nnn {chemmacros} {reactant-bookmark} {#1} }
+    \texorpdfstring
+      { \__chemmacros_reactants_item:nn {#1} {name} ~ \cmpd+ {#1} }
+      { \__chemmacros_reactants_item:nn {#1} {bookmark} \space \cmpdplain {#1} }
+  }
+  
+% #1: full ID
+\DeclareExpandableDocumentCommand \Reactantplain {m}
+  { 
+    \chemmacros_if_package_loaded:nF {hyperref} 
+      {
+        \msg_expandable_error:nnnn
+          {chemmacros}
+          {package-not-loaded}
+          { \reactantplain }
+          {hyperref}
+      }
+    \__chemmacros_reactants_if_property:nnF {#1} {upper-bookmark}
+      { \msg_expandable_error:nnn {chemmacros} {reactant-bookmark} {#1} }
+    \texorpdfstring
+      { \__chemmacros_reactants_item:nn {#1} {upper-name} ~ \cmpd+ {#1} }
+      { \__chemmacros_reactants_item:nn {#1} {upper-bookmark} \space \cmpdplain {#1} }
+  }
+  
+  
+% #1: main Id
+% #2: sub ID
+\DeclareExpandableDocumentCommand \submainreactantplain {mm}
+  { 
+    \chemmacros_if_package_loaded:nF {hyperref} 
+      {
+        \msg_expandable_error:nnnn
+          {chemmacros}
+          {package-not-loaded}
+          { \submainreactantplain }
+          {hyperref}
+      }
+    \__chemmacros_reactants_if_property:nnF
+      { #1 \l_chemnum_compound_separator_tl #2 }
+      {bookmark}
+      { \msg_expandable_error:nnn {chemmacros} {reactant-bookmark} {#1.#2} }
+    \texorpdfstring
+      {
+        \__chemmacros_reactants_item:nn
+          { #1 \l_chemnum_compound_separator_tl #2 }
+          {name}
+        \c_space_tl
+        \cmpd+ {#1.#2}
+      }
+      {
+        \__chemmacros_reactants_item:nn
+          { #1 \l_chemnum_compound_separator_tl #2 }
+          {bookmark}
+        \space \submaincmpdplain {#1} {#2}
+      }
+  }
+  
+
+% #1: main Id
+% #2: sub ID
+\DeclareExpandableDocumentCommand \Submainreactantplain {mm}
+  { 
+    \chemmacros_if_package_loaded:nF {hyperref} 
+      {
+        \msg_expandable_error:nnnn
+          {chemmacros}
+          {package-not-loaded}
+          { \submainreactantplain }
+          {hyperref}
+      }
+    \__chemmacros_reactants_if_property:nnF
+      { #1 \l_chemnum_compound_separator_tl #2 }
+      {upper-bookmark}
+      { \msg_expandable_error:nnn {chemmacros} {reactant-bookmark} {#1.#2} }
+    \texorpdfstring
+      {
+        \__chemmacros_reactants_item:nn
+          { #1 \l_chemnum_compound_separator_tl #2 }
+          {upper-name}
+        \c_space_tl
+        \cmpd+ {#1.#2}
+      }
+      {
+        \__chemmacros_reactants_item:nn
+          { #1 \l_chemnum_compound_separator_tl #2 }
+          {upper-bookmark}
+        \space \submaincmpdplain {#1} {#2}
+      }
+  }
+  
+
+% #1: full ID
+\DeclareExpandableDocumentCommand \solventplain {m}
+  { 
+    \chemmacros_if_package_loaded:nF {hyperref} 
+      {
+        \msg_expandable_error:nnnn
+          {chemmacros}
+          {package-not-loaded}
+          { \solventplain }
+          {hyperref}
+        }
+      \__chemmacros_reactants_if_property:nnF {#1} {bookmark}
+        { \msg_expandable_error:nnn {chemmacros} {reactant-bookmark} {#1} }
+    \texorpdfstring
+      { \__chemmacros_reactants_item:nn {#1} {name} ~ }
+      { \__chemmacros_reactants_item:nn {#1} {bookmark} ~ }
+  } 
+  
+% #1: full ID
+\DeclareExpandableDocumentCommand \Solventplain {m}
+  { 
+    \chemmacros_if_package_loaded:nF {hyperref} 
+      {
+        \msg_expandable_error:nnnn
+          {chemmacros}
+          {package-not-loaded}
+          { \solventplain }
+          {hyperref}
+        }
+      \__chemmacros_reactants_if_property:nnF {#1} {upper-bookmark}
+        { \msg_expandable_error:nnn {chemmacros} {reactant-bookmark} {#1} }
+    \texorpdfstring
+      { \__chemmacros_reactants_item:nn {#1} {upper-name} ~ }
+      { \__chemmacros_reactants_item:nn {#1} {upper-bookmark} ~ }
+  } 
+  
+% --------------------------------------------------------------------------
+% #1: star: include ID in table
+\NewDocumentCommand \printreactants {s}
+  {
+  \group_begin:
+     \chemmacros_set_keys:nn {reactants} { switch = false }
+      \int_step_variable:nNn
+        { \seq_count:N \g_chemnum_initiated_compounds_seq }
+        \l__chemmacros_reactants_tmpa_tl 
+        {
+          \seq_put_right:Nx 
+            \l__chemmacros_reactants_tmpa_seq
+            {
+              \chemnum_cmpd:nnne { \c_false_bool } { \c_true_bool } {}
+                {
+                  \seq_item:NV
+                    \g_chemnum_initiated_compounds_seq
+                    \l__chemmacros_reactants_tmpa_tl
+                }
+              & 
+              \bool_if:nT {#1}
+                {
+                  \seq_item:NV
+                    \g_chemnum_initiated_compounds_seq
+                    \l__chemmacros_reactants_tmpa_tl
+                  &
+                }
+              % TODO: expl3-command ??
+              \solvent
+                {
+                  \seq_item:NV
+                    \g_chemnum_initiated_compounds_seq
+                    \l__chemmacros_reactants_tmpa_tl
+                }
+              \tabularnewline
+            }
+          \tl_set:Nx
+            \l__chemmacros_reactants_tmpb_tl
+            {
+              \seq_item:NV
+                \g_chemnum_initiated_compounds_seq
+                \l__chemmacros_reactants_tmpa_tl
+            }
+          \chemmacros_reactants_list_subreactant:Vn
+            \l__chemmacros_reactants_tmpb_tl
+            {#1}
+        }
+      % TODO: longtable ?
+      %       table customizable?
+      % first draft of two styles
+      \par
+      \noindent
+      \bool_if:NTF \l__chemmacros_reactants_printreactants_style_bool
+        {
+          \str_case:Vn \l__chemmacros_reactants_printreactants_style_str
+            {
+              {xltabular}
+              {
+                \chemmacros_if_package_loaded:nTF {xltabular}
+                  {	  
+                    \bool_if:nTF {#1}
+                    {
+                      \begin
+                        {xltabular}
+                        { \textwidth }
+                        { @{}ll>{\raggedright\arraybackslash}X@{} }
+                    }
+                    {
+                      \begin
+                        {xltabular}
+                        { \textwidth }
+                        { @{}l>{\raggedright\arraybackslash}X@{} }
+                    }
+                   \seq_use:Nn \l__chemmacros_reactants_tmpa_seq { }
+				   \end{xltabular}
+				  }
+				  {
+                    \msg_expandable_error:nnnn
+                      {chemmacros}
+                      {package-not-loaded}
+                      { \printreactants }
+                      {xltabular}
+				  }
+			  }
+              {longtable}
+              {
+                \chemmacros_if_package_loaded:nTF {longtable}
+                  {	  
+                    \bool_if:nTF {#1}
+                    {
+                      \begin
+                        {longtable}[l]
+                        { @{}ll>{\raggedright\arraybackslash}p{0.6\textwidth}@{} }
+                    }
+                    {
+                      \begin
+                        {longtable}[l]
+                        { @{}l>{\raggedright\arraybackslash}p{0.9\textwidth}@{} }
+                    }
+                  \seq_use:Nn \l__chemmacros_reactants_tmpa_seq { }
+                  \end{longtable}
+				  }
+				  {
+                    \msg_expandable_error:nnnn
+                      {chemmacros}
+                      {package-not-loaded}
+                      { \printreactants }
+                      {longtable}
+				  }
+			  }
+			}
+	    }
+	    {
+	      \msg_warning:nn {chemmacros} {missing-printreactants-style}
+	    }
+    \group_end:
+  }
+
+% #1: full ID
+% #2: star, include ID in table
+\cs_new_protected:Npn \chemmacros_reactants_list_subreactant:nn #1#2
+  {
+    \chemnum_if_subcompounds:nT {#1}
+      {
+        \int_step_variable:nNn
+          { \chemnum_count_subcompounds:n {#1} } 
+          \l__chemmacros_reactants_tmpa_tl 
+          {
+            \seq_put_right:Nx 
+            \l__chemmacros_reactants_tmpa_seq
+              {
+                \chemnum_cmpd:nnne { \c_false_bool } { \c_true_bool } {}
+                  {
+                    \exp_not:n {#1}
+                    \exp_not:V \l_chemnum_compound_separator_tl
+                    \chemnum_get_subcompound:nV
+                      {#1}
+                      \l__chemmacros_reactants_tmpa_tl
+                  }
+                & 
+                \bool_if:nT {#2}
+                  {
+                    #1
+                    \l_chemnum_compound_separator_tl
+                    \chemnum_get_subcompound:nV
+                      {#1}
+                      \l__chemmacros_reactants_tmpa_tl
+                    &
+                  }
+                % TODO: expl3-command ??
+                \solvent
+                  {
+                    #1
+                    \l_chemnum_compound_separator_tl
+                    \chemnum_get_subcompound:nV
+                      {#1}
+                      \l__chemmacros_reactants_tmpa_tl
+                  }
+                \tabularnewline
+              }
+          }
+      }
+  }
+\cs_generate_variant:Nn \chemmacros_reactants_list_subreactant:nn {V}
+
+% --------------------------------------------------------------------------
+\ChemModuleEnd
+\ChemModule{translations}{2022/01/16 translations for defined keys at one place}
+
+% --------------------------------------------------------------------------
+\chemmacros_declare_translations:nn {K-acid}
+  {
+    German = \mathrm {s} ,
+    Danish = \mathrm {s} ,
+    Dutch  = \mathrm {z}
+  }
+
+\chemmacros_declare_translations:nn {K-acid}
+  { Danish = \mathrm {v} }
+
+% --------------------------------------------------------------------------
+\chemmacros_declare_translations:nn {phase-sld}
+  {
+    fallback = s ,
+    German   = f
+  }
+
+\chemmacros_declare_translations:nn {phase-lqd}
+  {
+    fallback = l ,
+    German   = f\/l
+  }
+
+\chemmacros_declare_translations:nn {phase-gas}
+  { fallback = g }
+
+\chemmacros_declare_translations:nn {phase-aq}
+  { fallback = aq }
+
+% --------------------------------------------------------------------------
+\chemmacros_declare_translations:nn {solution}
+  {
+    fallback = solution~ in ,
+    English  = solution~ in ,
+    German   = L\"osung~ in ,
+  }
+
+% --------------------------------------------------------------------------
+\chemmacros_declare_translations:nn {list-of-reactions}
+  {
+    fallback  = List~ of~ Reactions ,
+    English   = List~ of~ Reactions ,
+    German    = Reaktionsverzeichnis ,
+    Italian   = Elenco~ delle~ reazioni ,
+    French    = Table~ des~ r\'{e}actions ,
+    Dutch     = Lijst~ van~ reacties ,
+    Norwegian = Reaksjonsliste ,
+    Nynorsk   = Reaksjonsliste ,
+    Danish    = Reaktionsliste
+  }
+
+\chemmacros_declare_translations:nn {reaction}
+  {
+    fallback  = reaction ,
+    English   = reaction ,
+    German    = Reaktion ,
+    Italian   = reazione ,
+    French    = r\'{e}action ,
+    Dutch     = reactie ,
+    Norwegian = reaksjon ,
+    Nynorsk   = reaksjon ,
+    Danish    = reaktion
+  }
+
+\chemmacros_declare_translations:nn {reactions}
+  {
+    fallback  = reactions ,
+    English   = reactions ,
+    German    = Reaktionen ,
+    Italian   = reazioni ,
+    French    = r\'{e}actions ,
+    Dutch     = reacties ,
+    Norwegian = reaksjoner ,
+    Nynorsk   = reaksjonar ,
+    Danish    = reaktioner
+  }
+
+\chemmacros_declare_translations:nn {Reaction}
+  {
+    fallback  = Reaction ,
+    English   = Reaction ,
+    German    = Reaktion ,
+    Italian   = Reazione ,
+    French    = R\'{e}action ,
+    Dutch     = Reactie ,
+    Norwegian = Reaksjon ,
+    Nynorsk   = Reaksjon ,
+    Danish    = Reaktion
+  }
+
+\chemmacros_declare_translations:nn {Reactions}
+  {
+    fallback  = Reactions ,
+    English   = Reactions ,
+    German    = Reaktionen ,
+    Italian   = Reazioni ,
+    French    = R\'{e}actions ,
+    Dutch     = Reacties ,
+    Norwegian = Reaksjoner ,
+    Nynorsk   = Reaksjonar ,
+    Danish    = Reaktioner
+ }
+
+% --------------------------------------------------------------------------
+\chemmacros_declare_translations:nn {scheme-name}
+  {
+    fallback  = Scheme ,
+    English   = Scheme ,
+    German    = Schema ,
+    Norwegian = Skjema ,
+    Nynorsk   = Skjema ,
+    Danish    = Skema
+  }
+
+\chemmacros_declare_translations:nn {scheme-list}
+  {
+    fallback  = List~ of~ Schemes ,
+    English   = List~ of~ Schemes ,
+    German    = Verzeichnis~ der~ Schemata ,
+    Norwegian = Skjemaliste ,
+    Nynorsk   = Skjemaliste ,
+    Danish    = Skemaliste
+  }
+
+\chemmacros_declare_translations:nn {scheme}
+  {
+    fallback  = scheme ,
+    English   = scheme ,
+    German    = Schema ,
+    Norwegian = skjema ,
+    Nynorsk   = skjema ,
+    Danish    = skema
+  }
+
+\chemmacros_declare_translations:nn {Scheme}
+  {
+    fallback  = Scheme ,
+    English   = Scheme ,
+    German    = Schema ,
+    Norwegian = Skjema ,
+    Nynorsk   = Skjema ,
+    Danish    = Skema
+  }
+
+\chemmacros_declare_translations:nn {schemes}
+  {
+    fallback  = schemes ,
+    English   = schemes ,
+    German    = Schemata ,
+    Norwegian = skjema ,
+    Nynorsk   = skjema ,
+    Danish    = skemaer
+  }
+
+\chemmacros_declare_translations:nn {Schemes}
+  {
+    fallback  = Schemes ,
+    English   = Schemes ,
+    German    = Schemata ,
+    Norwegian = Skjema ,
+    Nynorsk   = Skjema ,
+    Danish    = Skemaer
+  }
+
+% --------------------------------------------------------------------------
+\ChemModuleEnd

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros4.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros4.sty	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros4.sty	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,4100 +0,0 @@
-% --------------------------------------------------------------------------
-% the CHEMMACROS package
-%
-%   comprehensive support for typesetting chemistry documents
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-\RequirePackage{ expl3 , xparse , l3keys2e }
-\def\chemmacros at version{4.7a}
-\def\chemmacros at date{2015/08/16}
-
-\ExplSyntaxOn
-\ProvidesExplPackage
-  {chemmacros4}
-  {\chemmacros at date}
-  {\chemmacros at version}
-  {\c_chemmacros_info_tl \c_space_tl (CN)}
-
-% --------------------------------------------------------------------------
-% variants of kernel commands:
-\cs_generate_variant:Nn \prop_if_in:NnTF   { NV , Nx }
-\cs_generate_variant:Nn \prop_put:Nnn      { NV , NVV , NVx }
-\cs_generate_variant:Nn \prop_get:NnNTF    { NV }
-\cs_generate_variant:Nn \tl_set_rescan:Nnn { NnV }
-\cs_generate_variant:Nn \tl_if_eq:nnTF     { V }
-\cs_generate_variant:Nn \tl_const:cn       { cV }
-
-% --------------------------------------------------------------------------
-% load required packages
-% the technical ones:
-\RequirePackage { environ , scrlfile , etoolbox , translations }
-% related to other topics like mathematics or graphics:
-\RequirePackage { xfrac , siunitx , tikz, mathtools , bm }
-% other packages of this bundle -- ghsystem is not loaded here but at the end
-% of the preamble depending on a package option:
-\RequirePackage { chemformula , chemgreek }
-% TikZ libraries (the don't like expl3 syntax):
-\ExplSyntaxOff
-\usetikzlibrary{calc,arrows}
-\ExplSyntaxOn
-
-% --------------------------------------------------------------------------
-% boolean variables for the package options
-\bool_new:N      \l__chemmacros_xspace_bool
-\bool_set_true:N \l__chemmacros_xspace_bool
-
-\bool_new:N      \l__chemmacros_circled_bool
-\bool_set_true:N \l__chemmacros_circled_bool
-\bool_new:N      \l__chemmacros_circled_formal_bool
-\bool_set_true:N \l__chemmacros_circled_formal_bool
-\bool_new:N      \l__chemmacros_circled_chem_bool
-\bool_set_true:N \l__chemmacros_circled_chem_bool
-
-\bool_new:N      \l__chemmacros_EZ_cool_bool
-\bool_new:N      \l__chemmacros_Nu_mathspec_bool
-\bool_new:N      \l__chemmacros_chemstyle_bool
-\bool_new:N      \l__chemmacros_hyperref_bool
-\bool_new:N      \l__chemmacros_varioref_bool
-\bool_new:N      \l__chemmacros_chemfig_bool
-\bool_new:N      \l__chemmacros_ghsystem_bool
-% \bool_set_true:N \l__chemmacros_ghsystem_bool
-
-\bool_new:N      \l__chemmacros_iupac_restricted_bool
-\bool_new:N      \l__chemmacros_iupac_strict_bool
-\bool_new:N      \l__chemmacros_in_document_bool
-
-\AtBeginDocument
-  {
-    \bool_set_true:N \l__chemmacros_in_document_bool
-    \@ifpackageloaded { chemstyle }
-      { \bool_set_true:N \l__chemmacros_chemstyle_bool }
-      { \bool_set_false:N \l__chemmacros_chemstyle_bool }
-    \@ifpackageloaded { varioref }
-      { \bool_set_true:N \l__chemmacros_varioref_bool }
-      { \bool_set_false:N \l__chemmacros_varioref_bool }
-    \@ifpackageloaded { hyperref }
-      { \bool_set_true:N \l__chemmacros_hyperref_bool }
-      { \bool_set_false:N \l__chemmacros_hyperref_bool }
-    \@ifpackageloaded { chemfig }
-      { \bool_set_true:N \l__chemmacros_chemfig_bool }
-      { \bool_set_false:N \l__chemmacros_chemfig_bool }
-  }
-
-% --------------------------------------------------------------------------
-% warning / error messages
-\msg_new:nnnn { chemmacros } { language-not-defined }
-  { The~ language~ `#1'~ is~ not~ defined~ by~ chemmacros. }
-  {
-    You~ chose~ the~ language~ `#1'~ which~ is~ not~ defined~ by~ chemmacros.~
-    `english'~ is~ used~ instead.~ If~ you~ just~ mistyped~ try~ again!~
-    Otherwise~ contact~ the~ author~ and~ he'll~ probably~ add~ your~ language.
-  }
-
-\msg_new:nnnn { chemmacros } { already-defined }
-  { The~ command~ #1~ is~ already~ defined. }
-  {
-    The~ command~ #1~ has~ already~ been~ otherwise.~ chemmacros~ also~ tries~
-    to~ define~ it~ and~ fails.~
-  }
-
-\msg_new:nnnn { chemmacros } { not-defined }
-  { The~ command~ #1~ is~ not~ defined,~ yet. }
-  {
-    The~ command~ #1~ is~ not~ defined,~ yet.~ chemmacros~ tries~ to~
-    redefine~ it~ and~ fails.~
-  }
-
-\msg_new:nnnn { chemmacros } { option-deprecated }
-  { The~ option~ `#1'~ is~ deprecated.~ I~ will~ ignore~ it. }
-  {
-    The~ package~ option~ `#1'~ is~ deprecated~ and~ not~ used~ by~
-    chemmacros~ any~ more.~ It~ will~ therefore~ simply~ be~ ignored.
-  }
-
-\msg_new:nnnn { chemmacros } { command-deprecated }
-  {
-    The~ command~ \token_to_str:N #1 \c_space_tl is~ deprecated.~ Use~
-    \token_to_str:N #2 \c_space_tl instead.
-  }
-  {
-    The~ command~ \token_to_str:N #1 \c_space_tl is~ deprecated.~ Use~
-    \token_to_str:N #2 \c_space_tl instead.
-  }
-
-\msg_new:nnnn { chemmacros } { command-dropped }
-  {
-    The~ command~ \token_to_str:N #1 \c_space_tl has~ been~ dropped.~ I'm~
-    sorry.
-  }
-  {
-    The~ command~ \token_to_str:N #1 \c_space_tl has~ been~ dropped.~ I'm~
-    sorry.
-  }
-
-\msg_new:nnnn { chemmacros } { new-particle }
-  {
-    The~ command~ sequence~ \token_to_str:N #1 \c_space_tl is~ already~
-    defined.
-  }
-  {
-    You've~ tried~ to~ define~ a~ particle~ with~ \token_to_str:N
-    \NewChemParticle ,~ but~ the~ command~ sequence~ \token_to_str:N #1
-    \c_space_tl already~ exists.~ Please~ choose~ another~ name.
-  }
-
-\msg_new:nnnn { chemmacros } { renew-particle }
-  { The~ particle~ \token_to_str:N #1 \c_space_tl is~ not~ defined. }
-  {
-    You've~ tried~ to~ renew~ the~ particle~ \token_to_str:N #1 ,~ but~ it~
-    doesn't~ exist.
-  }
-
-\msg_new:nnnn { chemmacros } { new-latin }
-  {
-    The~ command~ sequence~ \token_to_str:N #1 \c_space_tl is~ already~
-    defined.
-  }
-  {
-    You've~ tried~ to~ define~ a~ latin~ phrase~ with~\token_to_str:N
-    \NewChemLatin ,~ but~ the~ command~ sequence~ \token_to_str:N #1
-    \c_space_tl already~ exists.~ Please~ choose~ another~ name.
-  }
-
-\msg_new:nnnn { chemmacros } { renew-latin }
-  { The~ latin~ phrase \token_to_str:N #1 \c_space_tl is~ not~ defined. }
-  {
-    You've~ tried~ to~ renew~ the~ latin~ phrase~ \token_to_str:N #1 ,~ but~
-    it~ doesn't~ exist.
-  }
-
-\msg_new:nnnn { chemmacros } { new-nmr }
-  {
-    The~ command~ sequence~ \token_to_str:N #1 \c_space_tl is~ already~
-    defined.
-  }
-  {
-    You've~ tried~ to~ define~ a~ NMR~ command~ with~\token_to_str:N
-    \NewChemParticle ,~ but~ the~ command~ sequence~ \token_to_str:N #1
-    \c_space_tl already~ exists.~ Please~ choose~ another~ name.
-  }
-
-\msg_new:nnnn { chemmacros } { renew-nmr }
-  { The~ NMR~ command~ \token_to_str:N #1 \c_space_tl is~ not~ defined. }
-  {
-    You've~ tried~ to~ renew~ the~ NMR~ command~ \token_to_str:N #1 ,~ but~
-    it~ doesn't~ exist.
-  }
-
-\msg_new:nnnn { chemmacros } { new-phase }
-  {
-    The~ command~ sequence~ \token_to_str:N #1 \c_space_tl is~ already~
-    defined.
-  }
-  {
-    You've~ tried~ to~ define~ a~ phase~ with~ \token_to_str:N
-    \NewChemPhase ,~ but~ the~ command~ sequence~ \token_to_str:N #1
-    \c_space_tl already~ exists.~ Please~ choose~ another~ name.
-  }
-
-\msg_new:nnnn { chemmacros } { renew-phase }
-  { The~ phase~ \token_to_str:N #1 \c_space_tl is~ not~ defined. }
-  {
-    You've~ tried~ to~ renew~ the~ phase~ \token_to_str:N #1 ,~ but~ it~
-    doesn't~ exist.
-  }
-
-\msg_new:nnnn { chemmacros } { new-iupac }
-  {
-    The~ iupac~ naming~ command~ \token_to_str:N #1 \c_space_tl is~ already~
-    defined.
-  }
-  {
-    You've~ tried~ to~ define~ a~ iupac~ naming~ command~ with~
-    \token_to_str:N \NewChemIUPAC ,~ but~ the~ iupac~ command~
-    \token_to_str:N #1 \c_space_tl already~ exists.~ Choose~ another~ name~
-    or~ use~ \token_to_str:N \RenewChemIUPAC .
-  }
-
-\msg_new:nnnn { chemmacros } { renew-iupac }
-  {
-    The~ iupac~ naming~ command~ \token_to_str:N #1 \c_space_tl is~ not~
-    defined.
-  }
-  {
-    You've~ tried~ to~ renew~ the~ iupac~ command~ \token_to_str:N #1 ,~ but~
-    it~ doesn't~ exist.~ Use~ \token_to_str:N \NewChemIUPAC \c_space_tl
-    instead.
-  }
-
-\msg_new:nnnn { chemmacros } { let-iupac }
-  {
-    The~ iupac~ naming~ command~ \token_to_str:N #2 \c_space_tl is~ not~
-    defined.
-  }
-  {
-    You've~ tried~ to~ let~ the~ iupac~ command~ \token_to_str:N #1 ~ to~ the~
-    iupac~ command~ \token_to_str:N #2 ,~ but~ the~ latter~ doesn't~ exist.~
-    Use~ \token_to_str:N \NewChemIUPAC \c_space_tl instead~ or~declare~
-    \token_to_str:N #2 \c_space_tl first.
-  }
-
-\msg_new:nnnn { chemmacros } { ox }
-  { \token_to_str:N \ox \c_space_tl : ~ #1 ~ \msg_line_context: . }
-  { \token_to_str:N \ox \c_space_tl : ~ #1 ~ \msg_line_context: . }
-
-\msg_new:nnnn { chemmacros } { OX }
-  { \token_to_str:N \OX \c_space_tl : ~ #1 ~ \msg_line_context: . }
-  { \token_to_str:N \OX \c_space_tl : ~ #1 ~ \msg_line_context: . }
-
-\msg_new:nnnn { chemmacros } { redox }
-  { \token_to_str:N \redox \c_space_tl : ~ #1 ~ \msg_line_context: . }
-  { \token_to_str:N \redox \c_space_tl : ~ #1 ~ \msg_line_context: . }
-
-\msg_new:nnnn { chemmacros } { chemfig }
-  {
-    You~ need~ to~ load~ the~ `chemfig'~ package~ in~ order~ to~ make~
-    \exp_after:wN \token_to_str:N \cs:w #1 \cs_end: \c_space_tl work~
-    properly~ \msg_line_context: .
-  }
-  {
-    You~ need~ to~ load~ the~ `chemfig'~ package~ in~ order~ to~ make~
-    \exp_after:wN \token_to_str:N \cs:w #1 \cs_end: \c_space_tl work~
-    properly~ \msg_line_context: .
-  }
-
-\msg_new:nnnn { chemmacros } { new-state }
-  {
-    The~ state~ \exp_after:wN \token_to_str:N \cs:w #1 \cs_end: \c_space_tl
-    already~ exists.~ You~ need~ to~ use~ \token_to_str:N \RenewChemState
-    \c_space_tl to~ alter~ it~ \msg_line_context: .
-  }
-  {
-    The~ state~ \exp_after:wN \token_to_str:N \cs:w #1 \cs_end: \c_space_tl
-    already~ exists.~ You~ need~ to~ use~ \token_to_str:N \RenewChemState
-    \c_space_tl to~ alter~ it~ \msg_line_context: .
-  }
-
-\msg_new:nnnn { chemmacros } { renew-state }
-  {
-    The~ state~ \exp_after:wN \token_to_str:N \cs:w #1 \cs_end: \c_space_tl
-    isn't~ set~ up~ yet.~ You~ need~ to~ use~ \token_to_str:N
-    \NewChemState \c_space_tl to~ create~ it~ \msg_line_context: .
-  }
-  {
-    The~ state~ \exp_after:wN \token_to_str:N \cs:w #1 \cs_end: \c_space_tl
-    isn't~ set~ up~ yet.~ You~ need~ to~ use~ \token_to_str:N
-    \NewChemState \c_space_tl to~ create ~it~ \msg_line_context: .
-  }
-
-\msg_new:nnn { chemmacros } { state-syntax }
-  {
-    You're~ using~ a~ no~ longer~ recommended~ syntax~ to~ (re-)define~ a~
-    state~ variable~ \msg_line_context: .~ This~ syntax~ may~ deprecate~ and~
-    be~ removed~ in~ the~ future.
-  }
-
-% declare an option as deprecated:
-\cs_new_protected:Npn \chemmacros_option_deprecated:n #1
-  { \msg_warning:nnn { chemmacros } { option-deprecated } { #1 } }
-
-% define a deprecated command with hints to the corresponding new one:
-\cs_new_protected:Npn \chemmacros_define_deprecated:NN #1#2
-  {
-    \cs_set_protected:Npn #1
-      {
-        \msg_warning:nnxx { chemmacros } { command-deprecated }
-          { #1 } { #2 }
-        #2
-      }
-  }
-
-\NewDocumentCommand \DeclareChemDeprecated { mm }
-  { \chemmacros_define_deprecated:NN #1 #2 }
-
-% define a command as dropped!
-\cs_new_protected:Npn \chemmacros_define_dropped:N #1
-  {
-    \cs_set_protected:Npn #1
-      { \msg_error:nnn { chemmacros } { command-dropped } { #1 } }
-  }
-
-\NewDocumentCommand \DeclareChemDropped { m }
-  { \chemmacros_define_dropped:N #1 }
-
-% --------------------------------------------------------------------------
-% temporary variables
-\tl_new:N  \l__chemmacros_tmpa_tl
-\tl_new:N  \l__chemmacros_tmpb_tl
-\int_new:N \l__chemmacros_tmpa_int
-\box_new:N \l__chemmacros_tmpa_box
-
-% --------------------------------------------------------------------------
-% language settings:
-\bool_new:N      \l__chemmacros_language_auto_bool
-\bool_set_true:N \l__chemmacros_language_auto_bool
-% this token list will hold the chosen language for chemmacros; since the
-% language is either chosen automatically or by option it is only available at
-% begin document
-\tl_new:N        \l_chemmacros_language_tl
-\tl_set:Nn       \l_chemmacros_language_tl { english }
-\tl_new:N        \l__chemmacros_current_language_tl
-
-% translate the key #1
-\cs_new:Npn \chemmacros_translate:n #1
-  {
-    \bool_if:NTF \l__chemmacros_language_auto_bool
-      { \GetTranslation{#1} }
-      { \GetTranslationFor{\l_chemmacros_language_tl}{#1} }
-  }
-
-\AtBeginDocument{
-  \bool_if:NTF \l__chemmacros_language_auto_bool
-    {
-      \tl_set:Nx \l_chemmacros_language_tl
-        { \@trnslt at language{\@trnslt at current@language} }
-    }
-    {
-      \tl_set_eq:NN
-        \l_chemmacros_language_tl
-        \l__chemmacros_current_language_tl
-    }
-}
-
-% --------------------------------------------------------------------------
-% package options
-%   circled     => circle charges
-%   detect-bold => behaviour when font series bold
-%   EZ          => cool or chemmacros version of \E
-%   german      => change pKA => pKS etc
-%   iupac       => behaviour of nomenclature commands
-%   ngerman     => an alias :)
-%   ghsystem    => load ghsystem or don't
-%   method      => use `chemformula' or `mhchem'
-%   strict      => errors or warnings
-%   synchronize => let particles et.al. adapt chemformula's font selection
-%   ugreek      => behaviour of \chemDelta, \chemalpha, ...
-%   version=1   => compatibility for documents set with v1.*
-%   xspace      => add an \xspace after a whole bunch of macros
-
-% this boolean has to be public since the other packages of the bundle may
-% want to know its value
-
-\bool_new:N \l__chemmacros_detect_bold_bool
-\bool_set_true:N \l__chemmacros_detect_bold_bool
-
-\bool_new:N \l__chemmacros_option_greek_set_bool
-\bool_new:N \l__chemmacros_use_upgreek_bool
-\bool_new:N \l__chemmacros_use_textgreek_bool
-\bool_new:N \l__chemmacros_use_kpfonts_bool
-\bool_new:N \l__chemmacros_use_newtx_bool
-
-\cs_new:Npn \chemmacros_inner_font: {}
-
-\keys_define:nn { chemmacros / option }
-  {
-    compatibility      .code:n = ,
-    bpchem             .code:n = \chemmacros_option_deprecated:n { bpchem } ,
-    circletype         .choice: ,
-    circletype / math  .code:n  =
-      { \bool_set_false:N \l__chemmacros_circled_chem_bool } ,
-    circletype / chem  .code:n  =
-      { \bool_set_true:N \l__chemmacros_circled_chem_bool } ,
-    circletype         .default:n = chem ,
-    circled            .choice: ,
-    circled / none     .code:n =
-      {
-        \bool_set_false:N \l__chemmacros_circled_bool
-        \bool_set_false:N \l__chemmacros_circled_formal_bool
-      } ,
-    circled / formal   .code:n =
-      {
-        \bool_set_true:N \l__chemmacros_circled_bool
-        \bool_set_true:N \l__chemmacros_circled_formal_bool
-      } ,
-    circled / all      .code:n =
-      {
-        \bool_set_true:N \l__chemmacros_circled_bool
-        \bool_set_false:N \l__chemmacros_circled_formal_bool
-      } ,
-    circled            .default:n  = all ,
-    detect-bold        .code:n = \chemmacros_option_deprecated:n { detect-bold } ,
-    EZ                 .code:n = \chemmacros_option_deprecated:n { EZ } ,
-    german             .code:n     =
-      \tl_set:Nn \l__chemmacros_current_language_tl { german } ,
-    ngerman            .code:n     =
-      \tl_set:Nn \l__chemmacros_current_language_tl { ngerman } ,
-    ghsystem           .bool_set:N = \l__chemmacros_ghsystem_bool ,
-    ghsystem           .default:n  = true ,
-    iupac              .choice: ,
-    iupac / restricted .code:n     =
-      \bool_set_true:N \l__chemmacros_iupac_restricted_bool
-      \bool_set_false:N \l__chemmacros_iupac_strict_bool ,
-    iupac / auto       .code:n     =
-      \bool_set_false:N \l__chemmacros_iupac_restricted_bool
-      \bool_set_false:N \l__chemmacros_iupac_strict_bool ,
-    iupac / strict     .code:n     =
-      \bool_set_false:N \l__chemmacros_iupac_restricted_bool
-      \bool_set_true:N \l__chemmacros_iupac_strict_bool ,
-    language           .code:n     =
-      \tl_if_eq:nnTF { #1 } { auto }
-        { \bool_set_true:N \l__chemmacros_language_auto_bool }
-        {
-          \bool_set_false:N \l__chemmacros_language_auto_bool
-          \tl_set:Nn \l__chemmacros_current_language_tl { #1 }
-        } ,
-    method             .choice: ,
-    method / chemformula   .code:n     =
-      \chemmacros_option_deprecated:n { method } ,
-    method / mhchem    .code:n     =
-      \chemmacros_option_deprecated:n { method } ,
-    Nu                 .choice: ,
-    Nu / mathspec      .code:n     =
-     \bool_set_true:N \l__chemmacros_Nu_mathspec_bool ,
-    Nu / chemmacros    .code:n     =
-     \bool_set_false:N \l__chemmacros_Nu_mathspec_bool ,
-    strict             .code:n     =
-      \chemmacros_option_deprecated:n { strict } ,
-    synchronize        .choice: ,
-    synchronize / true .code:n     =
-      \cs_set_eq:NN \chemmacros_inner_font: \chemformula_font_inner: ,
-    synchronize / false .code:n = \cs_set:Nn \chemmacros_inner_font: {} ,
-    synchronize        .default:n  = true ,
-    greek              .choice: ,
-    greek / upgreek    .code:n     =
-      \chemgreek_activate_mapping:n { upgreek }
-      \bool_set_true:N \l__chemmacros_option_greek_set_bool ,
-    greek / textgreek   .code:n    =
-      \chemgreek_activate_mapping:n { textgreek }
-      \bool_set_true:N \l__chemmacros_option_greek_set_bool ,
-    greek / kpfonts    .code:n     =
-      \chemgreek_activate_mapping:n { kpfonts }
-      \bool_set_true:N \l__chemmacros_option_greek_set_bool ,
-    greek / newtx      .code:n     =
-      \chemgreek_activate_mapping:n { newtx }
-      \bool_set_true:N \l__chemmacros_option_greek_set_bool ,
-    greek / mathdesign .code:n     =
-      \chemgreek_activate_mapping:n { mathdesign }
-      \bool_set_true:N \l__chemmacros_option_greek_set_bool ,
-    greek / fourier    .code:n     =
-      \chemgreek_activate_mapping:n { fourier }
-      \bool_set_true:N \l__chemmacros_option_greek_set_bool ,
-    greek / textalpha  .code:n     =
-      \chemgreek_activate_mapping:n { textalpha }
-      \bool_set_true:N \l__chemmacros_option_greek_set_bool ,
-    greek / math       .code:n     =
-      \chemgreek_activate_mapping:n { default }
-      \bool_set_true:N \l__chemmacros_option_greek_set_bool ,
-    greek / auto       .code:n     =
-      \bool_set_false:N \l__chemmacros_option_greek_set_bool ,
-    greek              .default:n  = auto ,
-    upgreek            .code:n = \chemmacros_option_deprecated:n { upgreek } ,
-    version            .code:n = \chemmacros_option_deprecated:n { version } ,
-    cmversion          .code:n = \chemmacros_option_deprecated:n { cmversion } ,
-    cmversion          .choice: ,
-    xspace             .bool_set:N = \l__chemmacros_xspace_bool ,
-    xspace             .default:n  = true
-  }
-
-
-
-\ProcessKeysOptions { chemmacros / option }
-
-% --------------------------------------------------------------------------
-% set up a few things:
-% - is `ghsystem' requested?
-% - do we need `xspace'?
-% - what about the greek letters?
-
-\seq_new:N  \l__chemmacros_greek_packages_seq
-\prop_new:N \l__chemmacros_greek_mapping_prop
-
-\cs_new_protected:Npn \chemmacros_add_greek_package_mapping:nn #1#2
-  {
-    \seq_put_right:Nn \l__chemmacros_greek_packages_seq {#1}
-    \prop_put:Nnn \l__chemmacros_greek_mapping_prop {#1} {#2}
-  }
-
-\cs_generate_variant:Nn \chemgreek_activate_mapping:n { V }
-
-\cs_new_protected:Npn \__chemmacros_select_greek_mapping:n #1
-  {
-    \bool_if:NF \l__chemmacros_option_greek_set_bool
-      {
-        \@ifpackageloaded { #1 }
-          {
-            \prop_get:NnN
-              \l__chemmacros_greek_mapping_prop
-              { #1 }
-              \l__chemmacros_tmpa_tl
-            \chemgreek_activate_mapping:V \l__chemmacros_tmpa_tl
-            \bool_set_true:N \l__chemmacros_option_greek_set_bool
-            \seq_map_break:
-          }
-          { }
-      }
-  }
-
-\chemmacros_add_greek_package_mapping:nn {upgreek}    {upgreek}
-\chemmacros_add_greek_package_mapping:nn {textgreek}  {textgreek}
-\chemmacros_add_greek_package_mapping:nn {mathdesign} {mathdesign}
-\chemmacros_add_greek_package_mapping:nn {kpfonts}    {kpfonts}
-\chemmacros_add_greek_package_mapping:nn {newtxmath}  {newtx}
-\chemmacros_add_greek_package_mapping:nn {fourier}    {fourier}
-\chemmacros_add_greek_package_mapping:nn {textalpha}  {textalpha}
-
-\AtEndPreamble
-  {
-    \bool_if:NT \l__chemmacros_ghsystem_bool
-      { \RequirePackage { ghsystem } }
-    \bool_if:NT \l__chemmacros_xspace_bool
-      { \RequirePackage { xspace } }
-    \seq_map_function:NN
-      \l__chemmacros_greek_packages_seq
-      \__chemmacros_select_greek_mapping:n
-  }
-
-\cs_new_protected:Npn \chemmacros_xspace:
-  { \bool_if:NT \l__chemmacros_xspace_bool { \xspace } }
-
-% --------------------------------------------------------------------------
-% TikZ drawings - helper macros
-\cs_new_protected:Npn \chemmacros_tikz_picture:nn #1#2
-  { \tikzpicture[#1] #2 \endtikzpicture }
-\cs_generate_variant:Nn \chemmacros_tikz_picture:nn { fn,xn }
-
-\cs_new_protected:Npn \chemmacros_tikz_draw:n #1
-  { \draw[#1] }
-\cs_generate_variant:Nn \chemmacros_tikz_draw:n { f,x }
-
-\cs_new_protected:Npn \chemmacros_tikz_node:n #1
-  { \node[#1] }
-\cs_generate_variant:Nn \chemmacros_tikz_node:n { f,x }
-
-\cs_new_protected:Npn \chemmacros_tikz_shade:n #1
-  { \shade[#1] }
-\cs_generate_variant:Nn \chemmacros_tikz_shade:n { f,x }
-
-\cs_new_protected:Npn \chemmacros_tikz_shadedraw:n #1
-  { \shadedraw[#1] }
-\cs_generate_variant:Nn \chemmacros_tikz_shadedraw:n { f,x }
-
-\cs_new_protected:Npn \chemmacros_tikz_node_in_draw:n #1
-  { node[#1] }
-\cs_generate_variant:Nn \chemmacros_tikz_node_in_draw:n { f,x }
-
-% --------------------------------------------------------------------------
-% a few general functions:
-\cs_new_eq:NN \mode_leave_vertical:   \chemformula_leave_vmode:
-\cs_new_eq:NN \chemmacros_ignore_spaces: \tex_ignorespaces:D
-\cs_new_eq:NN \chemmacros_nobreak:       \chemformula_nobreak:
-\cs_new_eq:NN \chemmacros_allow_break:   \chemformula_allow_break:
-\cs_new_eq:NN \chemmacros_skip_nobreak:N \chemformula_skip_nobreak:N
-\cs_new:Npn   \chemmacros_remove_backslash:N #1
-  { \exp_after:wN \use_none:n \token_to_str:N #1 }
-
-\prg_new_protected_conditional:Npnn \chemmacros_if_is_cs:n #1 { T,F,TF }
-  {
-    \tl_set:Nx \l__chemmacros_tmpa_tl { \token_if_cs:NTF #1 { } { x } }
-    \tl_if_blank:VTF \l__chemmacros_tmpa_tl
-      { \prg_return_true: }
-      { \prg_return_false: }
-  }
-
-% detection and handling of bold face:
-\prg_new_protected_conditional:Npnn \chemmacros_if_bold: { T,F,TF }
-  {
-    \seq_if_in:NVTF \l__chemmacros_if_bf_seq \f at series
-      { \prg_return_true: }
-      { \prg_return_false: }
-  }
-
-\seq_new:N  \l__chemmacros_if_bf_seq
-
-\seq_set_split:Nnn \l__chemmacros_if_bf_seq { , }
-  {
-    b , bc , bm , bx , bux ,
-    eb , ebc , ebx , mb ,
-    sb , sbc , sbx ,
-    ub , ubc , ubx
-  }
-
-\cs_new_protected:Npn \chemmacros_bm:n #1
-  {
-    \bool_if:NTF \l__chemmacros_detect_bold_bool
-      { \bm { #1 } }
-      { #1 }
-  }
-
-\cs_new_protected:Npn \chemmacros_bf:n #1
-  {
-    \bool_if:NTF \l__chemmacros_detect_bold_bool
-      { { \normalfont \bfseries #1 } }
-      { { \normalfont #1 } }
-  }
-
-\cs_new_protected:Npn \chemmacros_detect_bold:n #1
-  {
-    \chemmacros_if_bold:TF
-      {
-        \mode_if_math:TF
-          { \chemmacros_bm:n { #1 } }
-          { \chemmacros_bf:n { #1 } }
-      }
-      { #1 }
-  }
-
-% ---------------------------------------------------------------------------
-% transition state symbol
-\cs_new_protected:Npn \__chemmacros_transition_state:
-  {
-    \text
-      {
-        \skip_horizontal:n { .1ex }
-        \hbox_overlap_right:n
-          { \rule { .6ex } { 0pt } \rule { .05ex } { 1.3ex } }
-        \hbox_overlap_right:n { \rule [ .4ex ] { 1.3ex } { .05ex } }
-        \rule [ .85ex ] { 1.3ex } { .05ex }
-        \skip_horizontal:n { .1ex }
-      }
-  }
-
-\cs_new_protected:Npn \chemmacros_transition_state:
-  {
-    \ensuremath
-      {
-        \mathchoice
-          { \displaystyle }
-          { \textstyle }
-          { \scriptstyle }
-          { \scriptscriptstyle }
-        \__chemmacros_transition_state:
-      }
-  }
-
-% \DeclareDocumentCommand?
-\cs_new_eq:NN \transitionstatesymbol \chemmacros_transition_state:
-
-% --------------------------------------------------------------------------
-% let's make use of `chemformula' inside some of `chemmacros' commands:
-\cs_new_protected:Nn \chemmacros_atom:n
-  {
-    \mode_if_math:TF
-      { \text { \chemmacros_inner_font: #1 } }
-      { \group_begin: \chemmacros_inner_font: #1 \group_end: }
-  }
-\cs_generate_variant:Nn \chemmacros_atom:n { V }
-
-\cs_new_protected:Npn \chemmacros_text:n #1
-  { \mode_if_math:TF { \text { #1 } } { #1 } }
-
-\tl_new:N \l__chemmacros_chemformula_tl
-
-\cs_new_protected:Npn \chemmacros_chemformula:n #1
-  {
-    \group_begin:
-      \cs_set_eq:NN \chemformula_font_inner: \chemmacros_inner_font:
-      \chemformula_chcpd:nn {} { #1 }
-    \group_end:
-  }
-\cs_generate_variant:Nn \chemmacros_chemformula:n { x,V }
-
-% --------------------------------------------------------------------------
-% particles, charges
-\NewDocumentCommand \NewChemParticle { mm }
-  {
-    \cs_if_free:NTF #1
-      { \chemmacros_define_particle:Nn #1 { #2 } }
-      { \msg_error:nnn { chemmacros } { new-particle } { #1 } }
-  }
-
-\NewDocumentCommand \RenewChemParticle { mm }
-  {
-    \cs_if_free:NTF #1
-      { \msg_error:nnn { chemmacros } { renew-particle } { #1 } }
-      { \chemmacros_define_particle:Nn #1 { #2 } }
-  }
-
-\NewDocumentCommand \DeclareChemParticle { mm }
-  { \chemmacros_define_particle:Nn #1 { #2 } }
-
-\cs_new_protected:Nn \chemmacros_define_particle:Nn
-  {
-    \cs_set_protected:Npn #1
-      {
-        \chemformula_chcpd:nn {} { #2 }
-        \chemmacros_xspace:
-      }
-  }
-
-\NewChemParticle \el  { e- }
-\NewChemParticle \prt { p+ }
-\NewChemParticle \ntr { n^0 }
-
-% --------------------------------------------------------------------------
-% charges
-% circled charge signs: they are defined in the `chemformula' module:
-% use directly:
-
-\cs_new_protected:Npn \fplus  { { \chemformula_fplus:  } }
-\cs_new_protected:Npn \fminus { { \chemformula_fminus: } }
-
-% change output depending on circled-option
-\cs_new_eq:NN \chemmacros_plus: \chemformula_plus:
-\cs_new_eq:NN \chemmacros_minus: \chemformula_minus:
-
-\cs_new_protected:Npn \chemmacros_formal_plus:
-  {
-    \group_begin:
-      \bool_set_true:N \l_chemformula_formal_charges_bool
-      \chemformula_plus:
-    \group_end:
-  }
-
-\cs_new_protected:Npn \chemmacros_formal_minus:
-  {
-    \group_begin:
-      \bool_set_true:N \l_chemformula_formal_charges_bool
-      \chemformula_minus:
-    \group_end:
-  }
-
-\cs_new_protected:Npn \chemmacros_charge:n #1
-  {
-    \chemformula_superscript:n
-      { \chemmacros_detect_bold:n { #1 } }
-  }
-
-\keys_define:nn { chemmacros / charges }
-  { append .code:n = \chemmacros_option_deprecated:n { append } }
-
-\NewDocumentCommand \mch { o }
-  {
-    \IfNoValueTF { #1 }
-      { \chemmacros_charge:n { \chemmacros_minus: } }
-      { \chemmacros_charge:n { #1 \chemmacros_minus: } }
-  }
-
-\NewDocumentCommand \pch { o }
-  {
-    \IfNoValueTF { #1 }
-      { \chemmacros_charge:n { \chemmacros_plus: } }
-      { \chemmacros_charge:n { #1 \chemmacros_plus: } }
-  }
-
-\NewDocumentCommand \fmch { o }
-  {
-    \IfNoValueTF { #1 }
-      { \chemmacros_charge:n { \chemmacros_formal_minus: } }
-      { \chemmacros_charge:n { #1 \chemmacros_formal_minus: } }
-  }
-
-\NewDocumentCommand \fpch { o }
-  {
-    \IfNoValueTF { #1 }
-      { \chemmacros_charge:n { \chemmacros_formal_plus: } }
-      { \chemmacros_charge:n { #1 \chemmacros_formal_plus: } }
-  }
-
-\tl_new:N  \l__chemmacros_partial_charge_format_tl
-\tl_set:Nn \l__chemmacros_partial_charge_format_tl { \tiny }
-
-\cs_new_protected:Npn \delm
-  {
-    \mbox {
-      \l__chemmacros_partial_charge_format_tl
-      \c_math_toggle_token \delta \chemmacros_minus: \c_math_toggle_token
-    }
-    \chemmacros_xspace:
-  }
-\cs_new_protected:Npn \delp
-  {
-    \mbox {
-      \l__chemmacros_partial_charge_format_tl
-      \c_math_toggle_token \delta \chemmacros_plus: \c_math_toggle_token
-    }
-    \chemmacros_xspace:
-  }
-\cs_new_protected:Npn \fdelm
-  {
-    \mbox {
-      \l__chemmacros_partial_charge_format_tl
-      \c_math_toggle_token \delta \chemmacros_formal_minus: \c_math_toggle_token
-    }
-    \chemmacros_xspace:
-  }
-\cs_new_protected:Npn \fdelp
-  {
-    \mbox {
-      \l__chemmacros_partial_charge_format_tl
-      \c_math_toggle_token \delta \chemmacros_formal_plus: \c_math_toggle_token
-    }
-    \chemmacros_xspace:
-  }
-
-\cs_new_protected:Npn \scrm
-  { \ensuremath { \scriptstyle \chemmacros_minus: } }
-\cs_new_protected:Npn \scrp
-  { \ensuremath { \scriptstyle \chemmacros_plus: } }
-\cs_new_protected:Npn \fscrm
-  { \ensuremath { \scriptstyle \chemmacros_formal_minus: } }
-\cs_new_protected:Npn \fscrp
-  { \ensuremath { \scriptstyle \chemmacros_formal_plus: } }
-\cs_new_protected:Npn \fsscrm
-  { \ensuremath { \scriptscriptstyle \chemmacros_formal_minus: } }
-\cs_new_protected:Npn \fsscrp
-  { \ensuremath { \scriptscriptstyle \chemmacros_formal_plus: } }
-
-\keys_define:nn { chemmacros / charges }
-  {
-    partial-format .tl_set:N = \l__chemmacros_partial_charge_format_tl
-  }
-
-% --------------------------------------------------------------------------
-% ions, molecules
-% proton, hydroxide, hydronium/oxonium, water, nucleophile, electrophile
-\NewChemParticle \Hpl { H+ }
-\NewChemParticle \Hyd { OH- }
-\NewChemParticle \HtO { H3O+ }
-\NewChemParticle \El  { E+ }
-\NewChemParticle \water { H2O }
-
-\NewDocumentCommand \chemmacros_Nu:w { o }
-  {
-    \IfNoValueF { #1 } { \keys_set:nn { chemmacros / particle } { #1 } }
-    \bool_if:NTF \l__chemmacros_particle_elpair_bool
-      { \chemmacros_elpair:n { Nu } \mch }
-      { \chemmacros_chemformula:n { Nu- } }
-    \chemmacros_xspace:
-  }
-
-\AtBeginDocument
-  {
-    \bool_if:NTF \l__chemmacros_Nu_mathspec_bool
-      { \cs_set_eq:NN \Nuc \chemmacros_Nu:w }
-      { \cs_set_eq:NN \Nu \chemmacros_Nu:w }
-  }
-
-\cs_new_protected:Npn \chemmacros_ba:
-  {
-    \bool_if:NTF \l__chemmacros_particle_elpair_bool
-      { \chemmacros_elpair:n { ba } \mch }
-      { \chemmacros_chemformula:n { ba- } }
-    \chemmacros_xspace:
-  }
-
-\NewDocumentCommand \ba { o }
-  {
-    \group_begin:
-      \IfNoValueF { #1 } { \keys_set:nn { chemmacros / particle } { #1 } }
-      \chemmacros_ba:
-    \group_end:
-  }
-
-\cs_new_protected:Npn \chemmacros_elpair:n #1
-  {
-    \bool_if:NTF \l__chemmacros_chemfig_bool
-      {
-        \bool_if:NTF \l__chemmacros_elpair_dots_bool
-          { \chlewis { 0: } { #1 } }
-          { \chlewis { 0| } { #1 } }
-%          { { \chemmacros_inner_font: #1 \chlewis { 0=| } { \vphantom { #1 } } } }
-      }
-      {
-        \msg_error:nnn { chemmacros } { chemfig } { #1 }
-        \chemmacros_atom:n { #1 }
-      }
-  }
-
-\bool_new:N \l__chemmacros_particle_elpair_bool
-\bool_new:N \l__chemmacros_elpair_dots_bool
-
-\keys_define:nn { chemmacros / particle }
-  {
-    elpair         .choice: ,
-    elpair / false .code:n    =
-      { \bool_set_false:N \l__chemmacros_particle_elpair_bool } ,
-    elpair / dots  .code:n    =
-      {
-        \bool_set_true:N \l__chemmacros_particle_elpair_bool
-        \bool_set_true:N \l__chemmacros_elpair_dots_bool
-      } ,
-    elpair / dash  .code:n    =
-      {
-        \bool_set_true:N \l__chemmacros_particle_elpair_bool
-        \bool_set_false:N \l__chemmacros_elpair_dots_bool
-      } ,
-    elpair         .default:n = dots
-  }
-
-% --------------------------------------------------------------------------
-% IUPAC
-\prop_new:N \l__chemmacros_iupac_prop
-
-\cs_new_protected:Npn \chemmacros_new_iupac:Nn #1#2
-  {
-    \tl_set:Nx \l__chemmacros_tmpa_tl
-      { \chemmacros_remove_backslash:N #1 }
-    \prop_if_in:NVTF \l__chemmacros_iupac_prop \l__chemmacros_tmpa_tl
-      { \msg_error:nnn { chemmacros } { new-iupac } { #1 } }
-      {
-        \prop_put:NVn \l__chemmacros_iupac_prop
-          \l__chemmacros_tmpa_tl
-          { #2 }
-      }
-    \chemmacros_make_iupac:
-  }
-
-\cs_new_protected:Npn \chemmacros_define_iupac:Nn #1#2
-  {
-    \tl_set:Nx \l__chemmacros_tmpa_tl
-      { \chemmacros_remove_backslash:N #1 }
-    \prop_put:NVn \l__chemmacros_iupac_prop
-      \l__chemmacros_tmpa_tl
-      { #2 }
-    \chemmacros_make_iupac:
-  }
-
-\cs_new_protected:Npn \chemmacros_renew_iupac:Nn #1#2
-  {
-    \tl_set:Nx \l__chemmacros_tmpa_tl
-      { \chemmacros_remove_backslash:N #1 }
-    \prop_if_in:NVTF \l__chemmacros_iupac_prop \l__chemmacros_tmpa_tl
-      {
-        \prop_put:NVn \l__chemmacros_iupac_prop
-          \l__chemmacros_tmpa_tl
-          { #2 }
-      }
-      { \msg_error:nnn { chemmacros } { renew-iupac } { #1 } }
-    \chemmacros_make_iupac:
-  }
-
-\cs_new_protected:Npn \chemmacros_let_iupac:NN #1#2
-  {
-    \tl_set:Nx \l__chemmacros_tmpa_tl
-      { \chemmacros_remove_backslash:N #1 }
-    \tl_set:Nx \l__chemmacros_tmpb_tl
-      { \chemmacros_remove_backslash:N #2 }
-    \prop_get:NVNTF \l__chemmacros_iupac_prop
-      \l__chemmacros_tmpb_tl
-      \l__chemmacros_tmpc_tl
-      {
-        \prop_put:NVV \l__chemmacros_iupac_prop
-          \l__chemmacros_tmpa_tl
-          \l__chemmacros_tmpc_tl
-      }
-      { \msg_error:nnnn { chemmacros } { let-iupac } { #1 } { #2 } }
-    \chemmacros_make_iupac:
-  }
-
-\cs_new_protected:Npn \chemmacros_define_deprecated_iupac:NN #1#2
-  {
-    \chemmacros_define_iupac:Nn #1
-      {
-        \msg_warning:nnnn { chemmacros } { command-deprecated }
-          { #1 } { #2 }
-        #2
-      }
-  }
-
-
-\cs_new_protected:Npn \chemmacros_make_iupac:
-  {
-    \bool_if:NT \l__chemmacros_in_document_bool
-      {
-        \bool_if:NTF \l__chemmacros_inside_iupac_bool
-          {
-            \prop_map_inline:Nn \l__chemmacros_iupac_prop
-              { \cs_set_protected:cpn { ##1 } { ##2 } }
-          }
-          {
-            \bool_if:NF \l__chemmacros_iupac_restricted_bool
-              {
-                \bool_if:NTF \l__chemmacros_iupac_strict_bool
-                  {
-                    \prop_map_inline:Nn \l__chemmacros_iupac_prop
-                      { \cs_set_protected:cpn { ##1 } { ##2 } }
-                  }
-                  {
-                    \prop_map_inline:Nn \l__chemmacros_iupac_prop
-                      {
-                        \cs_if_exist:cF { ##1 }
-                          { \cs_set_protected:cpn { ##1 } { ##2 } }
-                      }
-                  }
-              }
-          }
-      }    
-  }
-
-\AtBeginDocument { \chemmacros_make_iupac: }
-
-\NewDocumentCommand \DeclareChemIUPAC { mm }
-  { \chemmacros_define_iupac:Nn #1 { #2 } }
-
-\NewDocumentCommand \NewChemIUPAC { mm }
-  { \chemmacros_new_iupac:Nn #1 { #2 } }
-
-\NewDocumentCommand \RenewChemIUPAC { mm }
-  { \chemmacros_renew_iupac:Nn #1 { #2 } }
-
-\NewDocumentCommand \LetChemIUPAC { mm }
-  { \chemmacros_let_iupac:NN #1 #2 }
-
-\NewDocumentCommand \DeprecateChemIUPAC { mm }
-  { \chemmacros_define_deprecated_iupac:NN #1 #2 }
-
-% stereo descriptors and other nomenclature commands
-% Cahn-Ingold-Prelog
-\dim_new:N  \l__chemmacros_cip_kern_dim
-\dim_set:Nn \l__chemmacros_cip_kern_dim { .075em }
-
-\keys_define:nn { chemmacros / iupac }
-  { cip-kern .dim_set:N = \l__chemmacros_cip_kern_dim }
-
-\NewDocumentCommand \cip { m }
-  { \chemmacros_cip:n { #1 } }
-
-\cs_new_protected:Npn \chemmacros_cip:n #1
-  { ( \textit{#1} \tex_kern:D \l__chemmacros_cip_kern_dim ) }
-
-\DeprecateChemIUPAC \Rcip \rectus
-\DeprecateChemIUPAC \Scip \sinister
-
-\NewChemIUPAC \rectus   { \cip { R } }
-\NewChemIUPAC \sinister { \cip { S } }
-
-\LetChemIUPAC \R \rectus
-\LetChemIUPAC \S \sinister
-
-% TikZ needs : to be other
-\ExplSyntaxOff
-\protected\def\chemmacros at sconf#1%
-  {%
-    \begingroup
-    \tikz[baseline,text height=1.5ex,text depth=.25ex]
-      {
-        \node[anchor=base] (chemmacros@@Sconf) {#1} ;
-        \draw[->,thick,rotate=90]
-          ($(chemmacros@@Sconf.center)+(20:.8em)$) arc (20:340:.8em);
-      }%
-    \endgroup
-  }
-
-\protected\def\chemmacros at rconf#1%
-  {%
-    \begingroup
-    \tikz[baseline,text height=1.5ex,text depth=.25ex]
-      {
-        \node[anchor=base] (chemmacros@@Rconf) {#1} ;
-        \draw[<-,thick,rotate=90]
-          ($(chemmacros@@Rconf.center)+(20:.8em)$) arc (20:340:.8em) ;
-      }%
-    \endgroup
-  }
-\ExplSyntaxOn
-
-\NewDocumentCommand \Sconf { O{S} } { \chemmacros at sconf { #1 } }
-\NewDocumentCommand \Rconf { O{R} } { \chemmacros at rconf { #1 } }
-
-% E(ntgegen)/Z(usammen)
-\NewChemIUPAC \entgegen { \cip { E } }
-\NewChemIUPAC \zusammen { \cip { Z } }
-
-\LetChemIUPAC \E \entgegen
-\LetChemIUPAC \Z \zusammen
-
-% cis/trans
-\NewChemIUPAC \cis   { \textit { cis } }
-\NewChemIUPAC \trans { \textit { trans } }
-
-% fac/mer
-\NewChemIUPAC \fac { \textit { fac } }
-\NewChemIUPAC \mer { \textit { mer } }
-
-% tert
-\NewChemIUPAC \tert  { \textit { tert } }
-
-% Fischer
-\NewChemIUPAC \dexter { \textsc { d } }
-\NewChemIUPAC \laevus { \textsc { l } }
-
-\LetChemIUPAC \D \dexter
-\LetChemIUPAC \L \laevus
-
-% ortho/meta/para
-\NewChemIUPAC \ortho { \textit { o } }
-\NewChemIUPAC \meta  { \textit { m } }
-\NewChemIUPAC \para  { \textit { p } }
-
-% syn/anti
-\NewChemIUPAC \syn  { \textit { syn } }
-\NewChemIUPAC \anti { \textit { anti } }
-
-% coordination chemistry
-\bool_new:N \l__chemmacros_bridge_super_bool
-
-\keys_define:nn { chemmacros / iupac }
-  {
-    bridge-number         .choice: ,
-    bridge-number / sub   .code:n     =
-      \bool_set_false:N \l__chemmacros_bridge_super_bool ,
-    bridge-number / super .code:n     =
-      \bool_set_true:N \l__chemmacros_bridge_super_bool ,
-    coord-use-hyphen      .bool_set:N = \l__chemmacros_coord_use_hyphen_bool ,
-    coord-use-hyphen      .default:n  = true
-  }
-
-\cs_new_protected:Npn \chemformula_hapto:n #1
-  {
-    \chemeta \chemformula_superscript:n { #1 }
-    \bool_if:NT \l__chemmacros_coord_use_hyphen_bool
-      { \chemmacros_break_point_hyphen: }
-  }
-
-\cs_new_protected:Npn \chemformula_dento:n #1
-  {
-    \chemkappa \chemformula_superscript:n { #1 }
-    \bool_if:NT \l__chemmacros_coord_use_hyphen_bool
-      { \chemmacros_break_point_hyphen: }
-  }
-
-\cs_new_protected:Npn \chemformula_bridge:n #1
-  {
-    \chemmu
-    \tl_if_blank:nF { #1 }
-      {
-        \bool_if:NTF \l__chemmacros_bridge_super_bool
-          { \chemformula_superscript:n { #1 } }
-          { \chemformula_subscript:n { #1 } }
-      }
-    \bool_if:NT \l__chemmacros_coord_use_hyphen_bool
-      { \chemmacros_break_point_hyphen: }
-  }
-
-\NewChemIUPAC \hapto  { \chemformula_hapto:n }
-\NewChemIUPAC \dento  { \chemformula_dento:n }
-\NewChemIUPAC \bridge { \chemformula_bridge:n }
-
-% attachments to heteroatoms / added hydrogen
-\NewChemIUPAC \hydrogen   { \textit { H } }
-\NewChemIUPAC \oxygen     { \textit { O } }
-\NewChemIUPAC \nitrogen   { \textit { N } }
-\NewChemIUPAC \sulfur     { \textit { S } }
-\NewChemIUPAC \phosphorus { \textit { P } }
-
-\LetChemIUPAC \H  \hydrogen
-\LetChemIUPAC \O  \oxygen
-\LetChemIUPAC \N  \nitrogen
-\LetChemIUPAC \Sf \sulfur
-\LetChemIUPAC \P  \phosphorus
-
-% language specific settings
-\AtBeginDocument
-  {
-    \bool_if:NT \l__chemmacros_italian_bool
-      {
-        \NewChemIUPAC \sin  { \textit { sin } }
-        \NewChemIUPAC \ter  { \textit { ter } }
-      }
-  }
-
-% greek letters
-\NewChemIUPAC \a { \chemalpha }
-\NewChemIUPAC \b { \chembeta }
-\NewChemIUPAC \g { \chemgamma }
-\NewChemIUPAC \d { \chemdelta }
-\NewChemIUPAC \k { \chemkappa }
-\NewChemIUPAC \m { \chemmu }
-\NewChemIUPAC \n { \chemeta }
-\NewChemIUPAC \w { \chemomega }
-
-% \iupac (basically the same as bpchem's \IUPAC)
-% - allows multiple breaking points as compound names can get really long and
-%   especially in multicolumn documents can span more than two lines
-% - add a (very) little space before the hyphen and a little negative space
-%   after it
-% - add a little space at breaking points if not broken
-% - enables all naming commands regardless if they're definied otherwise or not
-\cs_new_protected:Nn \chemmacros_allow_hyphens:
-  {
-    \chemmacros_nobreak:
-    \skip_horizontal:N \c_zero_dim
-  }
-
-\dim_new:N  \l__chemmacros_iupac_hyphen_pre_dim
-\dim_set:Nn \l__chemmacros_iupac_hyphen_pre_dim { .01em }
-\dim_new:N  \l__chemmacros_iupac_hyphen_post_dim
-\dim_set:Nn \l__chemmacros_iupac_hyphen_post_dim { -.03em }
-\dim_new:N  \l__chemmacros_iupac_break_dim
-\dim_set:Nn \l__chemmacros_iupac_break_dim { .03em }
-
-\keys_define:nn { chemmacros / iupac }
-  {
-    hyphen-pre-space  .dim_set:N = \l__chemmacros_iupac_hyphen_pre_dim ,
-    hyphen-post-space .dim_set:N = \l__chemmacros_iupac_hyphen_post_dim ,
-    break-space       .dim_set:N = \l__chemmacros_iupac_break_dim
-  }
-
-\cs_new_protected:Nn \chemmacros_break_point_hyphen:
-  {
-    \chemmacros_nobreak:
-    \tex_discretionary:D { - } { }
-      {
-        \tex_kern:D \l__chemmacros_iupac_hyphen_pre_dim
-        -
-        \tex_kern:D \l__chemmacros_iupac_hyphen_post_dim
-      }
-    \chemmacros_allow_hyphens:
-  }
-
-\cs_new_protected:Npn \chemmacros_break_point:
-  {
-    \chemmacros_nobreak:
-    \tex_discretionary:D { - } { }
-      { \tex_kern:D \l__chemmacros_iupac_break_dim }
-    \chemmacros_allow_hyphens:
-  }
-
-\cs_new_protected:Npn \chemmacros_superscript:n #1
-  { \mode_if_math:TF { \sb {#1} } { \textsuperscript {#1} } }
-  
-\bool_new:N \l__chemmacros_inside_iupac_bool
-
-\char_set_active_eq:NN | \chemmacros_break_point:
-\char_set_active_eq:NN ^ \chemmacros_superscript:n
-
-\group_begin:
-\char_set_catcode_active:N \|
-\char_set_catcode_active:N \^
-
-\cs_new_protected:Npn \chemmacros_iupac:n #1
-  {
-    \group_begin:
-      \bool_set_true:N \l__chemmacros_inside_iupac_bool
-      \chemmacros_make_iupac:
-      \chemmacros_ignore_spaces:
-      \cs_set_eq:NN \- \chemmacros_break_point_hyphen:
-      \chemmacros_define_deprecated:NN \| |
-      \chemmacros_define_deprecated:NN \^ ^
-      \tl_set_rescan:Nnn \l__chemmacros_tmpa_tl
-        {
-          \char_set_catcode_active:N \|
-          \char_set_catcode_active:N \^
-        }
-        {#1}
-      \l__chemmacros_tmpa_tl
-    \group_end:
-  }
-
-\group_end:
-
-% Thanks to Joseph Wright and Enrico Gregorio for the help on the curious
-% redefinition of \- and the end of the compilation
-% see http://tex.stackexchange.com/q/42405/5049 for reference
-\cs_set_protected:Npx \| { \exp_not:o { \| } }
-\cs_set_protected:Npx \- { \exp_not:o { \- } }
-\cs_set_eq:NN \@dischyph \-
-
-\NewDocumentCommand \iupac { }
-  { \chemmacros_iupac:n }
-
-% --------------------------------------------------------------------------
-% latin phrases
-\tl_new:N  \l__chemmacros_latin_format_tl
-\tl_set:Nn \l__chemmacros_latin_format_tl { \itshape }
-
-\keys_define:nn { chemmacros / latin }
-  { format . tl_set:N = \l__chemmacros_latin_format_tl }
-
-\cs_new_protected:Npn \chemmacros_latin:n #1
-  { { \l__chemmacros_latin_format_tl #1 } }
-
-\prop_new:N \l__chemmacros_latin_prop
-
-\cs_new_protected:Npn \chemmacros_new_latin:Nn #1#2
-  {
-    \cs_if_free:NTF #1
-      {
-        \cs_new_protected:Npn #1
-          { \chemmacros_latin:n { #2 } \chemmacros_xspace: }
-        \prop_put:Nnn \l__chemmacros_latin_prop { #1 } { #2 }
-      }
-      { \msg_error:nnn { chemmacros } { new-latin } { #1 } }
-  }
-
-\cs_new_protected:Npn \chemmacros_define_latin:Nn #1#2
-  {
-    \cs_if_free:NTF #1
-      {
-        \cs_new_protected:Npn #1
-          { \chemmacros_latin:n { #2 } \chemmacros_xspace: }
-        \prop_put:Nnn \l__chemmacros_latin_prop { #1 } { #2 }
-      }
-      {
-        \cs_set_protected:Npn #1
-          { \chemmacros_latin:n { #2 } \chemmacros_xspace: }
-        \prop_put:Nnn \l__chemmacros_latin_prop { #1 } { #2 }
-      }
-  }
-
-\cs_new_protected:Npn \chemmacros_renew_latin:Nn #1#2
-  {
-    \prop_if_in:NnTF \l__chemmacros_latin_prop { #1 }
-      { \cs_set:Npn #1 { \chemmacros_latin:n { #2 } \chemmacros_xspace: } }
-      { \msg_error:nnn { chemmacros } { renew-latin } { #1 } }
-  }
-
-\NewDocumentCommand \NewChemLatin { mm }
-  { \chemmacros_new_latin:Nn #1 { #2 } }
-
-\NewDocumentCommand \RenewChemLatin { mm }
-  { \chemmacros_renew_latin:Nn #1 { #2 } }
-
-\NewDocumentCommand \DeclareChemLatin { mm }
-  { \chemmacros_define_latin:Nn #1 { #2 } }
-
-\AtBeginDocument
-  {
-    \bool_if:NTF \l__chemmacros_chemstyle_bool
-      {
-        \AfterPackage* { chemstyle }
-          {
-            \cs_undefine:N \invacuo
-            \cs_set_eq:NN \chemmacros_latin:n \cst at latin
-          }
-      }
-      {
-        \cs_new_eq:NN  \latin \chemmacros_latin:n
-      }
-    \NewChemLatin \insitu   { in~situ }
-    \NewChemLatin \abinitio { ab~initio }
-    \NewChemLatin \invacuo  { in~vacuo }
-  }
-
-% --------------------------------------------------------------------------- %
-% acid / base
-\tl_new:N  \l__chemmacros_k_acid_tl
-\tl_new:N  \l__chemmacros_k_base_tl
-\tl_new:N  \l__chemmacros_k_water_tl
-
-% \bool_new:N \l__chemmacros_subscript_lowercase_bool
-
-\tl_set:Nn \l__chemmacros_k_acid_tl
-  { \chemmacros_translate:n {K-acid} }
-
-\tl_set:Nn \l__chemmacros_k_base_tl
-  { \chemmacros_translate:n {K-base} }
-
-\tl_set:Nn \l__chemmacros_k_water_tl
-  { \chemmacros_translate:n {K-water} }
-
-\keys_define:nn { chemmacros / acid-base }
-  {
-    p-style             .choice: ,
-    p-style / slanted   .code:n   = \cs_set_eq:NN \chemmacros_p_style:n \textsl ,
-    p-style / italics   .code:n   = \cs_set_eq:NN \chemmacros_p_style:n \textit ,
-    p-style / upright   .code:n   = \cs_set_eq:NN \chemmacros_p_style:n \textup ,
-    K-acid              .tl_set:N = \l__chemmacros_k_acid_tl ,
-    K-base              .tl_set:N = \l__chemmacros_k_base_tl ,
-    K-water             .tl_set:N = \l__chemmacros_k_water_tl ,
-    subscript           .code:n   = \chemmacros_option_deprecated:n {#1}
-    % subscript / lowercase .code:n =
-    %   \bool_set_true:N \l__chemmacros_subscript_lowercase_bool ,
-    % subscript / uppercase .code:n =
-    %   \bool_set_false:N \l__chemmacros_subscript_lowercase_bool
-  }
-
-\cs_new_eq:NN \chemmacros_p_style:n \textup
-
-\cs_new_protected:Npn \Ka
-  {
-    \ensuremath
-      {
-        \chemmacros_detect_bold:n
-          {
-            K
-            \c_math_subscript_token
-              { \l__chemmacros_k_acid_tl }
-          }
-      }
-    \chemmacros_xspace:
-  }
-
-\cs_new_protected:Npn \Kb
-  {
-    \ensuremath
-      {
-        \chemmacros_detect_bold:n
-          {
-            K
-            \c_math_subscript_token
-              { \l__chemmacros_k_base_tl }
-          }
-      }
-    \chemmacros_xspace:
-  }
-
-\cs_new_protected:Npn \Kw
-  {
-    \ensuremath
-      {
-        \chemmacros_detect_bold:n
-          {
-            K
-            \c_math_subscript_token
-              { \l__chemmacros_k_water_tl }
-          }
-      }
-    \chemmacros_xspace:
-  }
-
-\cs_new_protected:Npn \chemmacros_p:n #1
-  {
-    \group_begin:
-      \mbox
-        {
-          \chemmacros_p_style:n { p }
-          \ensuremath { #1 }
-        }
-    \group_end:
-  }
-
-\NewDocumentCommand \p { m }
-  { \chemmacros_p:n { #1 } }
-
-\cs_new_protected:Npn \pH
-  {
-    \chemmacros_p:n { \chemmacros_chemformula:n { H } }
-    \chemmacros_xspace:
-  }
-
-\cs_new_protected:Npn \pOH
-  {
-    \chemmacros_p:n { \chemmacros_chemformula:n { OH } }
-    \chemmacros_xspace:
-  }
-
-\NewDocumentCommand \pKa { o }
-  {
-    \chemmacros_p:n
-      {
-        \Ka \IfNoValueF { #1 }
-          { {} \c_math_subscript_token { \chemmacros_detect_bold:n { #1 } } }
-      }
-    \chemmacros_xspace:
-  }
-
-\NewDocumentCommand \pKb { o }
-  {
-    \chemmacros_p:n
-      {
-        \Kb \IfNoValueF { #1 }
-          { {} \c_math_subscript_token { \chemmacros_detect_bold:n { #1 } } }
-      }
-    \chemmacros_xspace:
-  }
-
-% --------------------------------------------------------------------------
-% units
-\DeclareSIUnit { \atm        } { atm }
-\DeclareSIUnit { \atmosphere } { atm }
-\DeclareSIUnit { \calory     } { cal }
-\DeclareSIUnit { \cal        } { cal }
-
-\AtBeginDocument
-  {
-    \bool_if:NF \l__chemmacros_chemstyle_bool
-      {
-        \DeclareSIUnit { \cmc   } { \cubic\centi\metre }
-        \DeclareSIUnit { \molar } { \mole\per\cubic\deci\metre }
-        \DeclareSIUnit { \Molar } { \textsc{m} }
-      }
-  }
-
-\DeclareSIUnit { \moLar   } { \mole\per\liter }
-\DeclareSIUnit { \MolMass } { \gram\per\mole }
-\DeclareSIUnit { \normal  } { \textsc{n} }
-\DeclareSIUnit { \torr    } { torr }
-
-% --------------------------------------------------------------------------
-% reaction mechanisms
-% \mech[<type>]
-% <type> - substitutions: {}, 1, 2, se, 1e, 2e, ar
-%        - eliminations:  e, e1, e2, cb
-\tl_new:N \l__chemmacros_mech_type_tl
-\tl_new:N \l__chemmacros_mech_mol_tl
-\tl_new:N \l__chemmacros_mech_ar_tl
-
-\cs_new_protected:Npn \__chemmacros_set_mech:nnn #1#2#3
-  {
-    \tl_set:Nn \l__chemmacros_mech_type_tl { #1 }
-    \tl_set:Nn \l__chemmacros_mech_mol_tl  { #2 }
-    \tl_set:Nn \l__chemmacros_mech_ar_tl   { #3 }
-  }
-
-\keys_define:nn { chemmacros / mech }
-  {
-    type      .choice: ,
-    type /    .code:n    =
-      {
-        \__chemmacros_set_mech:nnn { S }
-          {
-            \c_math_toggle_token
-              \c_math_subscript_token { \text {N} }
-            \c_math_toggle_token
-          }
-          { }
-      } ,
-    type / 1  .code:n    =
-      {
-        \__chemmacros_set_mech:nnn { S }
-          {
-            \c_math_toggle_token
-              \c_math_subscript_token { \text {N} }
-            \c_math_toggle_token
-            1
-          }
-          { }
-      } ,
-    type / 2  .code:n    =
-      {
-        \__chemmacros_set_mech:nnn { S }
-          {
-            \c_math_toggle_token
-              \c_math_subscript_token { \text {N} }
-            \c_math_toggle_token
-            2
-          }
-          { }
-      } ,
-    type / se .code:n    =
-      {
-        \__chemmacros_set_mech:nnn { S }
-          {
-            \c_math_toggle_token
-              \c_math_subscript_token { \text {E} }
-            \c_math_toggle_token
-          }
-          { }
-      } ,
-    type / 1e .code:n    =
-      {
-        \__chemmacros_set_mech:nnn { S }
-          {
-            \c_math_toggle_token
-              \c_math_subscript_token { \text {E} }
-            \c_math_toggle_token
-            1
-          }
-          { }
-      } ,
-    type / 2e .code:n    =
-      {
-        \__chemmacros_set_mech:nnn { S }
-          {
-            \c_math_toggle_token
-              \c_math_subscript_token { \text {E} }
-            \c_math_toggle_token
-            2
-          }
-          { }
-      } ,
-    type / ar .code:n    =
-      {
-        \__chemmacros_set_mech:nnn { S }
-          {
-            \c_math_toggle_token
-              \c_math_subscript_token { \text {E} }
-            \c_math_toggle_token
-          }
-          { Ar - }
-      } ,
-    type / e  .code:n    =
-      { \__chemmacros_set_mech:nnn { E } { } { } } ,
-    type / e1 .code:n    =
-      { \__chemmacros_set_mech:nnn { E } { 1 } { } } ,
-    type / e2 .code:n    =
-      { \__chemmacros_set_mech:nnn { E } { 2 } { } } ,
-    type / cb .code:n    =
-      {
-        \__chemmacros_set_mech:nnn { E }
-          {
-            1
-            \c_math_toggle_token
-              \c_math_subscript_token { \text {cb} }
-            \c_math_toggle_token
-          }
-          { }
-      } ,
-    type      .default:n = 
-  }
-
-\cs_new_protected:Npn \chemmacros_mech:n #1
-  {
-    \tl_if_blank:nTF { #1 }
-      { \keys_set:nn { chemmacros / mech } { type } }
-      { \keys_set:nn { chemmacros / mech } { type = #1 } }
-    \mbox
-      {
-        \tl_use:N \l__chemmacros_mech_ar_tl
-        \tl_use:N \l__chemmacros_mech_type_tl
-        \tl_use:N \l__chemmacros_mech_mol_tl
-      }
-    \chemmacros_xspace:
-  }
-
-\NewDocumentCommand \mech { o }
-  {
-    \IfNoValueTF { #1 }
-      { \chemmacros_mech:n { } }
-      { \chemmacros_mech:n { #1 } }
-  }
-
-% --------------------------------------------------------------------------
-% oxidation numbers
-% \ox{<number>,<atom>}
-\bool_new:N       \l__chemmacros_ox_sign_bool
-\bool_new:N       \l__chemmacros_ox_integer_bool
-\bool_new:N       \l__chemmacros_ox_explicit_sign_bool
-\bool_set_false:N \l__chemmacros_ox_explicit_sign_bool
-\bool_new:N       \l__chemmacros_ox_format_roman_bool
-\bool_set_true:N  \l__chemmacros_ox_format_roman_bool
-\bool_new:N       \l__chemmacros_ox_decimal_marker_comma_bool
-\bool_set_false:N \l__chemmacros_ox_decimal_marker_comma_bool
-\bool_new:N       \l__chemmacros_ox_parse_bool
-\bool_set_true:N  \l__chemmacros_ox_parse_bool
-\bool_new:N       \l__chemmacros_ox_side_bool
-\bool_new:N       \l__chemmacros_ox_super_bool
-\bool_new:N       \l__chemmacros_ox_top_bool
-\bool_set_true:N  \l__chemmacros_ox_top_bool
-\bool_new:N       \l__chemmacros_ox_align_center_bool
-
-\int_new:N \l__chemmacros_ox_number_int
-\fp_new:N  \l__chemmacros_ox_number_fp
-
-\cs_new_protected:Npn \__chemmacros_ox_process_number:n #1
-  {
-    \bool_if:NTF \l__chemmacros_ox_parse_bool
-      {
-        \tl_if_in:nnTF { #1 } { / }
-          { \__chemmacros_ox_fraction:w #1 \q_stop }
-          {
-            \__chemmacros_ox_sign:n { #1 }
-            \__chemmacros_ox_value:n { #1 }
-          }
-      }
-      { #1 }
-  }
-
-\DeclareInstance { xfrac } { chemmacros-ox-frac } { text }
-  {
-    scale-factor        = 1.2 ,
-    denominator-bot-sep = -.5ex ,
-    numerator-top-sep   = -.3ex ,
-    slash-left-kern     = -.2em ,
-    slash-right-kern    = -.2em ,
-    slash-symbol-font   = lmr
-  }
-
-\cs_new_protected:Npn \__chemmacros_ox_fraction:w #1/#2 \q_stop
-  {
-    \bool_set_false:N \l__chemmacros_ox_format_roman_bool
-    \__chemmacros_ox_sign:n { #1 }
-    \bool_if:NTF \l__chemmacros_ox_side_bool
-      { \sfrac { \__chemmacros_ox_value:n { #1 } } { #2 } }
-      {
-        \sfrac [ chemmacros-ox-frac ]
-          { \__chemmacros_ox_value:n { #1 } }
-          { #2 }
-      }
-  }
-
-\cs_new_protected:Npn \__chemmacros_ox_sign:n #1
-  {
-    \fp_compare:nNnT { #1 } > { 0 }
-      {
-        \bool_if:NT \l__chemmacros_ox_explicit_sign_bool
-          { \c_math_toggle_token + \c_math_toggle_token }
-      }
-    \fp_compare:nNnT { #1 } = { 0 }
-      {
-        \bool_if:NT \l__chemmacros_ox_explicit_sign_bool
-          { \c_math_toggle_token \pm \c_math_toggle_token }
-      }
-    \fp_compare:nNnT { #1 } < { 0 }
-      { \c_math_toggle_token - \c_math_toggle_token }
-  }
-
-\cs_new_protected:Npn \__chemmacros_ox_value:n #1
-  {
-    \fp_set:Nn \l__chemmacros_ox_number_fp { abs(#1) }
-    \__chemmacros_ox_is_integer:V \l__chemmacros_ox_number_fp
-    \bool_if:NTF \l__chemmacros_ox_format_roman_bool
-      { \__chemmacros_fp_to_Roman:V \l__chemmacros_ox_number_fp }
-      {
-        \bool_if:NTF \l__chemmacros_ox_integer_bool
-          {
-            \c_math_toggle_token
-              \__chemmacros_fp_to_arabic:V \l__chemmacros_ox_number_fp
-            \c_math_toggle_token
-          }
-          {
-            \c_math_toggle_token
-              \__chemmacros_fp_show:V \l__chemmacros_ox_number_fp
-            \c_math_toggle_token
-          }
-      }
-  }
-
-\cs_new_protected:Npn \__chemmacros_ox_is_integer:n #1
-  {
-    \fp_set:Nn \l__chemmacros_tmpa_fp { round(#1 + 1 , 0 ) - 1 }
-    \fp_compare:nNnTF { \l__chemmacros_tmpa_fp } = { #1 }
-      { \bool_set_true:N \l__chemmacros_ox_integer_bool }
-      {
-        \bool_set_false:N \l__chemmacros_ox_integer_bool
-        \bool_set_false:N \l__chemmacros_ox_format_roman_bool
-      }
-  }
-\cs_generate_variant:Nn \__chemmacros_ox_is_integer:n { V }
-
-\cs_new_protected:Npn \__chemmacros_fp_to_Roman:n #1
-  {
-    \group_begin:
-      \fp_set:Nn \l__chemmacros_tmpa_fp { round(#1 , 0 ) }
-      \int_set:Nn \l__chemmacros_tmpa_int
-        { \fp_to_tl:N \l__chemmacros_tmpa_fp } 
-      \int_compare:nTF { \l__chemmacros_tmpa_int = 0 }
-        { 0 }
-        { \int_to_Roman:n { \l__chemmacros_tmpa_int } }
-    \group_end:
-  }
-\cs_generate_variant:Nn \__chemmacros_fp_to_Roman:n { V }
-
-\cs_new_protected:Npn \__chemmacros_fp_to_arabic:n #1
-  {
-    \group_begin:
-      \fp_set:Nn \l__chemmacros_tmpa_tl { #1 }
-      \fp_to_tl:N \l__chemmacros_tmpa_tl
-    \group_end:
-  }
-\cs_generate_variant:Nn \__chemmacros_fp_to_arabic:n { V }
-
-\cs_new_protected:Npn \__chemmacros_fp_show:n #1
-  {
-    \group_begin:
-      \fp_set:Nn \l__chemmacros_tmpa_tl { #1 }
-      \bool_if:NTF \l__chemmacros_ox_decimal_marker_comma_bool
-        {
-          \tl_set:Nx \l__chemmacros_tmpb_tl
-            { \fp_to_tl:N \l__chemmacros_tmpa_tl }
-          \tl_replace_once:Nnn \l__chemmacros_tmpb_tl { . } { {,} }
-          \tl_use:N \l__chemmacros_tmpb_tl
-        }
-        { \fp_to_tl:N \l__chemmacros_tmpa_tl }
-    \group_end:
-  }
-\cs_generate_variant:Nn \__chemmacros_fp_show:n { V }
-
-\cs_new_protected:Npn \__chemmacros_ox_write:nn #1#2
-  {
-    \tl_if_blank:nT { #1 }
-      { \msg_error:nnx { chemmacros } { ox } { oxidation~number~missing } }
-    \tl_if_blank:nT { #2 }
-      { \msg_error:nnx { chemmacros } { ox } { atom~missing } }
-    \ensuremath
-      {
-        \bool_if:NT \l__chemmacros_ox_super_bool
-          {
-            \chemmacros_text:n
-              {
-                #2
-                \c_math_toggle_token
-                  \c_math_superscript_token
-                    { \text { \tiny \__chemmacros_ox_process_number:n { #1 } } }
-                \c_math_toggle_token
-              }
-          }
-        \bool_if:NT \l__chemmacros_ox_side_bool
-          {
-            \chemmacros_text:n
-              { #2 ( \text { \__chemmacros_ox_process_number:n { #1 } } ) }
-          }
-        \bool_if:NT \l__chemmacros_ox_top_bool
-          {
-            \overset
-              {
-                \bool_if:NTF \l__chemmacros_ox_align_center_bool
-                  { \clap } { \rlap }
-                {
-                  \chemmacros_text:n
-                    { \tiny \__chemmacros_ox_process_number:n { #1 } }
-                }
-              }
-              { \chemmacros_text:n { #2 } }
-          }
-      }
-  }
-
-\cs_new_protected:Npn \__chemmacros_ox_pos_top:
-  {
-    \bool_set_true:N  \l__chemmacros_ox_top_bool
-    \bool_set_false:N \l__chemmacros_ox_super_bool
-    \bool_set_false:N \l__chemmacros_ox_side_bool
-  }
-
-\cs_new_protected:Npn \__chemmacros_ox_pos_super:
-  {
-    \bool_set_false:N \l__chemmacros_ox_top_bool
-    \bool_set_true:N  \l__chemmacros_ox_super_bool
-    \bool_set_false:N \l__chemmacros_ox_side_bool
-  }
-
-\cs_new_protected:Npn \__chemmacros_ox_pos_side:
-  {
-    \bool_set_false:N \l__chemmacros_ox_top_bool
-    \bool_set_false:N \l__chemmacros_ox_super_bool
-    \bool_set_true:N  \l__chemmacros_ox_side_bool
-  }
-
-\keys_define:nn { chemmacros / ox }
-  {
-    pos            .choice: ,
-    pos / top      .code:n     = \__chemmacros_ox_pos_top: ,
-    pos / super    .code:n     = \__chemmacros_ox_pos_super: ,
-    pos / side     .code:n     = \__chemmacros_ox_pos_side: ,
-    roman          .bool_set:N = \l__chemmacros_ox_format_roman_bool ,
-    roman          .default:n  = true ,
-    parse          .bool_set:N = \l__chemmacros_ox_parse_bool ,
-    parse          .default:n  = true ,
-    explicit-sign  .bool_set:N = \l__chemmacros_ox_explicit_sign_bool ,
-    explicit-sign  .default:n  = true ,
-    decimal-marker .choice: ,
-    decimal-marker / comma .code:n =
-      { \bool_set_true:N \l__chemmacros_ox_decimal_marker_comma_bool } ,
-    decimal-marker / point .code:n =
-      { \bool_set_false:N \l__chemmacros_ox_decimal_marker_comma_bool } ,
-    align          .choice: ,
-    align / center .code:n    = \bool_set_true:N \l__chemmacros_ox_align_center_bool ,
-    align / right  .code:n    = \bool_set_false:N \l__chemmacros_ox_align_center_bool
-  }
-
-% \ox[<keyval>]{<num>,<atom>}
-% \ox*[<keyval>]{<num>,<atom>} => always number on the side
-\cs_new_protected:Npn \chemmacros_ox:nnnn #1#2#3#4
-  {
-    \group_begin:
-      \tl_if_blank:nF { #1 } { \__chemmacros_ox_pos_super: }
-      \keys_set:nn { chemmacros / ox } { #2 }
-      \__chemmacros_ox_write:nn { #3 } { #4 }
-    \group_end:
-  }
-
-\NewDocumentCommand \ox { s o > { \SplitArgument { 1 } { , } } m }
-  {
-    \IfBooleanTF { #1 }
-      {
-        \IfNoValueTF { #2 }
-          { \chemmacros_ox:nnnn { #1 } {    } #3 }
-          { \chemmacros_ox:nnnn { #1 } { #2 } #3 }
-      }
-      {
-        \IfNoValueTF { #2 }
-          { \chemmacros_ox:nnnn { } {    } #3 }
-          { \chemmacros_ox:nnnn { } { #2 } #3 }
-      }
-  }
-
-% --------------------------------------------------------------------------- %
-% - oxidation arrows
-\tl_new:N   \l__chemmacros_redox_begin_tl
-\tl_new:N   \l__chemmacros_redox_end_tl
-\tl_new:N   \l__chemmacros_redox_tikz_tl
-\tl_new:N   \l__chemmacros_redox_shift_tl
-\tl_new:N   \l__chemmacros_redox_anchor_tl
-\tl_new:N   \l__chemmacros_redox_side_tl
-
-\fp_new:N   \l__chemmacros_redox_shift_fp
-
-\dim_new:N  \l__chemmacros_redox_sep_dim
-\dim_new:N  \l__chemmacros_redox_sep_default_dim
-\dim_set:Nn \l__chemmacros_redox_sep_default_dim { .2em }
-\dim_new:N  \l__chemmacros_redox_dist_dim
-\dim_set:Nn \l__chemmacros_redox_dist_dim {.6em}
-
-% place and name nodes:
-% \OX{<name>,<atom>}
-\NewDocumentCommand \OX { > { \SplitArgument { 1 } { , } } m }
-  { \chemmacros_redox_partner:nn #1 }
-
-\cs_new_protected:Npn \chemmacros_redox_partner:nn #1#2
-  {
-    \chemformula_latex_if:nTF { measuring@ }
-      {
-        \group_begin:
-        \tikz[baseline=(#1.base)]
-          { \node [inner~sep=0pt] (#1) { #2 } ; }
-        \group_end:
-      }
-      {
-        \tl_if_blank:nT { #1 }
-          { \msg_error:nnx { chemmacros } { OX } { node~name~missing } }
-        \tl_if_blank:nT { #2 }
-          { \msg_error:nnx { chemmacros } { OX } { atom~missing } }
-        \tikz[baseline=(#1.base),remember~picture]
-          { \node [inner~sep=0pt] (#1) { #2 } ; }
-      }
-  }
-
-\cs_new_protected:Npn \__chemmacros_redox_coordinates:nn #1#2
-  {
-    \tl_set:Nn \l__chemmacros_redox_begin_tl { #1 }
-    \tl_set:Nn \l__chemmacros_redox_end_tl   { #2 }
-  }
-
-\cs_new_protected:Npn \chemmacros_redox:nnnnn #1#2#3#4#5
-  {
-    \tl_clear:N \l__chemmacros_redox_begin_tl
-    \tl_clear:N \l__chemmacros_redox_end_tl
-    \tl_clear:N \l__chemmacros_redox_tikz_tl
-    \__chemmacros_redox_coordinates:nn { #1 } { #2 }
-    \tl_if_blank:nF { #3 }
-      { \tl_set:Nn \l__chemmacros_redox_tikz_tl { #3 } }
-    \tl_if_blank:nTF { #4 }
-      {
-        \fp_set:Nn \l__chemmacros_redox_shift_fp  { 1 }
-        \tl_set:Nn \l__chemmacros_redox_anchor_tl { above }
-        \tl_set:Nn \l__chemmacros_redox_side_tl { north }
-        \dim_set_eq:NN
-          \l__chemmacros_redox_sep_dim
-          \l__chemmacros_redox_sep_default_dim
-      }
-      {
-        \fp_compare:nNnTF { #4 } < { 0 }
-          {
-            \tl_set:Nn \l__chemmacros_redox_anchor_tl { below }
-            \tl_set:Nn \l__chemmacros_redox_side_tl { south }
-            \exp_args:NNo \dim_set:Nn \l__chemmacros_redox_sep_dim
-              { - \l__chemmacros_redox_sep_default_dim }
-          }
-          {
-            \tl_set:Nn \l__chemmacros_redox_anchor_tl { above }
-            \tl_set:Nn \l__chemmacros_redox_side_tl { north }
-            \dim_set_eq:NN
-              \l__chemmacros_redox_sep_dim
-              \l__chemmacros_redox_sep_default_dim
-          }
-        \fp_set:Nn \l__chemmacros_redox_shift_fp { #4 }
-      }
-      \tl_set:Nn \l__chemmacros_redox_shift_tl
-        { \fp_to_tl:N \l__chemmacros_redox_shift_fp }
-    \tikz[remember~picture,overlay]
-      {
-        \chemmacros_tikz_draw:f { \tl_use:N \l__chemmacros_redox_tikz_tl }
-        ($
-          (\l__chemmacros_redox_begin_tl .
-          \l__chemmacros_redox_side_tl)+(0,\l__chemmacros_redox_sep_dim)
-        $)
-        -- 
-        ++(0,\l__chemmacros_redox_shift_tl * \l__chemmacros_redox_dist_dim) -|
-        node [pos=.25,\l__chemmacros_redox_anchor_tl] { { #5 } }
-        ($
-          (\l__chemmacros_redox_end_tl .
-          \l__chemmacros_redox_side_tl)+(0,\l__chemmacros_redox_sep_dim)
-        $) ;
-      }
-  }
-
-\NewDocumentCommand \redox { > { \SplitArgument { 1 } { , } } r() o o G{} }
-  {
-    \IfNoValueT { #1 }
-      {
-        \msg_error:nnx { chemmacros } { redox }
-          { You~need~to~specify~coordinates }
-      }
-    \IfNoValueTF { #2 }
-      { \chemmacros_redox:nnnnn #1 { } { } { #4 } }
-      {
-        \IfNoValueTF { #3 }
-          { \chemmacros_redox:nnnnn #1 { #2 } {    } { #4 } }
-          { \chemmacros_redox:nnnnn #1 { #2 } { #3 } { #4 } }
-      }
-  }
-
-% redox-keys
-\keys_define:nn { chemmacros / redox }
-  {
-    dist .dim_set:N = \l__chemmacros_redox_dist_dim ,
-    dist .default:n = { .6em } ,
-    sep  .dim_set:N = \l__chemmacros_redox_sep_default_dim ,
-    sep  .default:n = { .2em }
-  }
-
-% --------------------------------------------------------------------------- %
-% spectroscopy
-\tl_new:N  \g__chemmacros_nmr_isotope_tl
-\tl_new:N  \l__chemmacros_nmr_isotope_default_tl
-\tl_set:Nn \l__chemmacros_nmr_isotope_default_tl { 1 }
-\tl_new:N  \l__chemmacros_nmr_coupling_nuclei_tl
-\tl_new:N  \l__chemmacros_nmr_coupling_nuclei_pre_tl
-\tl_set:Nn \l__chemmacros_nmr_coupling_nuclei_pre_tl { ( }
-\tl_new:N  \l__chemmacros_nmr_coupling_nuclei_post_tl
-\tl_set:Nn \l__chemmacros_nmr_coupling_nuclei_post_tl { ) }
-\tl_new:N  \l__chemmacros_nmr_coupling_bonds_tl
-\tl_new:N  \l__chemmacros_nmr_coupling_bonds_pre_tl
-\tl_set:Nn \l__chemmacros_nmr_coupling_bonds_pre_tl { }
-\tl_set:Nn \l__chemmacros_nmr_coupling_bonds_post_tl { \! }
-\tl_new:N  \l__chemmacros_nmr_coupling_symbol_tl
-\tl_set:Nn \l__chemmacros_nmr_coupling_symbol_tl { J }
-\tl_new:N  \g__chemmacros_nmr_element_coupled_tl
-\tl_new:N  \g__chemmacros_nmr_element_tl
-\tl_new:N  \l__chemmacros_nmr_element_default_tl
-\tl_set:Nn \l__chemmacros_nmr_element_default_tl { H }
-\tl_new:N  \l__chemmacros_nmr_format_tl
-\tl_new:N  \l__chemmacros_nmr_delta_tl
-\tl_new:N  \l__chemmacros_nmr_coupling_unit_tl
-\tl_set:Nn \l__chemmacros_nmr_coupling_unit_tl { \hertz }
-\tl_new:N  \l__chemmacros_nmr_unit_tl
-\tl_set:Nn \l__chemmacros_nmr_unit_tl { \mega\hertz }
-\tl_new:N  \l__chemmacros_nmr_list_setup_tl
-\tl_set:Nn \l__chemmacros_nmr_list_setup_tl
-  {
-    \topsep\z at skip \partopsep\z at skip 
-    \itemsep\z@ \parsep\z@ \itemindent\z@
-    \leftmargin\z@
-  }
-\tl_new:N  \l__chemmacros_nmr_position_tl
-\tl_new:N  \l__chemmacros_nmr_element_method_connector_tl
-\tl_set:Nn \l__chemmacros_nmr_element_method_connector_tl {-}
-\tl_new:N  \l__chemmacros_nmr_method_tl
-\tl_set:Nn \l__chemmacros_nmr_method_tl {NMR}
-
-\bool_new:N      \l__chemmacros_nmr_coupling_nuclei_sub_bool
-\bool_new:N      \l__chemmacros_nmr_frequency_bool
-\bool_new:N      \l__chemmacros_nmr_solvent_bool
-\bool_new:N      \l__chemmacros_nmr_delimiters_bool
-\bool_new:N      \l__chemmacros_nmr_comma_bool
-\bool_new:N      \l__chemmacros_nmr_inner_bool
-\bool_new:N      \l__chemmacros_nmr_position_side_bool
-\bool_new:N      \l__chemmacros_nmr_parse_bool
-\bool_set_true:N \l__chemmacros_nmr_parse_bool
-\bool_new:N      \l__chemmacros_nmr_list_bool
-\bool_new:N      \l__chemmacros_nmr_use_equal_bool
-\bool_new:N      \l__chemmacros_nmr_custom_command_active_bool
-\bool_new:N      \l__chemmacros_nmr_custom_command_used_bool
-
-\cs_new_protected:Npn \__chemmacros_nmr_nucleus:nn #1#2
-  {
-    \tl_gset:Nn \g__chemmacros_nmr_isotope_tl { #1 }
-    \tl_if_in:nnTF { #2 } { [ }
-      { \__chemmacros_nmr_element:w #2 \q_stop }
-      {
-        \tl_gset:No \g__chemmacros_nmr_element_tl { #2 }
-        \tl_gclear:N \g__chemmacros_nmr_element_coupled_tl
-      }
-  }
-\cs_generate_variant:Nn \__chemmacros_nmr_nucleus:nn { VV }
-
-\cs_new_protected:Npn \__chemmacros_nmr_nucleus:w #1,#2 \q_stop
-  {
-    \tl_gset:Nn \g__chemmacros_nmr_isotope_tl { #1 }
-    \tl_if_in:nnTF { #2 } { [ }
-      { \__chemmacros_nmr_element:w #2 \q_stop }
-      {
-        \tl_gset:No \g__chemmacros_nmr_element_tl { #2 }
-        \tl_gclear:N \g__chemmacros_nmr_element_coupled_tl
-      }
-  }
-
-\cs_new_protected:Npn \__chemmacros_nmr_element:w #1[#2] \q_stop
-  {
-    \tl_gset:Nn \g__chemmacros_nmr_element_tl { #1 }
-    \tl_gset:Nn \g__chemmacros_nmr_element_coupled_tl { #2 }
-  }
-
-\cs_new_protected:Npn \__chemmacros_nmr_default_nucleus:w #1,#2 \q_stop
-  {
-    \tl_set:Nn \l__chemmacros_nmr_isotope_default_tl { #1 }
-    \tl_set:Nn \l__chemmacros_nmr_element_default_tl { #2 }
-  }
-
-\cs_new_protected:Npn \__chemmacros_nmr_base:nn #1#2
-  {
-    \tl_if_blank:VF \g__chemmacros_nmr_element_coupled_tl
-      {
-        \tl_put_left:Nn \g__chemmacros_nmr_element_coupled_tl { \{ }
-        \tl_put_right:Nn \g__chemmacros_nmr_element_coupled_tl { \} }
-      }
-    \tl_put_left:Nn \g__chemmacros_nmr_element_coupled_tl { #2 }
-    \iupac { ^ { #1 } }
-    \bool_if:NTF \l__chemmacros_nmr_parse_bool
-      { \chemformula_ch:nV {} \g__chemmacros_nmr_element_coupled_tl }
-      { \chemmacros_atom:V \g__chemmacros_nmr_element_coupled_tl }
-    \tl_use:N \l__chemmacros_nmr_element_method_connector_tl
-    \tl_use:N \l__chemmacros_nmr_method_tl
-  }
-\cs_generate_variant:Nn \__chemmacros_nmr_base:nn { VV }
-
-\cs_new_protected:Npn \__chemmacros_nmr_frequency:n #1
-  {
-    \tl_if_in:nnTF { #1 } { , }
-      { \__chemmacros_nmr_frequency_aux_i:w #1 \q_stop }
-      { \__chemmacros_nmr_frequency_aux_ii:n { #1 } }
-  }
-
-\cs_new_protected:Npn \__chemmacros_nmr_frequency_aux_i:w #1,#2 \q_stop
-  { \SI { #1 } { #2 } }
-
-\cs_new_protected:Npn \__chemmacros_nmr_frequency_aux_ii:n #1
-  { \SI { #1 } { \tl_use:N \l__chemmacros_nmr_unit_tl } }
-
-\cs_new_eq:NN \__chemmacros_nmr_number:n \use:n
-\cs_new_eq:NN \__chemmacros_nmr_position:n \use:n
-
-\keys_define:nn { chemmacros / nmr }
-  {
-    unit          .tl_set:N      = \l__chemmacros_nmr_unit_tl ,
-    unit          .default:n     = \mega\hertz ,
-    nucleus       .code:n        =
-      { \__chemmacros_nmr_default_nucleus:w #1 \q_stop } ,
-    nucleus       .default:n     = { 1,H } ,
-    format        .tl_set:N      = \l__chemmacros_nmr_format_tl ,
-    method        .tl_set:N      = \l__chemmacros_nmr_method_tl ,
-    connector     .tl_set:N      = \l__chemmacros_nmr_element_method_connector_tl ,
-    pos-number    .choice: ,
-    pos-number / sub  .code:n =
-      \tl_set:Nn \l__chemmacros_nmr_position_tl { _ }
-      \bool_set_false:N \l__chemmacros_nmr_position_side_bool ,
-    pos-number / super .code:n =
-      \tl_set:Nn \l__chemmacros_nmr_position_tl { ^ }
-      \bool_set_false:N \l__chemmacros_nmr_position_side_bool ,
-    pos-number / side .code:n =
-      \tl_set:Nn \l__chemmacros_nmr_position_tl { - }
-      \bool_set_true:N \l__chemmacros_nmr_position_side_bool ,
-    coupling-unit .tl_set:N   = \l__chemmacros_nmr_coupling_unit_tl ,
-    coupling-pos  .choice: ,
-    coupling-pos / sub .code:n =
-      \bool_set_true:N \l__chemmacros_nmr_coupling_nuclei_sub_bool ,
-    coupling-pos / side .code:n =
-      \bool_set_false:N \l__chemmacros_nmr_coupling_nuclei_sub_bool ,
-    coupling-nuclei-pre  .tl_set:N =
-      \l__chemmacros_nmr_coupling_nuclei_pre_tl ,
-    coupling-nuclei-post .tl_set:N =
-      \l__chemmacros_nmr_coupling_nuclei_post_tl ,
-    coupling-bonds-pre   .tl_set:N =
-      \l__chemmacros_nmr_coupling_bonds_pre_tl ,
-    coupling-bonds-post  .tl_set:N =
-      \l__chemmacros_nmr_coupling_bonds_post_tl ,
-    coupling-symbol .tl_set:N    =
-      \l__chemmacros_nmr_coupling_symbol_tl ,
-    atom-number-cs .code:n       =
-      \cs_set_eq:NN \__chemmacros_nmr_number:n #1 ,
-    coupling-pos-cs .code:n      =
-      \cs_set_eq:NN \__chemmacros_nmr_position:n #1 ,
-    parse         .bool_set:N    = \l__chemmacros_nmr_parse_bool ,
-    delta         .code:n        =
-      \tl_set:Nn \l__chemmacros_nmr_delta_tl { \, #1 } ,
-    list          .bool_set:N    = \l__chemmacros_nmr_list_bool ,
-    list          .default:n     = true ,
-    list-setup    .tl_set:N      = \l__chemmacros_nmr_list_setup_tl ,
-    use-equal     .bool_set:N    = \l__chemmacros_nmr_use_equal_bool ,
-    use-equal     .default:n     = true
-  }
-
-\prop_new:N \l__chemmacros_nmr_prop
-
-\cs_new_protected:Npn \chemmacros_new_nmr:Nn #1#2
-  {
-    \bool_if:nTF
-      {
-        \prop_if_in_p:Nn \l__chemmacros_nmr_prop { #1 }
-        ||
-        \cs_if_exist_p:N #1
-      }
-      { \msg_error:nnn { chemmacros } { new-nmr } { #1 } }
-      {
-        \prop_put:Nnn \l__chemmacros_nmr_prop { #1 } { #2 }
-        \NewDocumentCommand #1 { s }
-          { \IfBooleanTF {##1} { \NMR*{#2} } { \NMR{#2} } }
-      }
-  }
-
-\cs_new_protected:Npn \chemmacros_define_nmr:Nn #1#2
-  {
-    \prop_put:Nnn \l__chemmacros_nmr_prop { #1 } { #2 }
-    \cs_if_exist:NTF #1
-      {
-        \RenewDocumentCommand #1 { s }
-          { \IfBooleanTF {##1} { \NMR*{#2} } { \NMR{#2} } }
-      }
-      {
-        \NewDocumentCommand #1 { s }
-          { \IfBooleanTF {##1} { \NMR*{#2} } { \NMR{#2} } }
-      }
-  }
-
-\cs_new_protected:Npn \chemmacros_renew_nmr:Nn #1#2
-  {
-    \bool_if:nTF
-      {
-        \prop_if_in_p:Nn \l__chemmacros_nmr_prop { #1 }
-        &&
-        \cs_if_exist_p:N #1
-      }
-      {
-        \prop_put:Nnn \l__chemmacros_nmr_prop { #1 } { #2 }
-        \RenewDocumentCommand #1 { s }
-          { \IfBooleanTF {##1} { \NMR*{#2} } { \NMR{#2} } }
-      }
-      { \msg_error:nnn { chemmacros } { renew-nmr } { #1 } }
-  }
-
-\NewDocumentCommand \NewChemNMR { mm }
-  { \chemmacros_new_nmr:Nn #1 { #2 } }
-
-\NewDocumentCommand \RenewChemNMR { mm }
-  { \chemmacros_renew_nmr:Nn #1 { #2 } }
-
-\NewDocumentCommand \DeclareChemNMR { mm }
-  { \chemmacros_define_nmr:Nn #1 { #2 } }
-
-\NewDocumentCommand \NMR { s G{} D(){} O{} }
-  {
-    \IfBooleanTF { #1 }
-      { \chemmacros_nmr:nnnn { * } { #2 } { #3 } { #4 } }
-      { \chemmacros_nmr:nnnn {   } { #2 } { #3 } { #4 } }
-  }
-
-\AtBeginDocument
-  {
-    % \NMR{<num>,<elem>}(<num>,<unit>)[<solvent>] ALL arguments are optional
-    % \NMR* same but without ": $\delta$" at end
-    \cs_new_protected:Npn \chemmacros_nmr:nnnn #1#2#3#4
-      {
-        \bool_if:NT \l__chemmacros_nmr_list_bool { \item \scan_stop: }
-        \group_begin:
-          \mode_leave_vertical:
-          \bool_set_false:N \l__chemmacros_nmr_frequency_bool
-          \bool_set_false:N \l__chemmacros_nmr_solvent_bool
-          \tl_if_empty:nF { #3 }
-            { \bool_set_true:N \l__chemmacros_nmr_frequency_bool }
-          \tl_if_empty:nF { #4 }
-            { \bool_set_true:N \l__chemmacros_nmr_solvent_bool }
-          \bool_if:nT
-            {
-              \l__chemmacros_nmr_frequency_bool
-              ||
-              \l__chemmacros_nmr_solvent_bool
-            }
-            { \bool_set_true:N \l__chemmacros_nmr_delimiters_bool }
-          \bool_if:nT
-            {
-              \l__chemmacros_nmr_frequency_bool
-              &&
-              \l__chemmacros_nmr_solvent_bool
-            }
-            { \bool_set_true:N \l__chemmacros_nmr_comma_bool }
-          \tl_if_empty:nTF { #2 }
-            {
-              \__chemmacros_nmr_nucleus:VV
-                \l__chemmacros_nmr_isotope_default_tl
-                \l__chemmacros_nmr_element_default_tl
-            }
-            { \__chemmacros_nmr_nucleus:w #2 \q_stop }
-          \mode_if_math:TF
-            {
-              \text
-                {
-                  \group_begin:
-                    \tl_use:N \l__chemmacros_nmr_format_tl
-                    \__chemmacros_nmr_base:VV
-                      \g__chemmacros_nmr_isotope_tl
-                      \g__chemmacros_nmr_element_tl
-                    \bool_if:NT \l__chemmacros_nmr_delimiters_bool
-                      { ~ ( }
-                    \bool_if:NT \l__chemmacros_nmr_frequency_bool
-                      { \__chemmacros_nmr_frequency:n { #3 } }
-                    \bool_if:NT \l__chemmacros_nmr_comma_bool
-                      { , ~ }
-                    \bool_if:NT \l__chemmacros_nmr_solvent_bool
-                      { \chemmacros_atom:n { #4 } }
-                    \bool_if:NT \l__chemmacros_nmr_delimiters_bool
-                      { ) }
-                    \tl_if_blank:nT { #1 } { : ~ }
-                  \group_end:
-                }
-              \tl_if_blank:nT { #1 }
-                {
-                  \delta
-                  \text { \l__chemmacros_nmr_delta_tl }
-                  \bool_if:NT \l__chemmacros_nmr_use_equal_bool { = }
-                }
-            }
-            {
-              \group_begin:
-                \tl_use:N \l__chemmacros_nmr_format_tl
-                \__chemmacros_nmr_base:VV
-                  \g__chemmacros_nmr_isotope_tl
-                  \g__chemmacros_nmr_element_tl
-                \bool_if:NT \l__chemmacros_nmr_delimiters_bool
-                  { ~ ( }
-                \bool_if:NT \l__chemmacros_nmr_frequency_bool
-                  { \__chemmacros_nmr_frequency:n { #3 } }
-                \bool_if:NT \l__chemmacros_nmr_comma_bool
-                  { , ~ }
-                \bool_if:NT \l__chemmacros_nmr_solvent_bool
-                  {
-                    \bool_if:NTF \l__chemmacros_nmr_parse_bool
-                      { \chemformula_ch:nn { } { #4 } }
-                      { #4 }
-                  }
-                \bool_if:NT \l__chemmacros_nmr_delimiters_bool
-                  { ) }
-                \tl_if_blank:nT { #1 } { : }
-              \group_end:
-              \tl_if_blank:nT { #1 }
-                {
-                  \tl_use:N \c_space_tl
-                  \c_math_toggle_token
-                    \delta
-                  \c_math_toggle_token
-                  \l__chemmacros_nmr_delta_tl
-                  \bool_if:NT \l__chemmacros_nmr_use_equal_bool { ~ = }
-                }
-              \bool_if:NF \l__chemmacros_nmr_comma_bool
-                { \tl_if_blank:nT { #1 } { \chemmacros_xspace: } }
-            }
-        \group_end:
-      }
-  }
-
-\NewDocumentCommand \chemmacros_data:w { smo }
-  {
-    \bool_if:NT \l__chemmacros_nmr_list_bool { \item }
-    {
-      \tl_use:N \l__chemmacros_nmr_format_tl #2
-      \IfNoValueF { #3 } { ~ ( #3 ) }
-      \IfBooleanT { #1 } { \bool_if:NT \l__chemmacros_nmr_use_equal_bool { : } }
-    }
-    \IfBooleanF { #1 } { \bool_if:NT \l__chemmacros_nmr_use_equal_bool { ~ = } }
-  }
-
-\cs_new_protected:Npn \chemmacros_val:n #1
-  {
-    \tl_if_in:nnTF { #1 } { -- }
-      { \chemmacros_val_aux:w #1 \q_nil }
-      { \num { #1 } }
-  }
-
-\cs_new_protected:Npn \chemmacros_val_aux:w #1--#2 \q_nil
-  { \numrange { #1 } { #2 } }
-
-\NewDocumentEnvironment { experimental } { o }
-  {
-    \group_begin:
-    \IfNoValueF { #1 } { \keys_set:nn { chemmacros / nmr } { #1 } }
-    \bool_set_true:N \l__chemmacros_nmr_inner_bool
-    \cs_set_eq:NN \#    \chemmacros_nmr_number:n
-    \cs_set_eq:NN \pos  \chemmacros_nmr_position:n
-    \cs_set_eq:NN \J    \chemmacros_nmr_coupling:w
-    \cs_set_eq:NN \data \chemmacros_data:w
-    \cs_set_eq:NN \val  \chemmacros_val:n
-    \bool_if:NT \l__chemmacros_nmr_list_bool
-      { \list {} { \l__chemmacros_nmr_list_setup_tl } }
-  }
-  {
-    \bool_if:NT \l__chemmacros_nmr_list_bool
-      { \endlist }
-    \group_end:
-    \chemmacros_ignore_spaces:
-  }
-
-\cs_new_protected:Npn \chemmacros_nmr_number:n #1
-  {
-    \__chemmacros_nmr_number:n { #1 } \,
-    \chemmacros_atom:V \g__chemmacros_nmr_element_tl
-  }
-
-\cs_new_protected:Npn \chemmacros_nmr_position:n #1
-  {
-    \chemmacros_chemformula:x
-      {
-        \exp_not:V \g__chemmacros_nmr_element_tl
-        \bool_if:NF \l__chemmacros_nmr_position_side_bool
-          {
-            \exp_not:V \l__chemmacros_nmr_position_tl
-            \exp_not:n { {#1} }
-          }
-      }
-    \bool_if:NT \l__chemmacros_nmr_position_side_bool
-      {
-        \tl_use:N \l__chemmacros_nmr_position_tl
-        \__chemmacros_nmr_position:n { #1 }
-      }
-  }
-
-\cs_new_protected:Npn \chemmacros_nmr_coupling:w
-  {
-    \tl_clear:N \l__chemmacros_nmr_coupling_nuclei_tl
-    \tl_clear:N \l__chemmacros_nmr_coupling_bonds_tl
-    \peek_meaning:NTF (
-      { \__chemmacros_nmr_coupling:w }
-      { \__chemmacros_nmr_coupling_aux_i:w }
-  }
-
-\cs_new_protected:Npn \__chemmacros_nmr_coupling:w (#1;#2)
-  {
-    \tl_set:Nn \l__chemmacros_nmr_coupling_bonds_tl
-      {
-        \l__chemmacros_nmr_coupling_bonds_pre_tl
-        #1
-        \l__chemmacros_nmr_coupling_bonds_post_tl
-      }
-    \bool_if:NTF \l__chemmacros_nmr_coupling_nuclei_sub_bool
-      {
-        \tl_set:Nn \l__chemmacros_nmr_coupling_nuclei_tl
-          {
-            \c_math_subscript_token
-              { \chemmacros_chemformula:n {#2} }
-          }
-      }
-      {
-        \tl_set:Nn \l__chemmacros_nmr_coupling_nuclei_tl
-          {
-            \l__chemmacros_nmr_coupling_nuclei_pre_tl
-            \chemmacros_chemformula:n {#2}
-            \l__chemmacros_nmr_coupling_nuclei_post_tl
-          }
-      }
-    \__chemmacros_nmr_coupling_aux_i:w
-  }
-
-\cs_new_protected:Npn \__chemmacros_nmr_coupling_aux_i:w
-  {
-    \peek_meaning:NTF [
-      { \__chemmacros_nmr_coupling_aux_ii:w }
-      { \__chemmacros_nmr_coupling_aux_iii:n }
-  }
-
-\cs_new_protected:Npn \__chemmacros_nmr_coupling_aux_ii:w [#1]#2
-  {
-    \group_begin:
-      \sisetup
-        {
-          list-final-separator={,~},
-          list-pair-separator={,~},
-          list-units=single
-        }
-      \c_math_toggle_token
-        ^{ \l__chemmacros_nmr_coupling_bonds_tl }
-        \l__chemmacros_nmr_coupling_symbol_tl
-        \l__chemmacros_nmr_coupling_nuclei_tl = \SIlist{#2}{#1}
-      \c_math_toggle_token
-    \group_end:
-  }
-
-\cs_new_protected:Npn \__chemmacros_nmr_coupling_aux_iii:n #1
-  {
-    \group_begin:
-      \sisetup
-        {
-          list-final-separator={,~},
-          list-pair-separator={,~},
-          list-units=single
-        }
-      \c_math_toggle_token
-         ^{ \l__chemmacros_nmr_coupling_bonds_tl }
-         \l__chemmacros_nmr_coupling_symbol_tl
-         \l__chemmacros_nmr_coupling_nuclei_tl
-         = \exp_args:Nno \SIlist { #1 } { \l__chemmacros_nmr_coupling_unit_tl }
-      \c_math_toggle_token
-    \group_end:
-  }
-
-% --------------------------------------------------------------------------
-% deprecated mhName:
-\keys_define:nn { chemmacros }
-  { mhName .code:n = \chemmacros_option_deprecated:n { mhName } }
-
-% --------------------------------------------------------------------------- %
-% - phases
-\bool_new:N \l__chemmacros_phases_sub_bool
-\dim_new:N  \l__chemmacros_phases_space_dim
-\dim_set:Nn \l__chemmacros_phases_space_dim { .1333 em }
-\prop_new:N \l__chemmacros_phases_prop
-\prop_new:N \l__chemmacros_phases_german_prop
-
-\keys_define:nn { chemmacros / phases }
-  {
-    pos        .choice: ,
-    pos / sub  .code:n    = \bool_set_true:N \l__chemmacros_phases_sub_bool ,
-    pos / side .code:n    = \bool_set_false:N \l__chemmacros_phases_sub_bool ,
-    space      .dim_set:N = \l__chemmacros_phases_space_dim
-  }
-
-\cs_new_protected:Npn \chemmacros_new_phase:Nn #1#2
-  {
-    \tl_set:Nx \l__chemmacros_tmpa_tl
-      { \chemmacros_remove_backslash:N #1 }
-    \cs_if_free:NF #1
-      { \msg_error:nnn {chemmacros} {new-phase} {#1} }
-    \exp_args:Nx \@trnslt at declare@translation
-      { phase-\l__chemmacros_tmpa_tl } {fallback} {#2}
-    \__chemmacros_define_phase:Nx #1
-      {
-        \exp_not:N \chemmacros_translate:n
-          { phase-\l__chemmacros_tmpa_tl }
-      }
-  }
-
-\cs_new_protected:Npn \chemmacros_define_phase:Nn #1#2
-  {
-    \tl_set:Nx \l__chemmacros_tmpa_tl
-      { \chemmacros_remove_backslash:N #1 }
-    \exp_args:Nx \@trnslt at declare@translation
-      { phase-\l__chemmacros_tmpa_tl } {fallback} {#2}
-    \__chemmacros_define_phase:Nx #1
-      {
-        \exp_not:N \chemmacros_translate:n
-          { phase-\l__chemmacros_tmpa_tl }
-      }
-  }
-
-\cs_new_protected:Npn \chemmacros_renew_phase:Nn #1#2
-  {
-    \tl_set:Nx \l__chemmacros_tmpa_tl
-      { \chemmacros_remove_backslash:N #1 }
-    \cs_if_exist:NF #1
-      { \msg_error:nnn {chemmacros} {renew-phase} {#1} }
-    \exp_args:Nx \@trnslt at declare@translation
-      { phase-\l__chemmacros_tmpa_tl } {fallback} {#2}
-    \__chemmacros_define_phase:Nx #1
-      {
-        \exp_not:N \chemmacros_translate:n
-          { phase-\l__chemmacros_tmpa_tl }
-      }
-  }
-
-\NewDocumentCommand \NewChemPhase { mom }
-  { \chemmacros_new_phase:Nn #1 {#3} }
-
-\NewDocumentCommand \DeclareChemPhase { mom }
-  { \chemmacros_define_phase:Nn #1 {#3} }
-
-\NewDocumentCommand \RenewChemPhase { mom }
-  { \chemmacros_renew_phase:Nn #1 {#3} }
-
-\cs_new_protected:Npn \__chemmacros_define_phase:Nn #1#2
-  {
-    \cs_if_exist:NF #1 { \cs_new:Npn #1 {} }
-    \DeclareDocumentCommand #1 { o }
-      {
-        \bool_if:NTF \l__chemmacros_phases_sub_bool
-          {
-            \bool_if:NTF \l_chemformula_inside_ch_bool
-              { \chemformula_subscript:n { ( #2 \IfNoValueF {##1} {,~##1} ) } }
-              {
-                \ensuremath
-                  {
-                    \c_math_subscript_token
-                    { \text { ( #2 \IfNoValueF {##1} {,~##1} ) } }
-                  }
-              }
-          }
-          {
-            \ensuremath
-              {
-                \skip_horizontal:N \l__chemmacros_phases_space_dim
-                \text { ( #2 \IfNoValueF {##1} {,~##1} ) }
-              }
-          }
-      }
-  }
-\cs_generate_variant:Nn \__chemmacros_define_phase:Nn { Nx }
-
-\NewChemPhase \sld {s}
-\NewChemPhase \lqd {l}
-\NewChemPhase \gas {g}
-\NewChemPhase \aq  {aq}
-
-\cs_new_protected:Npn \chemmacros_phase:n #1
-  {
-    \bool_if:NTF \l__chemmacros_phases_sub_bool
-      { \ensuremath { \c_math_subscript_token { \text { (#1) } } } }
-      {
-        \ensuremath
-          {
-            \skip_horizontal:N \l__chemmacros_phases_space_dim
-            \text { (#1) }
-          }
-      }
-  }
-
-\NewDocumentCommand \phase { m }
-  { \chemmacros_phase:n {#1} }
-
-% --------------------------------------------------------------------------
-% reaction environments
-\cs_new_protected:Npn \__chemmacros_record_for_lor:nnnnn #1#2#3#4#5
-  {
-    \tl_if_eq:nnT { #1 } { reaction }
-      {
-        \group_begin:
-          % we need to prevent \Hy at make@anchor from being written to the lor
-          % file:
-          \bool_if:NT \l__chemmacros_hyperref_bool
-            { \cs_set:Npn \Hy at make@anchor {} }
-          \addcontentsline { lor } { reaction }
-            {
-              \tl_use:N \l__chemmacros_reaction_lorname_tl
-              \tl_use:N \c_space_tl
-              #2 #3 #4 #5
-              \tl_use:N \g__chemmacros_reaction_description_tl
-            }
-          \tl_gclear:N \g__chemmacros_reaction_description_tl
-        \group_end:
-      }
-  }
-
-% redefine mathtools' command \MT_define_tagform:nwnn to ensure we add an
-% entry to the list of reactions even if the user redefines the reaction tag
-% this should probably be done via patching...
-\AfterPackage* { mathtools }
-  {
-    \cs_set_protected:Npn \MT_define_tagform:nwnn #1[#2]#3#4
-      {
-        \@namedef{MT_tagform_#1:n}##1
-          {
-            % this is the original part:
-            \maketag@@@{#3\ignorespaces#2{##1}\unskip\@@italiccorr#4}
-            % this is added => this disturbs hyperref:
-            \__chemmacros_record_for_lor:nnnnn
-              { #1 } { #3 } { #2 } { ##1 } { #4 }
-          }
-      }
-  }
-
-\tl_new:N \g__chemmacros_reaction_description_tl
-
-\cs_new_protected:Npn \chemmacros_add_reaction_description:n #1
-  {
-    \tl_if_blank:nF { #1 }
-      { \tl_gset:Nn \g__chemmacros_reaction_description_tl { : ~ #1 } }
-  }
-
-\NewDocumentCommand \AddRxnDesc { m }
-  { \chemmacros_add_reaction_description:n { #1 } }
-
-% define \listofreactions
-\tl_new:N \l__chemmacros_reaction_lorname_tl
-\tl_new:N \reactionlistname
-\tl_new:N \l__chemmacros_reaction_heading_tl
-
-\cs_new:Npn \__chemmacros_reaction_heading:n #1
-  { \l__chemmacros_reaction_heading_tl { #1 } }
-\cs_generate_variant:Nn \__chemmacros_reaction_heading:n { V }
-
-\cs_new_protected:Npn \listofreactions
-  {
-    \__chemmacros_reaction_heading:V \reactionlistname
-    \@starttoc { lor }
-  }
-
-\cs_new_protected:Npn \l at reaction #1#2
-  { \@dottedtocline { 1 } { 1.5em } { 2.3em } { #1 } { #2 } }
-
-% create tagform
-\newtagform { reaction } { \{ } { \} }
-\newcounter { chemmacros_save_reaction }
-\newcounter { reaction }
-
-% switch to reaction tags
-\cs_new_protected:Npn \__chemmacros_begin_reaction:
-  {
-    % create individual names for `hyperref':
-    \bool_if:NT \l__chemmacros_hyperref_bool
-      {
-        \cs_set:Npn \theHequation
-          { R . \theHsection . \arabic { reaction } }
-      }
-    % enable labelformat `reaction':
-    \bool_if:NT \l__chemmacros_varioref_bool
-      { \cs_set_eq:NN \p at equation \p at reaction }
-    \setcounter { chemmacros_save_reaction } { \value { equation } }
-    \setcounter { equation } { \value { reaction } }
-    \usetagform { reaction }
-  }
-
-% switch back to equation tags
-\cs_new_protected:Npn \__chemmacros_end_reaction:
-  {
-    \setcounter { reaction } { \value { equation } }
-    \setcounter { equation } { \value { chemmacros_save_reaction } }
-  }
-
-% --------------------------------------------------------------------------- %
-\bool_new:N \l__chemmacros_reactions_star_bool
-\bool_new:N \l__chemmacros_reactions_args_bool
-
-\keys_define:nn { chemmacros / reaction }
-  {
-    star         .bool_set:N = \l__chemmacros_reactions_star_bool ,
-    star         .default:n  = true ,
-    arg          .bool_set:N = \l__chemmacros_reactions_args_bool ,
-    arg          .default:n  = true ,
-    list-name    .tl_set:N   = \reactionlistname ,
-    list-entry   .code:n     =
-      \tl_set:Nn \l__chemmacros_reaction_lorname_tl { #1 } ,
-    list-heading .tl_set:N   = \l__chemmacros_reaction_heading_tl
-  }
-
-% \DeclareChemReaction[<keyval>]{<name>}{<type>}
-\cs_new_protected:Npn \__chemmacros_define_reaction:Nnnn #1#2#3#4
-  {
-    \bool_set_false:N \l__chemmacros_reactions_star_bool
-    \bool_set_false:N \l__chemmacros_reactions_args_bool
-    \keys_set:nn { chemmacros / reaction } { #2 }
-    \bool_if:NTF \l__chemmacros_reactions_args_bool
-      {
-        #1 { #3 } [ 2 ] []
-          {
-            \__chemmacros_begin_reaction:
-            \AddRxnDesc { ##1 }
-            \begin { #4 } { ##2 }
-              \chemmacros_equation_chemformula:V \BODY
-            \end{ #4 }
-            \__chemmacros_end_reaction:
-          }
-        \bool_if:NT \l__chemmacros_reactions_star_bool
-          {
-            #1 { #3* } [ 1 ]
-              {
-                \begin { #4* } { ##1 }
-                  \chemmacros_equation_chemformula:V \BODY
-                \end { #4* }
-              }
-          }
-      }
-      {
-        #1 { #3 } [ 1 ] []
-          {
-            \__chemmacros_begin_reaction:
-            \AddRxnDesc { ##1 }
-            \begin { #4 }
-              \chemmacros_equation_chemformula:V \BODY
-            \end { #4 }
-            \__chemmacros_end_reaction:
-          }
-        \bool_if:NT \l__chemmacros_reactions_star_bool
-          {
-            #1 { #3* }
-              {
-                \begin { #4* }
-                  \chemmacros_equation_chemformula:V \BODY
-                \end { #4* }
-              }
-          }
-      }
-    \ignorespaces
-  }
-
-\cs_new_protected:Npn \chemmacros_define_reaction:nnn #1#2#3
-  {
-    \cs_if_exist:cTF { #2 }
-      { \__chemmacros_define_reaction:Nnnn \RenewEnviron { #1 } { #2 } { #3 } }
-      { \__chemmacros_define_reaction:Nnnn \NewEnviron { #1 } { #2 } { #3 } }
-  }
-
-\cs_new_protected:Npn \chemmacros_new_reaction:nnn #1#2#3
-  {
-    \cs_if_exist:cTF { #2 }
-      { \msg_error:nnx { chemmacros } { already-defined } { #2 } }
-      { \__chemmacros_define_reaction:Nnnn \NewEnviron { #1 } { #2 } { #3 } }
-  }
-
-\cs_new_protected:Npn \chemmacros_renew_reaction:nnn #1#2#3
-  {
-    \cs_if_exist:cTF { #2 }
-      { \__chemmacros_define_reaction:Nnnn \RenewEnviron { #1 } { #2 } { #3 } }
-      { \msg_error:nnx { chemmacros } { not-defined } { #2 } }
-  }
-
-\NewDocumentCommand \NewChemReaction { O{} m m }
-  { \chemmacros_new_reaction:nnn { #1 } { #2 } { #3 } }
-\NewDocumentCommand \RenewChemReaction { O{} m m }
-  { \chemmacros_renew_reaction:nnn { #1 } { #2 } { #3 } }
-\NewDocumentCommand \DeclareChemReaction { O{} m m }
-  { \chemmacros_declare_reaction:nnn { #1 } { #2 } { #3 } }
-\DeclareChemDeprecated \newreaction \NewChemReaction
-
-\cs_new_protected:Npn \chemmacros_equation_chemformula:n #1
-  { \chemformula_ch:nn { } { #1 } }
-\cs_generate_variant:Nn \chemmacros_equation_chemformula:n { V }
-
-% predefined:
-\NewChemReaction [ star ] { reaction }  { equation }
-\NewChemReaction [ star ] { reactions } { align }
-
-% --------------------------------------------------------------------------
-% thermodynamics et.al.
-% \standardstate as defined by the chemstyle package. Thanks to Joseph Wright
-% the `chemstyle' provides it with \providecommand so it doesn't matter which
-% package defines it first
-\ProvideDocumentCommand \standardstate {}
-  { { \ensuremath { \chemmacros_standardstate: } } }
-
-\cs_new_protected:Npn \chemmacros_standardstate:
-  { \mathpalette \chemmacros_standardstate_aux: \circ }
-
-\cs_new_protected:Npn \chemmacros_standardstate_aux: #1#2
-  {
-    \ooalign
-      {
-        \tex_hfil:D
-        \c_math_toggle_token #1- \c_math_toggle_token
-        \tex_hfil:D
-        \tex_cr:D
-        \tex_hfil:D
-        \c_math_toggle_token #1#2 \c_math_toggle_token
-        \tex_hfil:D
-        \tex_cr:D
-      }
-  }
-
-\cs_new_protected:Npn \changestate
-  { \mathop{} \! \chemDelta }
-
-% --------------------------------------------------------------------------
-% \State
-\tl_new:N  \l__chemmacros_State_delta_tl
-\tl_set:Nn \l__chemmacros_State_delta_tl { \changestate }
-\tl_new:N  \l__chemmacros_State_exponent_tl
-\tl_set:Nn \l__chemmacros_State_exponent_tl { \standardstate }
-
-\bool_new:N      \l__chemmacros_State_delta_bool
-\bool_set_true:N \l__chemmacros_State_delta_bool
-\bool_new:N      \l__chemmacros_State_subscript_left_bool
-\bool_set_true:N \l__chemmacros_State_subscript_left_bool
-\bool_new:N      \l__chemmacros_State_exponent_bool
-\bool_set_true:N \l__chemmacros_State_exponent_bool
-
-\keys_define:nn { chemmacros / state }
-  {
-    delta     .code:n     =
-      {
-        \exp_args:Nf \tl_if_eq:nnTF { #1 } { false }
-          { \bool_set_false:N \l__chemmacros_State_delta_bool }
-          {
-            \bool_set_true:N \l__chemmacros_State_delta_bool
-            \tl_set:Nn \l__chemmacros_State_delta_tl { #1 }
-          }
-      } ,
-    subscript-left .bool_set:N = \l__chemmacros_State_subscript_left_bool ,
-    subscript-left .default:n  = true ,
-    exponent  .code:n     =
-      {
-        \exp_args:Nf \tl_if_eq:nnTF { #1 } { false }
-          { \bool_set_false:N \l__chemmacros_State_exponent_bool }
-          {
-            \bool_set_true:N \l__chemmacros_State_exponent_bool
-            \tl_set:Nn \l__chemmacros_State_exponent_tl { #1 }
-          }
-      } ,
-    exponent  .default:n  = \standardstate
-  }
-
-% old syntax (v1.1):
-% \State[<exp>,<Delta>,<subscript pos>]{<Symbol>}{<subscript>}
-% old syntax (v2.0):
-% \State[<keyval>]{<Symbol>}{<subscript>}
-% {<subscript>} is an optional argument!
-\cs_new_protected:Npn \chemmacros_state:nnn #1#2#3
-  {
-    \group_begin:
-      \keys_set:nn { chemmacros / state } { #1 }
-      \ensuremath
-       {
-          \bool_if:NT \l__chemmacros_State_delta_bool
-            { \tl_use:N \l__chemmacros_State_delta_tl }
-          \bool_if:NT \l__chemmacros_State_subscript_left_bool
-            { \c_math_subscript_token { \text { #3 } } }
-          #2
-          \bool_if:NF \l__chemmacros_State_subscript_left_bool
-            { \c_math_subscript_token { \text { #3 } } }
-          \bool_if:NT \l__chemmacros_State_exponent_bool
-            { ^ { \tl_use:N \l__chemmacros_State_exponent_tl } }
-        }
-    \group_end:
-  }
-\cs_generate_variant:Nn \chemmacros_state:nnn { xnV }
-
-\NewDocumentCommand \State { s O{} m G{} }
-  {
-    \group_begin:
-      \IfBooleanT { #1 }
-        {
-          \keys_set:nn { chemmacros / state }
-            { subscript-left = false , exponent = }
-        }
-      \chemmacros_state:nnn { #2 } { #3 } { #4 }
-    \group_end:
-  }
-
-% --------------------------------------------------------------------------
-\tl_new:N  \l__chemmacros_thermod_subscript_left_tl
-\tl_new:N  \l__chemmacros_thermod_subscript_left_default_tl
-\tl_new:N  \l__chemmacros_thermod_subscript_tl
-\tl_new:N  \l__chemmacros_thermod_subscript_default_tl
-\tl_new:N  \l__chemmacros_thermod_unit_tl
-\tl_new:N  \l__chemmacros_thermod_exponent_tl
-\tl_new:N  \l__chemmacros_thermod_exponent_default_tl
-\tl_set:Nn \l__chemmacros_thermod_exponent_default_tl { \standardstate }
-\tl_new:N  \l__chemmacros_thermod_delta_tl
-\tl_new:N  \l__chemmacros_thermod_delta_default_tl
-\tl_set:Nn \l__chemmacros_thermod_delta_default_tl { \changestate }
-
-\bool_new:N \l__chemmacros_renewstate_bool
-\bool_new:N \l__chemmacros_state_overwrite_error_bool
-
-\keys_define:nn { chemmacros }
-  {
-    State / subscript         .choice: ,
-    State / subscript / left  .code:n   =
-      { \tl_set:Nn \l__chemmacros_thermod_subscript_left_tl { true } } ,
-    State / subscript / right .code:n   =
-      { \tl_set:Nn \l__chemmacros_thermod_subscript_left_tl { false } } ,
-    State / exponent          .tl_set:N =
-      \l__chemmacros_thermod_exponent_tl ,
-    State / delta             .tl_set:N =
-      \l__chemmacros_thermod_delta_tl ,
-    State / unit              .tl_set:N =
-      \l__chemmacros_thermod_unit_tl ,
-    setnewstate / subscript-left .tl_set:N =
-      \l__chemmacros_thermod_subscript_left_default_tl ,
-    setnewstate / subscript   .tl_set:N =
-      \l__chemmacros_thermod_subscript_default_tl ,
-    setnewstate / exponent    .tl_set:N =
-      \l__chemmacros_thermod_exponent_default_tl ,
-    setnewstate / delta       .tl_set:N =
-      \l__chemmacros_thermod_delta_default_tl
-  }
-
-% \NewChemState{<name>}[<keyval>]{<symbol>}{<unit>}
-\NewDocumentCommand \NewChemState { omO{}mm }
-  {
-    \bool_set_false:N \l__chemmacros_renewstate_bool
-    \bool_set_true:N \l__chemmacros_state_overwrite_error_bool
-    \__chemmacros_setnewstate_reset:
-    \IfNoValueTF { #1 }
-      { \chemmacros_define_state:nnnn { #3 } { #2 } { #4 } { #5 } }
-      {
-        \msg_warning:nn { chemmacros } { state-syntax }
-        \chemmacros_define_state:nnnn { #1#3 } { #2 } { #4 } { #5 }
-      }
-  }
-% \DeclareChemState{<name>}[<keyval>]{<symbol>}{<unit>}
-\NewDocumentCommand \DeclareChemState { omO{}mm }
-  {
-    \bool_set_false:N \l__chemmacros_renewstate_bool
-    \bool_set_false:N \l__chemmacros_state_overwrite_error_bool
-    \__chemmacros_setnewstate_reset:
-    \IfNoValueTF { #1 }
-      { \chemmacros_define_state:nnnn { #3 } { #2 } { #4 } { #5 } }
-      {
-        \msg_warning:nn { chemmacros } { state-syntax }
-        \chemmacros_define_state:nnnn { #1#3 } { #2 } { #4 } { #5 }
-      }
-  }
-% \RenewChemState{<name>}[<keyval>]{<symbol>}{<unit>}
-\NewDocumentCommand \RenewChemState { omO{}mm }
-  {
-    \bool_set_true:N \l__chemmacros_renewstate_bool
-    \bool_set_true:N \l__chemmacros_state_overwrite_error_bool
-    \__chemmacros_setnewstate_reset:
-    \IfNoValueTF { #1 }
-      { \chemmacros_define_state:nnnn { #3 } { #2 } { #4 } { #5 } }
-      {
-        \msg_warning:nn { chemmacros } { state-syntax }
-        \chemmacros_define_state:nnnn { #1#3 } { #2 } { #4 } { #5 }
-      }
-  }
-% TODO
-\cs_set_protected:Npn \setnewstate
-  {
-    \msg_warning:nnnn { chemmacros } { command-deprecated }
-      { \setnewstate } { \NewChemState }
-    \NewChemState
-  }
-\cs_set_protected:Npn \renewstate
-  {
-    \msg_warning:nnnn { chemmacros } { command-deprecated }
-      { \renewstate } { \RenewChemState }
-    \RenewChemState
-  }
-
-\cs_new_protected:Npn \__chemmacros_setnewstate_reset:
-  {
-    \tl_set:Nn  \l__chemmacros_thermod_subscript_left_default_tl { true }
-    \tl_clear:N \l__chemmacros_thermod_subscript_default_tl
-    \tl_set:Nn  \l__chemmacros_thermod_exponent_default_tl { \standardstate }
-    \tl_set:Nn  \l__chemmacros_thermod_delta_default_tl { \changestate }
-  }
-
-\cs_new_protected:Npn \chemmacros_define_state:nnnn #1#2#3#4
-  {
-    \keys_set:nn { chemmacros / setnewstate } { #1 }
-    \chemmacros_if_is_cs:nTF { #2 }
-      { \__chemmacros_set_state:xnn { \cs_to_str:N #2 } { #3 } { #4 } }
-      {
-        \msg_warning:nn { chemmacros } { state-syntax }
-        \__chemmacros_set_state:nnn { #2 } { #3 } { #4 }
-      }
-  }
-
-\cs_new_protected:Npn \__chemmacros_set_state:nnn #1#2#3
-  {
-    \bool_if:NT \l__chemmacros_state_overwrite_error_bool
-      {
-        \bool_if:NTF \l__chemmacros_renewstate_bool
-          {
-            \cs_if_exist:cF { #1 }
-              { \msg_error:nnx { chemmacros } { nenew-state } { #1 } }
-          }
-          {
-            \cs_if_exist:cT { #1 }
-              { \msg_error:nnx { chemmacros } { new-state } { #1 } }
-          }
-      }
-    \cs_undefine:c { chemmacros_ #1 _reset: }
-    \cs_undefine:c { c__chemmacros_ #1 _subscript_tl }
-    \cs_undefine:c { c__chemmacros_ #1 _exponent_tl }
-    \cs_undefine:c { c__chemmacros_ #1 _delta_tl }
-    \cs_undefine:c { c__chemmacros_ #1 _left_tl }
-    \cs_undefine:c { c__chemmacros_ #1 _unit_tl }
-    \cs_undefine:c { #1 }
-    \cs_undefine:c { #1 _aux_i:n }
-    \cs_undefine:c { #1 _aux_ii:n }
-    \cs_undefine:c { #1 _aux_iii:n }
-    \group_begin:
-      \tl_const:cV
-        { c__chemmacros_ #1 _subscript_tl }
-        \l__chemmacros_thermod_subscript_default_tl
-      \tl_const:cV
-        { c__chemmacros_ #1 _exponent_tl }
-        \l__chemmacros_thermod_exponent_default_tl
-      \tl_const:cV
-        { c__chemmacros_ #1 _delta_tl }
-        \l__chemmacros_thermod_delta_default_tl
-      \tl_const:cV
-        { c__chemmacros_ #1 _left_tl }
-        \l__chemmacros_thermod_subscript_left_default_tl
-      \tl_const:cn
-        { c__chemmacros_ #1 _unit_tl }
-        { #3 }
-      \cs_new_protected:cpn {chemmacros_ #1 _reset: }
-        {
-          \tl_set_eq:Nc
-            \l__chemmacros_thermod_subscript_tl
-            { c__chemmacros_ #1 _subscript_tl }
-          \tl_set_eq:Nc
-            \l__chemmacros_thermod_exponent_tl
-            { c__chemmacros_ #1 _exponent_tl }
-          \tl_set_eq:Nc
-            \l__chemmacros_thermod_delta_tl
-            { c__chemmacros_ #1 _delta_tl }
-          \tl_set_eq:Nc
-            \l__chemmacros_thermod_subscript_left_tl
-            { c__chemmacros_ #1 _left_tl }
-          \tl_set_eq:Nc
-            \l__chemmacros_thermod_unit_tl
-            { c__chemmacros_ #1 _unit_tl }
-        }
-      \cs_new_protected:cpn { #1 }
-        {
-          \use:c {chemmacros_ #1 _reset: }
-          \peek_meaning:NTF [
-            { \tl_use:c { #1 _aux_i:n } }
-            {
-              \peek_meaning:NTF (
-                { \tl_use:c { #1 _aux_ii:n } }
-                { \tl_use:c { #1 _aux_iii:n } }
-            }
-        }
-      \cs_new_protected:cpn { #1 _aux_i:n } [##1]
-        {
-          \keys_set:nn { chemmacros / State } { ##1 }
-          \peek_meaning:NTF (
-            { \tl_use:c { #1 _aux_ii:n } }
-            { \tl_use:c { #1 _aux_iii:n } }
-        }
-      \cs_new_protected:cpn { #1 _aux_ii:n } (##1)
-        {
-          \tl_set:Nn \l__chemmacros_thermod_subscript_tl { ##1 }
-          \tl_use:c { #1 _aux_iii:n }
-        }
-      \cs_new_protected:cpn { #1 _aux_iii:n } ##1
-        {
-          \ensuremath
-            {
-              \tl_if_eq:VnTF
-                \l__chemmacros_thermod_subscript_left_tl { true }
-                {
-                  \chemmacros_state:xnV
-                    {
-                      subscript-left = true ,
-                      exponent       =
-                        { \exp_not:V \l__chemmacros_thermod_exponent_tl } ,
-                      delta          =
-                        { \exp_not:V \l__chemmacros_thermod_delta_tl }
-                    }
-                    { #2 }
-                }
-                {
-                  \chemmacros_state:xnV
-                    {
-                      subscript-left = false ,
-                      exponent       =
-                        { \exp_not:V \l__chemmacros_thermod_exponent_tl } ,
-                      delta          =
-                        { \exp_not:V \l__chemmacros_thermod_delta_tl }
-                    }
-                    { #2 }
-                }
-                \l__chemmacros_thermod_subscript_tl
-                =
-                \exp_args:NnV \SI { ##1 } \l__chemmacros_thermod_unit_tl
-            }
-        }
-    \group_end:
-    \ignorespaces
-  }
-\cs_generate_variant:Nn \__chemmacros_set_state:nnn { x }
-
-% predefined:
-\NewChemState \Enthalpy {H} {\kilo\joule\per\mole}
-\NewChemState \Entropy [ delta=false, subscript-left=false ]
-  {S} {\joule\per\kelvin\per\mole}
-\NewChemState \Gibbs {G} {\kilo\joule\per\mole}
-
-% --------------------------------------------------------------------------
-% Newman projections
-\fp_new:N  \l__chemmacros_newman_rel_angle_fp
-\fp_zero:N \l__chemmacros_newman_rel_angle_fp
-\fp_new:N  \l__chemmacros_newman_tmp_angle_fp
-\fp_new:N  \l__chemmacros_newman_abs_angle_fp
-\fp_zero:N \l__chemmacros_newman_abs_angle_fp
-\fp_new:N  \l__chemmacros_newman_scale_fp
-\fp_set:Nn \l__chemmacros_newman_scale_fp { 1 }
-\fp_new:N  \l__chemmacros_newman_x_fp
-\fp_new:N  \l__chemmacros_newman_y_fp
-
-\tl_new:N \l__chemmacros_newman_tikz_ring_tl
-\tl_new:N \l__chemmacros_newman_tikz_front_tl
-\tl_new:N \l__chemmacros_newman_tikz_back_tl
-
-\bool_new:N \l__chemmacros_newman_tikz_back_bool
-
-\keys_define:nn { chemmacros / newman }
-  {
-    ring       .tl_set:N  = \l__chemmacros_newman_tikz_ring_tl ,
-    atoms      .tl_set:N  = \l__chemmacros_newman_tikz_front_tl ,
-    back-atoms .code:n    =
-      {
-        \bool_set_true:N \l__chemmacros_newman_tikz_back_bool
-        \tl_set:Nn \l__chemmacros_newman_tikz_back_tl { #1 }
-      } ,
-    scale       .fp_set:N  = \l__chemmacros_newman_scale_fp ,
-    scale       .default:n = 1 ,
-    angle       .fp_set:N  = \l__chemmacros_newman_abs_angle_fp ,
-    angle       .default:n = 0
-  }
-
-% \newman[<keyval>](<angle>){<1>,<2>,<3>,<4>,<5>,<6>}
-\NewDocumentCommand \newman { o d() > { \SplitArgument { 5 } { , } } m }
-  {
-    \group_begin:
-      \IfNoValueF { #1 } { \keys_set:nn { chemmacros / newman } { #1 } }
-      \IfNoValueTF { #2 }
-        { \chemmacros_newman_atoms:nnnnnnn {    } #3 }
-        { \chemmacros_newman_atoms:nnnnnnn { #2 } #3 }
-    \group_end:
-  }
-
-% place atoms:
-% #1: angle
-% #2 - #7: atoms
-\cs_new_protected:Npn \chemmacros_newman_atoms:nnnnnnn #1#2#3#4#5#6#7
-  {
-    \tl_if_blank:nTF { #1 }
-      {
-        \fp_set_eq:NN
-          \l__chemmacros_newman_rel_angle_fp
-          \l__chemmacros_newman_abs_angle_fp
-      }
-      { \fp_set:Nn \l__chemmacros_newman_rel_angle_fp { #1 } }
-    \chemmacros_tikz_picture:xn
-      {
-        scale = \fp_to_tl:N \l__chemmacros_newman_scale_fp ,
-        chemmacros_newman_atom_front / .style =
-          {
-            inner~sep=0pt,
-            outer~sep=0pt,
-            \tl_use:N \l__chemmacros_newman_tikz_front_tl
-          },
-        chemmacros_newman_atom_back / .style =
-          {
-            inner~sep=0pt,
-            outer~sep=0pt,
-            \bool_if:NTF \l__chemmacros_newman_tikz_back_bool
-              { \tl_use:N \l__chemmacros_newman_tikz_back_tl }
-              { \tl_use:N \l__chemmacros_newman_tikz_front_tl }
-          }
-      }
-      {
-        \chemmacros_tikz_draw:f
-          { \tl_use:N \l__chemmacros_newman_tikz_ring_tl }
-          (0pt,0pt) circle (\fp_to_dim:N \l__chemmacros_newman_scale_fp * 15) ;
-        \chemmacros_newman_back_node:nn
-          { 30 }
-          { \IfNoValueF { #6 } { #6 } }
-        \chemmacros_newman_back_node:nf
-          { 150 }
-          { \IfNoValueF { #7 } { #7 } }
-        \chemmacros_newman_back_node:nf
-          { 270 }
-          { \IfNoValueF { #5 } { #5 } }
-        \chemmacros_newman_front_node:nf
-          { 90 }
-          { \IfNoValueF { #2 } { #2 } }
-        \chemmacros_newman_front_node:nf
-          { 210 }
-          { \IfNoValueF { #3 } { #3 } }
-        \chemmacros_newman_front_node:nf
-          { 330 }
-          { \IfNoValueF { #4 } { #4 } }
-    }
-  }
-
-% provide cartesian coordiantes from polar coordinates
-% #1: fp variable for x
-% #2: fp variable for y
-% #3: angle
-% #4: radius
-\cs_new_protected:Npn \chemmacros_polar_to_cartesian:NNnn #1#2#3#4
-  {
-    \fp_set:Nn #1 { #4 * cos( #3 / 180 * pi ) }% x
-    \fp_set:Nn #2 { #4 * sin( #3 / 180 * pi ) }% y
-  }
-
-% place back nodes
-\cs_new_protected:Npn \chemmacros_newman_back_node:nn #1#2
-  {
-    \group_begin:
-      \fp_add:Nn \l__chemmacros_newman_rel_angle_fp { #1 }
-      \chemmacros_polar_to_cartesian:NNnn
-        \l__chemmacros_newman_x_fp
-        \l__chemmacros_newman_y_fp
-        { \l__chemmacros_newman_rel_angle_fp }
-        { \l__chemmacros_newman_scale_fp }
-      \chemmacros_tikz_draw:f
-        { \tl_use:N \l__chemmacros_newman_tikz_ring_tl }
-        (
-          15 * \fp_to_dim:N \l__chemmacros_newman_x_fp ,
-          15 * \fp_to_dim:N \l__chemmacros_newman_y_fp
-        )
-        --
-        (
-          30 * \fp_to_dim:N \l__chemmacros_newman_x_fp ,
-          30 * \fp_to_dim:N \l__chemmacros_newman_y_fp
-        ) ;
-      \chemmacros_polar_to_cartesian:NNnn
-        \l__chemmacros_newman_x_fp
-        \l__chemmacros_newman_y_fp
-        { \l__chemmacros_newman_rel_angle_fp }
-        { \l__chemmacros_newman_scale_fp }
-      \chemmacros_tikz_node:f
-        {
-          chemmacros_newman_atom_back,
-          anchor = -180 + \fp_to_int:N \l__chemmacros_newman_rel_angle_fp
-        }
-        at
-        (
-          31 * \fp_to_dim:N \l__chemmacros_newman_x_fp ,
-          31 * \fp_to_dim:N \l__chemmacros_newman_y_fp
-        )
-        { #2 } ;
-    \group_end:
-  }
-\cs_generate_variant:Nn \chemmacros_newman_back_node:nn { nf }
-
-% place front nodes:
-\cs_new_protected:Npn \chemmacros_newman_front_node:nn #1#2
-  {
-    \chemmacros_polar_to_cartesian:NNnn
-      \l__chemmacros_newman_x_fp
-      \l__chemmacros_newman_y_fp
-      { #1 }
-      { \l__chemmacros_newman_scale_fp }
-    \chemmacros_tikz_draw:f
-      { \tl_use:N \l__chemmacros_newman_tikz_ring_tl }
-      (0pt,0pt) -- ++
-      (
-        30 * \fp_to_dim:N \l__chemmacros_newman_x_fp ,
-        30 * \fp_to_dim:N \l__chemmacros_newman_y_fp
-      ) ;
-    \chemmacros_polar_to_cartesian:NNnn
-      \l__chemmacros_newman_x_fp
-      \l__chemmacros_newman_y_fp
-      { #1 }
-      { \l__chemmacros_newman_scale_fp }
-    \chemmacros_tikz_node:f
-      { chemmacros_newman_atom_front, anchor = -180 + #1 }
-      at
-      (
-        31 * \fp_to_dim:N \l__chemmacros_newman_x_fp ,
-        31 * \fp_to_dim:N \l__chemmacros_newman_y_fp
-      )
-      { #2 } ;
-  }
-\cs_generate_variant:Nn \chemmacros_newman_front_node:nn { nf }
-
-% --------------------------------------------------------------------------
-% \orbital[<keyval>]{<type>}
-% variables:
-\bool_new:N      \l__chemmacros_orbital_type_s_bool
-\bool_new:N      \l__chemmacros_orbital_type_p_bool
-\bool_new:N      \l__chemmacros_orbital_type_sp_bool
-\bool_new:N      \l__chemmacros_orbital_type_sptwo_bool
-\bool_new:N      \l__chemmacros_orbital_type_spthree_bool
-\bool_new:N      \l__chemmacros_orbital_s_phase_bool
-\bool_set_true:N \l__chemmacros_orbital_s_phase_bool
-\bool_new:N      \l__chemmacros_orbital_p_phase_bool
-\bool_set_true:N \l__chemmacros_orbital_p_phase_bool
-\bool_new:N      \l__chemmacros_orbital_sp_phase_bool
-\bool_set_true:N \l__chemmacros_orbital_sp_phase_bool
-\bool_new:N      \l__chemmacros_orbital_sptwo_phase_bool
-\bool_set_true:N \l__chemmacros_orbital_sptwo_phase_bool
-\bool_new:N      \l__chemmacros_orbital_spthree_phase_bool
-\bool_set_true:N \l__chemmacros_orbital_spthree_phase_bool
-\bool_new:N      \l__chemmacros_orbital_p_half_bool
-\bool_new:N      \l__chemmacros_orbital_overlay_bool
-\bool_new:N      \l__chemmacros_orbital_opacity_bool
-
-\tl_new:N  \l__chemmacros_orbital_s_color_tl
-\tl_set:Nn \l__chemmacros_orbital_s_color_tl { black }
-\tl_new:N  \l__chemmacros_orbital_s_phase_color_tl
-\tl_new:N  \l__chemmacros_orbital_p_color_tl
-\tl_set:Nn \l__chemmacros_orbital_p_color_tl { black }
-\tl_new:N  \l__chemmacros_orbital_p_pphase_color_tl
-\tl_new:N  \l__chemmacros_orbital_p_mphase_color_tl
-\tl_new:N  \l__chemmacros_orbital_sp_color_tl
-\tl_set:Nn \l__chemmacros_orbital_sp_color_tl { black }
-\tl_new:N  \l__chemmacros_orbital_sp_pphase_color_tl
-\tl_new:N  \l__chemmacros_orbital_sp_mphase_color_tl
-\tl_new:N  \l__chemmacros_orbital_sptwo_color_tl
-\tl_set:Nn \l__chemmacros_orbital_sptwo_color_tl { black }
-\tl_new:N  \l__chemmacros_orbital_sptwo_pphase_color_tl
-\tl_new:N  \l__chemmacros_orbital_sptwo_mphase_color_tl
-\tl_new:N  \l__chemmacros_orbital_spthree_color_tl
-\tl_set:Nn \l__chemmacros_orbital_spthree_color_tl { black }
-\tl_new:N  \l__chemmacros_orbital_spthree_pphase_color_tl
-\tl_new:N  \l__chemmacros_orbital_spthree_mphase_color_tl
-\tl_new:N  \l__chemmacros_orbital_s_scale_tl
-\tl_set:Nn \l__chemmacros_orbital_s_scale_tl { 1 }
-\tl_new:N  \l__chemmacros_orbital_p_scale_tl
-\tl_set:Nn \l__chemmacros_orbital_p_scale_tl { 1 }
-\tl_new:N  \l__chemmacros_orbital_sp_scale_tl
-\tl_set:Nn \l__chemmacros_orbital_sp_scale_tl { 1 }
-\tl_new:N  \l__chemmacros_orbital_sptwo_scale_tl
-\tl_set:Nn \l__chemmacros_orbital_sptwo_scale_tl { 1 }
-\tl_new:N  \l__chemmacros_orbital_spthree_scale_tl
-\tl_set:Nn \l__chemmacros_orbital_spthree_scale_tl { 1 }
-
-\fp_new:N  \l__chemmacros_orbital_angle_fp
-\fp_set:Nn \l__chemmacros_orbital_angle_fp { 90 }
-\fp_new:N  \l__chemmacros_orbital_opacity_fp
-\fp_set:Nn \l__chemmacros_orbital_opacity_fp { 0.5 }
-
-\cs_new:Npn \__chemmacros_orbital_options:
-  {
-    \__chemmacros_orbital_overlay: , \__chemmacros_orbital_opacity: ,
-    inner~sep=0 , outer~sep=0 , line~width=.2pt ,
-    rotate = { \fp_use:N \l__chemmacros_orbital_angle_fp - 90 } ,
-    baseline ,
-    minimum~size = 0
-  }
-
-\cs_new:Npn \__chemmacros_orbital_overlay:
-  { \bool_if:NT \l__chemmacros_orbital_overlay_bool { overlay } }
-
-\cs_new:Npn \__chemmacros_orbital_opacity:
-  {
-    \bool_if:NT \l__chemmacros_orbital_opacity_bool
-      { opacity = { \fp_use:N \l__chemmacros_orbital_opacity_fp } }
-  }
-
-% --------------------------------------------------------------------------
-% s-orbitals
-\cs_new_protected:Npn \__chemmacros_orbital_type_s:
-  {
-    \bool_set_true:N \l__chemmacros_orbital_type_s_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_p_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_sp_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_sptwo_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_spthree_bool
-  }
-
-\keys_define:nn { chemmacros / orbital / s }
-  {
-    phase .choice: ,
-    phase / + .code:n =
-      { \bool_set_true:N \l__chemmacros_orbital_s_phase_bool } ,
-    phase / - .code:n =
-      { \bool_set_false:N \l__chemmacros_orbital_s_phase_bool } ,
-    scale .tl_set:N   = \l__chemmacros_orbital_s_scale_tl ,
-    color .tl_set:N   = \l__chemmacros_orbital_s_color_tl
-  }
-
-\cs_new_protected:Npn \__chemmacros_orbital_s_draw:n #1
-  {
-    \keys_set:nn { chemmacros / orbital / s } { #1 }
-    \bool_if:NTF \l__chemmacros_orbital_s_phase_bool
-      {
-        \tl_if_in:NnTF \l__chemmacros_orbital_s_color_tl { ! }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_s_phase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_s_color_tl }
-          }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_s_phase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_s_color_tl ! 90 }
-          }
-      }
-      {
-        \tl_set:Nn \l__chemmacros_orbital_s_phase_color_tl
-          { black ! 5 }
-      }
-    \chemmacros_tikz_picture:xn{ \__chemmacros_orbital_options: }
-      {
-        \chemmacros_tikz_shade:f
-          { ball~color = \l__chemmacros_orbital_s_phase_color_tl }
-          (0pt,0pt) circle (\l__chemmacros_orbital_s_scale_tl * .6em) ;
-      }
-  }
-
-% --------------------------------------------------------------------------
-% p-orbitals
-\cs_new_protected:Npn \__chemmacros_orbital_type_p:
-  {
-    \bool_set_false:N \l__chemmacros_orbital_type_s_bool
-    \bool_set_true:N  \l__chemmacros_orbital_type_p_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_sp_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_sptwo_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_spthree_bool
-  }
-
-\keys_define:nn { chemmacros / orbital / p }
-  {
-    phase .choice: ,
-    phase / + .code:n =
-      { \bool_set_true:N \l__chemmacros_orbital_p_phase_bool } ,
-    phase / - .code:n =
-      { \bool_set_false:N \l__chemmacros_orbital_p_phase_bool } ,
-    scale .tl_set:N   = \l__chemmacros_orbital_p_scale_tl ,
-    angle .fp_set:N   = \l__chemmacros_orbital_angle_fp ,
-    color .tl_set:N   = \l__chemmacros_orbital_p_color_tl ,
-    half  .bool_set:N = \l__chemmacros_orbital_p_half_bool ,
-    half  .default:n  = true
-  }
-
-\cs_new_protected:Npn \__chemmacros_orbital_p_draw:n #1
-  {
-    \keys_set:nn { chemmacros / orbital / p } { #1 }
-    \bool_if:NTF \l__chemmacros_orbital_p_phase_bool
-      {
-        \tl_if_in:NnTF \l__chemmacros_orbital_p_color_tl { ! }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_p_pphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_p_color_tl }
-          }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_p_pphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_p_color_tl ! 90 }
-          }
-        \tl_set:Nn \l__chemmacros_orbital_p_mphase_color_tl
-          { black ! 5 }
-        
-      }
-      {
-        \tl_if_in:NnTF \l__chemmacros_orbital_p_color_tl { ! }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_p_mphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_p_color_tl }
-          }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_p_mphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_p_color_tl ! 90 }
-          }
-        \tl_set:Nn \l__chemmacros_orbital_p_pphase_color_tl
-          { black ! 5 }
-      }
-    \chemmacros_tikz_picture:xn { \__chemmacros_orbital_options: }
-      {
-        \chemmacros_tikz_shadedraw:f
-          {
-            draw = \l__chemmacros_orbital_p_pphase_color_tl ,
-            ball~color = \l__chemmacros_orbital_p_pphase_color_tl
-          }
-          (0pt,0pt) .. controls ++
-          (
-            - \l__chemmacros_orbital_p_scale_tl * 2em ,
-            \l__chemmacros_orbital_p_scale_tl * 2em
-          )
-          and ++
-          (
-            \l__chemmacros_orbital_p_scale_tl * 2em ,
-            \l__chemmacros_orbital_p_scale_tl * 2em
-          )
-          .. (0pt,0pt);
-        \bool_if:NF \l__chemmacros_orbital_p_half_bool
-          {
-            \chemmacros_tikz_shadedraw:f
-              {
-                draw = \l__chemmacros_orbital_p_mphase_color_tl ,
-                ball~color = \l__chemmacros_orbital_p_mphase_color_tl
-              }
-              (0pt,0pt) .. controls ++
-              (
-                - \l__chemmacros_orbital_p_scale_tl * 2em ,
-                - \l__chemmacros_orbital_p_scale_tl * 2em
-              )
-              and ++
-              (
-                \l__chemmacros_orbital_p_scale_tl * 2em ,
-                - \l__chemmacros_orbital_p_scale_tl * 2em
-              )
-              .. (0pt,0pt);
-          }
-      }
-  }
-
-% --------------------------------------------------------------------------
-% sp-orbitals
-\cs_new_protected:Npn \__chemmacros_orbital_type_sp:
-  {
-    \bool_set_false:N \l__chemmacros_orbital_type_s_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_p_bool
-    \bool_set_true:N  \l__chemmacros_orbital_type_sp_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_sptwo_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_spthree_bool
-  }
-
-\keys_define:nn { chemmacros / orbital / sp }
-  {
-    phase .choice: ,
-    phase / + .code:n =
-      { \bool_set_true:N \l__chemmacros_orbital_sp_phase_bool } ,
-    phase / - .code:n =
-      { \bool_set_false:N \l__chemmacros_orbital_sp_phase_bool } ,
-    scale .tl_set:N   = \l__chemmacros_orbital_sp_scale_tl ,
-    angle .fp_set:N   = \l__chemmacros_orbital_angle_fp ,
-    color .tl_set:N   = \l__chemmacros_orbital_sp_color_tl
-  }
-
-\cs_new_protected:Npn \__chemmacros_orbital_sp_draw:n #1
-  {
-    \keys_set:nn { chemmacros / orbital / sp } { #1 }
-    \bool_if:NTF \l__chemmacros_orbital_sp_phase_bool
-      {
-        \tl_if_in:NnTF \l__chemmacros_orbital_sp_color_tl { ! }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_sp_pphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_sp_color_tl }
-          }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_sp_pphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_sp_color_tl ! 90 }
-          }
-        \tl_set:Nn \l__chemmacros_orbital_sp_mphase_color_tl
-          { black ! 5 }
-        
-      }
-      {
-        \tl_if_in:NnTF \l__chemmacros_orbital_sp_color_tl { ! }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_sp_mphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_sp_color_tl }
-          }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_sp_mphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_sp_color_tl ! 90 }
-          }
-        \tl_set:Nn \l__chemmacros_orbital_sp_pphase_color_tl
-          { black ! 5 }
-      }
-    \chemmacros_tikz_picture:xn { \__chemmacros_orbital_options: }
-      {
-        \chemmacros_tikz_shadedraw:f
-          {
-            draw = \l__chemmacros_orbital_sp_pphase_color_tl ,
-            ball~color = \l__chemmacros_orbital_sp_pphase_color_tl
-          }
-          (0pt,0pt) .. controls ++
-          (
-            - \l__chemmacros_orbital_sp_scale_tl * 2em ,
-            \l__chemmacros_orbital_sp_scale_tl * 2em
-          )
-          and ++
-          (
-            \l__chemmacros_orbital_sp_scale_tl * 2em ,
-            \l__chemmacros_orbital_sp_scale_tl * 2em
-          )
-          .. (0pt,0pt);
-        \chemmacros_tikz_shadedraw:f
-          {
-            draw = \l__chemmacros_orbital_sp_mphase_color_tl ,
-            ball~color = \l__chemmacros_orbital_sp_mphase_color_tl
-          }
-          (0pt,0pt) .. controls ++
-          (
-            - \l__chemmacros_orbital_sp_scale_tl * .6em ,
-            - \l__chemmacros_orbital_sp_scale_tl * .6em
-          )
-          and ++
-          (
-            \l__chemmacros_orbital_sp_scale_tl * .6em ,
-            - \l__chemmacros_orbital_sp_scale_tl * .6em
-          )
-          .. (0pt,0pt);
-      }
-  }
-
-% --------------------------------------------------------------------------
-% sp2-orbitals
-\cs_new_protected:Npn \__chemmacros_orbital_type_sptwo:
-  {
-    \bool_set_false:N \l__chemmacros_orbital_type_s_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_p_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_sp_bool
-    \bool_set_true:N  \l__chemmacros_orbital_type_sptwo_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_spthree_bool
-  }
-
-\keys_define:nn { chemmacros / orbital / sp2 }
-  {
-    phase .choice: ,
-    phase / + .code:n =
-      { \bool_set_true:N \l__chemmacros_orbital_sptwo_phase_bool } ,
-    phase / - .code:n =
-      { \bool_set_false:N \l__chemmacros_orbital_sptwo_phase_bool } ,
-    scale .tl_set:N   = \l__chemmacros_orbital_sptwo_scale_tl ,
-    angle .fp_set:N   = \l__chemmacros_orbital_angle_fp ,
-    color .tl_set:N   = \l__chemmacros_orbital_sptwo_color_tl
-  }
-
-\cs_new_protected:Npn \__chemmacros_orbital_sptwo_draw:n #1
-  {
-    \keys_set:nn { chemmacros / orbital / sp2 } { #1 }
-    \bool_if:NTF \l__chemmacros_orbital_sptwo_phase_bool
-      {
-        \tl_if_in:NnTF \l__chemmacros_orbital_sptwo_color_tl { ! }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_sptwo_pphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_sptwo_color_tl }
-          }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_sptwo_pphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_sptwo_color_tl ! 90 }
-          }
-        \tl_set:Nn \l__chemmacros_orbital_sptwo_mphase_color_tl
-          { black ! 5 }
-        
-      }
-      {
-        \tl_if_in:NnTF \l__chemmacros_orbital_sptwo_color_tl { ! }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_sptwo_mphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_sptwo_color_tl }
-          }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_sptwo_mphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_sptwo_color_tl ! 90 }
-          }
-        \tl_set:Nn \l__chemmacros_orbital_sptwo_pphase_color_tl
-          { black ! 5 }
-      }
-    \chemmacros_tikz_picture:xn { \__chemmacros_orbital_options: }
-      {
-        \chemmacros_tikz_shadedraw:f
-          {
-            draw = \l__chemmacros_orbital_sptwo_pphase_color_tl ,
-            ball~color = \l__chemmacros_orbital_sptwo_pphase_color_tl
-          }
-          (0pt,0pt) .. controls ++
-          (
-            - \l__chemmacros_orbital_sptwo_scale_tl * 2em ,
-            \l__chemmacros_orbital_sptwo_scale_tl * 2em
-          )
-          and ++
-          (
-            \l__chemmacros_orbital_sptwo_scale_tl * 2em ,
-            \l__chemmacros_orbital_sptwo_scale_tl * 2em
-          )
-          .. (0pt,0pt);
-        \chemmacros_tikz_shadedraw:f
-          {
-            draw = \l__chemmacros_orbital_sptwo_mphase_color_tl ,
-            ball~color = \l__chemmacros_orbital_sptwo_mphase_color_tl
-          }
-          (0pt,0pt) .. controls ++
-          (
-            - \l__chemmacros_orbital_sptwo_scale_tl * .8em ,
-            - \l__chemmacros_orbital_sptwo_scale_tl * .8em
-          )
-          and ++
-          (
-            \l__chemmacros_orbital_sptwo_scale_tl * .8em ,
-            - \l__chemmacros_orbital_sptwo_scale_tl * .8em
-          )
-          .. (0pt,0pt);
-      }
-  }
-
-% --------------------------------------------------------------------------
-% sp3-orbitals
-\cs_new_protected:Npn \__chemmacros_orbital_type_spthree:
-  {
-    \bool_set_false:N \l__chemmacros_orbital_type_s_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_p_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_sp_bool
-    \bool_set_false:N \l__chemmacros_orbital_type_sptwo_bool
-    \bool_set_true:N  \l__chemmacros_orbital_type_spthree_bool
-  }
-
-\keys_define:nn { chemmacros / orbital / sp3 }
-  {
-    phase .choice: ,
-    phase / + .code:n =
-      { \bool_set_true:N \l__chemmacros_orbital_spthree_phase_bool } ,
-    phase / - .code:n =
-     { \bool_set_false:N \l__chemmacros_orbital_spthree_phase_bool } ,
-    scale .tl_set:N   = \l__chemmacros_orbital_spthree_scale_tl ,
-    angle .fp_set:N   = \l__chemmacros_orbital_angle_fp ,
-    color .tl_set:N   = \l__chemmacros_orbital_spthree_color_tl
-  }
-
-\cs_new_protected:Npn \__chemmacros_orbital_spthree_draw:n #1
-  {
-    \keys_set:nn { chemmacros / orbital / sp3 } { #1 }
-    \bool_if:NTF \l__chemmacros_orbital_spthree_phase_bool
-      {
-        \tl_if_in:NnTF \l__chemmacros_orbital_spthree_color_tl { ! }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_spthree_pphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_spthree_color_tl }
-          }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_spthree_pphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_spthree_color_tl ! 90 }
-          }
-        \tl_set:Nn \l__chemmacros_orbital_spthree_mphase_color_tl
-          { black ! 5 }
-        
-      }
-      {
-        \tl_if_in:NnTF \l__chemmacros_orbital_spthree_color_tl { ! }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_spthree_mphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_spthree_color_tl }
-          }
-          {
-            \tl_set:Nn \l__chemmacros_orbital_spthree_mphase_color_tl
-              { \tl_use:N \l__chemmacros_orbital_spthree_color_tl ! 90 }
-          }
-        \tl_set:Nn \l__chemmacros_orbital_spthree_pphase_color_tl
-          { black ! 5 }
-      }
-    \chemmacros_tikz_picture:xn { \__chemmacros_orbital_options: }
-      {
-        \chemmacros_tikz_shadedraw:f
-          {
-            draw = \l__chemmacros_orbital_spthree_pphase_color_tl ,
-            ball~color = \l__chemmacros_orbital_spthree_pphase_color_tl
-          }
-          (0pt,0pt) .. controls ++
-          (
-            - \l__chemmacros_orbital_spthree_scale_tl * 2em ,
-            \l__chemmacros_orbital_spthree_scale_tl * 2em
-          )
-          and ++
-          (
-            \l__chemmacros_orbital_spthree_scale_tl * 2em ,
-            \l__chemmacros_orbital_spthree_scale_tl * 2em
-          )
-          .. (0pt,0pt);
-        \chemmacros_tikz_shadedraw:f
-          {
-            draw = \l__chemmacros_orbital_spthree_mphase_color_tl ,
-            ball~color = \l__chemmacros_orbital_spthree_mphase_color_tl
-          }
-          (0pt,0pt) .. controls ++
-          (
-            - \l__chemmacros_orbital_spthree_scale_tl * 1em ,
-            - \l__chemmacros_orbital_spthree_scale_tl * 1em
-          )
-          and ++
-          (
-            \l__chemmacros_orbital_spthree_scale_tl * 1em ,
-            - \l__chemmacros_orbital_spthree_scale_tl * 1em
-          )
-          .. (0pt,0pt);
-      }
-  }
-
-% --------------------------------------------------------------------------
-% main command
-\keys_define:nn { chemmacros / orbital }
-  {
-    overlay .bool_set:N = \l__chemmacros_orbital_overlay_bool ,
-    overlay .default:n  = true ,
-    opacity .code:n     =
-      {
-        \fp_compare:nTF { #1 = 1 }
-          { \bool_set_false:N \l__chemmacros_orbital_opacity_bool }
-          { \bool_set_true:N \l__chemmacros_orbital_opacity_bool }
-        \fp_set:Nn \l__chemmacros_orbital_opacity_fp { #1 }
-      }
-  }
-
-\keys_define:nn { chemmacros / orbital / type }
-  {
-    s   .code:n = { \__chemmacros_orbital_type_s: } ,
-    p   .code:n = { \__chemmacros_orbital_type_p: } ,
-    sp  .code:n = { \__chemmacros_orbital_type_sp: } ,
-    sp2 .code:n = { \__chemmacros_orbital_type_sptwo: } ,
-    sp3 .code:n = { \__chemmacros_orbital_type_spthree: }
-  }
-
-\cs_new_protected:Npn \chemmacros_orbital:n #1
-  {
-    \bool_if:NT \l__chemmacros_orbital_type_s_bool
-      { \__chemmacros_orbital_s_draw:n { #1 } }
-    \bool_if:NT \l__chemmacros_orbital_type_p_bool
-      { \__chemmacros_orbital_p_draw:n { #1 } }
-    \bool_if:NT \l__chemmacros_orbital_type_sp_bool
-      { \__chemmacros_orbital_sp_draw:n { #1 } }
-    \bool_if:NT \l__chemmacros_orbital_type_sptwo_bool
-      { \__chemmacros_orbital_sptwo_draw:n { #1 } }
-    \bool_if:NT \l__chemmacros_orbital_type_spthree_bool
-      { \__chemmacros_orbital_spthree_draw:n { #1 } }
-  }
-
-\NewDocumentCommand \orbital { o m }
-  {
-    \group_begin:
-      \keys_set:nn { chemmacros / orbital / type } { #2 }
-      \IfNoValueTF { #1 }
-        { \chemmacros_orbital:n {    } }
-        { \chemmacros_orbital:n { #1 } }
-    \group_end:
-  }
-
-% --------------------------------------------------------------------------
-% arrow tips for electron movement
-\dim_new:N \l__chemmacros_el_length_dim
-
-% full tip for pairs
-\pgfarrowsdeclare { el } { el }
-  {
-    \dim_set:Nn \l__chemmacros_el_length_dim
-      { 2.5pt + 2.5\pgflinewidth }
-    \pgfarrowsleftextend { -\l__chemmacros_el_length_dim }
-    \pgfarrowsrightextend { .5\pgflinewidth }
-  }
-  {
-    \dim_set:Nn \l__chemmacros_el_length_dim
-      { 2.5pt + 2.5\pgflinewidth }
-    \pgfsetdash {} { 0pt }
-    \pgfsetroundjoin
-    \pgfsetroundcap
-    \pgfpathmoveto { \pgfpoint { 0pt } { 0pt } }
-    \pgfpathlineto
-      {
-        \pgfpoint
-          { -\l__chemmacros_el_length_dim }
-          { .3\l__chemmacros_el_length_dim }
-      }
-    \pgfpathlineto
-      { \pgfpoint { -.5\l__chemmacros_el_length_dim } { 0pt } }
-    \pgfpathlineto
-      {
-        \pgfpoint
-          { -\l__chemmacros_el_length_dim }
-          { -.3\l__chemmacros_el_length_dim }
-      }
-    \pgfpathlineto { \pgfpoint { 0pt } { 0pt } }
-    \pgfusepathqfillstroke
-  }
-
-% half tip on the left
-\pgfarrowsdeclare { left~el } { left~el }
-  {
-    \dim_set:Nn \l__chemmacros_el_length_dim
-      { 2.5pt + 2.5\pgflinewidth }
-    \pgfarrowsleftextend { -\l__chemmacros_el_length_dim }
-    \pgfarrowsrightextend { .5\pgflinewidth }
-  }
-  {
-    \dim_set:Nn \l__chemmacros_el_length_dim
-      { 2.5pt + 2.5\pgflinewidth }
-    \pgfsetdash {} { 0pt }
-    \pgfsetroundjoin
-    \pgfsetroundcap
-    \pgfpathmoveto { \pgfpoint { 0pt } { 0pt } }
-    \pgfpathlineto
-      {
-        \pgfpoint
-          { -\l__chemmacros_el_length_dim }
-          { .3\l__chemmacros_el_length_dim }
-      }
-    \pgfpathlineto { \pgfpoint { -.5\l__chemmacros_el_length_dim } { 0pt } }
-    \pgfpathlineto { \pgfpoint { 0pt } { 0pt } }
-    \pgfusepathqfillstroke
-  }
-
-% half tip in the right
-\pgfarrowsdeclare { right~el } { right~el }
-  {
-    \dim_set:Nn \l__chemmacros_el_length_dim
-      { 2.5pt + 2.5\pgflinewidth }
-    \pgfarrowsleftextend { -\l__chemmacros_el_length_dim }
-    \pgfarrowsrightextend { .5\pgflinewidth }
-  }
-  {
-    \dim_set:Nn \l__chemmacros_el_length_dim
-      { 2.5pt + 2.5\pgflinewidth }
-    \pgfsetdash {} { 0pt }
-    \pgfsetroundjoin
-    \pgfsetroundcap
-    \pgfpathmoveto { \pgfpoint { 0pt } { 0pt } }
-    \pgfpathlineto
-      {
-        \pgfpoint
-          { -\l__chemmacros_el_length_dim }
-          { -.3\l__chemmacros_el_length_dim }
-      }
-    \pgfpathlineto { \pgfpoint { -.5\l__chemmacros_el_length_dim } { 0pt } }
-    \pgfpathlineto { \pgfpoint { 0pt } { 0pt } }
-    \pgfusepathqfillstroke
-  }
-
-% --------------------------------------------------------------------------
-% setup
-\NewDocumentCommand \chemsetup { o m }
-  {
-    \IfNoValueTF { #1 }
-      { \keys_set:nn { chemmacros } { #2 } }
-      {
-        \tl_if_eq:nnTF { #1 } { chemformula }
-          { \setchemformula { #2 } }
-          { \keys_set:nn { chemmacros / #1 } { #2 } }
-      }
-    \ignorespaces
-  }
-
-
-% --------------------------------------------------------------------------
-% hyperref support
-% ?? unsure about adding IUPAC commands
-\AfterPackage* { hyperref }
-  {
-    \pdfstringdefDisableCommands
-      {
-        % \cs_set:Npn \- { - } % maybe not a good idea...
-        \cs_set:Npn \| { }
-        \cs_set:Npn \pH { pH }
-        \cs_set:Npn \pOH { pOH }
-        \cs_set:Npn \iupac #1 { #1 }
-        \cs_set:Npn \cip #1 { (#1) }
-        \cs_set:Npn \cis { cis }
-        \cs_set:Npn \trans { trans }
-        \cs_set:Npn \tert { tert }
-        \cs_set:Npn \ortho { o }
-        \cs_set:Npn \meta { m }
-        \cs_set:Npn \para { p }
-        \cs_set:Npn \syn { syn }
-        \cs_set:Npn \anti { anti }
-      }
-  }
-
-% --------------------------------------------------------------------------
-% language support -- provided through `translations'
-% equilibrium constants:
-\DeclareTranslationFallback {K-acid}  {\mathrm{a}}
-\DeclareTranslation{German} {K-acid}  {\mathrm{s}}
-\DeclareTranslation{Dutch}  {K-acid}  {\mathrm{z}}
-
-\DeclareTranslationFallback {K-base}  {\mathrm{b}}
-
-\DeclareTranslationFallback {K-water} {\mathrm{w}}
-
-% phases:
-\DeclareTranslation{German}{phase-sld}{ f }
-\DeclareTranslation{German}{phase-lqd}{ f{}l }
-% list of reactions:
-\DeclareTranslationFallback  {list-of-reactions} { List~ of~ reactions }
-\DeclareTranslation{English} {list-of-reactions} { List~ of~ reactions }
-\DeclareTranslation{German}  {list-of-reactions} { Reaktionsverzeichnis }
-\DeclareTranslation{Italian} {list-of-reactions} { Elenco~ delle~ reazioni }
-\DeclareTranslation{French}  {list-of-reactions} { Table~ des~ r\'eactions }
-\DeclareTranslation{Dutch}   {list-of-reactions} { Lijst~ van~ reacties }
-%
-\DeclareTranslationFallback  {reaction} { Reaction }
-\DeclareTranslation{English} {reaction} { Reaction }
-\DeclareTranslation{German}  {reaction} { Reaktion }
-\DeclareTranslation{Italian} {reaction} { Reazione }
-\DeclareTranslation{French}  {reaction} { R\'eaction }
-\DeclareTranslation{Dutch}   {reaction} { Reactie }
-
-\tl_set:Nn \l__chemmacros_reaction_lorname_tl
-  { \chemmacros_translate:n {reaction} }
-\tl_set:Nn \reactionlistname
-  { \chemmacros_translate:n {list-of-reactions} }
-
-\file_input_stop:
-
-% --------------------------------------------------------------------------
-Version history
-2015/08/29 - version 5.0  - integration as v4.7 into v5.0 of chemmacros for
-                            backwards compatibility
-                          - fix typo in \l_chemformula_formal_charges_bool
-                          - remove \tl_to_lowercase:n
-
-% --------------------------------------------------------------------------- %
-% TODO:
-- add d-orbitals
-- make electron movement arrow tips (`el', `left el' and `right el') public
-- phase commands with arguments (see http://texwelt.de/wissen/fragen/9264)
-

Deleted: trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros5.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros5.sty	2022-01-17 20:54:44 UTC (rev 61630)
+++ trunk/Master/texmf-dist/tex/latex/chemmacros/chemmacros5.sty	2022-01-17 20:55:11 UTC (rev 61631)
@@ -1,330 +0,0 @@
-% --------------------------------------------------------------------------
-% the CHEMMACROS package
-%
-%   comprehensive support for typesetting chemistry documents
-%
-% --------------------------------------------------------------------------
-% Clemens Niederberger
-% --------------------------------------------------------------------------
-% https://github.org/cgnieder/chemmacros/
-% contact at mychemistry.eu
-% --------------------------------------------------------------------------
-% If you have any ideas, questions, suggestions or bugs to report, please
-% feel free to contact me.
-% --------------------------------------------------------------------------
-% 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.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 2008/05/04 or later.
-%
-% This work has the LPPL maintenance status `maintained'.
-%
-% The Current Maintainer of this work is Clemens Niederberger.
-% --------------------------------------------------------------------------
-% The chemmacros package consists of the following files
-%  - chemmacros.sty, chemmacros4.sty, chemmacros5.sty,
-%  - chemmacros_en.tex, chemmacros_en.pdf,
-%  - quite a number of module files following the naming scheme
-%    chemmacros.module.*.code.tex
-%  - README
- % --------------------------------------------------------------------------
-\RequirePackage{expl3,xparse,l3keys2e}
-\ExplSyntaxOn
-
-% --------------------------------------------------------------------------
-% package information:
-\ProvidesExplPackage
-  {chemmacros5}
-  {\c_chemmacros_date_tl}
-  {\c_chemmacros_version_tl}
-  {\c_chemmacros_info_tl \c_space_tl (CN)}
-
-% --------------------------------------------------------------------------
-\msg_new:nnn {chemmacros} {package-option}
-  {
-    Unknown~ option~ `#1'!~ Since~ v5.0~ chemmacros~ has~ no~ package~
-    options~ any~ more!
-  }
-
-\msg_new:nnn {chemmacros} {module-not-available}
-  {
-    The~ module~ `#1'~ is~ only~ available~ in~ compatibility~ mode~ #2~ or~
-    higher.
-  }
-
-\cs_generate_variant:Nn \msg_warning:nnn { nnV }
-
-\keys_define:nn {chemmacros/package-options}
-  {
-    compatibility .code:n = ,
-    unknown       .code:n =
-      \msg_warning:nnV {chemmacros} {package-option} \CurrentOption
-  }
-
-\ProcessKeysPackageOptions {chemmacros/package-options}
-
-% --------------------------------------------------------------------------
-% messages:
-\msg_new:nnn {chemmacros} {module-missing}
-  {
-    You've~ requested~ the~ chemmacros~ 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 {chemmacros} {loading-module}
-  {
-    (chemmacros) \c_space_tl \c_space_tl \c_space_tl \c_space_tl
-    Loading~ module~ `#1'...
-  }
-
-% --------------------------------------------------------------------------
-% variants of kernel functions:
-\cs_generate_variant:Nn \tl_if_eq:nnTF       {xx,V}
-\cs_generate_variant:Nn \seq_set_split:Nnn   {Nnx}
-\cs_generate_variant:Nn \prop_item:Nn        {NV}
-\cs_generate_variant:Nn \seq_item:Nn         {cV}
-\cs_generate_variant:Nn \int_to_arabic:n     {V}
-\cs_generate_variant:Nn \tl_replace_once:Nnn {NnV}
-\cs_generate_variant:Nn \prop_gput:Nnn       {cxx,NVf}
-\cs_generate_variant:Nn \msg_error:nnn       {nnV}
-\cs_generate_variant:Nn \msg_warning:nnn     {nnV}
-\cs_generate_variant:Nn \msg_warning:nnnn    {nnV}
-\cs_generate_variant:Nn \vbox_set:Nn         {NV}
-\cs_generate_variant:Nn \keys_define:nn      {x} 
-\cs_generate_variant:Nn \keys_set:nn         {x,nx}
-
-% --------------------------------------------------------------------------
-% temporary variables:
-\tl_new:N    \l__chemmacros_tmpa_tl
-\tl_new:N    \l__chemmacros_tmpb_tl
-\tl_new:N    \l__chemmacros_tmpc_tl
-\tl_new:N    \l__chemmacros_tmpd_tl
-
-\bool_new:N  \l__chemmacros_tmpa_bool
-\bool_new:N  \l__chemmacros_tmpb_bool
-\bool_new:N  \l__chemmacros_tmpc_bool
-
-\dim_new:N   \l__chemmacros_tmpa_dim
-\dim_new:N   \l__chemmacros_tmpb_dim
-\dim_new:N   \l__chemmacros_tmpc_dim
-
-\seq_new:N   \l__chemmacros_tmpa_seq
-\seq_new:N   \l__chemmacros_tmpb_seq
-\seq_new:N   \l__chemmacros_tmpc_seq
-
-\int_new:N   \l__chemmacros_tmpa_int
-\int_new:N   \l__chemmacros_tmpb_int
-\int_new:N   \l__chemmacros_tmpc_int
-
-\box_new:N   \l__chemmacros_tmpa_box
-\box_new:N   \l__chemmacros_tmpb_box
-\box_new:N   \l__chemmacros_tmpc_box
-
-\clist_new:N \l__chemmacros_tmpa_clist
-\clist_new:N \l__chemmacros_tmpb_clist
-\clist_new:N \l__chemmacros_tmpc_clist
-
-\str_new:N   \l__chemmacros_tmpa_str
-\str_new:N   \l__chemmacros_tmpb_str
-\str_new:N   \l__chemmacros_tmpc_str
-
-% --------------------------------------------------------------------------
-% module mechanism:
-\tl_const:Nn \c__chemmacros_module_extension_tl {code.tex}
-\tl_const:Nn \c__chemmacros_module_prefix_tl    {chemmacros.module}
-
-\seq_new:N \g__chemmacros_loaded_modules_seq
-\prop_new:N \g__chemmacros_loaded_modules_prop
-
-\cs_new_protected:Npn \chemmacros_load_modules:n #1
-  { \clist_map_inline:nn {#1} { \chemmacros_load_module:n {##1} } }
-
-\cs_new_protected:Npn \chemmacros_load_module:n #1
-  {
-    \tl_set:Nx \l__chemmacros_tmpa_tl { \tl_trim_spaces:n {#1} }
-    \__chemmacros_load_module:V \l__chemmacros_tmpa_tl
-  }
-
-\cs_new_protected:Npn \__chemmacros_load_module:n #1
-  {
-    \chemmacros_if_module_loaded:nF {#1}
-      {
-        \chemmacros_if_module_exist:nTF {#1}
-          {
-            \__chemmacros_use_module_hook:nn {#1} {before}
-            \msg_log:nnn {chemmacros} {loading-module} {#1}
-            \@onefilewithoptions
-              {\c__chemmacros_module_prefix_tl.#1}[][]
-              \c__chemmacros_module_extension_tl
-            \__chemmacros_use_module_hook:nn {#1} {after}
-          }
-          { \msg_error:nnn {chemmacros} {module-missing} {#1} }
-      }
-  }
-\cs_generate_variant:Nn \__chemmacros_load_module:n { V }
-
-\prg_new_conditional:Npnn \chemmacros_if_module_loaded:n #1 {p,T,F,TF}
-  {
-    \seq_if_in:NnTF \g__chemmacros_loaded_modules_seq {#1}
-      { \prg_return_true: }
-      { \prg_return_false: }
-  }
-
-\prg_new_conditional:Npnn \chemmacros_if_module_exist:n #1 {p,T,F,TF}
-  {
-    \file_if_exist:nTF
-      {\c__chemmacros_module_prefix_tl.#1.\c__chemmacros_module_extension_tl}
-      { \prg_return_true: }
-      { \prg_return_false: }
-  }
-
-% --------------------------------------------------------------------------
-\ChemCompatibilityFrom{5.1}
-% module hooks:
-% #1: module
-% #2: code
-\cs_new_protected:Npn \chemmacros_after_module:nn #1#2
-  {
-    \chemmacros_if_module_loaded:nTF {#1}
-      {#2}
-      { \__chemmacros_add_to_module_hook:nnn {#1} {after} {#2} }
-  }
-
-% #1: module
-% #2: code
-\cs_new_protected:Npn \chemmacros_before_module:nn #1#2
-  {
-    \chemmacros_if_module_loaded:nF {#1}
-      { \__chemmacros_add_to_module_hook:nnn {#1} {before} {#2} }
-  }
-\EndChemCompatibility
-
-% #1: module
-% #2: hook name
-% #3: code
-\cs_new_protected:Npn \__chemmacros_add_to_module_hook:nnn #1#2#3
-  {
-    \chemmacros_if_module_loaded:nF {#1}
-      {
-        \tl_if_exist:cF {g__chemmacros_module_#1_#2_hook_tl}
-          { \tl_new:c {g__chemmacros_module_#1_#2_hook_tl} }
-        \tl_gput_right:cn {g__chemmacros_module_#1_#2_hook_tl} {#3}
-      }
-  }
-
-% #1: module
-% #2: hook name
-\cs_new_protected:Npn \__chemmacros_use_module_hook:nn #1#2
-  {
-    \tl_if_exist:cT {g__chemmacros_module_#1_#2_hook_tl}
-      {
-        \tl_use:c {g__chemmacros_module_#1_#2_hook_tl}
-        \tl_gclear:c {g__chemmacros_module_#1_#2_hook_tl}
-      }
-  }
-
-% --------------------------------------------------------------------------
-\cs_new_protected:Npn \__chemmacros_module:nnnn #1#2#3#4
-  {
-    \chemmacros_if_compatibility:nnF {>=} {#4}
-      {
-        \msg_warning:nnnn {chemmacros} {module-not-available} {#2} {#4}
-        \file_input_stop:
-      }
-    \seq_gput_right:Nn \g__chemmacros_loaded_modules_seq {#2}
-    \prop_gput:Nnn \g__chemmacros_loaded_modules_prop {#2} {#3}
-    \ProvidesFile
-      {\c__chemmacros_module_prefix_tl.#2.\c__chemmacros_module_extension_tl}
-      [
-        \c_chemmacros_date_tl
-        \c_space_tl
-        v \c_chemmacros_version_tl
-        \c_space_tl
-        chemmacros~ module~ `#2'~ #3
-      ]
-    \bool_if:nF {#1} { \ExplSyntaxOn }
-  }
-  
-% define a chemmacros module:
-% standard modules are written in the expl3 programming environment, the
-% starred version only uses a 2e programming environment, i.e., with @ as a
-% letter
-% #1: boolean
-% #2: name
-% #3: description
-\NewDocumentCommand \ChemModule {smmO{5.0}}
-  { \__chemmacros_module:nnnn {#1} {#2} {#3} {#4} }
-
-% --------------------------------------------------------------------------
-% command for loading modules:
-\NewDocumentCommand \usechemmodule {m} { \chemmacros_load_modules:n {#1} }
-
-% --------------------------------------------------------------------------
-% load default modules:
-\chemmacros_load_modules:n
-  {
-    % required modules:
-    base,
-    errorcheck,
-    lang, greek,
-    chemformula,
-    % preloaded modules:
-    acid-base,
-    symbols,
-    charges,
-    particles,
-    phases ,
-    nomenclature
-  }
-
-% --------------------------------------------------------------------------
-\file_input_stop:
-
-% --------------------------------------------------------------------------
-Modules: (* = preloaded)
- - internal modules:
-   - base *
-   - errorcheck *
-   - lang *
-   - greek *
-   - chemformula *
-   - tikz
- - user modules:
-   - acid-base *
-   - all
-   - charges *
-   - isotopes
-   - mechanisms
-   - newman
-   - nomenclature *
-   - orbital
-   - particles *
-   - phases *
-   - reactions
-   - redox
-   - scheme
-   - spectroscopy
-   - symbols *
-   - thermodynamics
-   - units
-   - xfrac
-
-% --------------------------------------------------------------------------
-Version history
-2015/08/29 - initial release v5.0
-2015/09/23 - add module hooks `before' and `after'
-           - allow to give minimal compatibility version to a module: this
-             should be the first version when a module is published and
-             shouldn't be changed any more; loading the corresponding module
-             will abort when compatibility is too low
-           - store loaded modules in a seq and in a prop
-2015/10/14 - bug fix in the module hook mechanism
-           - bug fix in \chemmacros_if_module_loaded:n
-           - new `errorcheck' module
-2020/02/03 - add temporary string variables



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