% --------------------------------------------------------------------------
% the CHEMGREEK package
%
%   interface for upright greek letters for use in chemistry
%
% --------------------------------------------------------------------------
% Clemens Niederberger
% --------------------------------------------------------------------------
% https://github.org/cgnieder/chemgreek/
% contact@mychemistry.eu
% --------------------------------------------------------------------------
% If you have any ideas, questions, suggestions or bugs to report, please
% feel free to contact me.
% --------------------------------------------------------------------------
% Copyright 2011-2016 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.
% --------------------------------------------------------------------------
\RequirePackage{expl3,xparse,amstext}
\ExplSyntaxOn
\tl_const:Nn \c_chemgreek_date_tl {2016/01/05}
\tl_const:Nn \c_chemgreek_version_tl {1.0c}
\tl_const:Nn \c_chemgreek_info_tl {interface for upright greek letters for use in chemistry}

\ProvidesExplPackage{chemgreek}
  {\c_chemgreek_date_tl}
  {\c_chemgreek_version_tl}
  {\c_chemgreek_info_tl\c_space_tl (CN)}

% ----------------------------------------------------------------------------
% temporary variables:
\seq_new:N \l__chemgreek_tmpa_seq 
\tl_new:N  \l__chemgreek_tmpa_tl
\tl_new:N  \l__chemgreek_tmpb_tl
\int_new:N \l__chemgreek_tmpa_int
\int_new:N \g__chemgreek_tmpa_int

