% --------------------------------------------------------------------------
% the CHEMMACROS package
%
%   comprehensive support for typesetting chemistry documents
%
% --------------------------------------------------------------------------
% 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-2015 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,l3keys2e}
\ExplSyntaxOn

% --------------------------------------------------------------------------
% package information:
\tl_const:Nn \c_chemmacros_date_tl {2015/09/23}
\tl_const:Nn \c_chemmacros_version_major_number_tl {5}
\tl_const:Nn \c_chemmacros_version_minor_number_tl {1}
\tl_const:Nn \c_chemmacros_version_subrelease_tl   {}
\tl_const:Nx \c_chemmacros_version_number_tl
  {\c_chemmacros_version_major_number_tl.\c_chemmacros_version_minor_number_tl}
\tl_const:Nx \c_chemmacros_version_tl
  { \c_chemmacros_version_number_tl \c_chemmacros_version_subrelease_tl }
\tl_const:Nn \c_chemmacros_info_tl
  {comprehensive~ support~ for~ typesetting~ chemistry~ documents}

\ProvidesExplPackage
  {chemmacros}
  {\c_chemmacros_date_tl}
  {\c_chemmacros_version_tl}
  {\c_chemmacros_info_tl \c_space_tl (CN)}

% --------------------------------------------------------------------------
% messages:
\msg_new:nnn {chemmacros} {too-low-compatibility}
  {
    Compatibility~ for~ versions~ below~ v4.7~ is~ not~ supported!~ You~
    requested~ version~ v #1.~ Loading~ v4.7~ instead.
  }

\msg_new:nnn {chemmacros} {low-compatibility}
  {
    You~ requested~ compatibility~ mode~ v #1~ while~ the~ current~ version~
    of~ chemmacros~ is~ v \c_chemmacros_version_number_tl .~ Not~ all~ features~
    will~ be~ available!
  }

% --------------------------------------------------------------------------
% compatibility
\fp_new:N \l__chemmacros_compatibility_version_fp
\fp_set:Nn \l__chemmacros_compatibility_version_fp {\c_chemmacros_version_number_tl}

\keys_define:nn {chemmacros/compatibility}
  {
    compatibility .fp_set:N = \l__chemmacros_compatibility_version_fp ,
    unknown       .code:n   =
      \PassOptionsToPackage{\CurrentOption}{chemmacros4}
      \PassOptionsToPackage{\CurrentOption}{chemmacros5}
  }

\ProcessKeysPackageOptions {chemmacros/compatibility}

