% --------------------------------------------------------------------------
%
% the CHEMMACROS package -- module: `acid-base'
%
% --------------------------------------------------------------------------
% 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{acid-base}{2018/02/22 acid/base}

\chemmacros_load_modules:n {charges}

% --------------------------------------------------------------------------
% equilibrium constants:

\tl_new:N  \l__chemmacros_equilibrium_constant_tl
\tl_set:Nn \l__chemmacros_equilibrium_constant_tl {K}
\prop_new:N \l__chemmacros_eq_constants_prop

\prg_new_conditional:Npnn \chemmacros_if_eq_constant:Nn #1#2 {T,F,TF}
  {
    \cs_if_exist:NTF #1
      {
        \tl_if_eq:xnTF
          { \prop_item:Nn \l__chemmacros_eq_constants_prop {#1} }
          {#2}
          { \prg_return_true: }
          { \prg_return_false: }
      }
      { \prg_return_false: }
  }
\cs_generate_variant:Nn \tl_if_eq:nnTF {x}

% #1: cs
% #2: translation id and option name
% #3: default translation
\cs_new_protected:Npn \chemmacros_define_eq_constant:Nnn #1#2#3
  {
    \chemmacros_if_eq_constant:NnF {#1} {#2}
      {
        \cs_new_protected:Npn #1 {}
        \prop_put:Nnn \l__chemmacros_eq_constants_prop {#1} {#2}
        \tl_new:c {l__chemmacros_#2_tl}
        \chemmacros_define_keys:nn {acid-base}
          { #2 .tl_set:c = l__chemmacros_#2_tl }
      }
    \tl_set:cn
      {l__chemmacros_#2_tl}
      { \chemmacros_translate:n {#2} }
    \chemmacros_if_compatibility:nnTF {>=} {5.7}
      { \chemmacros_declare_translation:nnn {#2} {fallback} {#3} }
      { \DeclareTranslationFallback {#2} {#3} }
    \cs_set_protected:Npn #1
      {
        \ensuremath
          {
            \chemmacros_bold:n
              {
                \l__chemmacros_equilibrium_constant_tl
                \c_math_subscript_token
                  { \tl_use:c {l__chemmacros_#2_tl} }
              }
          }
      }
  }

\NewChemMacroset {EqConstant} {mmm}
  { \chemmacros_define_eq_constant:Nnn #1 {#2} {#3} }

\NewChemEqConstant \Ka {K-acid}  { \mathrm{a} }
\NewChemEqConstant \Kb {K-base}  { \mathrm{b} }
\NewChemEqConstant \Kw {K-water} { \mathrm{w} }

\chemmacros_if_compatibility:nnT {>=} {5.4}
  {
    \chemmacros_define_keys:nn {acid-base}
      { eq-constant .tl_set:N = \l__chemmacros_equilibrium_constant_tl }
  }

\chemmacros_define_keys:nn {acid-base}
  {
    p-style           .choice: ,
    p-style / slanted .code:n   = \cs_set_eq:NN \chemmacros_p_style:n \textsl ,
    p-style / italics .code:n   = \cs_set_eq:NN \chemmacros_p_style:n \textit ,
    p-style / upright .code:n   = \cs_set_eq:NN \chemmacros_p_style:n \textup ,
    p-style           .initial:n = upright
  }

\cs_new_protected:Npn \chemmacros_p:n #1
  {
    \group_begin:
      \chemmacros_if_compatibility:nnTF {<=} {5.8b}
        { \mbox }
        { \chemmacros_text:n }
        {
          \chemmacros_p_style:n {p}
          \ensuremath {#1}
        }
    \group_end:
  }

\NewDocumentCommand \p  {m} { \chemmacros_p:n {#1} }
\NewDocumentCommand \pH  {} { \chemmacros_p:n { \chemmacros_chemformula:n {H} } }
\NewDocumentCommand \pOH {} { \chemmacros_p:n { \chemmacros_chemformula:n {OH} } }

\NewDocumentCommand \pKa {o}
  {
    \chemmacros_p:n
      {
        \Ka \IfNoValueF {#1}
          { {} \c_math_subscript_token { \chemmacros_bold:n {#1} } }
      }
  }

\NewDocumentCommand \pKb {o}
  {
    \chemmacros_p:n
      {
        \Kb \IfNoValueF {#1}
          { {} \c_math_subscript_token { \chemmacros_bold:n {#1} } }
      }
  }

% --------------------------------------------------------------------------
\ChemCompatibilityTo{5.6}
\DeclareTranslation {English} {K-acid}  {\mathrm{a}}
\DeclareTranslation {German}  {K-acid}  {\mathrm{s}}
\DeclareTranslation {Dutch}   {K-acid}  {\mathrm{z}}

\DeclareTranslation {English} {K-base}  {\mathrm{b}}

\DeclareTranslation {English} {K-water} {\mathrm{w}}
\EndChemCompatibility

\ChemCompatibilityFrom{5.6}
\chemmacros_declare_translations:nn {K-acid}
  {
    German = \mathrm {s} ,
    Dutch  = \mathrm {z}
  }
\EndChemCompatibility
% --------------------------------------------------------------------------
\file_input_stop:

2016/02/04 - \NewChemEqConstant and family, new option `eq-constant'
2016/04/27 - moved translations from lang module to acid-base module
2016/05/31 - adapt to changes in `lang' module
2018/02/22 - fix bug in \chemmacros_p:n (https://tex.stackexchange.com/q/416227/)
