% --------------------------------------------------------------------------
%
% the CHEMMACROS package -- module: `thermodynamics'
%
% --------------------------------------------------------------------------
% Clemens Niederberger
% --------------------------------------------------------------------------
% https://github.org/cgnieder/chemmacros/
% contact@mychemistry.eu
% --------------------------------------------------------------------------
% If you have any ideas, questions, suggestions or bugs to report, please
% feel free to contact me.
% --------------------------------------------------------------------------
% Copyright 2011--2020 Clemens Niederberger
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.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.
% --------------------------------------------------------------------------
\ChemModule{thermodynamics}{2015/06/09 thermodynamics}

\RequirePackage {siunitx}

\tl_new:N \l__chemmacros_state_pre_tl
\tl_new:N \l__chemmacros_state_post_tl
\tl_new:N \l__chemmacros_state_sp_left_tl
\tl_new:N \l__chemmacros_state_sb_left_tl
\tl_new:N \l__chemmacros_state_sp_right_tl
\tl_new:N \l__chemmacros_state_sb_right_tl
\tl_new:N \l__chemmacros_state_sb_pos_tl
\tl_new:N \l__chemmacros_state_symbol_tl
\tl_new:N \l__chemmacros_state_unit_tl

\tl_set:Nn \l__chemmacros_state_pre_tl { \changestate }
\tl_set:Nn \l__chemmacros_state_sp_right_tl { \standardstate }
\tl_set:Nn \l__chemmacros_state_sb_pos_tl {left}

\chemmacros_define_keys:nn {thermodynamics}
  {
    pre               .tl_set:N   = \l__chemmacros_state_pre_tl ,
    post              .tl_set:N   = \l__chemmacros_state_post_tl ,
    superscript-left  .tl_set:N   = \l__chemmacros_state_sp_left_tl ,
    superscript-right .tl_set:N   = \l__chemmacros_state_sp_right_tl ,
    superscript       .meta:n     = { superscript-right = #1 } ,
    subscript-left    .tl_set:N   = \l__chemmacros_state_sb_left_tl ,
    subscript-right   .tl_set:N   = \l__chemmacros_state_sb_right_tl ,
    subscript         .meta:n     = { subscript-left = #1 } ,
    unit              .tl_set:N   = \l__chemmacros_state_unit_tl ,
    unit              .groups:n   = {variables}
  }

\cs_new_protected:Npn \chemmacros_state:nn #1#2
  {
    % pre (\Delta)
    % post
    % superscript-left
    % superscript-right (\standardstate)
    % subscript-left
    % subscript-right
    \group_begin:
      \chemmacros_set_keys:nn {thermodynamics} {#1}
      \ensuremath
        {
          \chemmacros_text:V \l__chemmacros_state_pre_tl
          \c_math_superscript_token
            { \chemmacros_text:V \l__chemmacros_state_sp_left_tl }
          \c_math_subscript_token
            { \chemmacros_text:V \l__chemmacros_state_sb_left_tl }
          #2
          \c_math_superscript_token
            { \chemmacros_text:V \l__chemmacros_state_sp_right_tl }
          \c_math_subscript_token
            { \chemmacros_text:V \l__chemmacros_state_sb_right_tl }
          \chemmacros_text:V \l__chemmacros_state_post_tl
        }
    \group_end:
  }
\cs_generate_variant:Nn \chemmacros_state:nn { nV }

\DeclareDocumentCommand \state { O{}m }
  { \chemmacros_state:nn {#1} {#2} }

\cs_new_protected:Npn \chemmacros_declare_state:Nn #1#2
  {
    \chemmacros_define_keys:xn
      {thermodynamics/\chemmacros_remove_backslash:N #1}
      {
        pre               .meta:nn = {chemmacros/thermodynamics} { pre = ##1 } ,
        post              .meta:nn = {chemmacros/thermodynamics} { post = ##1 } ,
        superscript-left  .meta:nn = {chemmacros/thermodynamics} { superscript-left = ##1 } ,
        superscript-right .meta:nn = {chemmacros/thermodynamics} { superscript-right = ##1 } ,
        superscript       .meta:n  = { superscript-right = ##1 } ,
        subscript-left    .meta:nn = {chemmacros/thermodynamics} { subscript-left = ##1 } ,
        subscript-right   .meta:nn = {chemmacros/thermodynamics} { subscript-right = ##1 } ,
        subscript         .meta:n     = { subscript-left = ##1 } ,
        subscript-pos     .choices:nn =
          { left , right }
          { \tl_set_eq:NN \l__chemmacros_state_sb_pos_tl \l_keys_choice_tl } ,
        symbol            .tl_set:N = \l__chemmacros_state_symbol_tl ,
        unit              .tl_set:N = \l__chemmacros_state_unit_tl
      }
    \DeclareDocumentCommand #1 { sO{}D(){}m }
      {
        \group_begin:
          \chemmacros_set_keys:xn
            {thermodynamics/\chemmacros_remove_backslash:N #1}
            {#2}
          \tl_if_blank:nF {##3}
            {
              \chemmacros_set_keys:nx {thermodynamics}
                { subscript-\l__chemmacros_state_sb_pos_tl = \exp_not:n {##3} }
            }
          \ensuremath
            {
              \chemmacros_state:nV {##2} \l__chemmacros_state_symbol_tl
              \chemmacros_set_keys_groups:nnn {thermodynamics} {variables} {##2}
              \IfBooleanF {##1} { = \SI {##4} { \l__chemmacros_state_unit_tl } }
            }
        \group_end:
      }
  }

\NewChemMacroset {State} {mm}
  { \chemmacros_declare_state:Nn #1 {#2} }

% --------------------------------------------------------------------------
% predefined:
\NewChemState \enthalpy { symbol = H , unit = \kilo\joule\per\mole }
\NewChemState \entropy  { symbol = S , unit = \joule\per\kelvin\per\mole , pre = }
\NewChemState \gibbs    { symbol = G , unit = \kilo\joule\per\mole }

\ChemCompatibilityTo{5.3}
  \DeclareChemDeprecated \State    \state
  \DeclareChemDeprecated \Enthalpy \enthalpy
  \DeclareChemDeprecated \Entropy  \entropy
  \DeclareChemDeprecated \Gibbs    \gibbs
\EndChemCompatibility

% --------------------------------------------------------------------------