% --------------------------------------------------------------------------
% compare version numbers
% #1: number
% #2: relation
% #3: number
% #4: true
% #5: false
\prg_new_conditional:Npnn \chemmacros_if_version:nnn #1#2#3 {p,T,F,TF}
  {
    \fp_compare:nTF { floor(#1) = floor(#3) }
      {
        \fp_compare:nTF
          { (\chemmacros_get_minor:f {#1}) #2 (\chemmacros_get_minor:f {#3}) }
          { \prg_return_true: }
          { \prg_return_false: }
      }
      {
        \fp_compare:nTF { (#1) #2 (#3) }
          { \prg_return_true: }
          { \prg_return_false: }
      }
  }

\cs_new:Npn \__chemmacros_get_minor:w #1.#2.#3 \q_stop
  { \tl_if_blank:nTF {#2} {0} {#2} }
\cs_new:Npn \chemmacros_get_minor:n #1
  { \__chemmacros_get_minor:w #1.. \q_stop }
\cs_generate_variant:Nn \chemmacros_get_minor:n {f}

% check compatibility
% #1: relation
% #2: number
% #3: true
% #4: false
\prg_new_conditional:Npnn \chemmacros_if_compatiblity:nn #1#2 {p,T,F,TF}
  {
    \chemmacros_if_version:nnnTF
      { \fp_to_decimal:N \l__chemmacros_compatibility_version_fp }
      {#1}
      {#2}
      { \prg_return_true: }
      { \prg_return_false: }
  }
\cs_generate_variant:Nn \chemmacros_if_compatiblity:nnT {nV}

% user checks:
\NewDocumentCommand \IfChemCompatibilityTF {mm+m+m}
  { \chemmacros_if_compatiblity:nnTF {#1} {#2} {#3} {#4} }

\NewDocumentCommand \IfChemCompatibilityT {mm+m}
  { \chemmacros_if_compatiblity:nnT {#1} {#2} {#3} }

\NewDocumentCommand \IfChemCompatibilityF {mm+m}
  { \chemmacros_if_compatiblity:nnF {#1} {#2} {#3} }

% --------------------------------------------------------------------------
% compatibility coding:
\cs_new_protected:Npn \ChemCompatibility #1#2 \EndChemCompatibility
  { \chemmacros_if_compatiblity:nnT {=} {#1} {#2} }
  
\cs_new_protected:Npn \ChemCompatibilityFrom #1#2 \EndChemCompatibility
  { \chemmacros_if_compatiblity:nnT {>=} {#1} {#2} }

\cs_new_protected:Npn \ChemCompatibilityTo #1#2 \EndChemCompatibility
  { \chemmacros_if_compatiblity:nnT {<=} {#1} {#2} }

\cs_new_protected:Npn \ChemCompatibilityBetween #1#2#3 \EndChemCompatibility
  {
    \bool_if:nT
      {
        \chemmacros_if_compatiblity_p:nn {>=} {#1} &&
        \chemmacros_if_compatiblity_p:nn {<=} {#2}
      }
      {#3}
  }

% let's see that the max number is the newest (=current) version
\chemmacros_if_compatiblity:nnT {>} { \c_chemmacros_version_number_tl }
  {
    \fp_set:Nn \l__chemmacros_compatibility_version_fp
      { \c_chemmacros_version_number_tl }
  }

% --------------------------------------------------------------------------
% compatibility too low:
\chemmacros_if_compatiblity:nnT {<} {4.7}
  {
    \msg_warning:nnx {chemmacros} {too-low-compatibility}
      { \fp_to_tl:N \l__chemmacros_compatibility_version_fp }
  }

% not the newest version:
\chemmacros_if_compatiblity:nnT {<} { \c_chemmacros_version_number_tl }
  {
    \msg_warning:nnx {chemmacros} {low-compatibility}
      { \fp_to_tl:N \l__chemmacros_compatibility_version_fp }
  }
  
% --------------------------------------------------------------------------
\chemmacros_if_compatiblity:nnTF {<} {5.0}
  { \RequirePackage{chemmacros4} }
  { \RequirePackage{chemmacros5} }

% --------------------------------------------------------------------------
\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
2012/01/28 - version 3.0  - bundled with packages `formula' and `ghs'
                          - new commands \Ka, \Kb, \Kw
                          - commands can detect if font series is bold
                          - new package option "detect-bold"
                          - new package option "method" => choose between
                            `mhchem' and `formula' for internal uses.
                          - new package option "ghs" => load `ghs' or don't
                          - new package option "synchronize"
                          - new package option "strict"
                          - new command \iupac
                          - new command \listofreactions, reaction environments
                            with optional argument
                          - \cis, \trans, \tert without \xspace
2012/01/30 - version 3.0a - bugfix in formula.sty
                          - renamed formula => chemformula
                            and ghs => ghsystem to make the names unique
                            (following a request by Karl Berry for TeXlive)
2012/02/03 - version 3.0b - new command \DeclareChemParticle, updated
                            documentation
2012/02/05 - version 3.0c - renamed pictogram files (following a request by
                            Karl Berry for TeXlive)
                          - new package option "Nu"
2012/02/10 - version 3.0d - several bugfixes in chemformula
                          - bugfixes with \DeclareChemParticle
                          - new command \RenewChemParticle
                          - new option phases / pos
                          - new commands \DeclareChemPhase, \RenewChemPhase,
                            \phase
                          - changed default behaviour of phases
                          - removed optional argument from \sld and \lqd
                          - new arrow type <>
2012/02/19 - version 3.1  - new commands \DeclareChemIUPAC and \RenewChemIUPAC
                          - new option "option/iupac"
                          - deprecated option: "option/EZ"
                          - deprecated commands:
                            \newreaction => \DeclareChemReaction
                            \setnewstate => \DeclareChemState
                            \renewstate  => \RenewChemState
                            \Rcip        => \R
                            \Scip        => \S
                            \Dfi         => \D
                            \Lfi         => \L
                          - new arrow types -/>, </- and <o>
                          - new commands \DeclareChemArrow, \RenewChemArrow and
                            \ShowChemArrow
2012/02/26 - version 3.1a - "operator" p rewritten to follow IUPAC
                            recommendations
                          - new option "acid-base/p-style"
                          - deprecated option: "option/detect-bold"
2012/03/03 - version 3.1b - arrow types are stored in a sequence to automate the
                            search and replace in the right order 
                          - new arrow type ==                                   
                          - IUPAC compliance for stoichiometric factors
                          - new handling of super- and subscripts to correct
                            various flaws: clear distinction between isotope and
                            formula
                          - new option charge-vshift
                          - IUPAC compliance for \Delta and \ox
2012/03/14 - version 3.1c - compatibility with KOMA's global option
                            "version = <value>"
                          - bugfix in the list of reactions
                          - improved arrow labels
2012/03/20 - version 3.2  - new: option input via @{<options>}
                          - improved list of reactions: resetting the "reaction"
                            counter now doesn't cause errors any more
                          - \AddRxnDesc added which allows to add descriptions
                            to each reaction in the "reactions" environment
2012/05/07 - version 3.3  - new environment `experimental' that allows some
                            formatting for the for displaying of measurement
                            results
                          - more greek letters for the \iupac command
                          - \ch now bypasses \ref{}, \label{}, and \intertext{}
                          - small adjustments of the iupac commands \| and \-
                          - bug fix: option `upgreek' is now working and was
                            renamed to `greek'
                          - proper language support
2012/05/13 - version 3.3a - Italian translations of the H, EUH and P statements
                          - \hapto and \bridge
2012/05/18 - version 3.3b - compatibility with MiKTeX
2012/05/18 - version 3.3c - fix in the `ghsystem/language' option
2012/07/24 - version 3.3d - additional picture file type `pdf'
                          - default bond length set to 1.1667ex
                          - bug fix in the bonds
                          - added kerning to cip commands, new option
                            `iupac/cip-kern'
                          - bug fix: messages needed to be defined before the
                            options
2012/08/21 - version 3.3e - new option ox/align=center|right
                          - a new option to \NMR and to \J
2012/09/11 - version 3.4  - cleaned a little, minor bug fixes
                          - switched to internal scratch variables
                          - new command \bond, more bond types
                          - new commands \DeclareChemBond, \DeclareChemBondAlias,
                            \RenewChemBond and \ShowChemBond
                          - radical point thicker, new options `radical-style'
                            and `radical-radius'
2012/10/03 - version 3.4a - bug fix in coupling constant \J
2013/01/04 - version 3.4b - bug fix in the sub- and superscript handling
2013/01/28 - version 3.5  - disallow breaks at bonds
                          - allow breaks after arrows
                          - made some spaces in chemformulas stretch- and
                            shrinkable
                          - various internal code improvements
                          - changed defaults for horizontal spaces that have in
                            set in ex into corresponding values in em.
                          - improvements to the placement of sub- and superscripts
2013/02/19 - version 3.5a - bug fix: `ghsystem' recognizes language again
2013/02/26 - version 3.6  - support for use with the `breqn' package
                          - chemformula: math escaping also via \(\)
                          - chemformula internal: clearer escaping macros
                          - new options: `radical-vshift', `radical-hshift'
                            and `radical-space'
                          - bug fix: `radical-...' options are now correctly set
                          - stoichiometric factors: add leading 0 if missing
                          - new option: `stoich-paren-parse'
                          - internal changes: be way more rigid about protected
                            and expandable macros
                          - internal changes: clearer distinction between
                            private macros and accessable module macros
                          - internal changes: clearer distinction between
                            document commands and module level commands
                          - chemformula's !()() syntax now also works with babel's
                            French
2013/02/27 - version 3.6a - bug fix: escaped text and math stays escaped, i.e.
                            also arrow code like `<=>'
2013/04/19 - version 3.6b - chemformula: new key `arrow-min-length'
                          - bug fix: stoichiometric fractions correctly displayed
                          - changed appearance of \cip to use upright parentheses
2013/07/06 - version 4.0  - `chemformula' doesn't automatically load
                            `chemmacros' any more but can be used stand-alone
                          - option `bpchem' has been dropped
                          - improved detection of bold font series
                          - changed wrongly used \mbox in definition of \Ka,
                            \Kb and \Kw into \ensuremath
                          - adapt \mch and \pch to match `chemformula's
                            charges
                          - dropped option `method=mhchem'
                          - support for `kpfonts' and `newtxmath' upright
                            greek letters added, greek alphabet complete both
                            for uppercase and lowercase; this is handled by
                            the new package in the family: `chemgreek'
                          - \OX and \redox now work in `amsmath's environment
                            by ignoring the measuring phase
                          - language management with the help of the
                            `translations' package =>
                            recognize document language automatically and use
                            it if it a) is known to `chemmacros' and b) has
                            not been overwritten by the `language' option;
                            this also made minor changes to `ghsystem'
                            necessary; additionally this lead to changes in
                            the way phases are defined
                          - status of \Dfi and \Lfi changed from `deprecated'
                            to `dropped'
                          - new option `charges/partial-format'
                          - fixed wrongly written contents to the lor when
                            used together with `hyperref'
                          - new option `reaction/list-heading'
                          - option `charges/append' deprecated
2013/08/07 - version 4.0a - extra pair of braces in definition of
                            \standardstate
                          - added missing \exp_not:n to the definitions of
                            \chemmacros_declare_phase:Nn and kin
2013/08/24 - version 4.1  - changed `0' values in TikZ coordinates into `0pt'
                            see http://tex.stackexchange.com/q/128792/5049 and
                            http://tex.stackexchange.com/q/118467/5049 for
                            reference
2013/10/28 - version 4.2  - changed particles with electron pairs to use
                            \chlewis
                          - changed \Delta in thermodynamic state variables
                            into \ChemDelta for IUPAC compliance and defined
                            it as an operator
                          - change in the syntax of \DeclareChemState and
                            \RenewChemState and improved both internal
                            definition and user interface
2013/10/31 - version 4.2a - bug bix in \hapto and \bridge
2013/11/04 - version 4.2b - new IUPAC commands: \fac/\mer
2013/11/20 - version 4.2c - step bundle version due to changes in `chemgreek'
2013/12/15 - version 4.2d - small changes to the translating mechansim which
                            now seems to be more logical: `language=auto'
                            detects the current `babel' language and
                            `language=<lang>' overwrites to the chosen
                            language
                          - new options `acid-base/K-acid', `acid-base/K-base'
                            and `acid-base/K-water'
                          - adapt \ox to updates in `l3fp'
2014/01/09 - version 4.2e - step bundle version due to changes in `ghsystem'
2014/01/24 - version 4.3  - \NewChemIUPAC, \LetChemIUPAC
                          - \NewChemParticle
                          - \NewChemNMR
                          - \NewChemPhase
                          - \NewChemReaction, \RenewChemReaction
                          - \NewChemState
                          - added macro names with more meaningfule names to
                            each of the one-letter name commands
                          - changed behaviour of \DeclareChem to match
                            \DeclareRobustCommand, i.e., no check if command
                            is defined; added a \NewChem variant to each that
                            /does/ check; use \NewChem instead of \DeclareChem
                            for definitions
                          - new iupac command \dento
                          - new option choice `nmr/pos=super'
                          - bug fix in appearance of coupling nuclei
                          - new possibilities for formatting the output of the
                            NMR coupling constants output with \J:
                            `coupling-pos=side/sub', `coupling-nuclei-pre',
                            coupling-nuclei-post', `coupling-bonds-pre',
                            coupling-bonds-post', `coupling-symbol'
                          - internal changes to the greek letter mapping
                            selection mechanism
                          - deprecate package option `strict'
                          - deprecate package option `cmversion': also all
                            backwards compatibility for version 1 has been
                            dropped
                          - drop command \mhName
2014/01/29 - version 4.4  - bug fix in the display of the coupling constant
                          - bug fix in phase definitions (need to adapt to
                            changes in `translations'
                          - new option `nmr/atom-number-cs'
                          - new option `nmr/coupling-pos-cs'
2014/04/08 - version 4.5  - new option `acid-base/subscript'
                          - added Dutch translations
2014/06/30 - version 4.5a - adapt to deprecated expl3 functions
2014/08/08 - version 4.6  - from bundle to packages: packages `chemformula',
                            `ghsystem' and `chemgreek' no longer belong to the
                            bundle but now are packages of their own.
2015/02/08 - version 4.7  - fix \iupac so active letters like | still work
                            inside other macros (\section, ...)
                          - Change the default subscripts of the equilibrium
                            constants to match the usage in the IUPAC Green
                            Book
                          - allow \NewChemPhase and friends after \begin{document}
                          - new optional argument to phase commands
                          - new options `nmr/method' and `nmr/connector'
2015/09/11 - version 5.0  - the former chemmacros.sty is now chemmacros4.sty
                            and can be loaded through the `compatibility'
                            option
                          - chemmacros is now organized in separate modules
                            which either are preloaded or can be loaded by the
                            user with \usechemmodule
                          - various changes, see
                            http://www.mychemistry.eu/2015/06/chemmacros-development/
                            and the manual section 3.4. Upgrading from version < 5.0
                            for details
2015/09/23 - version 5.1  - add option `method' to `chemformula' module
                          - make module `scheme' compatible with `floatrow'
                          - add module hooks `before' and `after'