% ----------------------------------------------------------------------------
% an l3 conditional that can test 2e's conditionals that go like
%   \iffoo ... \else ... \fi
% see http://tex.stackexchange.com/a/119806/5049
\prg_new_conditional:Npnn \chemgreek_latex_if:n #1 {p,T,F,TF}
  { \use:c { if #1 } \prg_return_true: \else: \prg_return_false: \fi: }

% let's see if we can test if a package has been loaded after begin document:
\prg_new_conditional:Npnn \chemgreek_if_package_loaded:n #1 {p,T,F,TF}
  {
    \cs_if_exist:cTF { ver@#1.sty }
      { \prg_return_true: }
      { \prg_return_false: }
  }
\cs_generate_variant:Nn \chemgreek_if_package_loaded:nTF { V }
\cs_generate_variant:Nn \chemgreek_if_package_loaded:nF  { V }

% check if a package has been loaded with a certain option:
\prg_new_protected_conditional:Npnn \chemgreek_if_package_with:nn #1#2 {T,F,TF}
  {
    \cs_if_exist:cTF {opt@#1.sty}
      {
        \clist_if_in:cnTF {opt@#1.sty} {#2}
          { \prg_return_true: }
          { \prg_return_false: }
      }
      { \prg_return_false: }
  }

% check if a mapping needs a package:
\tl_new:N \l__chemgreek_mapping_package_tl
\prg_new_protected_conditional:Npnn \chemgreek_if_mapping_package:n #1 {T,F,TF}
  {
    \prop_get:NnN \l__chemgreek_packages_prop {#1}
      \l__chemgreek_mapping_package_tl
    \quark_if_no_value:VTF \l__chemgreek_mapping_package_tl
      { \prg_return_false: }
      { \prg_return_true: }
  }

% check if needed package has been loaded:
\prg_new_protected_conditional:Npnn \chemgreek_if_mapping_package_loaded:n #1 {T,F,TF}
  {
    \chemgreek_if_mapping_package:nTF {#1}
      {
        \chemgreek_if_package_loaded:VTF \l__chemgreek_mapping_package_tl
          { \prg_return_true: }
          { \prg_return_false: }
      }
      { \prg_return_true: }
  }

% ----------------------------------------------------------------------------
% messages
\msg_new:nnn {chemgreek} {mapping-not-defined}
  {
    You~ chose~ the~ mapping~ `#1'~ \msg_line_context: \c_space_tl which~ has~
    apparently~ not~ been~ defined,~ yet.~ If~ this~ is~ due~ to~ a~
    miss-spelling~ you~ need~ to~ declare~ it~ first~ via~ \token_to_str:N
    \newchemgreekmapping \c_space_tl or~ \token_to_str:N
    \declarechemgreekmapping .
  }

\msg_new:nnn {chemgreek} {mapping-already-defined}
  {
    It~ seems~ you're~ trying~ to~ define~ the~ mapping~ `#1'~
    \msg_line_context: .~ However,~ this~ mapping~ does~ already~ exist.~ If~
    this~ is~ not~ due~ to~ a~ miss-spelling~ you~ need~ to~ redefine~ it~
    via~ \token_to_str:N \renewchemgreekmapping .
  }

\msg_new:nnn {chemgreek} {mapping-active}
  {
    The~ mapping~ `#1'~ already~ is~ active~ \msg_line_context: .~ I'm~ doing~
    nothing.
  }

\msg_new:nnn {chemgreek} {mapping-activated}
  { Activating~ mapping~ `#1'~ \msg_line_context: . }

\msg_new:nnn {chemgreek} {package-missing}
  {
    You're~ trying~ to~ activate~ the~ mapping~ `#1'~ which~ needs~ package~
    `#2'~ loaded.~ However,~ package~ `#2'~ does~ not~ seem~ to~ be~ loaded~
    \msg_line_context: .~ I'm~ loading~ the~ `default'~ mapping~ instead.
  }

\msg_new:nnn {chemgreek} {command-dropped}
  {
    The~ command~ \token_to_str:N #1  has~ been~ dropped.~ Use~ \token_to_str:N #2
    instead~ \msg_line_context: .
  }

% ----------------------------------------------------------------------------
% define a dropped command with hints to the corresponding new one:
\cs_new_protected:Npn \chemgreek_define_dropped:NN #1#2
  {
    \cs_new_protected:Npn #1
      { \msg_error:nnnn {chemgreek} {command-dropped} {#1} {#2} }
  }
\cs_generate_variant:Nn \chemgreek_define_dropped:NN { cc }

% ----------------------------------------------------------------------------
% a tokenlist constant that will be used to build the mapping property lists
% both for uppercase and lowercase and also for setting the output macros
\tl_const:Nn \c__chemgreek_alphabet_tl
  {
    { alpha }   %  1
    { beta }    %  2
    { gamma }   %  3
    { delta }   %  4
    { epsilon } %  5
    { zeta }    %  6
    { eta }     %  7
    { theta }   %  8
    { iota }    %  9
    { kappa }   % 10
    { lambda }  % 11
    { mu }      % 12
    { nu }      % 13
    { xi }      % 14
    { omikron } % 15
    { pi }      % 16
    { rho }     % 17
    { sigma }   % 18
    { tau }     % 19
    { upsilon } % 20
    { phi }     % 21
    { psi }     % 22
    { chi }     % 23
    { omega }   % 24
  }

% ----------------------------------------------------------------------------
% variants of kernel functions:
\cs_generate_variant:Nn \prop_put:Nnn          { cxV }
\cs_generate_variant:Nn \prop_get:Nn           { cV }
\cs_generate_variant:Nn \tl_if_eq:nnTF         { V }
\cs_generate_variant:Nn \msg_warning:nnnn      { nnnV }
\cs_generate_variant:Nn \quark_if_no_value:nTF { V }

% ----------------------------------------------------------------------------
% helper function to retrieve upper- and lowercase entries while the mapping
% happens:
\cs_new_protected:Npn \__chemgreek_get_upper_lower:w #1 / #2 \q_stop
  {
    \tl_set:Nn \l__chemgreek_tmpa_tl {#1}
    \tl_set:Nn \l__chemgreek_tmpb_tl {#2}
  }

% ----------------------------------------------------------------------------
% a conditional for testing if a mapping exists:
\prg_new_conditional:Npnn \chemgreek_if_mapping_exists:n #1 {p,T,F,TF}
  {
    \bool_if:nTF
      {
        \prop_if_exist_p:c { l__chemgreek_uppercase_mapping_#1_prop } &&
        \prop_if_exist_p:c { l__chemgreek_lowercase_mapping_#1_prop }
      }
      { \prg_return_true: }
      { \prg_return_false: }
  }

% a conditional for testing if a mapping is active:
\tl_new:N \l_chemgreek_active_mapping_tl
\prg_new_conditional:Npnn \chemgreek_if_mapping_active:n #1 {p,T,F,TF}
  {
    \tl_if_eq:NcTF
      \l_chemgreek_active_mapping_tl
      { c__chemgreek_mapping_#1_tl }
      { \prg_return_true: }
      { \prg_return_false: }
  }

% ----------------------------------------------------------------------------
% a property lists that holds the needed package names for a mapping
\prop_new:N \l__chemgreek_packages_prop

% ----------------------------------------------------------------------------
% a function that ensures we're in text mode:

\cs_new_protected:Npn \chemgreek_text:n #1
  { \ensuremath { \text {#1} } }

% ----------------------------------------------------------------------------
% the main mapping function:
% #1: mapping-name
% #2: package name
% #3: mapping entries
\cs_new_protected:Npn \chemgreek_declare_mapping:nnn #1#2#3
  {
    \prop_if_exist:cF { l__chemgreek_uppercase_mapping_#1_prop }
      { \prop_new:c { l__chemgreek_uppercase_mapping_#1_prop } }
    \prop_if_exist:cF { l__chemgreek_lowercase_mapping_#1_prop }
      { \prop_new:c { l__chemgreek_lowercase_mapping_#1_prop } }
    \tl_if_exist:cF { c__chemgreek_mapping_#1_tl }
      { \tl_const:cn { c__chemgreek_mapping_#1_tl } {#1} }
    \tl_if_blank:nTF {#2}
      { \prop_remove:Nn \l__chemgreek_packages_prop {#1} }
      { \prop_put:Nnn \l__chemgreek_packages_prop {#1} {#2} }
    \__chemgreek_set_mapping:nn {#1} {#3}
  }

\cs_new_protected:Npn \chemgreek_new_mapping:nnn #1#2#3
  {
    \chemgreek_if_mapping_exists:nTF {#1}
      { \msg_error:nnn {chemgreek} {mapping-already-defined} {#1} }
      { \chemgreek_declare_mapping:nnn {#1} {#2} {#3} }
  }

\cs_new_protected:Npn \chemgreek_renew_mapping:nnn #1#2#3
  {
    \chemgreek_if_mapping_exists:nTF {#1}
      { \chemgreek_declare_mapping:nnn {#1} {#2} {#3} }
      { \msg_error:nnn {chemgreek} {mapping-not-defined} {#1} }
  }

\cs_new_protected:Npn \__chemgreek_set_mapping:nn #1#2
  {
    \prop_clear:c { l__chemgreek_lowercase_mapping_#1_prop }
    \prop_clear:c { l__chemgreek_uppercase_mapping_#1_prop }
    \int_zero:N \l__chemgreek_tmpa_int
    \clist_map_inline:nn {#2}
      {
        \int_incr:N \l__chemgreek_tmpa_int
        \__chemgreek_get_upper_lower:w ##1 \q_stop
        \prop_put:cxV { l__chemgreek_lowercase_mapping_#1_prop }
          { \tl_item:Nn \c__chemgreek_alphabet_tl { \l__chemgreek_tmpa_int } }
          \l__chemgreek_tmpa_tl
        \prop_put:cxV { l__chemgreek_uppercase_mapping_#1_prop }
          { \tl_item:Nn \c__chemgreek_alphabet_tl { \l__chemgreek_tmpa_int } }
          \l__chemgreek_tmpb_tl
      }
  }

% aliasing mappings:
% #1: new mapping
% #2: existing mapping
\cs_new_protected:Npn \chemgreek_new_mapping_alias:nn #1#2
  {
    \chemgreek_if_mapping_exists:nTF {#1}
      { \msg_error:nnn {chemgreek} {mapping-already-defined} {#1} }
      {
        \chemgreek_if_mapping_exists:nTF {#2}
          { \chemgreek_declare_mapping_alias:nn {#1} {#2} }
          { \msg_error:nnn {chemgreek} {mapping-not-defined} {#2} }
      }
  }

\cs_new_protected:Npn \chemgreek_renew_mapping_alias:nn #1#2
  {
    \chemgreek_if_mapping_exists:nTF {#1}
      {
        \chemgreek_if_mapping_exists:nTF {#2}
          { \chemgreek_declare_mapping_alias:nn {#1} {#2} }
          { \msg_error:nnn {chemgreek} {mapping-not-defined} {#2} }
      }
      { \msg_error:nnn {chemgreek} {mapping-not-defined} {#1} }
  }

\cs_new_protected:Npn \chemgreek_declare_mapping_alias:nn #1#2
  {
    \chemgreek_if_mapping_exists:nT {#2}
      {
        \prop_if_exist:cF { l__chemgreek_uppercase_mapping_#1_prop }
          { \prop_new:c { l__chemgreek_uppercase_mapping_#1_prop } }
        \prop_if_exist:cF { l__chemgreek_lowercase_mapping_#1_prop }
          { \prop_new:c { l__chemgreek_lowercase_mapping_#1_prop } }
        \prop_get:NnNT \l__chemgreek_packages_prop {#2} \l__chemgreek_tmpa_tl
          { \prop_put:NnV \l__chemgreek_packages_prop {#1} \l__chemgreek_tmpa_tl }
        \prop_put:Nnn \l__chemgreek_packages_prop {#1} {#2}
        \tl_map_inline:Nn \c__chemgreek_alphabet_tl
          {
            \prop_put:cnx { l__chemgreek_uppercase_mapping_#1_prop } {##1}
              { \prop_get:cn { l__chemgreek_uppercase_mapping_#2_prop } {##1} }
            \prop_put:cnx { l__chemgreek_lowercase_mapping_#1_prop } {##1}
              { \prop_get:cn { l__chemgreek_lowercase_mapping_#2_prop } {##1} }
          }
      }
  }

% ----------------------------------------------------------------------------
% the user commands:

% #1: package name (optional)
% #2: mapping-name
% #3: mapping entries
\NewDocumentCommand \newchemgreekmapping { O{}mm }
  { \chemgreek_new_mapping:nnn {#2} {#1} {#3} }

\NewDocumentCommand \renewchemgreekmapping { O{}mm }
  { \chemgreek_renew_mapping:nnn {#2} {#1} {#3} }

\NewDocumentCommand \declarechemgreekmapping { O{}mm }
  { \chemgreek_declare_mapping:nnn {#2} {#1} {#3} }

% #1: new mapping
% #2: existing mapping
\NewDocumentCommand \newchemgreekmappingalias { mm }
  { \chemgreek_new_mapping_alias:nn {#1} {#2} }

\NewDocumentCommand \renewchemgreekmappingalias { mm }
  { \chemgreek_renew_mapping_alias:nn {#1} {#2} }

\NewDocumentCommand \declarechemgreekmappingalias { mm }
  { \chemgreek_declare_mapping_alias:nn {#1} {#2} }
  
% ----------------------------------------------------------------------------
% a function to selectively change specific entries in a mapping:

% this will hold all changed mappings until they've been (re-)activated
% logically a sequence or clist would make more sense; however,
% \prop_if_in:Nn(TF) is expandable
\prop_new:N \l__chemgreek_changed_mappings_prop

% #1: mapping-name
% #2: upper / lower
% #3: entry-name
% #4: entry
\cs_new_protected:Npn \chemgreek_change:nnnn #1#2#3#4
  {
    \chemgreek_if_mapping_exists:nTF {#1}
      {
        \prop_put:cnn { l__chemgreek_#2 case_mapping_#1_prop }
          {#3}
          {#4}
        \prop_put:Nnn \l__chemgreek_changed_mappings_prop
          {#1}
          {#1}
      }
      { \msg_error:nnn {chemgreek} {mapping-not-defined} {#1} }
  }

% the user command:
\NewDocumentCommand \changechemgreeksymbol { mmmm }
  { \chemgreek_change:nnnn {#1} {#2} {#3} {#4} }

% ----------------------------------------------------------------------------
\cs_new_protected:Npn \chemgreek_load_mapping_package:n #1
  {
    \chemgreek_if_mapping_package:nT {#1}
      { \exp_args:NV \RequirePackage \l__chemgreek_mapping_package_tl }
  }

% a function to activate a mapping:
% #1: mapping-name
\cs_new_protected:Npn \chemgreek_activate_mapping:n #1
  {
    \chemgreek_if_mapping_exists:nTF {#1}
      {
        \bool_if:nTF
          {
            ( \chemgreek_if_mapping_active_p:n {#1} )
            &&
            !( \prop_if_in_p:Nn \l__chemgreek_changed_mappings_prop {#1} )
          }
          { \msg_info:nnn {chemgreek} {mapping-active} {#1} }
          {
            \chemgreek_if_mapping_package_loaded:nTF {#1}
              { \__chemgreek_activate_mapping:n {#1} }
              {
                \msg_warning:nnnV {chemgreek} {package-missing}
                  {#1}
                  \l__chemgreek_mapping_package_tl
                \__chemgreek_activate_mapping:n {default}
              }            
            \prop_get:NnNT \l__chemgreek_changed_mappings_prop
              {#1}
              \l__chemgreek_tmpa_tl
              { \prop_remove:Nn \l__chemgreek_changed_mappings_prop {#1} }
          }
      }
      { \msg_error:nnn {chemgreek} {mapping-not-defined} {#1} }
  }
\cs_generate_variant:Nn \chemgreek_activate_mapping:n { V }

\cs_new_protected:Npn \__chemgreek_activate_mapping:n #1
  {
    \tl_set:Nn \l_chemgreek_active_mapping_tl {#1}
    \tl_map_inline:Nn \c__chemgreek_alphabet_tl
      {
        \cs_set_protected:cpx
          {
            chem
            \str_upper_case:f { \tl_head:n {##1} }
            \str_lower_case:f { \tl_tail:n {##1} }
          }
          { \prop_get:cn { l__chemgreek_uppercase_mapping_#1_prop } {##1} }
        \cs_set_eq:cc
          {
            chemgreek_
            \str_upper_case:f { \tl_head:n {##1} }
            \str_lower_case:f { \tl_tail:n {##1} }
            :
          }
          {
            chem
            \str_upper_case:f { \tl_head:n {##1} }
            \str_lower_case:f { \tl_tail:n {##1} }
          }
        \cs_set_protected:cpx { chem \str_lower_case:f {##1} }
          { \prop_get:cn { l__chemgreek_lowercase_mapping_#1_prop } {##1} }
        \cs_set_eq:cc
          { chemgreek_ \str_lower_case:f {##1} : }
          { chem \str_lower_case:f {##1} }
      }
    \msg_info:nnn {chemgreek} {mapping-activated} {#1}
  }

% #1: mapping name
% #2: symbol name
\cs_new_protected:Npn \chemgreek_get_from_mapping:nn #1#2
  {
    \tl_set:Nx \l__chemgreek_tmpa_tl
      {
        \str_upper_case:f { \tl_head:n {#2} }
        \str_lower_case:f { \tl_tail:n {#2} }
      }
    \str_if_eq:nVTF {#2} \l__chemgreek_tmpa_tl
      {
        \tl_set:Nx \l__chemgreek_tmpa_tl { \str_lower_case:f {#2} }
        \prop_get:cV
          { l__chemgreek_uppercase_mapping_#1_prop }
          \l__chemgreek_tmpa_tl
      }
      { \prop_get:cn { l__chemgreek_lowercase_mapping_#1_prop } {#2} }
  }

\NewDocumentCommand \chemgreekmappingsymbol { mm }
  { \chemgreek_get_from_mapping:nn {#1} {#2} }

% user command that also loads the needed package:
% #1: load package
% #2: mapping-name
\NewDocumentCommand \activatechemgreekmapping { sm }
  {
    \IfBooleanT {#1} { \chemgreek_load_mapping_package:n {#2} }
    \chemgreek_activate_mapping:n {#2}
  }
\@onlypreamble\activatechemgreekmapping

% user command that activates a new mapping without loading the package:
\NewDocumentCommand \selectchemgreekmapping { m }
  { \chemgreek_activate_mapping:n {#1} }

% ----------------------------------------------------------------------------
% debugging commands:
\cs_new_protected:Npn \chemgreek_print_mapping:n #1
  {
    \int_gzero:N \g__chemgreek_tmpa_int
    \begin {tabular} {llcc}
      pos & name & lower & upper \\
    \tl_map_inline:Nn \c__chemgreek_alphabet_tl
      {
        \int_gincr:N \g__chemgreek_tmpa_int
        \int_use:N \g__chemgreek_tmpa_int . &
        ##1  &
        \prop_get:cn { l__chemgreek_lowercase_mapping_#1_prop } {##1} &
        \prop_get:cn { l__chemgreek_uppercase_mapping_#1_prop } {##1} \\
      }
    \end{tabular}
  }

\cs_new_eq:NN \printchemgreekmapping \chemgreek_print_mapping:n

\cs_new_protected:Npn \chemgreek_show_mapping:n #1
  {
    \int_gzero:N \g__chemgreek_tmpa_int
    \iow_log:n { ................................................. }
    \iow_log:n { . ~ chemgreek~ mapping~ `#1': }
    \tl_map_inline:Nn \c__chemgreek_alphabet_tl
      {
        \int_gincr:N \g__chemgreek_tmpa_int
        \iow_log:x
          { . ~ \int_use:N \g__chemgreek_tmpa_int . }
        \iow_log:x
          {
            . \c_space_tl \c_space_tl \c_space_tl \c_space_tl \c_space_tl
            \str_lower_case:f {##1} ~ => ~
            \prop_get:cn { l__chemgreek_lowercase_mapping_#1_prop } {##1}
          }
        \iow_log:x
          {
            . \c_space_tl \c_space_tl \c_space_tl \c_space_tl \c_space_tl
            \str_upper_case:f { \tl_head:n {##1} }
            \str_lower_case:f { \tl_tail:n {##1} }
            \c_space_tl => ~
            \prop_get:cn { l__chemgreek_uppercase_mapping_#1_prop } {##1}
          }
      }
    \iow_log:n { ................................................. }
  }

\cs_new_eq:NN \showchemgreekmapping \chemgreek_show_mapping:n

\cs_new_protected:Npn \chemgreek_print_alphabet:
  {
    \tl_map_inline:Nn \c__chemgreek_alphabet_tl
      {
        \use:c { chem \str_lower_case:f {##1} }
        \use:c
          {
            chem
            \str_upper_case:f { \tl_head:n {##1} }
            \str_lower_case:f { \tl_tail:n {##1} }
          }
        \c_space_tl
      }
    \tex_unskip:D
  }

\cs_new_eq:NN \printchemgreekalphabet \chemgreek_print_alphabet:

% ----------------------------------------------------------------------------
% drop old macro names that started with an uppercase C:
% remove this in March 2016
\cs_new_protected:Npn \chemgreek_drop_symbol:n #1
  { \chemgreek_define_dropped:cc { Chem#1 } { chem#1 } }

\cs_new_protected:Npn \chemgreek_drop_symbols:
  {
    \tl_map_inline:Nn \c__chemgreek_alphabet_tl
      {
        \chemgreek_drop_symbol:n {##1}
        \chemgreek_drop_symbol:n
          {
            \str_upper_case:f { \tl_head:n {##1} }
            \str_lower_case:f { \tl_tail:n {##1} }
          }
      }
  }

\chemgreek_drop_symbols:

% ----------------------------------------------------------------------------
% functions to format integers with greek letters; these are basically copies
% of \int_to_alph:n
\cs_new:Npn \chemgreek_int_to_greek:n #1
  {
    \int_to_symbols:nnn {#1} {24}
      {
        {  1 } { \chemalpha }
        {  2 } { \chembeta }
        {  3 } { \chemgamma }
        {  4 } { \chemdelta }
        {  5 } { \chemepsilon }
        {  6 } { \chemzeta }
        {  7 } { \chemeta }
        {  8 } { \chemiota }
        {  9 } { \chemtheta }
        { 10 } { \chemkappa }
        { 11 } { \chemlambda }
        { 12 } { \chemmu }
        { 13 } { \chemnu }
        { 14 } { \chemxi }
        { 15 } { \chemomikron }
        { 16 } { \chempi }
        { 17 } { \chemrho }
        { 18 } { \chemsigma }
        { 19 } { \chemtau }
        { 20 } { \chemupsilon }
        { 21 } { \chemphi }
        { 22 } { \chempsi }
        { 23 } { \chemchi }
        { 24 } { \chemomega }
      }
  }

\cs_new:Npn \chemgreek_int_to_Greek:n #1
  {
    \int_to_symbols:nnn {#1} {24}
      {
        {  1 } { \chemAlpha }
        {  2 } { \chemBeta }
        {  3 } { \chemGamma }
        {  4 } { \chemDelta }
        {  5 } { \chemEpsilon }
        {  6 } { \chemZeta }
        {  7 } { \chemEta }
        {  8 } { \chemIota }
        {  9 } { \chemTheta }
        { 10 } { \chemKappa }
        { 11 } { \chemLambda }
        { 12 } { \chemMu }
        { 13 } { \chemNu }
        { 14 } { \chemXi }
        { 15 } { \chemOmikron }
        { 16 } { \chemPi }
        { 17 } { \chemRho }
        { 18 } { \chemSigma }
        { 19 } { \chemTau }
        { 20 } { \chemUpsilon }
        { 21 } { \chemPhi }
        { 22 } { \chemPsi }
        { 23 } { \chemChi }
        { 24 } { \chemOmega }
      }
  }

% ----------------------------------------------------------------------------
% predefine some mappings
% default:
\chemgreek_new_mapping:nnn {default} { }
  {
    \ensuremath{\alpha}   / \ensuremath{\mathrm{A}} , %  1
    \ensuremath{\beta}    / \ensuremath{\mathrm{B}} , %  2
    \ensuremath{\gamma}   / \ensuremath{\Gamma} ,     %  3
    \ensuremath{\delta}   / \ensuremath{\Delta} ,     %  4
    \ensuremath{\epsilon} / \ensuremath{\mathrm{E}} , %  5
    \ensuremath{\zeta}    / \ensuremath{\mathrm{Z}} , %  6
    \ensuremath{\eta}     / \ensuremath{\mathrm{H}} , %  7
    \ensuremath{\theta}   / \ensuremath{\Theta} ,     %  8
    \ensuremath{\iota}    / \ensuremath{\mathrm{I}} , %  9
    \ensuremath{\kappa}   / \ensuremath{\mathrm{K}} , % 10
    \ensuremath{\lambda}  / \ensuremath{\Lambda} ,    % 11
    \ensuremath{\mu}      / \ensuremath{\mathrm{M}} , % 12
    \ensuremath{\nu}      / \ensuremath{\mathrm{N}} , % 13
    \ensuremath{\xi}      / \ensuremath{\Xi} ,        % 14
    \ensuremath{o}        / \ensuremath{\mathrm{O}} , % 15
    \ensuremath{\pi}      / \ensuremath{\Pi} ,        % 16
    \ensuremath{\rho}     / \ensuremath{\mathrm{P}} , % 17
    \ensuremath{\sigma}   / \ensuremath{\Sigma} ,     % 18
    \ensuremath{\tau}     / \ensuremath{\mathrm{T}} , % 19
    \ensuremath{\upsilon} / \ensuremath{\Upsilon} ,   % 20
    \ensuremath{\phi}     / \ensuremath{\Phi} ,       % 21
    \ensuremath{\psi}     / \ensuremath{\Psi} ,       % 22
    \ensuremath{\chi}     / \ensuremath{\mathrm{X}} , % 23
    \ensuremath{\omega}   / \ensuremath{\Omega}       % 24
  }

% default-variant:
\chemgreek_new_mapping:nnn {var-default} { }
  {
    \ensuremath{\alpha}      / \ensuremath{\mathrm{A}} , %  1
    \ensuremath{\beta}       / \ensuremath{\mathrm{B}} , %  2
    \ensuremath{\gamma}      / \ensuremath{\Gamma} ,     %  3
    \ensuremath{\delta}      / \ensuremath{\Delta} ,     %  4
    \ensuremath{\varepsilon} / \ensuremath{\mathrm{E}} , %  5
    \ensuremath{\zeta}       / \ensuremath{\mathrm{Z}} , %  6
    \ensuremath{\eta}        / \ensuremath{\mathrm{H}} , %  7
    \ensuremath{\vartheta}   / \ensuremath{\Theta} ,     %  8
    \ensuremath{\iota}       / \ensuremath{\mathrm{I}} , %  9
    \ensuremath{\kappa}      / \ensuremath{\mathrm{K}} , % 10
    \ensuremath{\lambda}     / \ensuremath{\Lambda} ,    % 11
    \ensuremath{\mu}         / \ensuremath{\mathrm{M}} , % 12
    \ensuremath{\nu}         / \ensuremath{\mathrm{N}} , % 13
    \ensuremath{\xi}         / \ensuremath{\Xi} ,        % 14
    \ensuremath{o}           / \ensuremath{\mathrm{O}} , % 15
    \ensuremath{\varpi}      / \ensuremath{\Pi} ,        % 16
    \ensuremath{\varrho}     / \ensuremath{\mathrm{P}} , % 17
    \ensuremath{\varsigma}   / \ensuremath{\Sigma} ,     % 18
    \ensuremath{\tau}        / \ensuremath{\mathrm{T}} , % 19
    \ensuremath{\upsilon}    / \ensuremath{\Upsilon} ,   % 20
    \ensuremath{\varphi}     / \ensuremath{\Phi} ,       % 21
    \ensuremath{\psi}        / \ensuremath{\Psi} ,       % 22
    \ensuremath{\chi}        / \ensuremath{\mathrm{X}} , % 23
    \ensuremath{\omega}      / \ensuremath{\Omega}       % 24
  }

% mathdesign:
\chemgreek_new_mapping:nnn {mathdesign} {mathdesign}
  {
    \ensuremath{\alphaup}      / \ensuremath{\mathrm{A}} , %  1
    \ensuremath{\betaup}       / \ensuremath{\mathrm{B}} , %  2
    \ensuremath{\gammaup}      / \ensuremath{\Gammaup} ,   %  3
    \ensuremath{\deltaup}      / \ensuremath{\Deltaup} ,   %  4
    \ensuremath{\epsilonup}    / \ensuremath{\mathrm{E}} , %  5
    \ensuremath{\zetaup}       / \ensuremath{\mathrm{Z}} , %  6
    \ensuremath{\etaup}        / \ensuremath{\mathrm{H}} , %  7
    \ensuremath{\thetaup}      / \ensuremath{\Thetaup} ,   %  8
    \ensuremath{\iotaup}       / \ensuremath{\mathrm{I}} , %  9
    \ensuremath{\kappaup}      / \ensuremath{\mathrm{K}} , % 10
    \ensuremath{\lambdaup}     / \ensuremath{\Lambdaup} ,  % 11
    \ensuremath{\muup}         / \ensuremath{\mathrm{M}} , % 12
    \ensuremath{\nuup}         / \ensuremath{\mathrm{N}} , % 13
    \ensuremath{\xiup}         / \ensuremath{\Xiup} ,      % 14
    \ensuremath{\mathrm{o}}    / \ensuremath{\mathrm{O}} , % 15
    \ensuremath{\piup}         / \ensuremath{\Piup} ,      % 16
    \ensuremath{\rhoup}        / \ensuremath{\mathrm{R}} , % 17
    \ensuremath{\sigmaup}      / \ensuremath{\Sigmaup} ,   % 18
    \ensuremath{\tauup}        / \ensuremath{\mathrm{T}} , % 19
    \ensuremath{\upsilonup}    / \ensuremath{\Upsilonup} , % 20
    \ensuremath{\phiup}        / \ensuremath{\Phiup} ,     % 21
    \ensuremath{\psiup}        / \ensuremath{\Psiup} ,     % 22
    \ensuremath{\chiup}        / \ensuremath{\mathrm{X}} , % 23
    \ensuremath{\omegaup}      / \ensuremath{\Omegaup}     % 24
  }

% textgreek:
\chemgreek_new_mapping:nnn {textgreek} {textgreek}
  {
    \chemgreek_text:n {\textalpha}   / \chemgreek_text:n {\textAlpha} ,   %  1
    \chemgreek_text:n {\textbeta}    / \chemgreek_text:n {\textBeta} ,    %  2
    \chemgreek_text:n {\textgamma}   / \chemgreek_text:n {\textGamma} ,   %  3
    \chemgreek_text:n {\textdelta}   / \chemgreek_text:n {\textDelta} ,   %  4
    \chemgreek_text:n {\textepsilon} / \chemgreek_text:n {\textEpsilon} , %  5
    \chemgreek_text:n {\textzeta}    / \chemgreek_text:n {\textZeta} ,    %  6
    \chemgreek_text:n {\texteta}     / \chemgreek_text:n {\textEta} ,     %  7
    \chemgreek_text:n {\texttheta}   / \chemgreek_text:n {\textTheta} ,   %  8
    \chemgreek_text:n {\textiota}    / \chemgreek_text:n {\textIota} ,    %  9
    \chemgreek_text:n {\textkappa}   / \chemgreek_text:n {\textKappa} ,   % 10
    \chemgreek_text:n {\textlambda}  / \chemgreek_text:n {\textLambda} ,  % 11
    \chemgreek_text:n {\textmugreek} / \chemgreek_text:n {\textMu} ,      % 12
    \chemgreek_text:n {\textnu}      / \chemgreek_text:n {\textNu} ,      % 13
    \chemgreek_text:n {\textxi}      / \chemgreek_text:n {\textXi} ,      % 14
    \chemgreek_text:n {\textomikron} / \chemgreek_text:n {\textOmikron} , % 15
    \chemgreek_text:n {\textpi}      / \chemgreek_text:n {\textPi} ,      % 16
    \chemgreek_text:n {\textrho}     / \chemgreek_text:n {\textRho} ,     % 17
    \chemgreek_text:n {\textsigma}   / \chemgreek_text:n {\textSigma} ,   % 18
    \chemgreek_text:n {\texttau}     / \chemgreek_text:n {\textTau} ,     % 19
    \chemgreek_text:n {\textupsilon} / \chemgreek_text:n {\textUpsilon} , % 20
    \chemgreek_text:n {\textphi}     / \chemgreek_text:n {\textPhi} ,     % 21
    \chemgreek_text:n {\textpsi}     / \chemgreek_text:n {\textPsi} ,     % 22
    \chemgreek_text:n {\textchi}     / \chemgreek_text:n {\textChi} ,     % 23
    \chemgreek_text:n {\textomega}   / \chemgreek_text:n {\textOmega}     % 24
  }

% upgreek:
\chemgreek_new_mapping:nnn {upgreek} {upgreek}
  {
    \ensuremath{\upalpha}      / \ensuremath{\mathrm{A}} , %  1
    \ensuremath{\upbeta}       / \ensuremath{\mathrm{B}} , %  2
    \ensuremath{\upgamma}      / \ensuremath{\Upgamma} ,   %  3
    \ensuremath{\updelta}      / \ensuremath{\Updelta} ,   %  4
    \ensuremath{\upepsilon}    / \ensuremath{\mathrm{E}} , %  5
    \ensuremath{\upzeta}       / \ensuremath{\mathrm{Z}} , %  6
    \ensuremath{\upeta}        / \ensuremath{\mathrm{H}} , %  7
    \ensuremath{\uptheta}      / \ensuremath{\Uptheta} ,   %  8
    \ensuremath{\upiota}       / \ensuremath{\mathrm{I}} ,   %  9
    \ensuremath{\upkappa}      / \ensuremath{\mathrm{K}} , % 10
    \ensuremath{\uplambda}     / \ensuremath{\Uplambda} ,  % 11
    \ensuremath{\upmu}         / \ensuremath{\mathrm{M}} , % 12
    \ensuremath{\upnu}         / \ensuremath{\mathrm{N}} , % 13
    \ensuremath{\upxi}         / \ensuremath{\Upxi} ,      % 14
    \ensuremath{\mathrm{o}}    / \ensuremath{\mathrm{O}} , % 15
    \ensuremath{\uppi}         / \ensuremath{\Uppi} ,      % 16
    \ensuremath{\uprho}        / \ensuremath{\mathrm{R}} , % 17
    \ensuremath{\upsigma}      / \ensuremath{\Upsigma} ,   % 18
    \ensuremath{\uptau}        / \ensuremath{\mathrm{T}} , % 19
    \ensuremath{\upupsilon}    / \ensuremath{\Upupsilon} , % 20
    \ensuremath{\upphi}        / \ensuremath{\Upphi} ,     % 21
    \ensuremath{\uppsi}        / \ensuremath{\Uppsi} ,     % 22
    \ensuremath{\upchi}        / \ensuremath{\mathrm{X}} , % 23
    \ensuremath{\upomega}      / \ensuremath{\Upomega}     % 24
  }

% kpfonts:
\chemgreek_new_mapping:nnn {kpfonts} {kpfonts}
  {
    \ensuremath{\alphaup}      / \ensuremath{\mathrm{A}} , %  1
    \ensuremath{\betaup}       / \ensuremath{\mathrm{B}} , %  2
    \ensuremath{\gammaup}      / \ensuremath{\Gammaup} ,   %  3
    \ensuremath{\deltaup}      / \ensuremath{\Deltaup} ,   %  4
    \ensuremath{\epsilonup}    / \ensuremath{\mathrm{E}} , %  5
    \ensuremath{\zetaup}       / \ensuremath{\mathrm{Z}} , %  6
    \ensuremath{\etaup}        / \ensuremath{\mathrm{H}} , %  7
    \ensuremath{\thetaup}      / \ensuremath{\Thetaup} ,   %  8
    \ensuremath{\iotaup}       / \ensuremath{\mathrm{I}} , %  9
    \ensuremath{\kappaup}      / \ensuremath{\mathrm{K}} , % 10
    \ensuremath{\lambdaup}     / \ensuremath{\Lambdaup} ,  % 11
    \ensuremath{\muup}         / \ensuremath{\mathrm{M}} , % 12
    \ensuremath{\nuup}         / \ensuremath{\mathrm{N}} , % 13
    \ensuremath{\xiup}         / \ensuremath{\Xiup} ,      % 14
    \ensuremath{\mathrm{o}}    / \ensuremath{\mathrm{O}} , % 15
    \ensuremath{\piup}         / \ensuremath{\Piup} ,      % 16
    \ensuremath{\rhoup}        / \ensuremath{\mathrm{R}} , % 17
    \ensuremath{\sigmaup}      / \ensuremath{\Sigmaup} ,   % 18
    \ensuremath{\tauup}        / \ensuremath{\mathrm{T}} , % 19
    \ensuremath{\upsilonup}    / \ensuremath{\Upsilonup} , % 20
    \ensuremath{\phiup}        / \ensuremath{\Phiup} ,     % 21
    \ensuremath{\psiup}        / \ensuremath{\Psiup} ,     % 22
    \ensuremath{\chiup}        / \ensuremath{\mathrm{X}} , % 23
    \ensuremath{\omegaup}      / \ensuremath{\Omegaup}     % 24
  }

% newtx:
\chemgreek_new_mapping:nnn {newtx} {newtxmath}
  {
    \ensuremath{\upalpha}      / \ensuremath{\mathrm{A}} , %  1
    \ensuremath{\upbeta}       / \ensuremath{\mathrm{B}} , %  2
    \ensuremath{\upgamma}      / \ensuremath{\upGamma} ,   %  3
    \ensuremath{\updelta}      / \ensuremath{\upDelta} ,   %  4
    \ensuremath{\upepsilon}    / \ensuremath{\mathrm{E}} , %  5
    \ensuremath{\upzeta}       / \ensuremath{\mathrm{Z}} , %  6
    \ensuremath{\upeta}        / \ensuremath{\mathrm{H}} , %  7
    \ensuremath{\uptheta}      / \ensuremath{\upTheta} ,   %  8
    \ensuremath{\upiota}       / \ensuremath{\mathrm{I}} , %  9
    \ensuremath{\upkappa}      / \ensuremath{\mathrm{K}} , % 10
    \ensuremath{\uplambda}     / \ensuremath{\upLambda} ,  % 11
    \ensuremath{\upmu}         / \ensuremath{\mathrm{M}} , % 12
    \ensuremath{\upnu}         / \ensuremath{\mathrm{N}} , % 13
    \ensuremath{\upxi}         / \ensuremath{\upXi} ,      % 14
    \ensuremath{\mathrm{o}}    / \ensuremath{\mathrm{O}} , % 15
    \ensuremath{\uppi}         / \ensuremath{\upPi} ,      % 16
    \ensuremath{\uprho}        / \ensuremath{\mathrm{R}} , % 17
    \ensuremath{\upsigma}      / \ensuremath{\upSigma} ,   % 18
    \ensuremath{\uptau}        / \ensuremath{\mathrm{T}} , % 19
    \ensuremath{\upupsilon}    / \ensuremath{\upUpsilon} , % 20
    \ensuremath{\upphi}        / \ensuremath{\upPhi} ,     % 21
    \ensuremath{\uppsi}        / \ensuremath{\upPsi} ,     % 22
    \ensuremath{\upchi}        / \ensuremath{\mathrm{X}} , % 23
    \ensuremath{\upomega}      / \ensuremath{\upOmega}     % 24
  }

% fourier:
\cs_new:Npn \__chemgreek_lfourier:n #1
  {
    \chemgreek_latex_if:nTF { sloped }
      { \ensuremath { \use:c { other #1 } } }
      { \ensuremath { \use:c { #1 } } }
  }

\cs_new:Npn \__chemgreek_ufourier:n #1
  {
    \chemgreek_latex_if:nTF { sloped }
      { \ensuremath { \use:c { #1 } } }
      { \ensuremath { \use:c { other #1 } } }
  }

\chemgreek_new_mapping:nnn {fourier} {fourier}
  {
    \__chemgreek_lfourier:n {alpha}   / \ensuremath{\mathrm{A}} ,           %  1
    \__chemgreek_lfourier:n {beta}    / \ensuremath{\mathrm{B}} ,           %  2
    \__chemgreek_lfourier:n {gamma}   / \__chemgreek_ufourier:n {Gamma} ,   %  3
    \__chemgreek_lfourier:n {delta}   / \__chemgreek_ufourier:n {Delta} ,   %  4
    \__chemgreek_lfourier:n {epsilon} / \ensuremath{\mathrm{E}} ,           %  5
    \__chemgreek_lfourier:n {zeta}    / \ensuremath{\mathrm{Z}} ,           %  6
    \__chemgreek_lfourier:n {eta}     / \ensuremath{\mathrm{H}} ,           %  7
    \__chemgreek_lfourier:n {theta}   / \__chemgreek_ufourier:n {Theta} ,   %  8
    \__chemgreek_lfourier:n {iota}    / \ensuremath{\mathrm{I}} ,           %  9
    \__chemgreek_lfourier:n {kappa}   / \ensuremath{\mathrm{K}} ,           % 10
    \__chemgreek_lfourier:n {lambda}  / \__chemgreek_ufourier:n {Lambda} ,  % 11
    \__chemgreek_lfourier:n {mu}      / \ensuremath{\mathrm{M}} ,           % 12
    \__chemgreek_lfourier:n {nu}      / \ensuremath{\mathrm{N}} ,           % 13
    \__chemgreek_lfourier:n {xi}      / \__chemgreek_ufourier:n {Xi} ,      % 14
    \ensuremath {\mathrm{o}}          / \ensuremath{\mathrm{O}} ,           % 15
    \__chemgreek_lfourier:n {pi}      / \__chemgreek_ufourier:n {Pi} ,      % 16
    \__chemgreek_lfourier:n {rho}     / \ensuremath{\mathrm{R}} ,           % 17
    \__chemgreek_lfourier:n {sigma}   / \__chemgreek_ufourier:n {Sigma} ,   % 18
    \__chemgreek_lfourier:n {tau}     / \ensuremath{\mathrm{T}} ,           % 19
    \__chemgreek_lfourier:n {upsilon} / \__chemgreek_ufourier:n {Upsilon} , % 20
    \__chemgreek_lfourier:n {phi}     / \__chemgreek_ufourier:n {Phi} ,     % 21
    \__chemgreek_lfourier:n {psi}     / \__chemgreek_ufourier:n {Psi} ,     % 22
    \__chemgreek_lfourier:n {chi}     / \ensuremath{\mathrm{X}} ,           % 23
    \__chemgreek_lfourier:n {omega}   / \__chemgreek_ufourier:n {Omega}     % 24
  }

% textalpha:
\chemgreek_new_mapping:nnn {textalpha} {textalpha}
  {
    \chemgreek_text:n {\textalpha}   / \chemgreek_text:n {\textAlpha} ,   %  1
    \chemgreek_text:n {\textbeta}    / \chemgreek_text:n {\textBeta} ,    %  2
    \chemgreek_text:n {\textgamma}   / \chemgreek_text:n {\textGamma} ,   %  3
    \chemgreek_text:n {\textdelta}   / \chemgreek_text:n {\textDelta} ,   %  4
    \chemgreek_text:n {\textepsilon} / \chemgreek_text:n {\textEpsilon} , %  5
    \chemgreek_text:n {\textzeta}    / \chemgreek_text:n {\textZeta} ,    %  6
    \chemgreek_text:n {\texteta}     / \chemgreek_text:n {\textEta} ,     %  7
    \chemgreek_text:n {\texttheta}   / \chemgreek_text:n {\textTheta} ,   %  8
    \chemgreek_text:n {\textiota}    / \chemgreek_text:n {\textIota} ,    %  9
    \chemgreek_text:n {\textkappa}   / \chemgreek_text:n {\textKappa} ,   % 10
    \chemgreek_text:n {\textlambda}  / \chemgreek_text:n {\textLambda} ,  % 11
    \chemgreek_text:n {\textmu}      / \chemgreek_text:n {\textMu} ,      % 12
    \chemgreek_text:n {\textnu}      / \chemgreek_text:n {\textNu} ,      % 13
    \chemgreek_text:n {\textxi}      / \chemgreek_text:n {\textXi} ,      % 14
    \chemgreek_text:n {\textomicron} / \chemgreek_text:n {\textOmicron} , % 15
    \chemgreek_text:n {\textpi}      / \chemgreek_text:n {\textPi} ,      % 16
    \chemgreek_text:n {\textrho}     / \chemgreek_text:n {\textRho} ,     % 17
    \chemgreek_text:n {\textsigma}   / \chemgreek_text:n {\textSigma} ,   % 18
    \chemgreek_text:n {\texttau}     / \chemgreek_text:n {\textTau} ,     % 19
    \chemgreek_text:n {\textupsilon} / \chemgreek_text:n {\textUpsilon} , % 20
    \chemgreek_text:n {\textphi}     / \chemgreek_text:n {\textPhi} ,     % 21
    \chemgreek_text:n {\textpsi}     / \chemgreek_text:n {\textPsi} ,     % 22
    \chemgreek_text:n {\textchi}     / \chemgreek_text:n {\textChi} ,     % 23
    \chemgreek_text:n {\textomega}   / \chemgreek_text:n {\textOmega}     % 24
  }

% textgreek:
\chemgreek_new_mapping:nnn {fontspec} {fontspec}
  {
    \chemgreek_text:n {\textalpha}   / \chemgreek_text:n {\textAlpha} ,   %  1
    \chemgreek_text:n {\textbeta}    / \chemgreek_text:n {\textBeta} ,    %  2
    \chemgreek_text:n {\textgamma}   / \chemgreek_text:n {\textGamma} ,   %  3
    \chemgreek_text:n {\textdelta}   / \chemgreek_text:n {\textDelta} ,   %  4
    \chemgreek_text:n {\textepsilon} / \chemgreek_text:n {\textEpsilon} , %  5
    \chemgreek_text:n {\textzeta}    / \chemgreek_text:n {\textZeta} ,    %  6
    \chemgreek_text:n {\texteta}     / \chemgreek_text:n {\textEta} ,     %  7
    \chemgreek_text:n {\texttheta}   / \chemgreek_text:n {\textTheta} ,   %  8
    \chemgreek_text:n {\textiota}    / \chemgreek_text:n {\textIota} ,    %  9
    \chemgreek_text:n {\textkappa}   / \chemgreek_text:n {\textKappa} ,   % 10
    \chemgreek_text:n {\textlambda}  / \chemgreek_text:n {\textLambda} ,  % 11
    \chemgreek_text:n {\textmu}      / \chemgreek_text:n {\textMu} ,      % 12
    \chemgreek_text:n {\textnu}      / \chemgreek_text:n {\textNu} ,      % 13
    \chemgreek_text:n {\textxi}      / \chemgreek_text:n {\textXi} ,      % 14
    \chemgreek_text:n {o}            / \chemgreek_text:n {O} ,            % 15
    \chemgreek_text:n {\textpi}      / \chemgreek_text:n {\textPi} ,      % 16
    \chemgreek_text:n {\textrho}     / \chemgreek_text:n {\textRho} ,     % 17
    \chemgreek_text:n {\textsigma}   / \chemgreek_text:n {\textSigma} ,   % 18
    \chemgreek_text:n {\texttau}     / \chemgreek_text:n {\textTau} ,     % 19
    \chemgreek_text:n {\textupsilon} / \chemgreek_text:n {\textUpsilon} , % 20
    \chemgreek_text:n {\textphi}     / \chemgreek_text:n {\textPhi} ,     % 21
    \chemgreek_text:n {\textpsi}     / \chemgreek_text:n {\textPsi} ,     % 22
    \chemgreek_text:n {\textchi}     / \chemgreek_text:n {\textChi} ,     % 23
    \chemgreek_text:n {\textomega}   / \chemgreek_text:n {\textOmega}     % 24
  }

% pxgreeks: \iftgs@itupper
\cs_new:Npn \__chemgreek_upxgreeks:n #1
  {
    \chemgreek_latex_if:nTF { tgs@itupper }
      { \ensuremath { \use:c {other#1} } }
      { \ensuremath { \use:c {#1} } }
  }

\chemgreek_new_mapping:nnn {pxgreeks} {pxgreeks}
  {
    \ensuremath{\alphaup}      / \ensuremath{\mathrm{A}} ,            %  1
    \ensuremath{\betaup}       / \ensuremath{\mathrm{B}} ,            %  2
    \ensuremath{\gammaup}      / \__chemgreek_upxgreeks:n {Gamma} ,   %  3
    \ensuremath{\deltaup}      / \__chemgreek_upxgreeks:n {Delta} ,   %  4
    \ensuremath{\epsilonup}    / \ensuremath{\mathrm{E}} ,            %  5
    \ensuremath{\zetaup}       / \ensuremath{\mathrm{Z}} ,            %  6
    \ensuremath{\etaup}        / \ensuremath{\mathrm{H}} ,            %  7
    \ensuremath{\thetaup}      / \__chemgreek_upxgreeks:n {Theta} ,   %  8
    \ensuremath{\iotaup}       / \ensuremath{\mathrm{I}} ,            %  9
    \ensuremath{\kappaup}      / \ensuremath{\mathrm{K}} ,            % 10
    \ensuremath{\lambdaup}     / \__chemgreek_upxgreeks:n {Lambda} ,  % 11
    \ensuremath{\muup}         / \ensuremath{\mathrm{M}} ,            % 12
    \ensuremath{\nuup}         / \ensuremath{\mathrm{N}} ,            % 13
    \ensuremath{\xiup}         / \__chemgreek_upxgreeks:n {Xi} ,      % 14
    \ensuremath{\omicronup}    / \ensuremath{\mathrm{O}} ,            % 15
    \ensuremath{\piup}         / \__chemgreek_upxgreeks:n {Pi} ,      % 16
    \ensuremath{\rhoup}        / \ensuremath{\mathrm{R}} ,            % 17
    \ensuremath{\sigmaup}      / \__chemgreek_upxgreeks:n {Sigma} ,   % 18
    \ensuremath{\tauup}        / \ensuremath{\mathrm{T}} ,            % 19
    \ensuremath{\upsilonup}    / \__chemgreek_upxgreeks:n {Upsilon} , % 20
    \ensuremath{\phiup}        / \__chemgreek_upxgreeks:n {Phi} ,     % 21
    \ensuremath{\psiup}        / \__chemgreek_upxgreeks:n {Psi} ,     % 22
    \ensuremath{\chiup}        / \ensuremath{\mathrm{X}} ,            % 23
    \ensuremath{\omegaup}      / \__chemgreek_upxgreeks:n {Omega}     % 24
  }
  
% ----------------------------------------------------------------------------
% default activating of a mapping if a corresponding package has been loaded.

\cs_new_protected:Npn \chemgreek_choose_mapping:
  {
    \tl_if_blank:VT \l_chemgreek_active_mapping_tl
      {
        \int_zero:N \l__chemgreek_tmpa_int
        \prop_map_inline:Nn \l__chemgreek_packages_prop
          {
            \chemgreek_if_package_loaded:nT {##2}
              {
                \int_incr:N \l__chemgreek_tmpa_int
                \tl_set:Nn \l__chemgreek_tmpa_tl {##1}
              }
          }
        \int_compare:nTF { \l__chemgreek_tmpa_int = 1 }
          { \chemgreek_activate_mapping:V \l__chemgreek_tmpa_tl }
          { \chemgreek_activate_mapping:n {default} }
      }
  }

\AtBeginDocument { \chemgreek_choose_mapping: }

% ----------------------------------------------------------------------------
% Greek letters in bookmarks:
\AtBeginDocument
  {
    \chemgreek_if_package_with:nnT {hyperref} {unicode}
      {
        \chemgreek_if_package_loaded:nT {textalpha}
          {
            \pdfstringdefDisableCommands
              {
                \tl_map_inline:Nn \c__chemgreek_alphabet_tl
                  {
                    \cs_set_eq:cc
                      {
                        chem
                        \str_upper_case:f { \tl_head:n {#1} }
                        \str_lower_case:f { \tl_tail:n {#1} }
                      }
                      {
                        text
                        \str_upper_case:f { \tl_head:n {#1} }
                        \str_lower_case:f { \tl_tail:n {#1} }
                      }
                    \cs_set_eq:cc
                      {
                        chemgreek_
                        \str_upper_case:f { \tl_head:n {#1} }
                        \str_lower_case:f { \tl_tail:n {#1} }
                        :
                      }
                      {
                        text
                        \str_upper_case:f { \tl_head:n {#1} }
                        \str_lower_case:f { \tl_tail:n {#1} }
                      }
                    \cs_set_eq:cc {chem#1} {text#1}
                    \cs_set_eq:cc { chemgreek_ #1 : } {text#1}
                  }
              }
          }
      }
  }

\tex_endinput:D

HISTORY:
2013/06/26 - v0.1  - first working version to be bundled with chemmacros
2013/07/06 - v0.1a - fixed stupid bug in `upgreek' mapping
                   - added error messages and added \renewchemgreekmapping and
                     \declarechemgreekmapping
2013/08/24 - v0.2  - new mappings `mathdesign', `fourier'
                   - new functions: \chemgreek_int_to_greek:n and
                     \chemgreek_int_to_Greek:n
2013/11/20 - v0.2a - fixed typos in `fourier' mapping
                   - added missing \prop_clear: to \__chemgreek_set_mapping:nn
                   - added missing argument to message calls
2014/01/24 - v0.3  - rename \Chem<name => \chem<name>, the old names will
                     issue warnings but still work
                   - new mappings `textalpha' (cf the package with the same
                     name, part of `greek-fontenc')
                   - \chemgreek_new_mapping:nnn redefined so that package name
                     must be given if needed; \chemgreek_activate_mapping:n
                     now issues a warning if the needed package hasn't been
                     loaded
                   - if hyperref has been loaded with package option `unicode'
                     and `textalpha' package has been loaded, too, we can use
                     greek letters in PDF bookmarks
                   - new command \printchemgreekmapping
                   - \showchemgreekmapping now writes information to the log
2014/01/29 - v0.4  - add mapping `fontspec'
                   - new command \printchemgreekalphabet
2014/08/08 - v0.5  - split from `chemmacros' bundle as independent package
2015/03/13 - v0.5a - adapt to expl3's new case changing functions
                   - change status of \Chem... macros from deprecated to
                     dropped
2015/04/09 - v1.0  - if a mapping is activated that needs a package and the
                     package is missing the mapping falls back to `default'
                   - if exactly one package for one of the mappings has been
                     loaded the corresponding mapping is activated at begin
                     document
                   - expl3 versions of the letter macros (\chemgreek_alpha: ,
                     \chemgreek_Alpha: , ...)
                   - \chemgreek_get_from_mapping:nn
                   - \chemgreek_declare_mapping_alias:nn ,
                     \chemgreek_new_mapping_alias:nn ,
                     \chemgreek_renew_mapping_alias:nn
2015/07/01 - v1.0a - corrected `var-default' mapping
2015/11/10 - v1.0b - new mapping `pxgreeks'

TODO:

