%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% --------------------------------------------------------------------------- %
% - chemmacros - chemmacros.sty                                             - %
% - macros and commands for chemists                                        - %
% --------------------------------------------------------------------------- %
% - Clemens Niederberger                                                    - %
% - 2011/11/03                                                              - %
% --------------------------------------------------------------------------- %
% - http://www.mychemistry.eu/                                              - %
% - contact@mychemistry.eu                                                  - %
% --------------------------------------------------------------------------- %
% - If you have any ideas, questions, suggestions or bugs to report, please - %
% - feel free to contact me.                                                - %
% --------------------------------------------------------------------------- %
% - Copyright 2011 Clemens Niederberger                                     - %
% -                                                                         - %
% - This work may be distributed and/or modified under the                  - %
% - conditions of the LaTeX Project Public License, either version 1.3      - %
% - of this license or (at your option) any later version.                  - %
% - The latest version of this license is in                                - %
% -   http://www.latex-project.org/lppl.txt                                 - %
% - and version 1.3 or later is part of all distributions of LaTeX          - %
% - version 2005/12/01 or later.                                            - %
% -                                                                         - %
% - This work has the LPPL maintenance status `maintained'.                 - %
% -                                                                         - %
% - The Current Maintainer of this work is Clemens Niederberger.            - %
% -                                                                         - %
% - This work consists of the files chemmacros.sty, chemmacros-version1.cfg - %
% - chemmacros_doc_de.tex, chemmacros_doc_de.tex, README and the derived    - %
% - files chemmacros_doc_de.pdf and chemmacros_doc_en.pdf                   - %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\RequirePackage{ expl3 , xparse , l3keys2e , xfrac , siunitx , tikz , mathtools , cancel , environ }
\usetikzlibrary{calc,arrows}
\AtBeginDocument
  {
    \@ifpackageloaded{mhchem}{} { \RequirePackage[ version=3 ]{ mhchem } }
  }
\ProvidesExplPackage {chemmacros} {2011/11/03} {2.0a} {macros and commands for chemists}

\bool_new:N \l_chemmacros_version_one_bool
\bool_set_false:N \l_chemmacros_version_one_bool

\bool_new:N \l_chemmacros_german_bool
\bool_set_false:N \l_chemmacros_german_bool

\bool_new:N \l_chemmacros_xspace_bool
\bool_set_true:N \l_chemmacros_xspace_bool

\bool_new:N \l_chemmacros_bpchem_bool
\bool_set_false:N \l_chemmacros_bpchem_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_set_false:N \l_chemmacros_EZ_cool_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

\AtBeginDocument
  {
    \@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 }
  }

% --------------------------------------------------------------------------- %
% package options
%   german    => change pKA => pKS etc
%   xspace    => add an \xspace after a whole bunch of macros
%   bpchem    => use \IUPAC inside for \NMR command
%   circled   => circle charges
%   EZ        => cool or chemmacros version of \E
%   version=1 => compatibility for documents set with v1.*

\keys_define:nn { chemmacros / option }
  {
    bpchem          .bool_set:N = \l_chemmacros_bpchem_bool ,
    bpchem          .default:n  = true ,
    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  = formal ,
    EZ              .choice: ,
    EZ / cool       .code:n     =
      { \bool_set_true:N \l_chemmacros_EZ_cool_bool } ,
    EZ / chemmacros .code:n     =
      { \bool_set_false:N \l_chemmacros_EZ_cool_bool } ,
    EZ              .default:n  = chemmacros ,
    german          .bool_set:N = \l_chemmacros_german_bool ,
    german          .default:n  = true ,
    xspace          .bool_set:N = \l_chemmacros_xspace_bool ,
    xspace          .default:n  = true ,
    version         .choice: ,
    version / 1     .code:n     =
      { \bool_set_true:N \l_chemmacros_version_one_bool } ,
    version / 2     .code:n     =
      { \bool_set_false:N \l_chemmacros_version_one_bool }
  }

\ProcessKeysOptions { chemmacros / option }

\AtBeginDocument
  {
    \bool_if:NT \l_chemmacros_bpchem_bool
      { \RequirePackage { bpchem } }
    \bool_if:NT \l_chemmacros_xspace_bool
      { \RequirePackage { xspace } }
  }

\cs_new_nopar:Npn \chemmacros_xspace:
  {
    \bool_if:NT \l_chemmacros_xspace_bool
      { \xspace }
  }

% --------------------------------------------------------------------------- %
% warning / error messages
\msg_set:nnnn { chemmacros } { already-defined }
  {
    The~command~#1~has~also~been~defined~by~another~package.
  }
  {
    The~command~#1~has~also~been~defined~by~another~package.~
    chemmacros~provides~an~alternative~definition.~
    See~the~documentation~for~more~information.
  }

\msg_set:nnn { chemmacros } { ox }
  {
    \token_to_str:N \ox \c_space_tl : ~ #1 ~ \msg_line_context: .
  }

\msg_set:nnn { chemmacros } { OX }
  {
    \token_to_str:N \OX \c_space_tl : ~ #1 ~ \msg_line_context: .
  }

\msg_set:nnn { chemmacros } { redox }
  {
    \token_to_str:N \redox \c_space_tl : ~ #1 ~ \msg_line_context: .
  }

\msg_set:nnn { 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: .
  }

\msg_set:nnn { chemmacros } { setnewstate }
  {
    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 \renewstate \c_space_tl to~alter~it.
  }

\msg_set:nnn { chemmacros } { renewstate }
  {
    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 \setnewstate \c_space_tl to~create~it.
  }

% --------------------------------------------------------------------------- %
% TikZ drawings
\cs_new_nopar:Npn \chemmacros_tikz_picture:nn #1#2
  { \tikzpicture[#1] #2 \endtikzpicture }
\cs_generate_variant:Nn \chemmacros_tikz_picture:nn { fn,xn }

\cs_new_nopar:Npn \chemmacros_tikz_draw:n #1
  { \draw[#1] }
\cs_generate_variant:Nn \chemmacros_tikz_draw:n { f,x }

\cs_new_nopar:Npn \chemmacros_tikz_node:n #1
  { \node[#1] }
\cs_generate_variant:Nn \chemmacros_tikz_node:n { f,x }

\cs_new_nopar:Npn \chemmacros_tikz_shade:n #1
  { \shade[#1] }
\cs_generate_variant:Nn \chemmacros_tikz_shade:n { f,x }

\cs_new_nopar:Npn \chemmacros_tikz_shadedraw:n #1
  { \shadedraw[#1] }
\cs_generate_variant:Nn \chemmacros_tikz_shadedraw:n { f,x }

\cs_new_nopar:Npn \chemmacros_tikz_node_in_draw:n #1
  { node[#1] }
\cs_generate_variant:Nn \chemmacros_tikz_node_in_draw:n { f,x }

% --------------------------------------------------------------------------- %
% circled charge signs
% Definition inspired by chemstyle's definition of \standarsstate
% \cs_new_nopar:Npn \chemmacros_fplus_aux:
%   {
%     \raise.1ex\hbox{\scalebox{.65}{\textcircled{\lower.1ex\hbox{$+$}}}}
%   }
% \cs_new_nopar:Npn \chemmacros_fplus:
%   {
%     \mode_if_math:TF
%       { \text { \chemmacros_fplus_aux: } }
%       { \chemmacros_fplus_aux: }
%   }

\cs_new_nopar:Npn \chemmacros_fplus:
  { \ensuremath { \chemmacros_fplus_aux_i: } }
\cs_new_nopar:Npn \chemmacros_fplus_aux_i:
  { \mathpalette \chemmacros_fplus_aux_ii: \bigcirc }
\cs_new_nopar:Npn \chemmacros_fplus_aux_ii: #1#2
  {
    \ooalign
      {
        \tex_hfil:D
        $#1+$
        \tex_hfil:D
        \tex_cr:D
        \tex_hfil:D
        $#1#2$
        \tex_hfil:D
        \tex_cr:D
      }
  }

% \cs_new_nopar:Npn \chemmacros_fminus_aux:
%   {
%     \raise.1ex\hbox{\scalebox{.65}{\textcircled{\lower.1ex\hbox{$-$}}}}
%   }
% \cs_new_nopar:Npn \chemmacros_fminus:
%   {
%     \mode_if_math:TF
%       { \text { \chemmacros_fminus_aux: } }
%       { \chemmacros_fminus_aux: }
%   }

\cs_new_nopar:Npn \chemmacros_fminus:
  { \ensuremath { \chemmacros_fminus_aux_i: } }
\cs_new_nopar:Npn \chemmacros_fminus_aux_i:
  { \mathpalette \chemmacros_fminus_aux_aux_ii: \bigcirc }
\cs_new_nopar:Npn \chemmacros_fminus_aux_aux_ii: #1#2
  {
    \ooalign
      {
        \tex_hfil:D
        $#1-$
        \tex_hfil:D
        \tex_cr:D
        \tex_hfil:D
        $#1#2$
        \tex_hfil:D
        \tex_cr:D
      }
  }

% use directly:
\cs_new_eq:NN \fplus  \chemmacros_fplus:
\cs_new_eq:NN \fminus \chemmacros_fminus:

% change output depending on circled-option
\cs_new_nopar:Npn \chemmacros_plus:
  {
    \bool_if:nTF { \l_chemmacros_circled_bool && !\l_chemmacros_circled_formal_bool }
      {
        \bool_if:NTF \l_chemmacros_circled_chem_bool
          { \chemmacros_fplus: }
          { \oplus }
      }
      { + }
  }

\cs_new_nopar:Npn \chemmacros_minus:
  {
    \bool_if:nTF { \l_chemmacros_circled_bool && !\l_chemmacros_circled_formal_bool }
      {
        \bool_if:NTF \l_chemmacros_circled_chem_bool
          { \chemmacros_fminus: }
          { \ominus }
      }
      { - }
  }

\cs_new_nopar:Npn \chemmacros_formal_plus:
  {
    \bool_set_false:N \l_chemmacros_circled_formal_bool
    \chemmacros_plus:
  }

\cs_new_nopar:Npn \chemmacros_formal_minus:
  {
    \bool_set_false:N \l_chemmacros_circled_formal_bool
    \chemmacros_minus:
  }

% --------------------------------------------------------------------------- %
% transition state symbol
\AtBeginDocument
  {
    \cs_new_nopar:Npn \chemmacros_transitionstatesymbol:
      {
        \mode_if_math:TF
          { \text { \chemmacros_transitionstatesymbol_aux: } }
          { \chemmacros_transitionstatesymbol_aux: }
      }

    \cs_new_nopar:Npn \chemmacros_transitionstatesymbol_aux:
      {
        \tikz[inner~sep=0,outer~sep=0,minimum~size=0,space-space,line~width=.3pt]
          {
            \draw (0,0) --
              node[pos=.36]
                (chemmacros_transitionstate_x) {}
              node[pos=.64]
                (chemmacros_transitionstate_y){}
              (0,.8em) ;
            \draw (chemmacros_transitionstate_x) ++(-.4em,0) -- ++(.8em,0) ;
            \draw (chemmacros_transitionstate_y) ++(-.4em,0) -- ++(.8em,0) ;
          }
      }

    \@ifpackageloaded{mychemistry}
      {
        \cs_set_eq:NN
          \transitionstatesymbol
          \chemmacros_transitionstatesymbol:
      }
      {
        \cs_new_eq:NN
          \transitionstatesymbol
          \chemmacros_transitionstatesymbol:
      }
  }

\cs_new_nopar:Npn \chemmacros_atom:n #1
  { \ce { #1 } }
\cs_generate_variant:Nn \chemmacros_atom:n { o,f,x }

% --------------------------------------------------------------------------- %
% particles, charges
% electron
\bool_new:N \l_chemmacros_charge_append_bool
\bool_set_false:N \l_chemmacros_charge_append_bool

\cs_new_nopar:Npn \el
  { \chemmacros_atom:n { e } \mch \chemmacros_xspace: }
% proton
\cs_new_nopar:Npn \prt
  { \chemmacros_atom:n { p } \pch \chemmacros_xspace: }
% neutron
\cs_new_nopar:Npn \ntr
  { \chemmacros_atom:n { n^0 } \chemmacros_xspace: }

% charges
\cs_new_nopar:Npn \chemmacros_charge:n #1
  {
    \bool_if:NTF \l_chemmacros_charge_append_bool
      {
        \mode_if_math:TF
          { {}^ { #1 } }
          { $ {}^ { #1 } $ }
      }
      {
        \mode_if_math:TF
          { ^ { #1 } }
          { $ ^ { #1 } $ }
      }
  }

\keys_define:nn { chemmacros / charges }
  {
    append .bool_set:N = \l_chemmacros_charge_append_bool ,
    append .default:n  = true
  }

\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: } }
  }

\cs_new_nopar:Npn \delm
  { \mbox { \tiny \( \delta \chemmacros_minus: \) } \chemmacros_xspace: }
\cs_new_nopar:Npn \delp
  { \mbox { \tiny \( \delta \chemmacros_plus: \) } \chemmacros_xspace: }
\cs_new_nopar:Npn \fdelm
  { \mbox { \tiny \( \delta \chemmacros_formal_minus: \) } \chemmacros_xspace: }
\cs_new_nopar:Npn \fdelp
  { \mbox { \tiny \( \delta \chemmacros_formal_plus: \) } \chemmacros_xspace: }
\cs_new_nopar:Npn \scrm
  { \ensuremath { \scriptstyle \chemmacros_minus: } }
\cs_new_nopar:Npn \scrp
  { \ensuremath { \scriptstyle \chemmacros_plus: } }
\cs_new_nopar:Npn \fscrm
  { \ensuremath { \scriptstyle \chemmacros_formal_minus: } }
\cs_new_nopar:Npn \fscrp
  { \ensuremath { \scriptstyle \chemmacros_formal_plus: } }
\cs_new_nopar:Npn \fsscrm
  { \ensuremath { \scriptscriptstyle \chemmacros_formal_minus: } }
\cs_new_nopar:Npn \fsscrp
  { \ensuremath { \scriptscriptstyle \chemmacros_formal_plus: } }

% --------------------------------------------------------------------------- %
% ions, molecules
% proton, hydroxide, hydronium/oxonium, water, nucleophile, electrophile
\cs_new_nopar:Npn \Hpl
  { \chemmacros_atom:n { H } \pch \chemmacros_xspace: }
\cs_new_nopar:Npn \Hyd
  { \chemmacros_atom:n { OH } \mch \chemmacros_xspace: }
\cs_new_nopar:Npn \HtO
  { \chemmacros_atom:n { H3O } \pch \chemmacros_xspace: }
\cs_new_nopar:Npn \water
  { \chemmacros_atom:n { H2O } \chemmacros_xspace: }

\NewDocumentCommand \Nu { o }
  {
    \IfNoValueF { #1 } { \keys_set:nn { chemmacros / particle } { #1 } }
    \bool_if:NTF \l_chemmacros_particle_elpair_bool
      { \chemmacros_elpair:n { Nu } }
      { \chemmacros_atom:n { Nu } }
    \mch \chemmacros_xspace:
  }

\cs_new_nopar:Npn \El
  { \chemmacros_atom:n { E } \pch \chemmacros_xspace: }

\NewDocumentCommand \ba { o }
  {
    \IfNoValueF { #1 } { \keys_set:nn { chemmacros / particle } { #1 } }
    \bool_if:NTF \l_chemmacros_particle_elpair_bool
      { \chemmacros_elpair:n { ba } }
      { \chemmacros_atom:n { ba } }
    \mch \chemmacros_xspace:
  }

\cs_new_nopar:Npn \chemmacros_elpair:n #1
  {
    \bool_if:NTF \l_chemmacros_chemfig_bool
      {
        \bool_if:NTF \l_chemmacros_elpair_dots_bool
          { \Lewis { 0: , #1 } }
          { \Lewis { 0 , #1 } }
      }
      {
        \msg_warning:nnx { 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
  }

% --------------------------------------------------------------------------- %
% stereo descriptors and sim.
% Cahn-Ingold-Prelog
\cs_new_nopar:Npn \Rcip { \textit { (R) } }
\cs_new_nopar:Npn \Scip { \textit { (S) } }
\cs_new_nopar:Npn \cip #1 { \textit { (#1) } }
\ExplSyntaxOff
\NewDocumentCommand\Sconf { O { S } }%
  {%
    \tikz[baseline=(a.base),text height=1.5ex,text depth=.25ex]
      {
        \node(a) {#1} ;
        \draw[->,thick,rotate=90] ($(a.center)+(20:.8em)$) arc (20:340:.8em);
      }%
  }

\NewDocumentCommand \Rconf { O { R } }%
  {%
    \tikz[baseline=(a.base),text height=1.5ex,text depth=.25ex]
      {
        \node(a) {#1} ;
        \draw[<-,thick,rotate=90] ($(a.center)+(20:.8em)$) arc (20:340:.8em) ;
      }%
  }%
\ExplSyntaxOn
% E(ntgegen)/Z(usammen)
\AtBeginDocument
  {
    \bool_if:NTF \l_chemmacros_EZ_cool_bool
      {
        \cs_new_nopar:Npn \Ent { \textit { (E) } }
        \cs_new_nopar:Npn \Zus { \textit { (Z) } }
      }
      {
        \cs_if_free:NTF \E
          { \cs_new_nopar:Npn \E { \textit { (E) } } }
          { \cs_set_nopar:Npn \E { \textit { (E) } } }
        \cs_new_nopar:Npn \Z { \textit { (Z) } }
      }
  }

\AtBeginDocument
  {
    \cs_if_free:NTF \cis
      {
        \cs_new_nopar:Npn \cis   { \textit { cis } \chemmacros_xspace: }
      }
      {
        \cs_set_nopar:Npn \cis   { \textit { cis } \chemmacros_xspace: }
      }
    \cs_if_free:NTF \trans
      {
        \cs_new_nopar:Npn \trans { \textit { trans } \chemmacros_xspace: }
      }
      {
        \cs_set_nopar:Npn \trans { \textit { trans } \chemmacros_xspace: }
      }
  }

\cs_new_nopar:Npn \tert { \textit { tert } \chemmacros_xspace: }
% Fischer
\cs_new_nopar:Npn \Dfi { \textsc { d } }
\cs_new_nopar:Npn \Lfi { \textsc { l } }
% ortho/meta/para
\cs_new_nopar:Npn \ortho { \textsl { o } }
\cs_new_nopar:Npn \meta  { \textsl { m } }
\cs_new_nopar:Npn \para  { \textsl { p } }

% latin phrases
\AtBeginDocument
  {
    \bool_if:NTF \l_chemmacros_chemstyle_bool
      {
        \cs_new_nopar:Npn \insitu { \latin{in~situ} \chemmacros_xspace: }
        \cs_new_nopar:Npn \abinitio { \latin{ab~initio} \chemmacros_xspace: }
      }
      {
        \cs_new_nopar:Npn \insitu { \textit{in~situ} \chemmacros_xspace: }
        \cs_new_nopar:Npn \abinitio { \textit{ab~initio} \chemmacros_xspace: }
      }
  }

% --------------------------------------------------------------------------- %
% acid/base
\cs_new_nopar:Npn \pH
  { \mbox { \textsl { p } H } \chemmacros_xspace: }
\cs_new_nopar:Npn \pOH
  { \mbox { \textsl { p } OH } \chemmacros_xspace: }
\NewDocumentCommand \p { m }
  { \mbox { \textsl { p } \ensuremath { #1 } } \chemmacros_xspace: }

\char_set_catcode_math_subscript:N \@
\NewDocumentCommand \pKa { o }
  {
    \mbox
      {
        \textsl { p }
        \(
        K @ \mathrm
          {
            \bool_if:NTF \l_chemmacros_german_bool
              { S }
              { A }
            \IfNoValueF{ #1 } { #1 }
          }
        \)
      }
    \chemmacros_xspace:
  }

\NewDocumentCommand \pKb { o }
  {
    \mbox
      {
        \textsl { p }
        \(
        K @ \mathrm
          {
            B
            \IfNoValueF{ #1 } { #1 }
          }
        \)
      }
    \chemmacros_xspace:
  }
\char_set_catcode_letter:N \@

% --------------------------------------------------------------------------- %
% substituents
% \R[<sign>]{<subscript>}

\char_set_catcode_math_subscript:N \@
\NewDocumentCommand \R { o g }
  {
    \chemmacros_atom:n
      {
        R
        $
          \IfNoValueF { #2 } { @ { \mathrm { #2 } } }
          ^ {
              \IfNoValueF { #1 }
                {
                  \tl_if_eq:nnTF { #1 } { + }
                    { \chemmacros_plus: }
                    {
                      \tl_if_eq:nnT { #1 } { - }
                        { \chemmacros_minus: }
                    }
                }
            }
        $
      }
  }
\char_set_catcode_letter:N \@

% --------------------------------------------------------------------------- %
% 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_nopar: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 }
  }

\char_set_catcode_math_subscript:N \@
\keys_define:nn { chemmacros / mech }
  {
    type      .choice: ,
    type /    .code:n    =
      { \chemmacros_set_mech:nnn { S } { $ @ \text {N} $ } {} } ,
    type / 1  .code:n    =
      { \chemmacros_set_mech:nnn { S } { $ @ \text {N} $ 1 } {} } ,
    type / 2  .code:n    =
      { \chemmacros_set_mech:nnn { S } { $ @ \text {N} $ 2 } {} } ,
    type / se .code:n    =
      { \chemmacros_set_mech:nnn { S } { $ @ \text {E} $ } {} } ,
    type / 1e .code:n    =
      { \chemmacros_set_mech:nnn { S } { $ @ \text {E} $ 1 } {} } ,
    type / 2e .code:n    =
      { \chemmacros_set_mech:nnn { S } { $ @ \text {E} $ 2 } {} } ,
    type / ar .code:n    =
      { \chemmacros_set_mech:nnn { S } { $ @ \text {E} $ } { 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 $ @ \text {cb} $ } {} } ,
    type      .default:n = 
  }

\NewDocumentCommand \mech { o }
  {
    \IfNoValueTF { #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:
  }
\char_set_catcode_letter:N \@

% --------------------------------------------------------------------------- %
% 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

\int_new:N \l_chemmacros_ox_number_int
\fp_new:N \l_chemmacros_ox_number_fp

\bool_new:N \l_chemmacros_ox_side_bool
\bool_set_false:N \l_chemmacros_ox_side_bool
\bool_new:N \l_chemmacros_ox_super_bool
\bool_set_false:N \l_chemmacros_ox_super_bool
\bool_new:N \l_chemmacros_ox_top_bool
\bool_set_true:N \l_chemmacros_ox_top_bool

\cs_new_nopar:Npn \chemmacros_ox_process_number:n #1
  {
    \bool_if:NTF \l_chemmacros_ox_parse_bool
      {
        \tl_if_in:nnTF { #1 } { / }
          { \chemmacros_ox_fraction:n #1 }
          {
            \chemmacros_ox_sign:n { #1 }
            \chemmacros_ox_value:n { #1 }
          }
      }
      { #1 }
  }

\DeclareInstance { xfrac } { chemmacros-ox-frac } { text }
  {
    scale-factor        = 1.5 ,
    denominator-bot-sep = -.5ex ,
    numerator-top-sep   = -.3ex ,
    slash-left-kern     = -.05em ,
    slash-right-kern    = -.05em ,
    slash-symbol-font   = ptm
  }

\cs_new_nopar:Npn \chemmacros_ox_fraction:n #1/#2
  {
    \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_nopar:Npn \chemmacros_ox_sign:n #1
  {
    \fp_compare:nNnT { #1 } > { 0 }
      { \bool_if:NT \l_chemmacros_ox_explicit_sign_bool { $+$ } }
    \fp_compare:nNnT { #1 } = { 0 }
      { \bool_if:NT \l_chemmacros_ox_explicit_sign_bool { $\pm$ } }
    \fp_compare:nNnT { #1 } < { 0 }
      { $-$ }
  }

\cs_new_nopar:Npn \chemmacros_ox_value:n #1
  {
    \fp_set:Nn \l_chemmacros_ox_number_fp { #1 }
    \fp_abs:N \l_chemmacros_ox_number_fp
    \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
          { \chemmacros_fp_to_arabic:N \l_chemmacros_ox_number_fp }
          { \chemmacros_fp_show:N \l_chemmacros_ox_number_fp }
      }
  }

\cs_new_nopar:Npn \chemmacros_ox_is_integer:n #1
  {
    \fp_set:Nn \l_tmpa_tl { #1 }
    \fp_add:Nn \l_tmpa_tl { 1 }
    \fp_round_places:Nn \l_tmpa_tl { 0 }
    \fp_sub:Nn \l_tmpa_tl { 1 }
    \fp_compare:nNnTF { \l_tmpa_tl } = { #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 { N }

\cs_new_nopar:Npn \chemmacros_fp_to_Roman:n #1
  {
    \group_begin:
      \fp_set:Nn \l_tmpa_tl { #1 }
      \fp_round_places:Nn \l_tmpa_tl { 0 }
      \int_set:Nn \l_tmpa_int { \fp_to_tl:N \l_tmpa_tl }
      \int_compare:nTF { \l_tmpa_int = 0 }
        { 0 }
        { \int_to_Roman:n { \int_use:N \l_tmpa_int } }
    \group_end:
  }
\cs_generate_variant:Nn \chemmacros_fp_to_Roman:n { N }

\cs_new_nopar:Npn \chemmacros_fp_to_arabic:n #1
  {
    \group_begin:
      \fp_set:Nn \l_tmpa_tl { #1 }
      \fp_to_tl:N \l_tmpa_tl
    \group_end:
  }
\cs_generate_variant:Nn \chemmacros_fp_to_arabic:n { N }

\cs_new_nopar:Npn \chemmacros_fp_show:n #1
  {
    \group_begin:
      \fp_set:Nn \l_tmpa_tl { #1 }
      \bool_if:NTF \l_chemmacros_ox_decimal_marker_comma_bool
        {
          \tl_set:Nx \l_tmpb_tl { \fp_to_tl:N \l_tmpa_tl }
          \tl_replace_once:Nnn \l_tmpb_tl { . } { {,} }
          \tl_use:N \l_tmpb_tl
        }
        { \fp_to_tl:N \l_tmpa_tl }
    \group_end:
  }
\cs_generate_variant:Nn \chemmacros_fp_show:n { N }

\cs_new_nopar:Npn \chemmacros_ox: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_atom:n
              { #2 ^ { \text { \tiny \chemmacros_ox_process_number:n { #1 } } } }
          }
        \bool_if:NT \l_chemmacros_ox_side_bool
          {
            \chemmacros_atom:n { #2 ( \text { \chemmacros_ox_process_number:n { #1 } } ) }
          }
        \bool_if:NT \l_chemmacros_ox_top_bool
          {
            \overset
              { \mbox { \tiny \chemmacros_ox_process_number:n { #1 } } }
              { \chemmacros_atom:n { #2 } }
          }
      }
  }

\cs_new_nopar: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_nopar: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_nopar: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 }
  }

% \ox[<keyval>]{<num>,<atom>}
% \ox*[<keyval>]{<num>,<atom>} => always number on the side
\NewDocumentCommand \ox { s o > { \SplitArgument { 1 } { , } } m }
  {
    \group_begin:
      \IfBooleanT { #1 } { \chemmacros_ox_pos_super: }
      \bool_if:NTF \l_chemmacros_version_one_bool
        { \keys_set:nn { chemmacros / ox } { parse = false } }
        { \IfNoValueF { #2 } { \keys_set:nn { chemmacros / ox } { #2 } } }
      \chemmacros_ox:nn #3
    \group_end:
  }

% --------------------------------------------------------------------------- %
% - 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

\fp_new:N \l_chemmacros_redox_shift_fp
\tl_new:N \l_chemmacros_redox_shift_tl

\tl_new:N \l_chemmacros_redox_anchor_tl

\tl_new:N \l_chemmacros_redox_side_tl

\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_nopar:Npn \chemmacros_redox_partner:nn #1#2
  {
    \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=0] (#1) { \chemmacros_atom:n {#2} } ;
      }
  }

\cs_new_nopar: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 }
  }

\NewDocumentCommand \redox { > { \SplitArgument { 1 } { , } } d() o o m }
  {
    \IfNoValueT { #1 }
      {
        \msg_error:nnx { chemmacros } { redox } { You~need~to~specify~coordinates }
      }
    \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
    \IfNoValueF { #2 }
      { \tl_set:Nn \l_chemmacros_redox_tikz_tl { #2 } }
    \IfNoValueTF { #3 }
      {
        \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 { #3 } < { 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 { #3 }
      }
      \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] { #4 }
        ($(\l_chemmacros_redox_end_tl . \l_chemmacros_redox_side_tl)+(0,\l_chemmacros_redox_sep_dim)$) ;
      }
  }

% 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 }
  }

\bool_if:NT \l_chemmacros_version_one_bool
  {
    \NewDocumentCommand \setredoxdist { m }
      {
        \tl_if_blank:nTF { #1 }
          { \dim_set:Nn \l_chemmacros_redox_dist_dim { .6em } }
          { \dim_set:Nn \l_chemmacros_redox_dist_dim { #1 } }
      }
  }

% --------------------------------------------------------------------------- %
% spectroscopy
\tl_new:N \l_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_element_tl
\tl_new:N \l_chemmacros_nmr_element_default_tl
\tl_set:Nn \l_chemmacros_nmr_element_default_tl { H }

\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

\tl_new:N \l_chemmacros_nmr_unit_tl
\tl_set:Nn \l_chemmacros_nmr_unit_tl { \mega\hertz }

\cs_new_nopar:Npn \chemmacros_nmr_nucleus:n #1,#2 \q_stop
  {
    \tl_set:Nn \l_chemmacros_nmr_isotope_tl { #1 }
    \tl_set:Nn \l_chemmacros_nmr_element_tl { #2 }
  }

\cs_new:Npn \chemmacros_nmr_default_nucleus:n #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_nopar:Npn \chemmacros_nmr_base:nn #1#2
  {
    \bool_if:NTF \l_chemmacros_bpchem_bool
      { \IUPAC { \^ { #1 } #2 - NMR } }
      { $ ^ { #1 } $ #2 - NMR }
  }

\cs_new_nopar:Npn \chemmacros_nmr_frequency:n #1
  {
    \tl_if_in:nnTF { #1 } { , }
      { \chemmacros_nmr_frequency_aux_i:n #1 \q_stop }
      { \chemmacros_nmr_frequency_aux_ii:n { #1 } }
  }
\cs_new_nopar:Npn \chemmacros_nmr_frequency_aux_i:n #1,#2 \q_stop
  { \SI { #1 } { #2 } }
\cs_new_nopar:Npn \chemmacros_nmr_frequency_aux_ii:n #1
  { \SI { #1 } { \tl_use:N \l_chemmacros_nmr_unit_tl } }

\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:n #1 \q_stop } ,
    nucleus .default:n = { 1,H }
  }

\AtBeginDocument
  {
    % \NMR{<num>,<elem>}(<num>,<unit>)[<solvent>] ALL arguments are optional
    % \NMR* same but without ": $\delta$" at end
    \NewDocumentCommand \NMR { s g d() o }
      {
        \group_begin:
          \bool_set_false:N \l_chemmacros_nmr_frequency_bool
          \bool_set_false:N \l_chemmacros_nmr_solvent_bool
          \IfNoValueF { #3 }
            { \bool_set_true:N \l_chemmacros_nmr_frequency_bool }
          \IfNoValueF { #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 }
          \IfNoValueTF { #2 }
            {
              \chemmacros_nmr_nucleus:n
                \l_chemmacros_nmr_isotope_default_tl ,
                \l_chemmacros_nmr_element_default_tl \q_stop
            }
            { \chemmacros_nmr_nucleus:n #2 \q_stop }
          \mode_if_math:TF
            {
              \text
                {
                  \chemmacros_nmr_base:nn
                    { \tl_use:N \l_chemmacros_nmr_isotope_tl }
                    { \tl_use:N \l_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
                    { ) }
                  \IfBooleanF { #1 } { : ~ }
                }
              \IfBooleanF { #1 } { \delta }
            }
            {
              \chemmacros_nmr_base:nn
                { \tl_use:N \l_chemmacros_nmr_isotope_tl }
                { \tl_use:N \l_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
                { ) }
              \IfBooleanF { #1 }
                { : ~ $ \delta $ }
              \bool_if:NF \l_chemmacros_nmr_comma_bool
                { \IfBooleanF { #1 } { \chemmacros_xspace: } }
            }
        \group_end:
      }
  }

% --------------------------------------------------------------------------- %
% placing text below atom/molecule
\cs_new_nopar:Npn \dim_to_width:nn #1#2
  { \settowidth { #1 } { #2 } }
\cs_generate_variant:Nn \dim_to_width:nn { Nn }

\bool_new:N \l_chemmacros_mhname_width_bool
\bool_set_false:N \l_chemmacros_mhname_width_bool
\dim_new:N \l_chemmacros_mhname_width_dim

\tl_new:N \l_chemmacros_mhname_align_tl
\tl_set:Nn \l_chemmacros_mhname_align_tl { \centering }

\tl_new:N \l_chemmacros_mhname_fontattr_tl
\tl_new:N \l_chemmacros_mhname_fontsize_tl
\tl_set:Nn \l_chemmacros_mhname_fontsize_tl { \tiny }

\keys_define:nn { chemmacros / mhName }
  {
    align     .tl_set:N  = \l_chemmacros_mhname_align_tl ,
    fontattr  .tl_set:N  = \l_chemmacros_mhname_fontattr_tl ,
    fontsize  .tl_set:N  = \l_chemmacros_mhname_fontsize_tl ,
    width     .code:n    =
      {
        \tl_if_eq:nnTF { #1 } { auto }
          { \bool_set_false:N \l_chemmacros_mhname_width_bool }
          {
            \bool_set_true:N \l_chemmacros_mhname_width_bool
            \dim_set:Nn \l_chemmacros_mhname_width_dim { #1 }
          }
      }
  }

% \mhName[<keyval>]{<formula>}{<text>}
\bool_if:NF \l_chemmacros_version_one_bool
  {
    \NewDocumentCommand \mhName { o m m }
      {
        \group_begin:
          \IfNoValueF { #1 } { \keys_set:nn { chemmacros / mhName } { #1 } }
          \ensuremath
            {
              \underset
                {
                  \bool_if:NF \l_chemmacros_mhname_width_bool
                    { \dim_to_width:Nn \l_chemmacros_mhname_width_dim { #2 } }
                  \parbox
                    { \dim_use:N \l_chemmacros_mhname_width_dim }
                    {
                      \tl_use:N \l_chemmacros_mhname_align_tl
                      \tl_use:N \l_chemmacros_mhname_fontattr_tl
                      \tl_use:N \l_chemmacros_mhname_fontsize_tl
                      #3
                    }
                }
                { \chemmacros_atom:n { #2 } }
            }
        \group_end:
      }
  }

% --------------------------------------------------------------------------- %
% - phases
\char_set_catcode_math_subscript:N \@
\cs_new_nopar:Npn \sld
  {
    \peek_meaning:NTF [
      { \chemmacros_sld_aux_i: }
      { \chemmacros_sld_aux_ii: }
  }

\cs_new_nopar:Npn \chemmacros_sld_aux_i: [#1]
  { \ensuremath { @ \mathrm { ( #1 ) } } }

\cs_new_nopar:Npn \chemmacros_sld_aux_ii:
  {
    \ensuremath { @ \mathrm {
      (
        \bool_if:NTF \l_chemmacros_german_bool
          { f }
          { s }
      )
    } }
  }

\cs_new_nopar:Npn \lqd
  {
    \peek_meaning:NTF [
      { \chemmacros_lqd_aux_i: }
      { \chemmacros_lqd_aux_ii: }
  }

\cs_new_nopar:Npn \chemmacros_lqd_aux_i: [#1]
  { \ensuremath { @ \mathrm { ( #1 ) } } }

\cs_new_nopar:Npn \chemmacros_lqd_aux_ii:
  {
    \ensuremath { @ \mathrm {
      (
        \bool_if:NTF \l_chemmacros_german_bool
          { f\/l }
          { l }
      )
    } }
  }

\bool_if:NT \l_chemmacros_version_one_bool
  {
    \cs_new_eq:NN \solid \sld
    \cs_new_eq:NN \liquid \lqd
  }

\cs_new_nopar:Npn \gas
  { \ensuremath { @ \mathrm { (g) } } }

\cs_new_nopar:Npn \aq
  { \ensuremath { @ \mathrm { (aq) } } }
\char_set_catcode_letter:N \@

% --------------------------------------------------------------------------- %
\bool_if:NTF \l_chemmacros_version_one_bool
  { \newtagform { CMreaction } { \{ } { \} } }
  { \newtagform { reaction } { \{ } { \} } }
\newcounter { chemmacros_save_reaction }
\newcounter { reaction }
\cs_new_nopar:Npn \chemmacros_begin_reaction:
  {
    \bool_if:NT \l_chemmacros_hyperref_bool % create individual names for hyperref 
      { \cs_set_nopar:Npn \theHequation { R . \theHsection . \arabic { reaction } } }
    \bool_if:NT \l_chemmacros_varioref_bool % enable labelformat reaction
      { \cs_set_eq:NN \p@equation \p@reaction }
    \setcounter { chemmacros_save_reaction } { \value { equation } }
    \setcounter { equation } { \value { reaction } }
    \bool_if:NTF \l_chemmacros_version_one_bool
      { \usetagform { CMreaction } }
      { \usetagform { reaction } }
  }
\cs_new_nopar:Npn \chemmacros_end_reaction:
  {
    \setcounter { reaction } { \value { equation } }
    \setcounter { equation } { \value { chemmacros_save_reaction } }
  }

% --------------------------------------------------------------------------- %
% reaction environments for mhchem
\bool_new:N \l_chemmacros_reactions_star_bool
\bool_new:N \l_chemmacros_reactions_args_bool
\int_new:N \l_chemmacros_reactions_args_int

\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
  }

% \newreaction[<keyval>]{<name>}{<type>}
\bool_if:NF \l_chemmacros_version_one_bool
  {
  \NewDocumentCommand \newreaction { o m m }
    {
      \cs_if_exist:cTF { #2 }
        {
          \msg_error:nnx { chemmacros } { already-defined } { #2 }
        }
        {
          \IfNoValueTF { #1 }
            {
              \bool_set_false:N \l_chemmacros_reactions_star_bool
              \bool_set_false:N \l_chemmacros_reactions_args_bool
            }
            { \keys_set:nn { chemmacros / reaction } { #1 } }
          \bool_if:NTF \l_chemmacros_reactions_args_bool
            {
              \NewEnviron { #2 } [ 1 ]
                {
                  \chemmacros_begin_reaction:
                  \begin { #3 } { ##1 }
                    \chemmacros_cee:f { \BODY }
                  \end{ #3 }
                  \chemmacros_end_reaction:
                }
              \bool_if:NT \l_chemmacros_reactions_star_bool
                {
                  \NewEnviron { #2* } [ 1 ]
                    {
                      \begin { #3* } { ##1 }
                        \chemmacros_cee:f { \BODY }
                      \end { #3* }
                    }
                }
            }
            {
              \NewEnviron { #2 }
                {
                  \chemmacros_begin_reaction:
                  \begin { #3 }
                    \chemmacros_cee:f { \BODY }
                  \end { #3 }
                  \chemmacros_end_reaction:
                }
              \bool_if:NT \l_chemmacros_reactions_star_bool
                {
                  \NewEnviron { #2* }
                    {
                      \begin { #3* }
                        \chemmacros_cee:f { \BODY }
                      \end { #3* }
                    }
                }
            }
        }
    }
  }

\cs_new:Npn \chemmacros_cee:n #1
  { \cee { #1 } }
\cs_generate_variant:Nn \chemmacros_cee:n { f }

% predefined:
\bool_if:NF \l_chemmacros_version_one_bool
  {
    \newreaction [ star ] { reaction }  { equation }
    \newreaction [ star ] { reactions } { align }
  }

\NewDocumentCommand \chcancel { m }
  { \cancel { \chemmacros_atom:f { #1 } } }

% --------------------------------------------------------------------------- %
% thermodynamics et.al.
% \standardstate as defined by the chemstyle package. Thanks to Joseph Wright
\cs_if_exist:NF \standardstate
  {
    \cs_new_nopar:Npn \standardstate
      { \ensuremath { \chemmacros_standardstate: } }
    \cs_new_nopar:Npn \chemmacros_standardstate:
      { \mathpalette \chemmacros_standardstate_aux: \circ }
    \cs_new_nopar:Npn \chemmacros_standardstate_aux: #1#2
      {
        \ooalign
          {
            \tex_hfil:D
            $#1-$
            \tex_hfil:D
            \tex_cr:D
            \tex_hfil:D
            $#1#2$
            \tex_hfil:D
            \tex_cr:D
          }
      }
  }

% --------------------------------------------------------------------------- %
% \State
\tl_new:N \l_chemmacros_State_delta_tl
\tl_set:Nn \l_chemmacros_State_delta_tl { \Delta }
\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
\tl_new:N \l_chemmacros_State_exponent_tl
\tl_set:Nn \l_chemmacros_State_exponent_tl { \standardstate }

\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!
\char_set_catcode_math_subscript:N \@
\cs_new_nopar:Npn \chemmacros_state:nnn #1#2#3
  {
    \group_begin:
      \IfNoValueF { #1 }
        { \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
            { @ { \text { #3 } } }
          #2
          \bool_if:NF \l_chemmacros_State_subscript_left_bool
            { @ { \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 { fnn,xnn }

\bool_if:NF \l_chemmacros_version_one_bool
  {
    \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:
      }
  }
\char_set_catcode_letter:N \@

% --------------------------------------------------------------------------- %
\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 { \Delta }

\bool_new:N \l_chemmacros_renewstate_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
  }

% \setnewstate[<keyval>]{<name>}{<symbol>}{<unit>}
\bool_if:NF \l_chemmacros_version_one_bool
  {
    \cs_new:Npn \setnewstate
      {
        \bool_set_false:N \l_chemmacros_renewstate_bool
        \chemmacros_setnewstate_reset:
        \peek_meaning:NTF [
          { \setnewstate_aux_i:n }
          { \setnewstate_aux_ii:nnn }
      }
% \renewstate[<keyval>]{<name>}{<symbol>}{<unit>}
    \cs_new:Npn \renewstate
      {
        \bool_set_true:N \l_chemmacros_renewstate_bool
        \chemmacros_setnewstate_reset:
        \peek_meaning:NTF [
          { \setnewstate_aux_i:n }
          { \setnewstate_aux_ii:nnn }
      }
  }

\cs_new_nopar: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 { \Delta }
  }

\cs_new:Npn \setnewstate_aux_i:n [#1]
  {
    \keys_set:nn { chemmacros / setnewstate } { #1 }
    \setnewstate_aux_ii:nnn
  }

\cs_new:Npn \setnewstate_aux_ii:nnn #1#2#3
  {
    \bool_if:NTF \l_chemmacros_renewstate_bool
      {
        \cs_if_exist:cF { #1 }
          { \msg_error:nnx { chemmacros } { renewstate } { #1 } }
        \cs_undefine:c {chemmacros_ #1 _reset: }
        \cs_undefine:c { l_chemmacros_ #1 _subscript_tl }
        \cs_undefine:c { l_chemmacros_ #1 _exponent_tl }
        \cs_undefine:c { l_chemmacros_ #1 _delta_tl }
        \cs_undefine:c { l_chemmacros_ #1 _left_tl }
        \cs_undefine:c { l_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 }
      }
      {
        \cs_if_exist:cT { #1 }
          { \msg_error:nnx { chemmacros } { setnewstate } { #1 } }
      }
    \group_begin:
      \exp_args:Nnf \tl_const:cn
        { l_chemmacros_ #1 _subscript_tl }
        { \tl_use:N \l_chemmacros_thermod_subscript_default_tl }
      \exp_args:Nnf \tl_const:cn
        { l_chemmacros_ #1 _exponent_tl }
        { \tl_use:N \l_chemmacros_thermod_exponent_default_tl }
      \exp_args:Nnf \tl_const:cn
        { l_chemmacros_ #1 _delta_tl }
        { \tl_use:N \l_chemmacros_thermod_delta_default_tl }
      \exp_args:Nnf \tl_const:cn
        { l_chemmacros_ #1 _left_tl }
        { \tl_use:N \l_chemmacros_thermod_subscript_left_default_tl }
      \tl_const:cn
        { l_chemmacros_ #1 _unit_tl }
        { #3 }
      \cs_new_nopar:cpn {chemmacros_ #1 _reset: }
        {
          \tl_set_eq:Nc
            \l_chemmacros_thermod_subscript_tl
            { l_chemmacros_ #1 _subscript_tl }
          \tl_set_eq:Nc
            \l_chemmacros_thermod_exponent_tl
            { l_chemmacros_ #1 _exponent_tl }
          \tl_set_eq:Nc
            \l_chemmacros_thermod_delta_tl
            { l_chemmacros_ #1 _delta_tl }
          \tl_set_eq:Nc
            \l_chemmacros_thermod_subscript_left_tl
            { l_chemmacros_ #1 _left_tl }
          \tl_set_eq:Nc
            \l_chemmacros_thermod_unit_tl
            { l_chemmacros_ #1 _unit_tl }
        }
      \cs_new_nopar: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_nopar: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_nopar:cpn { #1 _aux_ii:n } (##1)
        {
          \tl_set:Nn \l_chemmacros_thermod_subscript_tl { ##1 }
          \tl_use:c { #1 _aux_iii:n }
        }
      \cs_new_nopar:cpn { #1 _aux_iii:n } ##1
        {
          \ensuremath
            {
              \exp_args:Nf \tl_if_eq:nnTF
                { \tl_use:N \l_chemmacros_thermod_subscript_left_tl } { true }
                {
                  \chemmacros_state:fnn
                  {
                    subscript-left = true ,
                    exponent       =
                      { \tl_use:N \l_chemmacros_thermod_exponent_tl } ,
                    delta          =
                      { \tl_use:N \l_chemmacros_thermod_delta_tl }
                  }
                  { #2 }
                }
                {
                  \chemmacros_state:fnn
                  {
                    subscript-left = false ,
                    exponent       =
                      { \tl_use:N \l_chemmacros_thermod_exponent_tl } ,
                    delta          =
                      { \tl_use:N \l_chemmacros_thermod_delta_tl }
                  }
                  { #2 }
                }
                { \tl_use:N \l_chemmacros_thermod_subscript_tl }
                =
                \exp_args:Nno \SI { ##1 } { \l_chemmacros_thermod_unit_tl }
            }
        }
    \group_end:
  }

% predefined:
\bool_if:NF \l_chemmacros_version_one_bool
  {
    \setnewstate              {Enthalpy} {H} {\kilo\joule\per\mole}
    \setnewstate[delta=false,subscript-left=false] {Entropy}  {S} {\joule\per\kelvin\per\mole}
    \setnewstate              {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 }

\tl_new:N \l_chemmacros_newman_tikz_ring_tl
\tl_clear:N \l_chemmacros_newman_tikz_ring_tl

\tl_new:N \l_chemmacros_newman_tikz_front_tl
\tl_clear:N \l_chemmacros_newman_tikz_front_tl

\tl_new:N \l_chemmacros_newman_tikz_back_tl
\tl_clear:N \l_chemmacros_newman_tikz_back_tl

\bool_new:N \l_chemmacros_newman_tikz_back_bool

\fp_new:N \l_chemmacros_newman_x_fp
\fp_new:N \l_chemmacros_newman_y_fp

\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
  }

% old usage (v1.1):
% \newman[<angle>,<scale>,<tikz ring>][<tikz (front) nodes>][<tikz back nodes>]{<1>,<2>,<3>,<4>,<5>,<6>}
% new usage (v1.2):
% \newman[<keyval>](<angle>){<1>,<2>,<3>,<4>,<5>,<6>}
\bool_if:NF \l_chemmacros_version_one_bool
  {
    \NewDocumentCommand \newman { o d() > { \SplitArgument { 5 } { , } } m }
      {
        \group_begin:
          \IfNoValueF { #1 } { \keys_set:nn { chemmacros / newman } { #1 } }
          \IfNoValueTF { #2 }
            { \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 { #2 } }
          \chemmacros_newman_atoms:nnnnnn #3
        \group_end:
      }
  }

% place atoms:
\cs_new:Npn \chemmacros_newman_atoms:nnnnnn #1#2#3#4#5#6
  {
    \chemmacros_tikz_picture:xn
      {
        scale = \fp_to_tl:N \l_chemmacros_newman_scale_fp ,
        chemmacros_newman_atom_front / .style =
          {
            inner~sep=0,
            outer~sep=0,
            \tl_use:N \l_chemmacros_newman_tikz_front_tl
          },
        chemmacros_newman_atom_back / .style =
          {
            inner~sep=0,
            outer~sep=0,
            \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 }
          (0,0) circle (\fp_to_dim:N \l_chemmacros_newman_scale_fp * 15) ;
        \chemmacros_newman_back_node:nf
          { 30 }
          { \IfNoValueF { #5 } { #5 } }
        \chemmacros_newman_back_node:nf
          { 150 }
          { \IfNoValueF { #6 } { #6 } }
        \chemmacros_newman_back_node:nf
          { 270 }
          { \IfNoValueF { #4 } { #4 } }
        \chemmacros_newman_front_node:nf
          { 90 }
          { \IfNoValueF { #1 } { #1 } }
        \chemmacros_newman_front_node:nf
          { 210 }
          { \IfNoValueF { #2 } { #2 } }
        \chemmacros_newman_front_node:nf
          { 330 }
          { \IfNoValueF { #3 } { #3 } }
    }
  }

% provide cartesian coordiantes from polar coordinates
% #1: angle pi #2: radius
\cs_new_nopar:Npn \chemmacros_newman_coordinates:nn #1#2
  {
    \fp_set:Nn \l_chemmacros_newman_tmp_angle_fp { #1 }
    \fp_div:Nn \l_chemmacros_newman_tmp_angle_fp { 180 }
    \fp_mul:Nn \l_chemmacros_newman_tmp_angle_fp { \fp_use:N \c_pi_fp }
    \fp_zero:N \l_chemmacros_newman_x_fp
    \fp_zero:N \l_chemmacros_newman_y_fp
    \fp_cos:Nn \l_chemmacros_newman_x_fp { \fp_use:N \l_chemmacros_newman_tmp_angle_fp }
    \fp_sin:Nn \l_chemmacros_newman_y_fp { \fp_use:N \l_chemmacros_newman_tmp_angle_fp }
    \fp_mul:Nn \l_chemmacros_newman_x_fp { \fp_use:N #2 }
    \fp_mul:Nn \l_chemmacros_newman_y_fp { \fp_use:N #2 }
  }
\cs_generate_variant:Nn \chemmacros_newman_coordinates:nn { on }

% place back nodes
\cs_new:Npn \chemmacros_newman_back_node:nn #1#2
  {
    \group_begin:
      \fp_add:Nn \l_chemmacros_newman_rel_angle_fp { #1 }
      \chemmacros_newman_coordinates:on
        { \fp_to_int:N \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_newman_coordinates:on
        { \fp_to_int:N \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:Npn \chemmacros_newman_front_node:nn #1#2
  {
    \chemmacros_newman_coordinates:nn { #1 } { \l_chemmacros_newman_scale_fp }
    \chemmacros_tikz_draw:f
      { \tl_use:N \l_chemmacros_newman_tikz_ring_tl }
      (0,0) -- ++ ( 30 * \fp_to_dim:N \l_chemmacros_newman_x_fp , 30 * \fp_to_dim:N \l_chemmacros_newman_y_fp ) ;
    \chemmacros_newman_coordinates:nn { #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

\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

\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

\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 }

\bool_new:N \l_chemmacros_orbital_p_half_bool
\bool_set_false:N \l_chemmacros_orbital_p_half_bool

\bool_new:N \l_chemmacros_orbital_overlay_bool
\bool_set_false:N \l_chemmacros_orbital_overlay_bool

\bool_new:N \l_chemmacros_orbital_opacity_bool
\bool_set_false:N \l_chemmacros_opacity_overlay_bool

\fp_new:N \l_chemmacros_orbital_opacity_fp
\fp_set:Nn \l_chemmacros_orbital_opacity_fp { 0.5 }

\cs_new_nopar: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_nopar:Npn \chemmacros_orbital_overlay:
  {
    \bool_if:NT \l_chemmacros_orbital_overlay_bool { overlay }
  }

\cs_new_nopar: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_nopar: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 } ,
    phase .default:n  = + ,
    scale .tl_set:N   = \l_chemmacros_orbital_s_scale_tl ,
    color .tl_set:N   = \l_chemmacros_orbital_s_color_tl
  }

\cs_new_nopar:Npn \chemmacros_orbital_s_draw:n #1
  {
    \IfNoValueF { #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 }
          (0,0) circle (\l_chemmacros_orbital_s_scale_tl * .6em) ;
      }
  }

% --------------------------------------------------------------------------- %
% p-orbitals
\cs_new_nopar: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_nopar:Npn \chemmacros_orbital_p_draw:n #1
  {
    \IfNoValueF { #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 }
          (0,0) .. 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)
          .. (0,0);
        \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 }
              (0,0) .. 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)
              .. (0,0);
          }
      }
  }

% --------------------------------------------------------------------------- %
% sp-orbitals
\cs_new_nopar: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_nopar:Npn \chemmacros_orbital_sp_draw:n #1
  {
    \IfNoValueF { #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 }
          (0,0) .. 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)
          .. (0,0);
        \chemmacros_tikz_shadedraw:f { draw = \l_chemmacros_orbital_sp_mphase_color_tl , ball~color = \l_chemmacros_orbital_sp_mphase_color_tl }
          (0,0) .. 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)
          .. (0,0);
      }
  }

% --------------------------------------------------------------------------- %
% sp2-orbitals
\cs_new_nopar: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_nopar:Npn \chemmacros_orbital_sptwo_draw:n #1
  {
    \IfNoValueF { #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 }
          (0,0) .. 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)
          .. (0,0);
        \chemmacros_tikz_shadedraw:f { draw = \l_chemmacros_orbital_sptwo_mphase_color_tl , ball~color = \l_chemmacros_orbital_sptwo_mphase_color_tl }
          (0,0) .. 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)
          .. (0,0);
      }
  }

% --------------------------------------------------------------------------- %
% sp3-orbitals
\cs_new_nopar: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_nopar:Npn \chemmacros_orbital_spthree_draw:n #1
  {
    \IfNoValueF { #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 }
          (0,0) .. 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)
          .. (0,0);
        \chemmacros_tikz_shadedraw:f { draw = \l_chemmacros_orbital_spthree_mphase_color_tl , ball~color = \l_chemmacros_orbital_spthree_mphase_color_tl }
          (0,0) .. 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)
          .. (0,0);
      }
  }

% --------------------------------------------------------------------------- %
% 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: }
  }

\NewDocumentCommand \orbital { o m }
  {
    \group_begin:
      \keys_set:nn { chemmacros / orbital / type } { #2 }
      \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 } }
    \group_end:
  }

% --------------------------------------------------------------------------- %
% setup
\NewDocumentCommand \chemsetup { o m }
  {
    \IfNoValueTF { #1 }
      { \keys_set:nn { chemmacros } { #2 } }
      { \keys_set:nn { chemmacros / #1 } { #2 } }
%     \tex_unskip:D
  }

% --------------------------------------------------------------------------- %
% load old definitions:
\bool_if:NT \l_chemmacros_version_one_bool
  {
    \input { chemmacros-version1 . cfg }
  }

\tex_endinput:D

% --------------------------------------------------------------------------- %
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
% --------------------------------------------------------------------------- %