diff options
Diffstat (limited to 'macros/latex/contrib/chemmacros')
32 files changed, 15199 insertions, 0 deletions
diff --git a/macros/latex/contrib/chemmacros/README b/macros/latex/contrib/chemmacros/README new file mode 100644 index 0000000000..d6b3a3a4cc --- /dev/null +++ b/macros/latex/contrib/chemmacros/README @@ -0,0 +1,64 @@ +-------------------------------------------------------------------------- +the CHEMMACROS package v5.8b 2017/08/28 + + comprehensive support for typesetting chemistry documents + +-------------------------------------------------------------------------- +Clemens Niederberger +Web: https://github.com/cgnieder/chemmacros/ +E-Mail: contact@mychemistry.eu +-------------------------------------------------------------------------- +Copyright 2011-2017 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. +-------------------------------------------------------------------------- +The chemmacros package consists of the following files + == STYLE FILES == + chemmacros.sty + chemmacros4.sty + chemmacros5.sty, + == DOCUMENTATION FILES == + chemmacros_en.tex + chemmacros_en.pdf, + README + chemmacros.history + == MODULE CODE FILES == + chemmacros.module.acid.code.tex + chemmacros.module.all.code.tex + chemmacros.module.base.code.tex + chemmacros.module.charges.code.tex + chemmacros.module.chemformula.code.tex + chemmacros.module.errorcheck.code.tex + chemmacros.module.greek.code.tex + chemmacros.module.isotopes.code.tex + chemmacros.module.lang.code.tex + chemmacros.module.mechanisms.code.tex + chemmacros.module.newman.code.tex + chemmacros.module.nomenclature.code.tex + chemmacros.module.orbital.code.tex + chemmacros.module.particles.code.tex + chemmacros.module.phases.code.tex + chemmacros.module.polymers.code.tex + chemmacros.module.reactions.code.tex + chemmacros.module.redox.code.tex + chemmacros.module.scheme.code.tex + chemmacros.module.spectroscopy.code.tex + chemmacros.module.symbols.code.tex + chemmacros.module.thermodynamics.code.tex + chemmacros.module.tikz.code.tex + chemmacros.module.units.code.tex + chemmacros.module.xfrac.code.tex +-------------------------------------------------------------------------- +If you have any ideas, questions, suggestions or bugs to report, please +feel free to contact me. +-------------------------------------------------------------------------- diff --git a/macros/latex/contrib/chemmacros/chemmacros.history b/macros/latex/contrib/chemmacros/chemmacros.history new file mode 100644 index 0000000000..505e43a72f --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.history @@ -0,0 +1,377 @@ +-------------------------------------------------------------------------- +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-2017 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. +-------------------------------------------------------------------------- +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' +2015/10/14 - version 5.2 - warn if compatibility version requested is higher + than the current version number + - enable to specify a minimal compatibility version + for a module + - add info message to `all' module + - add values `newest' and `latest' to the + compatibility option + - check for mhchem and chemformula and choose the + formula method accordingly + - fixes in the module hook mechanism + - fix in \chemmacros_if_module_loaded:n + - new internal module `errorcheck' +2016/01/13 - version 5.3 - removed options `german' and `ngerman' (lang) + - remove deprecated pre-v5 macros (several modules) + - new option `atom-number-space' (spectroscopy) + - add \chemprime and ' shorthand (nomenclature) + - new option `space' (particles) + - TikZ decoration `wave' (tikz) +2016/01/23 - version 5.3a - compatibility with chemscheme package (scheme) + - IUPAC shorthands only defined within \iupac + (nomenclature) +2016/02/10 - version 5.4 - \NewChemEqConstant and family, new option + `eq-constant' (acid-base) + - added \ignorespacesafterend to environments + (reactions) + - fixed erroneous definition of \NewChemMacroset + (base) + - new option `explicit-zero-sign' (redox) +2016/03/08 - version 5.5 - new module `polymers' +2016/05/02 - version 5.6 - generalization of the formula method concept, new + methods `chemist' and `chemfig' (chemformula) + - use `tocbasic' for the list of reactions if + available (reactions) + - fix reaction environments to obey \thereaction + (reactions) + - add cleveref and fancyref support (reactions) + - add cleveref and fancyref support (scheme) + - \DeclareChemTranslation and + \DeclareChemTranslations + - moved translations from lang module to the + corresponding modules they belong to +2016/05/04 - version 5.6a - fix small but annoying bugs (base and chemformula) +2016/06/07 - version 5.7 - \iupac gets an optional argument for setting + options (nomenclature) + - \latin always defined by chemmacros (nomenclature) + - fix conflict with `achemso' (nomenclature) + - allow `chemscheme'/`chemstyle' to be loaded after + chemmacros (errorcheck) + - translation keys get internal prefix (translations) +2016/06/08 - version 5.7a - rename functions which erroneously were assigned + to the `chemformula' module + - correct wrong dates in module files +2016/10/05 - version 5.7b - small improvement of the errorcheck module +2016/12/28 - version 5.7c - bug fix: typo in \chemmacros_tex_if:nnTF usage + (scheme) +2017/04/17 - version 5.8 - new option `nmr-base-format' (spectroscopy) + - change \hapto and \dento to follow iupacs rules + according to IUPAC Red Book 2005. IR-10.2.5.2 The + eta convention (p.216) and IR-9.2.4.2 The + kappa convention (p.155f) (nomenclature) + - fix error in \chemmacros_allow_hyphens: definition + (nomenclature) + - new options `cip-inner-format', `cip-outer-format' + and `cip-number-format' (nomenclature) +2017/06/13 - version 5.8a - changes to compatibility test: it now works also + for subreleases + - change behaviour of \ChemCompatibilityTo and + \ChemCompatibilityBetween in order to cope with + the changed compatibility test; adapt all files + reflecting those changes + - change behaviour of + \__chemmacros_break_point_insert:nnn so it does + nothing as last token in \iupac (nomenclature) +2017/08/28 - version 5.8b - fix missing hyperref check diff --git a/macros/latex/contrib/chemmacros/chemmacros.module.acid-base.code.tex b/macros/latex/contrib/chemmacros/chemmacros.module.acid-base.code.tex new file mode 100644 index 0000000000..fb998832c9 --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.module.acid-base.code.tex @@ -0,0 +1,164 @@ +% -------------------------------------------------------------------------- +% +% 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-2017 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}{2016/05/31 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: + \mbox + { + \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 +% -------------------------------------------------------------------------- +\tex_endinput:D + +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 diff --git a/macros/latex/contrib/chemmacros/chemmacros.module.all.code.tex b/macros/latex/contrib/chemmacros/chemmacros.module.all.code.tex new file mode 100644 index 0000000000..599b659819 --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.module.all.code.tex @@ -0,0 +1,75 @@ +% -------------------------------------------------------------------------- +% +% the CHEMMACROS package -- module: `all' +% +% -------------------------------------------------------------------------- +% 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-2017 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{all}{2016/03/07 load all libraries} + +\msg_new:nnn {chemmacros} {all-modules} + { + You~ are~ loading~ *all*~ of~ chemmacros'~ module~ through~ the~ `all'~ + module!~ This~ is~ fine~ but~ not~ really~ encouraged.~ Do~ really~ need~ + all~ of~ `isotopes' ,~ `mechanisms' ,~ `newman' ,~ `nomenclature' ,~ + `orbital' ,~ `particles' ,~ `phases' ,~ `polymers' ,~ `reactions' ,~ + `redox' ,~ `scheme' ,~ `spectroscopy' ,~ `symbols' ,~ `thermodynamics' ,~ + `units' ...? + } + +\chemmacros_load_modules:n + { + base , + errorcheck , + lang , + greek , + chemformula , + tikz , + acid-base , + charges , + isotopes , + mechanisms , + newman , + nomenclature , + orbital , + particles , + phases , + polymers , + reactions , + redox , + scheme , + spectroscopy , + symbols , + thermodynamics , + units , + xfrac + } + +\msg_info:nn {chemmacros} {all-modules} + +% -------------------------------------------------------------------------- +\tex_endinput:D + +2015/10/14 - add info message discouraging the usage of this module + - add `errorcheck' module +2016/03/07 - add `polymer' module diff --git a/macros/latex/contrib/chemmacros/chemmacros.module.base.code.tex b/macros/latex/contrib/chemmacros/chemmacros.module.base.code.tex new file mode 100644 index 0000000000..6e6b98094a --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.module.base.code.tex @@ -0,0 +1,484 @@ +% -------------------------------------------------------------------------- +% +% the CHEMMACROS package -- module: `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-2017 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{base}{2017/08/28 basic chemmacros module} + +% for the document hooks +\ChemCompatibilityFrom{5.1} +\RequirePackage {etoolbox} +\EndChemCompatibility + +% -------------------------------------------------------------------------- +\msg_new:nnn {chemmacros} {command-deprecated} + { + The~ command~ \token_to_str:N #1 \c_space_tl is~ deprecated.~ Use~ + \token_to_str:N #2 \c_space_tl instead. + } + +% define a deprecated command with hints to the corresponding new one: +\cs_new_protected:Npn \chemmacros_define_deprecated:NN #1#2 + { + \cs_set_protected:Npn #1 + { + \msg_warning:nnnn {chemmacros} {command-deprecated} {#1} {#2} + #2 + } + } + +\NewDocumentCommand \DeclareChemDeprecated {mm} + { \chemmacros_define_deprecated:NN #1 #2 } + +% -------------------------------------------------------------------------- +% define a macro set: +% \NewChem... \RenewChem... \DeclareChem... \ProvideChem... +% #1: macro names +% #2: arg spec +% #3: internal command call +\cs_new_protected:Npn \chemmacros_new_macroset:nnn #1#2#3 + { + \exp_args:Nc \NewDocumentCommand + { + NewChem + \str_upper_case:f { \tl_head:n {#1} } + \tl_tail:n {#1} + } + {#2} + { + \cs_if_free:NTF ##1 + { #3 } + { \msg_error:nnn {chemmacros} {new-#1} {##1} } + } + \exp_args:Nc \NewDocumentCommand + { + RenewChem + \str_upper_case:f { \tl_head:n {#1} } + \tl_tail:n {#1} + } + {#2} + { + \cs_if_free:NTF ##1 + { \msg_error:nnn {chemmacros} {renew-#1} {##1} } + { #3 } + } + \exp_args:Nc \NewDocumentCommand + { + DeclareChem + \str_upper_case:f { \tl_head:n {#1} } + \tl_tail:n {#1} + } + {#2} + {#3} + \exp_args:Nc \NewDocumentCommand + { + ProvideChem + \str_upper_case:f { \tl_head:n {#1} } + \tl_tail:n {#1} + } + {#2} + { \cs_if_free:NT ##1 { #3 } } + \msg_new:nnn {chemmacros} {new-#1} + { + You've~ tried~ to~ define~ a~ #1~ with~ \token_to_str:N + \NewChem #1 ,~ but~ the~ command~ sequence~ \token_to_str:N ##1 + \c_space_tl already~ exists.~ Please~ choose~ another~ name. + } + \msg_new:nnn {chemmacros} {renew-#1} + { + You've~ tried~ to~ renew~ the~ #1~ \token_to_str:N ##1 ,~ but~ + it~ doesn't~ exist. + } + } + +\cs_new_protected:Npn \chemmacros_new_environment_macroset:nnn #1#2#3 + { + \exp_args:Nc \NewDocumentCommand {NewChem#1} {#2} + { + \bool_if:nTF { \cs_if_free_p:c {##1} && \cs_if_free_p:c {end##1} } + { #3 } + { \msg_error:nnn {chemmacros} {new-#1} {##1} } + } + \exp_args:Nc \NewDocumentCommand {RenewChem#1} {#2} + { + \bool_if:nTF { \cs_if_free_p:c {##1} || \cs_if_free_p:c {end##1} } + { \msg_error:nnn {chemmacros} {renew-#1} {##1} } + { #3 } + } + \exp_args:Nc \NewDocumentCommand {DeclareChem#1} {#2} {#3} + \exp_args:Nc \NewDocumentCommand {ProvideChem#1} {#2} + { + \bool_if:nT { \cs_if_free_p:c {##1} && \cs_if_free_p:c {end##1} } + { #3 } + } + \msg_new:nnn {chemmacros} {new-#1} + { + You've~ tried~ to~ define~ a~ #1~ with~ \token_to_str:N + \NewChem #1 ,~ but~ the~ command~ sequence~ \exp_not:c {##1} + \c_space_tl already~ exists.~ Please~ choose~ another~ name. + } + \msg_new:nnn {chemmacros} {renew-#1} + { You've~ tried~ to~ renew~ the~ #1~ ##1,~ but~ it~ doesn't~ exist. } + } + +\NewDocumentCommand \NewChemMacroset {smmm} + { + \IfBooleanTF {#1} + { \chemmacros_new_environment_macroset:nnn {#2} {#3} {#4} } + { \chemmacros_new_macroset:nnn {#2} {#3} {#4} } + } + +% -------------------------------------------------------------------------- +\cs_new_protected:Npn \chemmacros_define_keys:nn #1#2 + { \keys_define:nn {chemmacros/#1} {#2} } +\cs_generate_variant:Nn \chemmacros_define_keys:nn {x} + +\cs_new_protected:Npn \chemmacros_set_keys:nn #1#2 + { \keys_set:nn {chemmacros/#1} {#2} } +\cs_generate_variant:Nn \chemmacros_set_keys:nn {x,nx} + +\cs_new_protected:Npn \chemmacros_set_keys_groups:nnn #1#2#3 + { \keys_set_groups:nnn {chemmacros/#1} {#2} {#3} } + +\cs_new_protected:Npn \chemmacros_set_keys_filter:nnn #1#2#3 + { \keys_set_filter:nnn {chemmacros/#1} {#2} {#3} } + +\cs_new_protected:Npn \chemmacros_define_global_keys:n #1 + { \keys_define:nn {chemmacros} {#1} } + +\cs_new_protected:Npn \chemmacros_set_global_keys:n #1 + { \keys_set:nn {chemmacros} {#1} } + +% -------------------------------------------------------------------------- +% basic tools: +\cs_new:Npn \chemmacros_remove_backslash:N #1 + { \exp_after:wN \use_none:n \token_to_str:N #1 } + +\cs_new_eq:NN \chemmacros_ignore_spaces: \tex_ignorespaces:D + +\cs_new_protected:Npn \chemmacros_leave_vmode: { \hbox_unpack:N \c_empty_box } +\cs_new_protected:Npn \chemmacros_nobreak: { \tex_penalty:D \c_ten_thousand } +\cs_new_protected:Npn \chemmacros_allow_break: { \tex_penalty:D \c_zero } +\cs_new_protected:Npn \chemmacros_skip_nobreak:N #1 + { + \chemmacros_nobreak: + \skip_horizontal:N #1 + \chemmacros_nobreak: + } + +% do I use those at all? +\prg_new_conditional:Npnn \chemmacros_tex_if:nn #1#2 {p,T,F,TF} + { \use:c { if #1 } #2 \prg_return_true: \else: \prg_return_false: \fi: } + +\prg_new_conditional:Npnn \chemmacros_latex_if:n #1 {p,T,F,TF} + { #1 { \prg_return_true: } { \prg_return_false: } } + +% this is used at least in the `isotope' module +\prg_new_conditional:Npnn \chemmacros_if_is_int:n #1 {p,T,F,TF} + { + \if_charcode:w ! \if_int_compare:w 9 < 1#1 ! \else: _ \fi: + \prg_return_true: + \else: + \prg_return_false: + \fi: + } + +\prg_new_conditional:Npnn \chemmacros_if_loaded:nn #1#2 {p,T,F,TF} + { + \use:c {chemmacros_if_#1_loaded:nTF} {#2} + { \prg_return_true: } + { \prg_return_false: } + } + +\prg_new_conditional:Npnn \chemmacros_if_package_loaded:n #1 {p,T,F,TF} + { + \cs_if_exist:cTF {ver@#1.sty} + { \prg_return_true: } + { \prg_return_false: } + } + +\prg_new_conditional:Npnn \chemmacros_if_class_loaded:n #1 {p,T,F,TF} + { + \cs_if_exist:cTF {ver@#1.cls} + { \prg_return_true: } + { \prg_return_false: } + } + +\ChemCompatibilityFrom{5.2} +% this is still true \AtBeginDocument: +\prg_new_conditional:Npnn \chemmacros_if_preamble: {p,T,F,TF} + { + \cs_if_eq:NNTF \@onlypreamble \@notprerr + { \prg_return_false: } + { \prg_return_true: } + } + +% this is still false \AtBeginDocument: +\prg_new_conditional:Npnn \chemmacros_if_document: {p,T,F,TF} + { + \bool_if:NTF \l__chemmacros_in_document_bool + { \prg_return_true: } + { \prg_return_false: } + } +\EndChemCompatibility + +\ChemCompatibilityFrom{5.6} +\cs_new_protected:Npn \chemmacros_cs_if_free_new:Npn #1 + { + \cs_if_exist:NF #1 + { \cs_new:Npn #1 } + } +\cs_generate_variant:Nn \chemmacros_cs_if_free_new:Npn {c} + +\cs_new_protected:Npn \chemmacros_cs_if_free_new_protected:Npn #1 + { + \cs_if_exist:NF #1 + { \cs_new_protected:Npn #1 } + } +\cs_generate_variant:Nn \chemmacros_cs_if_free_new_protected:Npn {c} + +\RequirePackage{scrlfile} + +% #1: counter +% #2: singular +% #3: plural +% #4: Singular +% #5: Plural +\cs_new_protected:Npn \chemmacros_add_cleveref_support:nnnnn #1#2#3#4#5 + { + \AfterPackage* {cleveref} + { + \cs_if_exist:cF {cref@#1@name} + { + \crefname {#1} {#2} {#3} + \Crefname {#1} {#4} {#5} + } + } + } +\cs_generate_variant:Nn \chemmacros_add_cleveref_support:nnnnn {nnnx , nnnxx , nnnnx } + +% #1: counter +% #2: singular +% #3: Singular (optional) +% #4: plural +% #5: Plural (optional) +\NewDocumentCommand \ChemCleverefSupport {mmomo} + { + \IfNoValueTF {#3} + { + \IfNoValueTF {#5} + { + \chemmacros_add_cleveref_support:nnnnn + {#1} + {#2} + {#4} + { \tl_mixed_case:n {#2} } + { \tl_mixed_case:n {#4} } + } + { + \chemmacros_add_cleveref_support:nnnnn + {#1} + {#2} + {#4} + { \tl_mixed_case:n {#2} } + {#5} + } + } + { + \IfNoValueTF {#5} + { + \chemmacros_add_cleveref_support:nnnnn + {#1} + {#2} + {#4} + {#3} + { \tl_mixed_case:n {#4} } + } + { \chemmacros_add_cleveref_support:nnnnn {#1} {#2} {#4} {#3} {#5} } + } + } +\@onlypreamble\ChemCleverefSupport + +% #1: id +% #2: mid sentence +% #3: begin sentence +\cs_new_protected:Npn \chemmacros_add_fancyref_support:nnn #1#2#3 + { + \AfterPackage* {fancyref} + { + \chemmacros_cs_if_free_new:cpn {fancyref#1labelprefix} {#1} + \chemmacros_cs_if_free_new:cpn {fref#1name} {#2} + \chemmacros_cs_if_free_new:cpn {Fref#1name} {#3} + \exp_args:Nnx \frefformat {vario} { \exp_not:c {fancyref#1labelprefix} } + { \use:c {fref#1name} \fancyrefdefaultspacing ##1##3 } + \exp_args:Nnx \Frefformat {vario} { \exp_not:c {fancyref#1labelprefix} } + { \use:c {Fref#1name} \fancyrefdefaultspacing ##1##3 } + \exp_args:Nnx \frefformat {plain} { \exp_not:c {fancyref#1labelprefix} } + { \use:c {fref#1name} \fancyrefdefaultspacing ##1 } + \exp_args:Nnx \Frefformat {plain} { \exp_not:c {fancyref#1labelprefix} } + { \use:c {Fref#1name} \fancyrefdefaultspacing ##1 } + } + } +\cs_generate_variant:Nn \chemmacros_add_fancyref_support:nnn {nnx} + +% #1: id +% #2: mid sentence +% #3: begin sentence (optional) +\NewDocumentCommand \ChemFancyrefSupport {mmo} + { + \IfNoValueTF {#3} + { \chemmacros_add_fancyref_support:nnn {#1} {#2} { \tl_mixed_case:n {#3} } } + { \chemmacros_add_fancyref_support:nnn {#1} {#2} {#3} } + } +\@onlypreamble\ChemFancyrefSupport +\EndChemCompatibility + +% -------------------------------------------------------------------------- +% some checks at begin document: +\bool_new:N \l__chemmacros_in_document_bool +\bool_new:N \l__chemmacros_chemstyle_bool + +\chemmacros_if_compatibility:nnTF {>=} {5.2} + { \AfterEndPreamble } + { \AtBeginDocument } + { \bool_set_true:N \l__chemmacros_in_document_bool } + +\AtBeginDocument + { + \@ifpackageloaded { chemstyle } + { \bool_set_true:N \l__chemmacros_chemstyle_bool } + { \bool_set_false:N \l__chemmacros_chemstyle_bool } + } + +% -------------------------------------------------------------------------- +% detection and handling of bold face: +\RequirePackage{bm} + +\prg_new_protected_conditional:Npnn \chemmacros_if_bold: {T,F,TF} + { + \seq_if_in:NVTF \l__chemmacros_if_bf_seq \f@series + { \prg_return_true: } + { \prg_return_false: } + } + +\seq_new:N \l__chemmacros_if_bf_seq + +\seq_set_split:Nnn \l__chemmacros_if_bf_seq { , } + { + b , bc , bm , bx , bux , + eb , ebc , ebx , mb , + sb , sbc , sbx , + ub , ubc , ubx + } + +\cs_new_protected:Npn \chemmacros_bold:n #1 + { + \chemmacros_if_bold:TF + { + \mode_if_math:TF + { \bm {#1} } + { \textbf {#1} } + } + {#1} + } + +\cs_new_protected:Npn \chemmacros_detect_bold:n + { \error \chemmacros_bold:n } + +% -------------------------------------------------------------------------- +\RequirePackage{amstext} + +\cs_new_protected:Npn \chemmacros_text:n #1 + { \mode_if_math:TF { \text {#1} } {#1} } +\cs_generate_variant:Nn \chemmacros_text:n { V } + +\cs_new_protected:Npn \chemmacros_math:n #1 + { \chemmacros_text:n { \c_math_toggle_token #1 \c_math_toggle_token } } +\cs_generate_variant:Nn \chemmacros_math:n { V } + +% -------------------------------------------------------------------------- +% a setup command: +\NewDocumentCommand \chemsetup {om} + { + \IfNoValueTF {#1} + { \keys_set:nn {chemmacros} {#2} } + { \keys_set:nn {chemmacros/#1} {#2} } + } + +\chemmacros_define_global_keys:n + { modules .code:n = \chemmacros_load_modules:n {#1} } + +% -------------------------------------------------------------------------- + +% load package #1 and add its options to chemmacros +% this requires that package #1 defines its options with l3keys using its +% name as module +\cs_new_protected:Npn \chemmacros_integrate_package:nnn #1#2#3 + { + \tl_if_blank:nTF {#3} + { + \tl_if_blank:nTF {#1} + { \RequirePackage {#2} } + { \RequirePackage [#1] {#2} } + } + { + \tl_if_blank:nTF {#1} + { \RequirePackage {#2} [#3] } + { \RequirePackage [#1] {#2} [#3] } + } + \chemmacros_define_global_keys:n + { + #2 .choice: , + #2 / unknown .code:n = + \keys_set:no {#2} { \l_keys_key_tl = ##1 } + } + } + +% -------------------------------------------------------------------------- + +\chemmacros_if_compatibility:nnT {>=} {5.2} + { \chemmacros_load_module:n {errorcheck} } + +% -------------------------------------------------------------------------- + +\bool_new:N \l__chemmacros_hyperref_bool + +\AtEndPreamble + { + \chemmacros_if_package_loaded:nT {hyperref} + { \bool_set_true:N \l__chemmacros_hyperref_bool } + } + +\tex_endinput:D + +2015/09/23 - new conditionals \chemmacros_if_preamble:TF and + \chemmacros_if_document:TF +2015/10/14 - load `errorcheck' module +2016/02/09 - starred version of \NewChemMacroset +2016/03/07 - \chemmacros_define_keys:nn and friends +2016/04/25 - macros for cleveref and fancyref support, \ChemCleverefSupport + \ChemFancyrefSupport +2016/05/04 - fix \ChemCleverefSupport +2017/08/28 - add missing hyperref check diff --git a/macros/latex/contrib/chemmacros/chemmacros.module.charges.code.tex b/macros/latex/contrib/chemmacros/chemmacros.module.charges.code.tex new file mode 100644 index 0000000000..3429727aa2 --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.module.charges.code.tex @@ -0,0 +1,157 @@ +% -------------------------------------------------------------------------- +% +% the CHEMMACROS package -- module: `charges' +% +% -------------------------------------------------------------------------- +% 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-2017 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{charges}{2015/07/30 charges} + +\chemmacros_load_module:n {chemformula} + +% -------------------------------------------------------------------------- +% circled charge signs: they are defined in the `chemformula' package: +% use directly: +\cs_new_protected:Npn \fplus { { \chemformula_fplus: } } +\cs_new_protected:Npn \fminus { { \chemformula_fminus: } } + +% change output depending on circled-option +\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 + + +\chemmacros_define_keys:nn {charges} + { + circletype .choice: , + circletype / math .code:n = + { + \bool_set_false:N \l__chemmacros_circled_chem_bool + \chemmacros_if_package_loaded:nT {chemformula} + { \bool_set_false:N \l_chemformula_formal_chem_bool } + } , + circletype / chem .code:n = + { + \bool_set_true:N \l__chemmacros_circled_chem_bool + \chemmacros_if_package_loaded:nT {chemformula} + { \bool_set_true:N \l_chemformula_formal_chem_bool } + } , + circletype .value_required:n = true , + circled .choice: , + circled / none .code:n = + { + \bool_set_false:N \l__chemmacros_circled_bool + \bool_set_false:N \l__chemmacros_circled_formal_bool + \chemmacros_if_package_loaded:nT {chemformula} + { \bool_set_false:N \l_chemformula_formal_charges_bool } + } , + circled / formal .code:n = + { + \bool_set_true:N \l__chemmacros_circled_bool + \bool_set_true:N \l__chemmacros_circled_formal_bool + \chemmacros_if_package_loaded:nT {chemformula} + { \bool_set_false:N \l_chemformula_formal_charges_bool } + } , + circled / all .code:n = + { + \bool_set_true:N \l__chemmacros_circled_bool + \bool_set_false:N \l__chemmacros_circled_formal_bool + \chemmacros_if_package_loaded:nT {chemformula} + { \bool_set_true:N \l_chemformula_formal_charges_bool } + } , + circled .default:n = all + } + +\cs_new_protected:Npn \chemmacros_plus: { \chemformula_plus: } +\cs_new_protected:Npn \chemmacros_minus: { \chemformula_minus: } + +\cs_new_protected:Npn \chemmacros_formal_plus: { \chemformula_formal_plus: } +\cs_new_protected:Npn \chemmacros_formal_minus: { \chemformula_formal_minus: } + +\cs_new_protected:Npn \chemmacros_charge:n #1 + { \chemmacros_chemformula:n { {}^{#1} } } + +\cs_new_protected:Npn \chemmacros_new_charge_command:Nn #1#2 + { + \DeclareDocumentCommand #1 {o} + { + \IfNoValueTF {##1} + { \chemmacros_charge:n {#2} } + { \chemmacros_charge:n {##1#2} } + } + } + +\tl_new:N \l__chemmacros_partial_charge_format_tl +\tl_set:Nn \l__chemmacros_partial_charge_format_tl { \tiny } + +\cs_new_protected:Npn \chemmacros_new_partial_charge_command:Nn #1#2 + { + \cs_new_protected:Npn #1 + { + \mbox { + \l__chemmacros_partial_charge_format_tl + \c_math_toggle_token \delta #2 \c_math_toggle_token + } + } + } + +\NewChemMacroset {Charge} {mm} + { \chemmacros_new_charge_command:Nn #1 {#2} } + +\NewChemMacroset {PartialCharge} {mm} + { \chemmacros_new_partial_charge_command:Nn #1 {#2} } + +\cs_new_protected:Npn \scrm + { \ensuremath { \scriptstyle \chemmacros_minus: } } +\cs_new_protected:Npn \scrp + { \ensuremath { \scriptstyle \chemmacros_plus: } } +\cs_new_protected:Npn \fscrm + { \ensuremath { \scriptstyle \chemmacros_formal_minus: } } +\cs_new_protected:Npn \fscrp + { \ensuremath { \scriptstyle \chemmacros_formal_plus: } } +\cs_new_protected:Npn \fsscrm + { \ensuremath { \scriptscriptstyle \chemmacros_formal_minus: } } +\cs_new_protected:Npn \fsscrp + { \ensuremath { \scriptscriptstyle \chemmacros_formal_plus: } } + +\chemmacros_define_keys:nn {charges} + { + partial-format .tl_set:N = \l__chemmacros_partial_charge_format_tl + } + +% -------------------------------------------------------------------------- +\NewChemCharge \mch { \chemmacros_minus: } +\NewChemCharge \pch { \chemmacros_plus: } +\NewChemCharge \fmch { \chemmacros_formal_minus: } +\NewChemCharge \fpch { \chemmacros_formal_plus: } + +% partial charges: +\NewChemPartialCharge \delm { \chemmacros_minus: } +\NewChemPartialCharge \delp { \chemmacros_plus: } +\NewChemPartialCharge \fdelm { \chemmacros_formal_minus: } +\NewChemPartialCharge \fdelp { \chemmacros_formal_plus: } + +% -------------------------------------------------------------------------- diff --git a/macros/latex/contrib/chemmacros/chemmacros.module.chemformula.code.tex b/macros/latex/contrib/chemmacros/chemmacros.module.chemformula.code.tex new file mode 100644 index 0000000000..9f54d9317f --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.module.chemformula.code.tex @@ -0,0 +1,244 @@ +% -------------------------------------------------------------------------- +% +% the CHEMMACROS package -- module: `chemformula' +% +% -------------------------------------------------------------------------- +% 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-2017 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{chemformula}{2016/05/03 integration of chemical formulas} + +\RequirePackage{amstext} +\chemmacros_load_module:n {charges} + +\msg_new:nnn {chemmacros} {unknown-formula-method} + { + You~ chose~ the~ formula~ method~ `#1'~ which~ is~ not~ available.~ + I'm~ falling~ back~ to~ `chemformula'~ now. + } + +\msg_new:nnn {chemmacros} {default-formula-method} + { + You~ haven't~ chosen~ a~ formula~ method~ so~ I'm~ assuming~ the~ default~ + method~ `chemformula'. + } + +\msg_new:nnn {chemmacros} {formula-conflict} + { + You~ have~ loaded~ multiple~ formula~ method~ packages~ but~ haven't~ + chosen~ which~ method~ to~ use!~ I~ will~ use~ `chemformula'. \\ + You~ should~ decide~ for~ only~ one~ of~ the~ packages~ for~ having~ a~ + consistent~ layout. + } + +% -------------------------------------------------------------------------- +% generic functions for usage in other packages; those are to be set in each +% method setup: +\cs_new_protected:Npn \chemmacros_reaction:n #1 {#1} +\cs_new_protected:Npn \chemmacros_chemformula:n #1 {#1} +\cs_generate_variant:Nn \chemmacros_chemformula:n { x,V } + +\cs_new_protected:Npn \chemmacros@formula #1 { \chemmacros_chemformula:n {#1} } +\cs_new_protected:Npn \chemmacros@reaction #1 { \chemmacros_reaction:n {#1} } + +% -------------------------------------------------------------------------- +% setup, check and define each method: +\bool_new:N \l__chemmacros_formula_method_set_bool + +\tl_new:N \g_chemmacros_formula_method_tl +\tl_gset:Nn \g_chemmacros_formula_method_tl {chemformula} + +\prop_new:N \l__chemmacros_method_packages_prop + +% #1: package/method name +% #2: preparations +\cs_new_protected:Npn \chemmacros_add_method_package:nn #1#2 + { \prop_put:Nnn \l__chemmacros_method_packages_prop {#1} {#2} } + +\cs_new_protected:Npn \chemmacros_setup_method_package:n #1 + { + \prop_item:Nn \l__chemmacros_method_packages_prop {#1} + \tl_gset:Nn \g_chemmacros_formula_method_tl {#1} + } + +\prg_new_conditional:Npnn \chemmacros_if_method_package:n #1 {p,T,F,TF} + { + \prop_if_in:NnTF \l__chemmacros_method_packages_prop {#1} + { \prg_return_true: } + { \prg_return_false: } + } + +\cs_new_protected:Npn \chemmacros_check_formula_method: + { + \bool_if:NF \l__chemmacros_formula_method_set_bool + { + \bool_set_false:N \l__chemmacros_tmpa_bool + \prop_map_inline:Nn \l__chemmacros_method_packages_prop + { + \chemmacros_if_package_loaded:nT {##1} + { + \bool_if:NTF \l__chemmacros_tmpa_bool + { + \msg_warning:nn {chemmacros} {formula-conflict} + \chemmacros_set_formula_method:n {chemformula} + } + { \chemmacros_set_formula_method:n {##1} } + \bool_set_true:N \l__chemmacros_tmpa_bool + } + } + \bool_if:NF \l__chemmacros_tmpa_bool + { + \msg_info:nn {chemmacros} {default-formula-method} + \chemmacros_set_formula_method:n {chemformula} + } + } + } + +\cs_new_protected:Npn \chemmacros_set_formula_method:n #1 + { + \chemmacros_if_method_package:nTF {#1} + { \chemmacros_setup_method_package:n {#1} } + { + \msg_warning:nnn {chemmacros} {unknown-formula-method} {#1} + \chemmacros_setup_method_package:n {chemformula} + } + \bool_set_true:N \l__chemmacros_formula_method_set_bool + } +\cs_generate_variant:Nn \chemmacros_set_formula_method:n {V} + +% -------------------------------------------------------------------------- +% add formula methods: +\chemmacros_add_method_package:nn {chemformula} + { + \chemmacros_integrate_package:nnn {} {chemformula} {2015/09/08} + \cs_set_protected:Npn \chemmacros_chemformula:n #1 + { \chemformula_chcpd:nn {} {#1} } + \cs_set_protected:Npn \chemmacros_reaction:n #1 + { \chemformula_ch:nn {} {#1} } + } + +\chemmacros_add_method_package:nn {mhchem} + { + \chemmacros_integrate_package:nnn {version=4} {mhchem} {} + \cs_set_protected:Npn \chemmacros_chemformula:n #1 { \ce {#1} } + \cs_set_protected:Npn \chemmacros_reaction:n #1 { \ce {#1} } + \chemmacros_after_module:nn {charges} + { + \cs_set_protected:Npn \chemmacros_elpair:n #1 { \ce{#1} : } + \cs_set_protected:Npn \chemmacros_plus: { + } + \cs_set_protected:Npn \chemmacros_minus: { - } + \cs_set_protected:Npn \chemmacros_formal_plus: { \ensuremath{\oplus} } + \cs_set_protected:Npn \chemmacros_formal_minus: { \ensuremath{\ominus} } + \cs_set_protected:Npn \fplus { \ensuremath{\oplus} } + \cs_set_protected:Npn \fminus { \ensuremath{\ominus} } + } + } + +\ChemCompatibilityFrom{5.6} +\chemmacros_add_method_package:nn {chemist} + { + \RequirePackage {chemist} + \cs_set_protected:Npn \chemmacros_chemformula:n #1 + { \chemmacros_text:n { \ChemForm {#1} } } + \cs_set_protected:Npn \chemmacros_reaction:n #1 + { \chemmacros_text:n { \ChemForm {#1} } } + \chemmacros_after_module:nn {charges} + { + \cs_set_protected:Npn \chemmacros_elpair:n #1 + { \chemmacros_text:n { \ChemForm {#1} : } } + \cs_set_protected:Npn \chemmacros_plus: { + } + \cs_set_protected:Npn \chemmacros_minus: { - } + \cs_set_protected:Npn \chemmacros_formal_plus: { \ensuremath{\oplus} } + \cs_set_protected:Npn \chemmacros_formal_minus: { \ensuremath{\ominus} } + \cs_set_protected:Npn \fplus { \ensuremath{\oplus} } + \cs_set_protected:Npn \fminus { \ensuremath{\ominus} } + } + } + +\chemmacros_add_method_package:nn {chemfig} + { + \RequirePackage {chemfig} + \cs_set_protected:Npn \chemmacros_chemformula:n #1 + { \printatom {#1} } + \cs_set_protected:Npn \chemmacros_reaction:n #1 + { \printatom {#1} } + \chemmacros_after_module:nn {charges} + { + \cs_set_protected:Npn \chemmacros_elpair:n #1 + { \Lewis { 0: , \printatom {#1} } } + \cs_set_protected:Npn \chemmacros_plus: { + } + \cs_set_protected:Npn \chemmacros_minus: { - } + \cs_set_protected:Npn \chemmacros_formal_plus: { \ensuremath{\oplus} } + \cs_set_protected:Npn \chemmacros_formal_minus: { \ensuremath{\ominus} } + \cs_set_protected:Npn \fplus { \ensuremath{\oplus} } + \cs_set_protected:Npn \fminus { \ensuremath{\ominus} } + } + } +\EndChemCompatibility + +% -------------------------------------------------------------------------- +\ChemCompatibilityTo{5.1} +\chemmacros_set_formula_method:n {chemformula} +\EndChemCompatibility + +\ChemCompatibilityFrom{5.1} +\chemmacros_define_global_keys:n + { formula .code:n = \chemmacros_set_formula_method:n {#1} } +\EndChemCompatibility + +\def\bla{bla} + +\AtEndPreamble + { + \bool_if:nTF + { + !\l__chemmacros_formula_method_set_bool + && + \chemmacros_if_compatibility_p:nn {>=} {5.2} + && + \chemmacros_if_compatibility_p:nn {<} {5.6} + } + { \chemmacros_check_formula_method: } + { + \bool_if:NF \l__chemmacros_formula_method_set_bool + { + \chemmacros_if_compatibility:nnTF {>=} {5.6} + { \msg_info:nn {chemmacros} {default-formula-method} } + { \msg_warning:nn {chemmacros} {default-formula-method} } + \chemmacros_set_formula_method:n {chemformula} + } + } + } + +% -------------------------------------------------------------------------- +\tex_endinput:D + +2015/09/22 - new general option `method' which allows a choice between + `chemformula' and `mhchem' +2015/10/13 - add missing compatibility definitions + - check for `mhchem' and `chemformula' and set method accordingly + if possible +2016/04/27 - further generalization of the `method' concept, new methods + `chemist' and `chemfig' + - don't automatically load an available method: load `chemformula' + if the users haven't decided for themselves and issue a warning +2016/05/03 - correct wrong method check diff --git a/macros/latex/contrib/chemmacros/chemmacros.module.errorcheck.code.tex b/macros/latex/contrib/chemmacros/chemmacros.module.errorcheck.code.tex new file mode 100644 index 0000000000..d7c70b5e9c --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.module.errorcheck.code.tex @@ -0,0 +1,130 @@ +% -------------------------------------------------------------------------- +% +% the CHEMMACROS package -- module: `errorcheck' +% +% -------------------------------------------------------------------------- +% 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-2017 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{errorcheck}{2016/10/05 error checking for unloaded modules}[5.2] + +\RequirePackage{scrlfile} + +\msg_new:nnn {chemmacros} {undefined} + { + The~ #1~ `#2'~ is~ undefined.~ You~ need~ to~ load~ the~ + `#3'~ module. + } + +\cs_generate_variant:Nn \msg_error:nnnnn {nnnx} + +\cs_new_protected:Npn \chemmacros_requires_module:nNn #1#2#3 + { + \chemmacros_if_module_loaded:nF {#3} + { + \cs_if_free:NT #2 + { + \cs_set:Npn #2 + { + \msg_error:nnnxn {chemmacros} {undefined} + {#1} + {\token_to_str:N #2} + {#3} + } + \chemmacros_before_module:nn {#3} { \cs_undefine:N #2 } + } + } + } +\cs_generate_variant:Nn \chemmacros_requires_module:nNn {nc} + +\cs_new_protected:Npn \chemmacros_command_requires_module:Nn #1#2 + { \chemmacros_requires_module:nNn {command} #1 {#2} } + +\cs_new_protected:Npn \chemmacros_environment_requires_module:nn #1#2 + { \chemmacros_requires_module:ncn {environment} {#1} {#2} } + +% -------------------------------------------------------------------------- +% add checking for the most common user commands and environments: +% isotopes module +\chemmacros_command_requires_module:Nn \isotope {isotopes} + +% mechanisms module +\chemmacros_command_requires_module:Nn \mech {mechanisms} + +% newman module +\chemmacros_command_requires_module:Nn \newman {newman} + +% orbital module +\chemmacros_command_requires_module:Nn \orbital {orbital} + +% polymers module +\chemmacros_command_requires_module:Nn \makepolymerdelims {polymers} + +% reactions module +\chemmacros_environment_requires_module:nn {reaction} {reactions} +\chemmacros_environment_requires_module:nn {reaction*} {reactions} +\chemmacros_environment_requires_module:nn {reactions} {reactions} +\chemmacros_environment_requires_module:nn {reactions*} {reactions} +\chemmacros_command_requires_module:Nn \listofreactions {reactions} +\chemmacros_command_requires_module:Nn \AddRxnDesc {reactions} + +% redox module +\chemmacros_command_requires_module:Nn \ox {redox} +\chemmacros_command_requires_module:Nn \OX {redox} +\chemmacros_command_requires_module:Nn \redox {redox} + +% scheme module +\chemmacros_environment_requires_module:nn {scheme} {scheme} +\chemmacros_command_requires_module:Nn \listschemename {scheme} +\chemmacros_command_requires_module:Nn \schemename {scheme} +\chemmacros_command_requires_module:Nn \listofschemes {scheme} + +\BeforePackage {chemscheme} + { + \cs_undefine:N \scheme + \cs_undefine:N \endscheme + \cs_undefine:N \listschemename + \cs_undefine:N \schemename + \cs_undefine:N \listofschemes + } + +% spectroscopy module +\chemmacros_command_requires_module:Nn \NMR {spectroscopy} +\chemmacros_environment_requires_module:nn {experimental} {spectroscopy} + +% thermodynamics module +\chemmacros_command_requires_module:Nn \state {thermodynamics} +\chemmacros_command_requires_module:Nn \enthalpy {thermodynamics} +\chemmacros_command_requires_module:Nn \entropy {thermodynamics} +\chemmacros_command_requires_module:Nn \gibbs {thermodynamics} + +% xfrac module +\chemmacros_command_requires_module:Nn \chemfrac {xfrac} + +% -------------------------------------------------------------------------- + +\tex_endinput:D + +2015/10/14 - first version +2016/03/08 - add `polymers' module +2016/05/31 - enable `chemscheme' to be loaded after chemmacros +2016/10/06 - check if commands exist before defining them to raise errors diff --git a/macros/latex/contrib/chemmacros/chemmacros.module.greek.code.tex b/macros/latex/contrib/chemmacros/chemmacros.module.greek.code.tex new file mode 100644 index 0000000000..a9f96d7485 --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.module.greek.code.tex @@ -0,0 +1,72 @@ +% -------------------------------------------------------------------------- +% +% the CHEMMACROS package -- module: `greek' +% +% -------------------------------------------------------------------------- +% 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-2017 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{greek}{2015/06/09 upright greek symbols} + +\RequirePackage{chemgreek}[2015/04/09] + +\msg_new:nnn {chemmacros} {no-greek} + { + You~ haven't~ loaded~ any~ package~ for~ upright~ Greek~ letters~ or~ no~ + unique~ choice~ was~ possible.~ Either~ load~ one~ of~ packages~ + specified~ in~ the~ manual~ or~ select~ a~ chemgreek~ mapping~ manually. + } + +\msg_new:nnn {chemmacros} {greek-undefined} + { + The~ chemgreek~ mapping~ `#1'~ you~ chose~ \msg_line_context: \c_space_tl + is~ not~ defined.~ Please~ choose~ another~ one. + } + +% chemgreek selects a mapping if an unambiguous choice is possible, otherwise +% selects `default'. Warn the user in this case: +\AtBeginDocument{ + \bool_if:nT + { + \chemgreek_if_mapping_active_p:n {default} || + \chemgreek_if_mapping_active_p:n {var-default} + } + { \msg_warning:nn {chemmacros} {no-greek} } +} + +% an option for manual selection: +\chemmacros_define_global_keys:n + { + greek .code:n = \chemmacros_choose_chemgreek_mapping:n {#1} + } + +\cs_new_protected:Npn \chemmacros_choose_chemgreek_mapping:n #1 + { + \chemgreek_if_mapping_exists:nTF {#1} + { + \chemgreek_load_mapping_package:n {#1} + \chemgreek_activate_mapping:n {#1} + } + { \msg_warning:nnn {chemmacros} {greek-undefined} {#1} } + } + +% -------------------------------------------------------------------------- diff --git a/macros/latex/contrib/chemmacros/chemmacros.module.isotopes.code.tex b/macros/latex/contrib/chemmacros/chemmacros.module.isotopes.code.tex new file mode 100644 index 0000000000..0931c1579f --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.module.isotopes.code.tex @@ -0,0 +1,235 @@ +% -------------------------------------------------------------------------- +% +% the CHEMMACROS package -- module: `isotopes' +% +% -------------------------------------------------------------------------- +% 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-2017 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{isotopes}{2015/07/22 a macro to easily print element isotopes} + +\RequirePackage{elements} + +\msg_new:nnn {chemmacros} {no-isotope} + { The~ isotope~ #2~ is~ not~ defined~ for~ element~ #1. } + +% -------------------------------------------------------------------------- +\tl_new:N \l__chemmacros_isotope_tl +\tl_new:N \l__chemmacros_isotope_list_tl +\seq_new:N \l__chemmacros_isotope_seq +\seq_new:N \l__chemmacros_check_isotopes_seq + +% #1: atomic number|element symbol|element name +% #2: tokenlist variable +\cs_new_protected:Npn \chemmacros_get_atom_number:nN #1#2 + { + \chemmacros_if_is_int:nTF {#1} + { \tl_set:Nn #2 {#1} } + { + \cs_if_exist:cTF { @elements@atom@number@ \str_lower_case:n {#1} } + { \tl_set:Nx #2 { \use:c { @elements@atom@number@ \str_lower_case:n {#1} } } } + { \tl_set:Nx #2 { \use:c { @elements@atom@name@num@ \str_lower_case:n {#1} } } } + } + } +\cs_generate_variant:Nn \chemmacros_get_atom_number:nN { V } + +% #1: atomic number|element symbol|element name +% #2: tl to store the result in +\cs_new_protected:Npn \chemmacros_get_isotope_list:nN #1#2 + { + \chemmacros_get_atom_number:nN {#1} \l__chemmacros_isotope_tl + \tl_set:Nx #2 + { + \use:c + { + @elements@atom@isotopes@ + \int_to_roman:n {\l__chemmacros_isotope_tl} + } + } + } + +% #1: atomic number|element symbol|element name +% #2: tokenlist variable +\cs_new_protected:Npn \chemmacros_get_element_symbol:nN #1#2 + { + \chemmacros_get_atom_number:nN {#1} \l__chemmacros_isotope_tl + \tl_set:Nx #2 + { + \use:c + { + @elements@atom@symbol@num@ + \int_to_roman:n {\l__chemmacros_isotope_tl} + } + } + } + +% #1: atomic number|element symbol|element name +% #2: isotope number +\prg_new_protected_conditional:Npnn \chemmacros_check_isotope:nn #1#2 {T,F,TF} + { + \chemmacros_get_isotopes:nN {#1} \l__chemmacros_check_isotopes_seq + \seq_if_in:NnTF \l__chemmacros_check_isotopes_seq {#2} + { \prg_return_true: } + { \prg_return_false: } + } +\cs_generate_variant:Nn \chemmacros_check_isotope:nnF { V } + +% #1: atomic number|element symbol|element name +% #2: tl to store the result in +\cs_new_protected:Npn \chemmacros_get_main_isotope:nN #1#2 + { + \chemmacros_get_isotope_list:nN {#1} \l__chemmacros_isotope_list_tl + \seq_set_split:NnV \l__chemmacros_isotope_seq {,} \l__chemmacros_isotope_list_tl + \seq_map_inline:Nn \l__chemmacros_isotope_seq + { + \chemmacros_read_isotope:nNN {##1} + \l__chemmacros_tmpa_bool + #2 + \bool_if:NT \l__chemmacros_tmpa_bool + { \seq_map_break: } + } + } +\cs_generate_variant:Nn \chemmacros_get_main_isotope:nN { V } + +% #1: atomic number|element symbol|element name +% #2: seq to store the results in +\cs_new_protected:Npn \chemmacros_get_isotopes:nN #1#2 + { + \seq_clear:N #2 + \chemmacros_get_isotope_list:nN {#1} \l__chemmacros_tmpa_tl + \seq_set_split:NnV \l__chemmacros_isotope_seq {,} \l__chemmacros_tmpa_tl + \seq_map_inline:Nn \l__chemmacros_isotope_seq + { + \chemmacros_read_isotope:nNN {##1} + \l__chemmacros_tmpa_bool + \l__chemmacros_tmpa_tl + \seq_put_right:NV #2 \l__chemmacros_tmpa_tl + } + } + +% #1: boolean variable +% #2: tokenlist variable +% #3: isotope list entry +\cs_new_protected:Npn \chemmacros_read_isotope:nNN #1#2#3 + { \__chemmacros_read_isotope:NNw #2#3 !#1!! \q_stop } + +% \__chemmacros_read_isotope:NNw N N !!1!! \q_stop +% \__chemmacros_read_isotope:NNw N N !1!! \q_stop +\cs_new_protected:Npn \__chemmacros_read_isotope:NNw #1#2#3!#4!#5!#6 \q_stop + { + \tl_if_blank:nTF {#5} + { + \tl_set:Nn #2 {#4} + \bool_set_false:N #1 + } + { + \tl_set:Nn #2 {#5} + \bool_set_true:N #1 + } + } + +% -------------------------------------------------------------------------- +% #1: boolean: hide atomic number? +% #2: nucleons, element symbol +\cs_new_protected:Npn \chemmacros_isotope:nn #1#2 + { \__chemmacros_isotope:nww {#1} #2,, \q_stop } + +\cs_new_protected:Npn \__chemmacros_isotope:nww #1#2,#3,#4 \q_stop + { + \tl_if_blank:nTF {#3} + { + \chemmacros_get_element_symbol:nN {#2} \l__chemmacros_tmpa_tl + \chemmacros_get_main_isotope:nN {#2} \l__chemmacros_tmpb_tl + \chemmacros_get_atom_number:nN {#2} \l__chemmacros_tmpc_tl + \bool_if:nTF {#1} + { + \chemmacros_isotope_write:VnV + \l__chemmacros_tmpb_tl + { } + \l__chemmacros_tmpa_tl + } + { + \chemmacros_isotope_write:VVV + \l__chemmacros_tmpb_tl + \l__chemmacros_tmpc_tl + \l__chemmacros_tmpa_tl + } + } + { + \chemmacros_get_element_symbol:nN {#3} \l__chemmacros_tmpa_tl + \chemmacros_get_atom_number:nN {#3} \l__chemmacros_tmpb_tl + \chemmacros_check_isotope:VnF + \l__chemmacros_tmpa_tl + {#2} + { + \chemmacros_get_element_symbol:nN {#3} \l__chemmacros_tmpa_tl + \msg_warning:nnVn {chemmacros} {no-isotope} + \l__chemmacros_tmpa_tl + {#2} + } + \chemmacros_get_element_symbol:nN {#3} \l__chemmacros_tmpa_tl + \bool_if:nTF {#1} + { \chemmacros_isotope_write:nnV {#2} { } \l__chemmacros_tmpa_tl } + { + \chemmacros_isotope_write:nVV {#2} + \l__chemmacros_tmpb_tl + \l__chemmacros_tmpa_tl + } + } + } + +\bool_new:N \l__chemmacros_isotope_super_bool +\tl_new:N \l__chemmacros_isotope_side_connect_tl + +\chemmacros_define_keys:nn {isotopes} + { + format .choice: , + format / super .code:n = + \bool_set_true:N \l__chemmacros_isotope_super_bool , + format / side .code:n = + \bool_set_false:N \l__chemmacros_isotope_super_bool , + format .initial:n = super , + side-connect .tl_set:N = \l__chemmacros_isotope_side_connect_tl , + side-connect .initial:n = - + } + +% #1: nucleons +% #2: atomic number +% #3: element symbol +\cs_new_protected:Npn \chemmacros_isotope_write:nnn #1#2#3 + { + \bool_if:NTF \l__chemmacros_isotope_super_bool + { \chemmacros_chemformula:n { ^{#1}_{#2}#3 } } + { + \chemmacros_chemformula:n {#3} + \tl_use:N \l__chemmacros_isotope_side_connect_tl + #1 + } + } +\cs_generate_variant:Nn \chemmacros_isotope_write:nnn { VnV , VVV , nnV , nVV } + +% TODO: option for the layout of the written isotope: ^{12}_6C vs C-12 + +\NewDocumentCommand \isotope { sm } + { \chemmacros_isotope:nn {#1} {#2} } + +% -------------------------------------------------------------------------- diff --git a/macros/latex/contrib/chemmacros/chemmacros.module.lang.code.tex b/macros/latex/contrib/chemmacros/chemmacros.module.lang.code.tex new file mode 100644 index 0000000000..b9dea089d2 --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.module.lang.code.tex @@ -0,0 +1,177 @@ +% -------------------------------------------------------------------------- +% +% the CHEMMACROS package -- module: `lang' +% +% -------------------------------------------------------------------------- +% 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-2017 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{lang}{2016/05/31 language settings for chemmacros} + +\RequirePackage{translations} + +\msg_new:nnn {chemmacros} {language-not-defined} + { + You~ chose~ the~ language~ `#1'~ which~ is~ not~ defined~ by~ chemmacros.~ + `english'~ is~ used~ instead.~ If~ you~ just~ mistyped~ try~ again!~ + Otherwise~ contact~ the~ author~ and~ he'll~ probably~ add~ your~ language. + } + +% -------------------------------------------------------------------------- +% language settings: +\bool_new:N \l__chemmacros_language_auto_bool +\bool_set_true:N \l__chemmacros_language_auto_bool +% this token list will hold the chosen language for chemmacros; since the +% language is either chosen automatically or by option it is only available at +% begin document +\tl_new:N \l_chemmacros_language_tl +\tl_set:Nn \l_chemmacros_language_tl {english} +\tl_new:N \l__chemmacros_current_language_tl + +\tl_const:Nx \c__chemmacros_keyword_prefix_tl + { \chemmacros_if_compatibility:nnT {>=} {5.7} {chem-keyword-} } + +\prop_new:N \g_chemmacros_translations_prop + +% translate the key #1 +\cs_new:Npn \chemmacros_translate:n #1 + { + \bool_if:NTF \l__chemmacros_language_auto_bool + { \GetTranslation { \c__chemmacros_keyword_prefix_tl #1 } } + { + \GetTranslationFor + {\l_chemmacros_language_tl} + { \c__chemmacros_keyword_prefix_tl #1 } + } + } + +\DeclareExpandableDocumentCommand \ChemTranslate {m} + { \chemmacros_translate:n {#1} } + +\chemmacros_define_global_keys:n + { + language .value_required:n = true , + language .code:n = + \tl_if_eq:nnTF {#1} {auto} + { \bool_set_true:N \l__chemmacros_language_auto_bool } + { + \bool_set_false:N \l__chemmacros_language_auto_bool + \tl_set:Nn \l__chemmacros_current_language_tl {#1} + } , + language .initial:n = auto + } + +\ChemCompatibilityTo{5.3} +\chemmacros_define_global_keys:n + { + german .meta:n = { language = german } , + ngerman .meta:n = { language = ngerman } + } +\EndChemCompatibility + +\AtBeginDocument{ + \bool_if:NTF \l__chemmacros_language_auto_bool + { + \tl_set:Nx \l_chemmacros_language_tl + { \@trnslt@language{\@trnslt@current@language} } + } + { + \tl_set_eq:NN + \l_chemmacros_language_tl + \l__chemmacros_current_language_tl + } +} + +% -------------------------------------------------------------------------- +\cs_new_protected:Npn \__chemmacros_declare_translation:nw #1#2=#3\q_stop + { + \tl_set:Nx \l__chemmacros_tmpa_tl { \tl_trim_spaces:n {#2} } + \tl_set:Nx \l__chemmacros_tmpb_tl { \tl_trim_spaces:n {#3} } + \use:x + { + \chemmacros_declare_translation:nnn + { \exp_not:n {#1} } + { \exp_not:V \l__chemmacros_tmpa_tl } + { \exp_not:V \l__chemmacros_tmpb_tl } + } + } + +% #1: key +% #2: lang +% #3: translation +\cs_new_protected:Npn \chemmacros_declare_translation:nnn #1#2#3 + { + \declaretranslation + {#2} + { \c__chemmacros_keyword_prefix_tl #1 } + {#3} + \prop_gput:Nnn \g_chemmacros_translations_prop {#1(#2)} {#3} + } +\cs_generate_variant:Nn \chemmacros_declare_translation:nnn {V} + +% #1: key +% #2: csv list: { <lang1> = <translation1> , <lang2> = <translation2> } +\cs_new_protected:Npn \chemmacros_declare_translations:nn #1#2 + { + \clist_map_inline:nn {#2} + { \__chemmacros_declare_translation:nw {#1} ##1 \q_stop } + } + +\NewDocumentCommand \DeclareChemTranslations {mm} + { \chemmacros_declare_translations:nn {#1} {#2} } +\@onlypreamble \DeclareChemTranslations + +\NewDocumentCommand \DeclareChemTranslation {mmm} + { \chemmacros_declare_translation:nnn {#1} {#2} {#3} } +\@onlypreamble \DeclareChemTranslation + +\cs_new:Npn \__chemmacros_parse_translate_list_entry:nnn #1#2#3 {} + +\cs_new_protected:Npn \__chemmacros_parse_translate_list_entry:www #1(#2)\q_mark#3\q_stop + { \__chemmacros_parse_translate_list_entry:nnn {#1} {#2} {#3} } + +\cs_new_protected:Npn \chemmacros_for_all_translations_do:n #1 + { + \cs_set:Npn \__chemmacros_parse_translate_list_entry:nnn ##1##2##3 {#1} + \prop_map_inline:Nn \g_chemmacros_translations_prop + { \__chemmacros_parse_translate_list_entry:www ##1 \q_mark ##2 \q_stop } + } + +\ChemCompatibilityFrom{5.7} +\NewDocumentCommand \ForAllChemTranslationsDo {+m} + { \chemmacros_for_all_translations_do:n {#1} } +\EndChemCompatibility + +% -------------------------------------------------------------------------- +\tex_endinput:D + +2015/11/17 - remove options `german' and `ngerman', starting with v5.3 +2016/02/03 - adapt to changes in `acid-base' module +2016/04/27 - additions/changes to reaction and scheme translations + - \chemmacros_declare_translation:nnn and + \chemmacros_declare_translations:nn + - \DeclareChemTranslation and \DeclareChemTranslations + - moved translations from lang module to the corresponding modules + they belong to +2016/05/31 - add prefix string to translation keywords + - add logging of translation keywords + - \ForAllChemTranslationsDo diff --git a/macros/latex/contrib/chemmacros/chemmacros.module.mechanisms.code.tex b/macros/latex/contrib/chemmacros/chemmacros.module.mechanisms.code.tex new file mode 100644 index 0000000000..662d93fbb3 --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.module.mechanisms.code.tex @@ -0,0 +1,165 @@ +% -------------------------------------------------------------------------- +% +% the CHEMMACROS package -- module: `mechanisms' +% +% -------------------------------------------------------------------------- +% 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-2017 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{mechanisms}{2015/06/09 reaction mechanisms} + +\RequirePackage{amstext} + +% -------------------------------------------------------------------------- +% reaction mechanisms +% \mech[<type>] +% <type> - substitutions: {}, 1, 2, se, 1e, 2e, ar +% - eliminations: e, e1, e2, cb +\tl_new:N \l__chemmacros_mechanisms_type_tl +\tl_new:N \l__chemmacros_mechanisms_mol_tl +\tl_new:N \l__chemmacros_mechanisms_ar_tl + +\cs_new_protected:Npn \__chemmacros_set_mechanisms:nnn #1#2#3 + { + \tl_set:Nn \l__chemmacros_mechanisms_type_tl { #1 } + \tl_set:Nn \l__chemmacros_mechanisms_mol_tl { #2 } + \tl_set:Nn \l__chemmacros_mechanisms_ar_tl { #3 } + } + +\chemmacros_define_keys:nn {mechanisms} + { + type .choice: , + type / .code:n = + { + \__chemmacros_set_mechanisms:nnn { S } + { + \c_math_toggle_token + \c_math_subscript_token { \text {N} } + \c_math_toggle_token + } + { } + } , + type / 1 .code:n = + { + \__chemmacros_set_mechanisms:nnn { S } + { + \c_math_toggle_token + \c_math_subscript_token { \text {N} } + \c_math_toggle_token + 1 + } + { } + } , + type / 2 .code:n = + { + \__chemmacros_set_mechanisms:nnn { S } + { + \c_math_toggle_token + \c_math_subscript_token { \text {N} } + \c_math_toggle_token + 2 + } + { } + } , + type / se .code:n = + { + \__chemmacros_set_mechanisms:nnn { S } + { + \c_math_toggle_token + \c_math_subscript_token { \text {E} } + \c_math_toggle_token + } + { } + } , + type / 1e .code:n = + { + \__chemmacros_set_mechanisms:nnn { S } + { + \c_math_toggle_token + \c_math_subscript_token { \text {E} } + \c_math_toggle_token + 1 + } + { } + } , + type / 2e .code:n = + { + \__chemmacros_set_mechanisms:nnn { S } + { + \c_math_toggle_token + \c_math_subscript_token { \text {E} } + \c_math_toggle_token + 2 + } + { } + } , + type / ar .code:n = + { + \__chemmacros_set_mechanisms:nnn { S } + { + \c_math_toggle_token + \c_math_subscript_token { \text {E} } + \c_math_toggle_token + } + { Ar - } + } , + type / e .code:n = + { \__chemmacros_set_mechanisms:nnn { E } { } { } } , + type / e1 .code:n = + { \__chemmacros_set_mechanisms:nnn { E } { 1 } { } } , + type / e2 .code:n = + { \__chemmacros_set_mechanisms:nnn { E } { 2 } { } } , + type / cb .code:n = + { + \__chemmacros_set_mechanisms:nnn { E } + { + 1 + \c_math_toggle_token + \c_math_subscript_token { \text {cb} } + \c_math_toggle_token + } + { } + } , + type .default:n = + } + +\cs_new_protected:Npn \chemmacros_mechanisms:n #1 + { + \tl_if_blank:nTF {#1} + { \chemmacros_set_keys:nn {mechanisms} { type } } + { \chemmacros_set_keys:nn {mechanisms} { type = #1 } } + \mbox + { + \tl_use:N \l__chemmacros_mechanisms_ar_tl + \tl_use:N \l__chemmacros_mechanisms_type_tl + \tl_use:N \l__chemmacros_mechanisms_mol_tl + } + } + +\NewDocumentCommand \mech {o} + { + \IfNoValueTF {#1} + { \chemmacros_mechanisms:n { } } + { \chemmacros_mechanisms:n {#1} } + } + +% -------------------------------------------------------------------------- diff --git a/macros/latex/contrib/chemmacros/chemmacros.module.newman.code.tex b/macros/latex/contrib/chemmacros/chemmacros.module.newman.code.tex new file mode 100644 index 0000000000..79d5c16ff1 --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.module.newman.code.tex @@ -0,0 +1,212 @@ +% -------------------------------------------------------------------------- +% +% the CHEMMACROS package -- module: `newman' +% +% -------------------------------------------------------------------------- +% 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-2017 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{newman}{2016/04/23 newman projections} + +\chemmacros_load_module:n {tikz} + +% 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} +\fp_new:N \l__chemmacros_newman_x_fp +\fp_new:N \l__chemmacros_newman_y_fp + +\tl_new:N \l__chemmacros_newman_tikz_ring_tl +\tl_new:N \l__chemmacros_newman_tikz_front_tl +\tl_new:N \l__chemmacros_newman_tikz_back_tl + +\bool_new:N \l__chemmacros_newman_tikz_back_bool + +\chemmacros_define_keys:nn {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 + } + +% \newman[<keyval>](<angle>){<1>,<2>,<3>,<4>,<5>,<6>} +\NewDocumentCommand \newman {od()m} + { + \group_begin: + \IfNoValueF {#1} { \chemmacros_set_keys:nn {newman} {#1} } + \IfNoValueTF {#2} + { \chemmacros_newman:nn { } {#3} } + { \chemmacros_newman:nn {#2} {#3} } + \group_end: + } + +% #1: angle +% #2: csv list of atoms +\cs_new_protected:Npn \chemmacros_newman:nn #1#2 + { \__chemmacros_newman_feed_atoms:nw {#1}#2 ,,,,,, \q_stop } + +\cs_new_protected:Npn \__chemmacros_newman_feed_atoms:nw #1#2,#3,#4,#5,#6,#7,#8 \q_stop + { \chemmacros_newman_atoms:nnnnnnn {#1} {#2} {#3} {#4} {#5} {#6} {#7} } + +% place atoms: +% #1: angle +% #2 - #7: atoms +\cs_new_protected:Npn \chemmacros_newman_atoms:nnnnnnn #1#2#3#4#5#6#7 + { + \tl_if_blank:nTF {#1} + { + \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 {#1} } + \chemmacros_tikz_picture:xn + { + scale = \fp_to_decimal:N \l__chemmacros_newman_scale_fp , + chemmacros_newman_atom_front / .style = + { + inner~sep = 0pt , + outer~sep = 0pt , + \exp_not:V \l__chemmacros_newman_tikz_front_tl + }, + chemmacros_newman_atom_back / .style = + { + inner~sep = 0pt , + outer~sep = 0pt , + \bool_if:NTF \l__chemmacros_newman_tikz_back_bool + { \exp_not:V \l__chemmacros_newman_tikz_back_tl } + { \exp_not:V \l__chemmacros_newman_tikz_front_tl } + } + } + { + \chemmacros_tikz_draw:x + { \exp_not:V \l__chemmacros_newman_tikz_ring_tl } + (0pt,0pt) circle (\fp_to_dim:N \l__chemmacros_newman_scale_fp * 15) ; + \chemmacros_newman_back_node:nn {30} {#6} + \chemmacros_newman_back_node:nn {150} {#7} + \chemmacros_newman_back_node:nn {270} {#5} + \chemmacros_newman_front_node:nn {90} {#2} + \chemmacros_newman_front_node:nn {210} {#3} + \chemmacros_newman_front_node:nn {330} {#4} + } + } + +% provide cartesian coordiantes from polar coordinates +% #1: fp variable for x +% #2: fp variable for y +% #3: angle +% #4: radius +\cs_new_protected:Npn \chemmacros_polar_to_cartesian:NNnn #1#2#3#4 + { + \fp_set:Nn #1 { #4 * cos( #3 / 180 * pi ) }% x + \fp_set:Nn #2 { #4 * sin( #3 / 180 * pi ) }% y + } + +% place back nodes +\cs_new_protected:Npn \chemmacros_newman_back_node:nn #1#2 + { + \group_begin: + \fp_add:Nn \l__chemmacros_newman_rel_angle_fp { #1 } + \chemmacros_polar_to_cartesian:NNnn + \l__chemmacros_newman_x_fp + \l__chemmacros_newman_y_fp + { \l__chemmacros_newman_rel_angle_fp } + { \l__chemmacros_newman_scale_fp } + \chemmacros_tikz_draw:x + { \exp_not:V \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_polar_to_cartesian:NNnn + \l__chemmacros_newman_x_fp + \l__chemmacros_newman_y_fp + { \l__chemmacros_newman_rel_angle_fp } + { \l__chemmacros_newman_scale_fp } + \chemmacros_tikz_node:x + { + 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_protected:Npn \chemmacros_newman_front_node:nn #1#2 + { + \chemmacros_polar_to_cartesian:NNnn + \l__chemmacros_newman_x_fp + \l__chemmacros_newman_y_fp + { #1 } + { \l__chemmacros_newman_scale_fp } + \chemmacros_tikz_draw:x + { \exp_not:V \l__chemmacros_newman_tikz_ring_tl } + (0pt,0pt) -- ++ + ( + 30 * \fp_to_dim:N \l__chemmacros_newman_x_fp , + 30 * \fp_to_dim:N \l__chemmacros_newman_y_fp + ) ; + \chemmacros_polar_to_cartesian:NNnn + \l__chemmacros_newman_x_fp + \l__chemmacros_newman_y_fp + { #1 } + { \l__chemmacros_newman_scale_fp } + \chemmacros_tikz_node:x + { 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 } + +% -------------------------------------------------------------------------- +\tex_endinput:D + +2016/04/23 - some changes on how \newman is processed internally diff --git a/macros/latex/contrib/chemmacros/chemmacros.module.nomenclature.code.tex b/macros/latex/contrib/chemmacros/chemmacros.module.nomenclature.code.tex new file mode 100644 index 0000000000..5a347b66e9 --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.module.nomenclature.code.tex @@ -0,0 +1,899 @@ +% -------------------------------------------------------------------------- +% +% the CHEMMACROS package -- module: `nomenclature' +% +% -------------------------------------------------------------------------- +% 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-2017 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{nomenclature}{2017/06/11 chemical names} + +\RequirePackage{scrlfile} + +\chemmacros_load_module:n {tikz} + +\bool_new:N \l__chemmacros_iupac_restricted_bool +\bool_new:N \l__chemmacros_iupac_strict_bool + +\msg_new:nnn {chemmacros} {new-iupac} + { + You've~ tried~ to~ define~ a~ iupac~ naming~ command~ with~ + \token_to_str:N \NewChemIUPAC ,~ but~ the~ iupac~ command~ + \token_to_str:N #1 \c_space_tl already~ exists.~ Choose~ another~ name~ + or~ use~ \token_to_str:N \RenewChemIUPAC . + } + +\msg_new:nnn {chemmacros} {renew-iupac} + { + You've~ tried~ to~ renew~ the~ iupac~ command~ \token_to_str:N #1 ,~ but~ + it~ doesn't~ exist.~ Use~ \token_to_str:N \NewChemIUPAC \c_space_tl + instead. + } + +\msg_new:nnn {chemmacros} {let-iupac} + { + You've~ tried~ to~ let~ the~ iupac~ command~ \token_to_str:N #1 ~ to~ the~ + iupac~ command~ \token_to_str:N #2 ,~ but~ the~ latter~ doesn't~ exist.~ + Use~ \token_to_str:N \NewChemIUPAC \c_space_tl instead~ or~declare~ + \token_to_str:N #2 \c_space_tl first. + } + +\msg_new:nnn {chemmacros} {new-iupac-shorthand} + { + You've~ tried~ to~ define~ a~ iupac~ shorthand~ with~ \token_to_str:N + \NewChemIUPACShorthand ,~ but~ the~ shorthand~ \token_to_str:N #1 + \c_space_tl already~ exists.~ Please~ choose~ another~ token. + } + +\msg_new:nnn {chemmacros} {renew-iupac-shorthand} + { + You've~ tried~ to~ renew~ the~ iupac~ shorthand~ \token_to_str:N #1 ,~ + but~ this~ shorthand~ doesn't~ exist,~ yet. + } + +\prop_new:N \l__chemmacros_iupac_prop + +\cs_new_protected:Npn \chemmacros_new_iupac:Nn #1#2 + { + \tl_set:Nx \l__chemmacros_tmpa_tl + { \chemmacros_remove_backslash:N #1 } + \prop_if_in:NVTF \l__chemmacros_iupac_prop \l__chemmacros_tmpa_tl + { \msg_error:nnn {chemmacros} {new-iupac} {#1} } + { + \prop_put:NVn \l__chemmacros_iupac_prop + \l__chemmacros_tmpa_tl + {#2} + } + \chemmacros_make_iupac: + } + +\cs_new_protected:Npn \chemmacros_provide_iupac:Nn #1#2 + { + \tl_set:Nx \l__chemmacros_tmpa_tl + { \chemmacros_remove_backslash:N #1 } + \prop_if_in:NVF \l__chemmacros_iupac_prop \l__chemmacros_tmpa_tl + { + \prop_put:NVn \l__chemmacros_iupac_prop + \l__chemmacros_tmpa_tl + {#2} + } + \chemmacros_make_iupac: + } + +\cs_new_protected:Npn \chemmacros_define_iupac:Nn #1#2 + { + \tl_set:Nx \l__chemmacros_tmpa_tl + { \chemmacros_remove_backslash:N #1 } + \prop_put:NVn \l__chemmacros_iupac_prop + \l__chemmacros_tmpa_tl + {#2} + \chemmacros_make_iupac: + } + +\cs_new_protected:Npn \chemmacros_renew_iupac:Nn #1#2 + { + \tl_set:Nx \l__chemmacros_tmpa_tl + { \chemmacros_remove_backslash:N #1 } + \prop_if_in:NVTF \l__chemmacros_iupac_prop \l__chemmacros_tmpa_tl + { + \prop_put:NVn \l__chemmacros_iupac_prop + \l__chemmacros_tmpa_tl + {#2} + } + { \msg_error:nnn {chemmacros} {renew-iupac} {#1} } + \chemmacros_make_iupac: + } + +\cs_new_protected:Npn \chemmacros_let_iupac:NN #1#2 + { + \tl_set:Nx \l__chemmacros_tmpa_tl + { \chemmacros_remove_backslash:N #1 } + \tl_set:Nx \l__chemmacros_tmpb_tl + { \chemmacros_remove_backslash:N #2 } + \prop_get:NVNTF \l__chemmacros_iupac_prop + \l__chemmacros_tmpb_tl + \l__chemmacros_tmpc_tl + { + \prop_put:NVV \l__chemmacros_iupac_prop + \l__chemmacros_tmpa_tl + \l__chemmacros_tmpc_tl + } + { \msg_error:nnnn {chemmacros} {let-iupac} {#1} {#2} } + \chemmacros_make_iupac: + } + +\ChemCompatibilityTo{5.2} +\cs_new_protected:Npn \chemmacros_make_iupac: + { + \bool_if:NT \l__chemmacros_in_document_bool + { + \bool_if:NTF \l__chemmacros_inside_iupac_bool + { + \prop_map_inline:Nn \l__chemmacros_iupac_prop + { \cs_set_protected:cpn {##1} {##2} } + } + { + \bool_if:NF \l__chemmacros_iupac_restricted_bool + { + \bool_if:NTF \l__chemmacros_iupac_strict_bool + { + \prop_map_inline:Nn \l__chemmacros_iupac_prop + { \cs_set_protected:cpn {##1} {##2} } + } + { + \prop_map_inline:Nn \l__chemmacros_iupac_prop + { + \cs_if_exist:cF {##1} + { \cs_set_protected:cpn {##1} {##2} } + } + } + } + } + } + } +\AtBeginDocument { \chemmacros_make_iupac: } +\EndChemCompatibility + +\ChemCompatibilityFrom{5.2} +\cs_new_protected:Npn \chemmacros_make_iupac: + { + \chemmacros_if_document:T + { + \bool_if:NTF \l__chemmacros_inside_iupac_bool + { + \prop_map_inline:Nn \l__chemmacros_iupac_prop + { \cs_set_protected:cpn {##1} {##2} } + } + { + \bool_if:NF \l__chemmacros_iupac_restricted_bool + { + \bool_if:NTF \l__chemmacros_iupac_strict_bool + { + \prop_map_inline:Nn \l__chemmacros_iupac_prop + { \cs_set_protected:cpn {##1} {##2} } + } + { + \prop_map_inline:Nn \l__chemmacros_iupac_prop + { + \cs_if_exist:cF {##1} + { \cs_set_protected:cpn {##1} {##2} } + } + } + } + } + } + } +\AfterEndPreamble { \chemmacros_make_iupac: } +\EndChemCompatibility + +\NewDocumentCommand \DeclareChemIUPAC {mm} + { \chemmacros_define_iupac:Nn #1 {#2} } + +\NewDocumentCommand \NewChemIUPAC {mm} + { \chemmacros_new_iupac:Nn #1 {#2} } + +\NewDocumentCommand \RenewChemIUPAC {mm} + { \chemmacros_renew_iupac:Nn #1 {#2} } + +\NewDocumentCommand \ProvideChemIUPAC {mm} + { \chemmacros_provide_iupac:Nn #1 {#2} } + +\NewDocumentCommand \LetChemIUPAC {mm} + { \chemmacros_let_iupac:NN #1 #2 } + +\chemmacros_define_keys:nn {nomenclature} + { + iupac .choice: , + iupac / restricted .code:n = + \bool_set_true:N \l__chemmacros_iupac_restricted_bool + \bool_set_false:N \l__chemmacros_iupac_strict_bool , + iupac / auto .code:n = + \bool_set_false:N \l__chemmacros_iupac_restricted_bool + \bool_set_false:N \l__chemmacros_iupac_strict_bool , + iupac / strict .code:n = + \bool_set_false:N \l__chemmacros_iupac_restricted_bool + \bool_set_true:N \l__chemmacros_iupac_strict_bool , + } + +% stereo descriptors and other nomenclature commands +% Cahn-Ingold-Prelog +\dim_new:N \l__chemmacros_cip_kern_dim +\dim_set:Nn \l__chemmacros_cip_kern_dim {.075em} + +\chemmacros_define_keys:nn {nomenclature} + { cip-kern .dim_set:N = \l__chemmacros_cip_kern_dim } + +\ChemCompatibilityTo{5.2} +\cs_new_protected:Npn \chemmacros_cip:n #1 + { \textit{#1} \tex_kern:D \l__chemmacros_cip_kern_dim } + +\NewDocumentCommand \cip {m} + { \chemmacros_cip:n {#1} } +\EndChemCompatibility + +\ChemCompatibilityBetween{5.2}{5.8} +\cs_new_protected:Npn \chemmacros_cip:n #1 + { + \int_zero:N \l__chemmacros_tmpa_int + \textup{(} + \clist_map_inline:nn + {#1} + { + \int_incr:N \l__chemmacros_tmpa_int + \textit{##1} + \int_compare:nT + { \l__chemmacros_tmpa_int < \clist_count:n {#1} } + { \textup{,} } + } + \textup{)} + \tex_kern:D \l__chemmacros_cip_kern_dim + } +\DeclareChemIUPAC \cip { \chemmacros_cip:n } +\EndChemCompatibility + +\ChemCompatibilityFrom{5.8} +\tl_new:N \l__chemmacros_cip_inner_tl +\tl_new:N \l__chemmacros_cip_outer_tl +\tl_new:N \l__chemmacros_cip_number_tl + +\chemmacros_define_keys:nn {nomenclature} + { + cip-inner-format .tl_set:N = \l__chemmacros_cip_inner_tl , + cip-inner-format .initial:n = \itshape , + cip-outer-format .tl_set:N = \l__chemmacros_cip_outer_tl , + cip-outer-format .initial:n = \upshape , + cip-number-format .tl_set:N = \l__chemmacros_cip_number_tl , + cip-number-format .initial:n = \itshape + } + +\cs_new_protected:Npn \__chemmacros_cip:n #1 + { + \tl_set:Nn \l__chemmacros_tmpa_tl {#1} + \int_step_inline:nnnn {0} {1} {9} + { + \tl_replace_all:Nnn \l__chemmacros_tmpa_tl + {##1} + { { \l__chemmacros_cip_number_tl ##1} } + } + { \l__chemmacros_cip_inner_tl \l__chemmacros_tmpa_tl } + } + +\cs_new_protected:Npn \chemmacros_cip:n #1 + { + \int_zero:N \l__chemmacros_tmpa_int + \group_begin: + \l__chemmacros_cip_outer_tl ( + \clist_map_inline:nn + {#1} + { + \int_incr:N \l__chemmacros_tmpa_int + \__chemmacros_cip:n {##1} + \int_compare:nT + { \l__chemmacros_tmpa_int < \clist_count:n {#1} } + { , } + } + ) + \group_end: + \tex_kern:D \l__chemmacros_cip_kern_dim + } +\DeclareChemIUPAC \cip { \chemmacros_cip:n } +\EndChemCompatibility + +% remember: TikZ needs : to be other +\cs_new_protected:Npn \chemmacros_sconf:n #1 + { + \group_begin: + \chemmacros_tikz:nn + { baseline,text~ height=1.5ex,text~ depth=.25ex } + { + \chemmacros_tikz_node:n {anchor=base} (chemmacros@@Sconf) {#1} ; + \chemmacros_tikz_draw:n {->,thick,rotate=90} + ($(chemmacros@@Sconf.center)+(20\c_chemmacros_other_colon_tl.8em)$) + arc (20\c_chemmacros_other_colon_tl340\c_chemmacros_other_colon_tl.8em); + } + \group_end: + } + +\cs_new_protected:Npn \chemmacros_rconf:n #1 + { + \group_begin: + \tikz[baseline,text~ height=1.5ex,text~ depth=.25ex] + { + \chemmacros_tikz_node:n {anchor=base} (chemmacros@@Rconf) {#1} ; + \chemmacros_tikz_draw:n {<-,thick,rotate=90} + ($(chemmacros@@Rconf.center)+(20\c_chemmacros_other_colon_tl.8em)$) + arc (20\c_chemmacros_other_colon_tl340\c_chemmacros_other_colon_tl.8em) ; + } + \group_end: + } + +\NewDocumentCommand \Sconf { O{S} } { \chemmacros_sconf:n {#1} } +\NewDocumentCommand \Rconf { O{R} } { \chemmacros_rconf:n {#1} } + +% coordination chemistry +\bool_new:N \l__chemmacros_bridge_super_bool + +\chemmacros_define_keys:nn {nomenclature} + { + bridge-number .choice: , + bridge-number / sub .code:n = + \bool_set_false:N \l__chemmacros_bridge_super_bool , + bridge-number / super .code:n = + \bool_set_true:N \l__chemmacros_bridge_super_bool , + coord-use-hyphen .bool_set:N = \l__chemmacros_coord_use_hyphen_bool , + coord-use-hyphen .initial:n = true + } + +% #1: boolean - if true hyphen is turned on +% #2: boolean - if true superscript will be used +% #3: symbol +% #4: sub-/superscript +\cs_new_protected:Npn \chemmacros_coordination_symbol:nnnn #1#2#3#4 + { + \chemmacros_chemformula:n {#3} + \tl_if_blank:nF {#4} + { + \bool_if:nTF {#2} + { \chemmacros_chemformula:n { {}^{#4} } } + { \chemmacros_chemformula:n { {}_{#4} } } + } + \bool_if:nT + {#1} + { \chemmacros_break_point_hyphen: } + } + +\cs_new_protected:Npn \chemmacros_hapto:n #1 + { + \chemmacros_coordination_symbol:nnnn + { \l__chemmacros_coord_use_hyphen_bool } + { + \chemmacros_if_compatibility:nnTF {>} {5.7} + { \c_true_bool } + { \c_false_bool } + } + { \chemeta } + {#1} + } + +\cs_new_protected:Npn \chemmacros_dento:n #1 + { + \chemmacros_coordination_symbol:nnnn + { \l__chemmacros_coord_use_hyphen_bool } + { + \chemmacros_if_compatibility:nnTF {>} {5.7} + { \c_true_bool } + { \c_false_bool } + } + { \chemkappa } + {#1} + } + +\cs_new_protected:Npn \chemmacros_bridge:n #1 + { + \chemmacros_coordination_symbol:nnnn + { \l__chemmacros_coord_use_hyphen_bool } + { \l__chemmacros_bridge_super_bool } + { \chemmu } + {#1} + } + +% \iupac (basically the same as bpchem's \IUPAC) +% - allows multiple breaking points as compound names can get really long and +% especially in multicolumn documents can span more than two lines +% - add a (very) little space before the hyphen and a little negative space +% after it +% - add a little space at breaking points if not broken +% - enables all naming commands regardless if they're definied otherwise or not +\cs_new_protected:Npn \chemmacros_allow_hyphens: + { + \chemmacros_nobreak: + \chemmacros_if_compatibility:nnTF {<=} {5.7} + { \skip_horizontal:N \c_zero_dim } + { \skip_horizontal:N \c_zero_skip } + } + +% #1: pre break +% #2: post break +% #3: no break +\ChemCompatibilityTo{5.1} +\cs_new_protected:Npn \__chemmacros_break_point_insert:nnn #1#2#3 + { + \chemmacros_nobreak: + \tex_discretionary:D { - } { } {#3} + \chemmacros_allow_hyphens: + } +\EndChemCompatibility + +\ChemCompatibilityBetween{5.1}{5.8} +\cs_new_protected:Npn \__chemmacros_break_point_insert:nnn #1#2#3 + { + \mode_if_math:TF + {#3} + { + \chemmacros_nobreak: + \tex_discretionary:D {#1} {#2} {#3} + \chemmacros_allow_hyphens: + } + } +\EndChemCompatibility + +\ChemCompatibilityFrom{5.8a} +\cs_new_protected:Npn \__chemmacros_break_point_insert:nnn #1#2#3 + { + \mode_if_math:TF + {#3} + { + \peek_meaning:NTF \group_end: + {#3} + { + \chemmacros_nobreak: + \tex_discretionary:D {#1} {#2} {#3} + \chemmacros_allow_hyphens: + } + } + } +\EndChemCompatibility + +\dim_new:N \l__chemmacros_iupac_hyphen_pre_dim +\dim_set:Nn \l__chemmacros_iupac_hyphen_pre_dim { .01em } +\dim_new:N \l__chemmacros_iupac_hyphen_post_dim +\dim_set:Nn \l__chemmacros_iupac_hyphen_post_dim { -.03em } +\dim_new:N \l__chemmacros_iupac_break_dim +\dim_set:Nn \l__chemmacros_iupac_break_dim { .03em } +\skip_new:N \l__chemmacros_iupac_break_skip +\skip_set:Nn \l__chemmacros_iupac_break_skip { .03em plus .07em } + +\chemmacros_define_keys:nn {nomenclature} + { + hyphen-pre-space .dim_set:N = \l__chemmacros_iupac_hyphen_pre_dim , + hyphen-post-space .dim_set:N = \l__chemmacros_iupac_hyphen_post_dim , + break-space .skip_set:N = \l__chemmacros_iupac_break_skip + } + +\ChemCompatibilityTo{5.2} +\cs_new_protected:Npn \chemmacros_break_point_hyphen: + { + \__chemmacros_break_point_insert:nnn + {-} + { } + { + \tex_kern:D \l__chemmacros_iupac_hyphen_pre_dim + - + \tex_kern:D \l__chemmacros_iupac_hyphen_post_dim + } + } +\EndChemCompatibility + +\ChemCompatibilityFrom{5.2} +\cs_new_protected:Npn \chemmacros_break_point_hyphen: + { + \__chemmacros_break_point_insert:nnn + { \tex_kern:D \l__chemmacros_iupac_hyphen_pre_dim - } + { } + { + \tex_kern:D \l__chemmacros_iupac_hyphen_pre_dim + - + \tex_kern:D \l__chemmacros_iupac_hyphen_post_dim + } + } +\EndChemCompatibility + +\cs_new_protected:Npn \chemmacros_break_point: + { + \__chemmacros_break_point_insert:nnn + {-} + { } + { + \mode_if_math:TF + { | } + { \tex_kern:D \l__chemmacros_iupac_break_dim } + } + } + +\cs_new_protected:Npn \chemmacros_break_point_opening_paren: + { \__chemmacros_break_point_insert:nnn { - } { ( } { ( } } + +\cs_new_protected:Npn \chemmacros_break_point_closing_paren: + { \__chemmacros_break_point_insert:nnn { )- } { } { ) } } + +\cs_new_protected:Npn \chemmacros_break_point_opening_bracket: + { \__chemmacros_break_point_insert:nnn { - } { [ } { [ } } + +\cs_new_protected:Npn \chemmacros_break_point_closing_bracket: + { \__chemmacros_break_point_insert:nnn { ]- } { } { ] } } + +\cs_new_protected:Npn \chemmacros_superscript:n #1 + { \mode_if_math:TF { \sp {#1} } { \textsuperscript {#1} } } + +\bool_new:N \l__chemmacros_inside_iupac_bool + +\seq_new:N \l__chemmacros_iupac_shorthands_seq +\prop_new:N \l__chemmacros_iupac_shorthands_prop + +% #1: token +% #2: definition +\cs_new_protected:Npn \chemmacros_define_iupac_shorthand:NN #1#2 + { + \seq_if_in:NnF \l__chemmacros_iupac_shorthands_seq {#1} + { \seq_put_right:Nn \l__chemmacros_iupac_shorthands_seq {#1} } + \prop_put:Nnn \l__chemmacros_iupac_shorthands_prop {#1} + { \char_set_active_eq:NN #1#2 } + } + +\cs_new_protected:Npn \chemmacros_remove_shorthand:N #1 + { + \chemmacros_define_iupac_shorthand:NN #1 \c_empty_tl + \seq_remove_all:Nn \l__chemmacros_iupac_shorthands_seq {#1} + \prop_remove:Nn \l__chemmacros_iupac_shorthands_prop {#1} + } + +\prg_new_conditional:Npnn \chemmacros_if_iupac_shorthand:N #1 {p,T,F,TF} + { + \seq_if_in:NnTF \l__chemmacros_iupac_shorthands_seq {#1} + { \prg_return_true: } + { \prg_return_false: } + } + +\cs_new_protected:Npn \chemmacros_for_all_iupac_shorthands_do:n #1 + { \seq_map_inline:Nn \l__chemmacros_iupac_shorthands_seq {#1} } + +\cs_new_protected:Npn \chemmacros_activate_iupac_shorthand:N #1 + { \chemmacros_if_iupac_shorthand:NT #1 { \char_set_catcode_active:N #1 } } + +\cs_new_protected:Npn \chemmacros_activate_iupac_shorthands:n #1 + { \tl_map_inline:nn {#1} { \chemmacros_activate_iupac_shorthand:N ##1 } } + +\cs_new_protected:Npn \chemmacros_activate_all_iupac_shorthands: + { + \chemmacros_for_all_iupac_shorthands_do:n + { \chemmacros_activate_iupac_shorthand:N ##1 } + } + +\cs_new_protected:Npn \chemmacros_make_shorthands: + { + \chemmacros_if_compatibility:nnT {>=} {5.2} + { + \chemmacros_if_document:T + { + \chemmacros_for_all_iupac_shorthands_do:n + { \prop_item:Nn \l__chemmacros_iupac_shorthands_prop {##1} } + } + } + } + +\NewDocumentCommand \DeclareChemIUPACShorthand {mm} + { \chemmacros_define_iupac_shorthand:NN #1#2 } + +\NewDocumentCommand \NewChemIUPACShorthand {mm} + { + \chemmacros_if_iupac_shorthand:NTF #1 + { \msg_error:nnn {chemmacros} {new-iupac-shorthand} {#1} } + { \chemmacros_define_iupac_shorthand:NN #1#2 } + } + +\NewDocumentCommand \ProvideChemIUPACShorthand {mm} + { + \chemmacros_if_iupac_shorthand:NTF #1 + { \chemmacros_define_iupac_shorthand:NN #1#2 } + } + +\NewDocumentCommand \RenewChemIUPACShorthand {mm} + { + \chemmacros_if_iupac_shorthand:NTF #1 + { \chemmacros_define_iupac_shorthand:NN #1#2 } + { \msg_error:nnn {chemmacros} {renew-iupac-shorthand} {#1} } + } + +\NewDocumentCommand \RemoveChemIUPACShorthand {m} + { \chemmacros_remove_shorthand:N #1 } + +\NewChemIUPACShorthand ^ \chemmacros_superscript:n +\NewChemIUPACShorthand | \chemmacros_break_point: +\NewChemIUPACShorthand - \chemmacros_break_point_hyphen: + +\ChemCompatibilityFrom{5.1} +\NewChemIUPACShorthand ( \chemmacros_break_point_opening_paren: +\NewChemIUPACShorthand ) \chemmacros_break_point_closing_paren: +\NewChemIUPACShorthand [ \chemmacros_break_point_opening_bracket: +\NewChemIUPACShorthand ] \chemmacros_break_point_closing_bracket: +\EndChemCompatibility + +\ChemCompatibilityFrom{5.3} +\NewChemIUPAC \chemprime { \ensuremath {{}^{\prime}} } +\NewChemIUPACShorthand ' \chemprime +\EndChemCompatibility + +\cs_new_protected:Npn \chemmacros_iupac:nn #1#2 + { + \group_begin: + \bool_set_true:N \l__chemmacros_inside_iupac_bool + \chemmacros_set_keys:nn {nomenclature} {#1} + \chemmacros_make_iupac: + \chemmacros_make_shorthands: + % what's this vvv in here for? + \chemmacros_ignore_spaces: + \chemmacros_if_compatibility:nnT {<=} {5.2} + { \chemmacros_define_deprecated:NN \- - } + \tl_set_rescan:Nnn \l__chemmacros_tmpa_tl + { \chemmacros_activate_all_iupac_shorthands: } + {#2} + \l__chemmacros_tmpa_tl + \group_end: + } + +\cs_new_protected:Npn \chemmacros_iupac:n #1 { \chemmacros_iupac:nn {} {#1} } + +\ChemCompatibilityTo{5.3} +% Thanks to Joseph Wright and Enrico Gregorio for the help on the curious +% redefinition of \- and the end of the compilation +% see http://tex.stackexchange.com/q/42405/5049 for reference +\cs_set_protected:Npx \- { \exp_not:o { \- } } +\cs_set_eq:NN \@dischyph \- +\EndChemCompatibility + +\NewDocumentCommand \iupac {O{}m} { \chemmacros_iupac:nn {#1} {#2} } + +% -------------------------------------------------------------------------- +% R(ectus)/S(inister): +\NewChemIUPAC \rectus { \cip {R} } +\NewChemIUPAC \sinister { \cip {S} } + +\LetChemIUPAC \R \rectus +\LetChemIUPAC \S \sinister + +% E(ntgegen)/Z(usammen) +\NewChemIUPAC \entgegen { \cip {E} } +\NewChemIUPAC \zusammen { \cip {Z} } + +\LetChemIUPAC \E \entgegen +\LetChemIUPAC \Z \zusammen + +% cis/trans +\NewChemIUPAC \cis { \textit {cis} } +\NewChemIUPAC \trans { \textit {trans} } + +% fac/mer +\NewChemIUPAC \fac { \textit {fac} } +\NewChemIUPAC \mer { \textit {mer} } + +% tert +\NewChemIUPAC \tert { \textit {tert} } + +% Italian descriptors - I forgot what they mean +\NewChemIUPAC \sin { \textit {sin} } +\NewChemIUPAC \ter { \textit {ter} } + +% Fischer +\NewChemIUPAC \dexter { \textsc {d} } +\NewChemIUPAC \laevus { \textsc {l} } + +\LetChemIUPAC \D \dexter +\LetChemIUPAC \L \laevus + +% ortho/meta/para +\NewChemIUPAC \ortho { \textit {o} } +\NewChemIUPAC \meta { \textit {m} } +\NewChemIUPAC \para { \textit {p} } + +% syn/anti +\NewChemIUPAC \syn { \textit {syn} } +\NewChemIUPAC \anti { \textit {anti} } + +% coordination chemistry: +\NewChemIUPAC \hapto { \chemmacros_hapto:n } +\NewChemIUPAC \dento { \chemmacros_dento:n } +\NewChemIUPAC \bridge { \chemmacros_bridge:n } + +% attachments to heteroatoms / added hydrogen +\NewChemIUPAC \hydrogen { \textit {H} } +\NewChemIUPAC \oxygen { \textit {O} } +\NewChemIUPAC \nitrogen { \textit {N} } +\NewChemIUPAC \sulfur { \textit {S} } +\NewChemIUPAC \phosphorus { \textit {P} } + +% atoms: +\LetChemIUPAC \H \hydrogen +\LetChemIUPAC \O \oxygen +\LetChemIUPAC \N \nitrogen +\LetChemIUPAC \Sf \sulfur +\LetChemIUPAC \P \phosphorus + +% greek letters +\NewChemIUPAC \a { \chemalpha } +\NewChemIUPAC \b { \chembeta } +\NewChemIUPAC \g { \chemgamma } +\NewChemIUPAC \d { \chemdelta } +\NewChemIUPAC \k { \chemkappa } +\NewChemIUPAC \m { \chemmu } +\NewChemIUPAC \n { \chemeta } +\NewChemIUPAC \w { \chemomega } + +% -------------------------------------------------------------------------- +% latin phrases +\tl_new:N \l__chemmacros_latin_format_tl + +\NewChemMacroset {Latin} {mm} + { \chemmacros_define_latin:Nn #1 {#2} } + +\ChemCompatibilityTo{5.7} +\chemmacros_define_keys:nn {nomenclature} + { + latin-format .tl_set:N = \l__chemmacros_latin_format_tl , + latin-format .initial:n = \textit , + } + +\cs_new_protected:Npn \chemmacros_latin:n #1 + { { \l__chemmacros_latin_format_tl {#1} } } + +\cs_new_protected:Npn \chemmacros_define_latin:Nn #1#2 + { \cs_set_protected:Npn #1 { \chemmacros_latin:n {#2} } } + +\AtBeginDocument + { + % if chemstyle is loaded use chemstyle's definition: + \chemmacros_if_package_loaded:nT {chemstyle} + { + \AfterPackage* {chemstyle} + { + \cs_undefine:N \invacuo + \cs_set_eq:NN \chemmacros_latin:n \cst@latin + } + } + \cs_if_exist:NTF \latin + { \cs_set_eq:NN \latin \chemmacros_latin:n } + { \cs_new_eq:NN \latin \chemmacros_latin:n } + \NewChemLatin \insitu {in~situ} + \NewChemLatin \abinitio {ab~initio} + \NewChemLatin \invacuo {in~vacuo} + } +\EndChemCompatibility + +\ChemCompatibilityFrom{5.7} +\chemmacros_define_keys:nn {nomenclature} + { + format .tl_set:N = \l__chemmacros_latin_format_tl , + format .initial:n = \emph , + } + +\cs_new_protected:Npn \chemmacros_write_latin:n #1 + { + \group_begin: + \l__chemmacros_latin_format_tl {#1} + \group_end: + } + +\cs_new_protected:Npn \chemmacros_latin:n #1 + { \chemmacros_write_latin:n {#1} } + +\cs_new_protected:Npn \chemmacros_define_latin:Nn #1#2 + { \DeclareDocumentCommand #1 {O{}} { \latin [##1] {#2} } } + +\NewDocumentCommand \latin {O{}m} + { + \group_begin: + \chemmacros_set_keys:nn {nomenclature} {#1} + \chemmacros_latin:n {#2} + \group_end: + } + +\AtBeginDocument + { + \AfterPackage* {chemstyle} { \cs_undefine:N \invacuo } + \NewChemLatin \insitu {in~situ} + \NewChemLatin \abinitio {ab~initio} + \NewChemLatin \invacuo {in~vacuo} + } + +\EndChemCompatibility + +% -------------------------------------------------------------------------- +% hyperref support +% ?? unsure about adding IUPAC commands +\AfterPackage* {hyperref} + { + \pdfstringdefDisableCommands + { + % \cs_set:Npn \- { - } % maybe not a good idea... + % \cs_set:Npn \| { } + % \cs_set:Npn \pH { pH } + % \cs_set:Npn \pOH { pOH } + \cs_set:Npn \iupac #1 {#1} + \cs_set:Npn \cip #1 {(#1)} + \cs_set:Npn \cis {cis} + \cs_set:Npn \trans {trans} + \cs_set:Npn \tert {tert} + \cs_set:Npn \ortho {o} + \cs_set:Npn \meta {m} + \cs_set:Npn \para {p} + \cs_set:Npn \syn {syn} + \cs_set:Npn \anti {anti} + \cs_set:Npn \R {(R)} + \cs_set:Npn \S {(S)} + \cs_set:Npn \E {(E)} + \cs_set:Npn \Z {(Z)} + \cs_set:Npn \D {D} + \cs_set:Npn \L {L} + \cs_set:Npn \H {H} + \cs_set:Npn \O {O} + \cs_set:Npn \N {N} + \cs_set:Npn \Sf {S} + \cs_set:Npn \P {P} + \cs_set:Npn \dexter {D} + \cs_set:Npn \laevus {L} + \cs_set:Npn \rectus {(R)} + \cs_set:Npn \sinister {(S)} + \cs_set:Npn \entgegen {(E)} + \cs_set:Npn \zusammen {(Z)} + \cs_set:Npn \hydrogen {H} + \cs_set:Npn \oxygen {O} + \cs_set:Npn \nitrogen {N} + \cs_set:Npn \sulfur {S} + \cs_set:Npn \phosphorus {P} + \cs_set:Npn \chemprime {'} + } + } + +% -------------------------------------------------------------------------- +\tex_endinput:D + +2015/10/01 - use new function \chemmacros_if_document:TF for + \chemmacros_make_iupac: + - \cip only italicizes elements of csv list + - fix bug in \RemoveChemIUPACShorthand +2016/01/02 - \chemprime +2016/01/23 - give shorthand definitions only inside \iupac +2016/01/25 - small improvements (?) of the shorthand code +2016/05/08 - check if \latin is already defined (eg by achemso) and overwrite + definition +2016/05/10 - define \chemmacros_hapto:n and friends in terms of + \chemmacros_coordination_symbol:nnnn + - \iupac gets an optional argument for setting options +2016/05/31 - overwrite any \latin definition -- or rather: just define \latin + - \latin and all macros defined with \NewChemLatin get an optional + argument for setting options +2016/06/07 - rename functions which erroneously were assigned to the + `chemformula' module +2017/04/17 - fix erroneous definition of \chemmacros_allow_hyphens: + - new options `cip-inner-format', `cip-outer-format' and + `cip-number-format' +2017/06/11 - change behaviour of \__chemmacros_break_point_insert:nnn so + it does nothing as last token in \iupac diff --git a/macros/latex/contrib/chemmacros/chemmacros.module.orbital.code.tex b/macros/latex/contrib/chemmacros/chemmacros.module.orbital.code.tex new file mode 100644 index 0000000000..d3f3a5a16f --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.module.orbital.code.tex @@ -0,0 +1,576 @@ +% -------------------------------------------------------------------------- +% +% the CHEMMACROS package -- module: `orbital' +% +% -------------------------------------------------------------------------- +% 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-2017 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{orbital}{2015/07/14 drawing orbital shapes} + +\chemmacros_load_module:n {tikz} + +% \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 +\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 +\bool_new:N \l__chemmacros_orbital_p_half_bool +\bool_new:N \l__chemmacros_orbital_overlay_bool +\bool_new:N \l__chemmacros_orbital_opacity_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 +\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 } +\fp_new:N \l__chemmacros_orbital_opacity_fp +\fp_set:Nn \l__chemmacros_orbital_opacity_fp { 0.5 } + +\cs_new: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:Npn \__chemmacros_orbital_overlay: + { \bool_if:NT \l__chemmacros_orbital_overlay_bool { overlay } } + +\cs_new: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_protected: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 + } + +\chemmacros_define_keys:nn {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 } , + scale .tl_set:N = \l__chemmacros_orbital_s_scale_tl , + color .tl_set:N = \l__chemmacros_orbital_s_color_tl + } + +\cs_new_protected:Npn \__chemmacros_orbital_s_draw:n #1 + { + \chemmacros_set_keys:nn {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:x + { ball~color = \exp_not:V \l__chemmacros_orbital_s_phase_color_tl } + (0pt,0pt) circle (\exp_not:V \l__chemmacros_orbital_s_scale_tl * .6em) ; + } + } + +% -------------------------------------------------------------------------- +% p-orbitals +\cs_new_protected: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 + } + +\chemmacros_define_keys:nn {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_protected:Npn \__chemmacros_orbital_p_draw:n #1 + { + \chemmacros_set_keys:nn {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:x + { + draw = \exp_not:V \l__chemmacros_orbital_p_pphase_color_tl , + ball~color = \exp_not:V \l__chemmacros_orbital_p_pphase_color_tl + } + (0pt,0pt) .. 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 + ) + .. (0pt,0pt); + \bool_if:NF \l__chemmacros_orbital_p_half_bool + { + \chemmacros_tikz_shadedraw:x + { + draw = \exp_not:V \l__chemmacros_orbital_p_mphase_color_tl , + ball~color = \exp_not:V \l__chemmacros_orbital_p_mphase_color_tl + } + (0pt,0pt) .. 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 + ) + .. (0pt,0pt); + } + } + } + +% -------------------------------------------------------------------------- +% sp-orbitals +\cs_new_protected: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 + } + +\chemmacros_define_keys:nn {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_protected:Npn \__chemmacros_orbital_sp_draw:n #1 + { + \chemmacros_set_keys:nn {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:x + { + draw = \exp_not:V \l__chemmacros_orbital_sp_pphase_color_tl , + ball~color = \exp_not:V \l__chemmacros_orbital_sp_pphase_color_tl + } + (0pt,0pt) .. 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 + ) + .. (0pt,0pt); + \chemmacros_tikz_shadedraw:x + { + draw = \exp_not:V \l__chemmacros_orbital_sp_mphase_color_tl , + ball~color = \exp_not:V \l__chemmacros_orbital_sp_mphase_color_tl + } + (0pt,0pt) .. 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 + ) + .. (0pt,0pt); + } + } + +% -------------------------------------------------------------------------- +% sp2-orbitals +\cs_new_protected: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 + } + +\chemmacros_define_keys:nn {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_protected:Npn \__chemmacros_orbital_sptwo_draw:n #1 + { + \chemmacros_set_keys:nn {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:x + { + draw = \exp_not:V \l__chemmacros_orbital_sptwo_pphase_color_tl , + ball~color = \exp_not:V \l__chemmacros_orbital_sptwo_pphase_color_tl + } + (0pt,0pt) .. 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 + ) + .. (0pt,0pt); + \chemmacros_tikz_shadedraw:x + { + draw = \exp_not:V \l__chemmacros_orbital_sptwo_mphase_color_tl , + ball~color = \exp_not:V \l__chemmacros_orbital_sptwo_mphase_color_tl + } + (0pt,0pt) .. 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 + ) + .. (0pt,0pt); + } + } + +% -------------------------------------------------------------------------- +% sp3-orbitals +\cs_new_protected: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 + } + +\chemmacros_define_keys:nn {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_protected:Npn \__chemmacros_orbital_spthree_draw:n #1 + { + \chemmacros_set_keys:nn {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:x + { + draw = \exp_not:V \l__chemmacros_orbital_spthree_pphase_color_tl , + ball~color = \exp_not:V \l__chemmacros_orbital_spthree_pphase_color_tl + } + (0pt,0pt) .. 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 + ) + .. (0pt,0pt); + \chemmacros_tikz_shadedraw:x + { + draw = \exp_not:V \l__chemmacros_orbital_spthree_mphase_color_tl , + ball~color = \exp_not:V \l__chemmacros_orbital_spthree_mphase_color_tl + } + (0pt,0pt) .. 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 + ) + .. (0pt,0pt); + } + } + +% -------------------------------------------------------------------------- +% main command +\chemmacros_define_keys:nn {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 } + } + } + +\chemmacros_define_keys:nn {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: } + } + +\cs_new_protected:Npn \chemmacros_orbital:n #1 + { + \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 } } + } + +\NewDocumentCommand \orbital {om} + { + \group_begin: + \chemmacros_set_keys:nn {orbital/type} {#2} + \IfNoValueTF {#1} + { \chemmacros_orbital:n { } } + { \chemmacros_orbital:n {#1} } + \group_end: + } +% -------------------------------------------------------------------------- diff --git a/macros/latex/contrib/chemmacros/chemmacros.module.particles.code.tex b/macros/latex/contrib/chemmacros/chemmacros.module.particles.code.tex new file mode 100644 index 0000000000..44cde87840 --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.module.particles.code.tex @@ -0,0 +1,141 @@ +% -------------------------------------------------------------------------- +% +% the CHEMMACROS package -- module: `particles' +% +% -------------------------------------------------------------------------- +% 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-2017 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{particles}{2016/04/02 particles} + +\chemmacros_load_modules:n {charges,chemformula} + +% -------------------------------------------------------------------------- +% particles +\cs_new_protected:Nn \chemmacros_define_particle:Nn + { + \tl_set_rescan:Nnn \l__chemmacros_tmpa_tl { \ExplSyntaxOff } {#2} + \use:x + { + \cs_set_protected:Npn \exp_not:N #1 + { \chemmacros_chemformula:n { \exp_not:V \l__chemmacros_tmpa_tl } } + } + } + +\NewChemMacroset {Particle} {mm} + { \chemmacros_define_particle:Nn #1 {#2} } + +% -------------------------------------------------------------------------- +% nucleophiles +\cs_new_protected:Npn \chemmacros_elpair:n #1 + { + \bool_if:NTF \l__chemmacros_elpair_dots_bool + { \chlewis { 0: } {#1} } + { \chlewis { 0| } {#1} } + } + +\bool_new:N \l__chemmacros_nucleophile_elpair_bool +\bool_new:N \l__chemmacros_elpair_dots_bool + +\ChemCompatibilityFrom{5.3} +\dim_new:N \l__chemmacros_nucleophile_dim +\dim_set:Nn \l__chemmacros_nucleophile_dim { .1em } + +\chemmacros_define_keys:nn {particles} + { + space .dim_set:N = \l__chemmacros_nucleophile_dim + } +\EndChemCompatibility + +\chemmacros_define_keys:nn {particles} + { + elpair .choice: , + elpair / false .code:n = + { \bool_set_false:N \l__chemmacros_nucleophile_elpair_bool } , + elpair / dots .code:n = + { + \bool_set_true:N \l__chemmacros_nucleophile_elpair_bool + \bool_set_true:N \l__chemmacros_elpair_dots_bool + } , + elpair / dash .code:n = + { + \bool_set_true:N \l__chemmacros_nucleophile_elpair_bool + \bool_set_false:N \l__chemmacros_elpair_dots_bool + } , + elpair .default:n = dots + } + +\cs_new_protected:Npn \chemmacros_declare_nucleophile:Nn #1#2 + { + \cs_set_protected:cpn {__chemmacros_ \chemmacros_remove_backslash:N #1:} + { + \bool_if:NTF \l__chemmacros_nucleophile_elpair_bool + { + \chemmacros_elpair:n { #2 } + \chemmacros_if_compatibility:nnT {>=} {5.3} + { \skip_horizontal:N \l__chemmacros_nucleophile_dim } + \chemmacros_chemformula:n { {}^{-} } + } + { \chemmacros_chemformula:n { #2^{-} } } + } + \DeclareDocumentCommand #1 {o} + { + \group_begin: + \IfNoValueF {##1} + { \chemmacros_set_keys:nn {particles} {##1} } + \use:c {__chemmacros_ \chemmacros_remove_backslash:N #1:} + \group_end: + } + } + +\NewChemMacroset {Nucleophile} {mm} + { \chemmacros_declare_nucleophile:Nn #1 {#2} } + +% -------------------------------------------------------------------------- +% particles: +\NewChemParticle \el { e^- } +\NewChemParticle \prt { p^+ } +\NewChemParticle \ntr { n^0 } + +% ions, molecules +% proton, hydroxide, hydronium/oxonium, water: +\NewChemParticle \Hpl { H^+ } +\NewChemParticle \Hyd { OH^- } +\NewChemParticle \Oxo { H_3O^+ } +\NewChemParticle \water { H_2O } + +% electrophile: +\NewChemParticle \El { E^+ } + +% nucleophiles: +\NewChemNucleophile \Nuc {Nu} +\NewChemNucleophile \ba {ba} + +\ChemCompatibilityTo{5.3} + \DeclareChemDeprecated \Hto \Oxo + \DeclareChemDeprecated \Nu \Nuc +\EndChemCompatibility + +% -------------------------------------------------------------------------- +\tex_endinput:D +2016/01/13 - new option particles/space +2016/04/02 - adapt to formula methods `chemist' and `chemfig' diff --git a/macros/latex/contrib/chemmacros/chemmacros.module.phases.code.tex b/macros/latex/contrib/chemmacros/chemmacros.module.phases.code.tex new file mode 100644 index 0000000000..5f2bcc1dcd --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.module.phases.code.tex @@ -0,0 +1,140 @@ +% -------------------------------------------------------------------------- +% +% the CHEMMACROS package -- module: `phases' +% +% -------------------------------------------------------------------------- +% 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-2017 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{phases}{2016/05/31 phase descriptors} + +\chemmacros_load_module:n {chemformula} + +\bool_new:N \l__chemmacros_phases_sub_bool +\dim_new:N \l__chemmacros_phases_space_dim +\dim_set:Nn \l__chemmacros_phases_space_dim { .1333 em } + +\chemmacros_define_keys:nn {phases} + { + pos .choice: , + pos / sub .code:n = \bool_set_true:N \l__chemmacros_phases_sub_bool , + pos / side .code:n = \bool_set_false:N \l__chemmacros_phases_sub_bool , + space .dim_set:N = \l__chemmacros_phases_space_dim + } + +\NewChemMacroset {Phase} {mm} + { \chemmacros_define_phase:Nn #1 {#2} } + +\ChemCompatibilityTo{5.7} +\cs_new_protected:Npn \chemmacros_define_phase:Nn #1#2 + { + \tl_set:Nx \l__chemmacros_tmpa_tl { phase-\chemmacros_remove_backslash:N #1 } + \exp_args:NV \@trnslt@declare@translation + \l__chemmacros_tmpa_tl + {fallback} + {#2} + \__chemmacros_define_phase:Nx #1 + { \exp_not:N \chemmacros_translate:n { \exp_not:V \l__chemmacros_tmpa_tl } } + } +\EndChemCompatibility + +\ChemCompatibilityFrom{5.7} +\cs_new_protected:Npn \chemmacros_define_phase:Nn #1#2 + { + \tl_set:Nx \l__chemmacros_tmpa_tl { phase-\chemmacros_remove_backslash:N #1 } + \chemmacros_declare_translation:Vnn + \l__chemmacros_tmpa_tl + {fallback} + {#2} + \__chemmacros_define_phase:Nx #1 + { \exp_not:N \chemmacros_translate:n { \exp_not:V \l__chemmacros_tmpa_tl } } + } +\EndChemCompatibility + +\cs_new_protected:Npn \__chemmacros_define_phase:Nn #1#2 + { + \cs_if_exist:NF #1 { \cs_new:Npn #1 {} } + \DeclareDocumentCommand #1 {o} + { \chemmacros_phase:n { #2 \IfNoValueF {##1} {,~##1} } } + } +\cs_generate_variant:Nn \__chemmacros_define_phase:Nn { Nx } + +\cs_new_protected:Npn \chemmacros_phase:n #1 + { + \chemmacros_leave_vmode: + \bool_if:NTF \l__chemmacros_phases_sub_bool + { \chemformula_subscript:n { (#1) } } + { + \skip_horizontal:N \l__chemmacros_phases_space_dim + \chemmacros_text:n { (#1) } + } + } + +% -------------------------------------------------------------------------- +\NewDocumentCommand \phase {m} { \chemmacros_phase:n {#1} } + +\NewChemPhase \sld {s} +\NewChemPhase \lqd {l} +\NewChemPhase \gas {g} +\NewChemPhase \aq {aq} + +% -------------------------------------------------------------------------- +\ChemCompatibilityTo{5.6} +\DeclareTranslation {English} {phase-sld} {s} +\DeclareTranslation {German} {phase-sld} {f} + +\DeclareTranslation {English} {phase-lqd} {l} +\DeclareTranslation {German} {phase-lqd} {f\/l} + +\DeclareTranslation {English} {phase-gas} {g} +\DeclareTranslation {German} {phase-gas} {g} + +\DeclareTranslation {English} {phase-aq} {aq} +\DeclareTranslation {German} {phase-aq} {aq} +\EndChemCompatibility + +\ChemCompatibilityFrom{5.6} +\chemmacros_declare_translations:nn {phase-sld} + { + fallback = s , + German = f + } + +\chemmacros_declare_translations:nn {phase-lqd} + { + fallback = l , + German = f\/l + } + +\chemmacros_declare_translations:nn {phase-gas} + { fallback = g } + +\chemmacros_declare_translations:nn {phase-aq} + { fallback = aq } +\EndChemCompatibility + +% -------------------------------------------------------------------------- +\tex_endinput:D + +2015/06/09 - first version +2016/04/27 - moved translations from lang module to phases module +2016/05/31 - adapt to changes in `lang' module diff --git a/macros/latex/contrib/chemmacros/chemmacros.module.polymers.code.tex b/macros/latex/contrib/chemmacros/chemmacros.module.polymers.code.tex new file mode 100644 index 0000000000..8c93ff002c --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.module.polymers.code.tex @@ -0,0 +1,166 @@ +% -------------------------------------------------------------------------- +% +% the CHEMMACROS package -- module: `polymers' +% +% -------------------------------------------------------------------------- +% 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-2017 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{polymers}{2016/03/08 polymers} + +\chemmacros_load_modules:n {nomenclature,tikz} + +% -------------------------------------------------------------------------- +% copolymers +\NewChemIUPAC \copolymer { \textit {co} } +\LetChemIUPAC \co \copolymer + +\NewChemIUPAC \statistical { \textit {stat} } +\LetChemIUPAC \stat \statistical + +\NewChemIUPAC \random { \textit {ran} } +\LetChemIUPAC \ran \random + +\NewChemIUPAC \alternating { \textit {alt} } +\LetChemIUPAC \alt \alternating + +\NewChemIUPAC \periodic { \textit {per} } +\LetChemIUPAC \per \periodic + +\NewChemIUPAC \block { \textit {block} } +\NewChemIUPAC \graft { \textit {graft} } + +% -------------------------------------------------------------------------- +% non-linear (co)polymers +\NewChemIUPAC \blend { \textit {blend} } +\NewChemIUPAC \comb { \textit {comb} } + +\NewChemIUPAC \complex { \textit {compl} } +\LetChemIUPAC \compl \complex + +\NewChemIUPAC \cyclic { \textit {cyclo} } +\LetChemIUPAC \cyclo \cyclic + +\NewChemIUPAC \branch { \textit {branch} } +\NewChemIUPAC \network { \textit {net} } +\LetChemIUPAC \net \network + +\NewChemIUPAC \ipnetwork { \textit {ipn} } +\LetChemIUPAC \ipn \ipnetwork + +\NewChemIUPAC \sipnetwork { \textit {sipn} } +\LetChemIUPAC \sipn \sipnetwork + +\NewChemIUPAC \star { \textit {star} } + +% -------------------------------------------------------------------------- + +\tl_new:N \l__chemmacros_polymer_delimiter_left_tl +\tl_new:N \l__chemmacros_polymer_delimiter_right_tl + +\tl_new:N \l__chemmacros_polymer_subscript_tl +\tl_new:N \l__chemmacros_polymer_superscript_tl + +\dim_new:N \l__chemmacros_polymer_delimiter_height_dim +\dim_new:N \l__chemmacros_polymer_delimiter_depth_dim + +\cs_new_protected:Npn \__chemmacros_set_polymer_delimiters:NN #1#2 + { + \tl_set:Nn \l__chemmacros_polymer_delimiter_left_tl {#1} + \tl_set:Nn \l__chemmacros_polymer_delimiter_right_tl {#2} + } + +% #1: height +% #2: depth +% #3: opening node +% #4: closing node +% #5: subscript +% #6: superscript +\cs_new_protected:Npn \chemmacros_make_polymer_braces:nnnnnn #1#2#3#4#5#6 + { + \dim_set:Nn \l__chemmacros_polymer_delimiter_height_dim { (#1+#2)/2 } + \dim_set:Nn \l__chemmacros_polymer_delimiter_depth_dim { (#1-#2)/2 } + \chemmacros_tikz_picture:nn {remember~ picture, overlay } + { + \chemmacros_tikz_node:n + { at = (#3) , yshift = \l__chemmacros_polymer_delimiter_depth_dim } + { + \c_math_toggle_token + \tex_left:D \l__chemmacros_polymer_delimiter_left_tl + \tex_vrule:D + height \l__chemmacros_polymer_delimiter_height_dim + depth \l__chemmacros_polymer_delimiter_height_dim + width \c_zero_dim + \tex_right:D . + \c_math_toggle_token + } ; + \chemmacros_tikz_node:n + { at = (#4) , yshift = \l__chemmacros_polymer_delimiter_depth_dim } + { + \c_math_toggle_token + \tex_left:D . + \tex_vrule:D + height \l__chemmacros_polymer_delimiter_height_dim + depth \l__chemmacros_polymer_delimiter_height_dim + width \c_zero_dim + \tex_right:D \l__chemmacros_polymer_delimiter_right_tl + \c_math_subscript_token { \hbox_overlap_right:n {#5} } + \c_math_superscript_token { \hbox_overlap_right:n {#6} } + \c_math_toggle_token + } ; + } + } +\cs_generate_variant:Nn \chemmacros_make_polymer_braces:nnnnnn {nnnnVV} + +\chemmacros_define_keys:nn {polymers} + { + delimiters .code:n = \__chemmacros_set_polymer_delimiters:NN #1 , + delimiters .initial:n = [] , + superscript .tl_set:N = \l__chemmacros_polymer_superscript_tl , + subscript .tl_set:N = \l__chemmacros_polymer_subscript_tl , + subscript .initial:n = $n$ + } + +\NewDocumentCommand \makepolymerdelims {O{}momm} + { + \group_begin: + \chemmacros_set_keys:nn {polymers} {#1} + \IfNoValueTF {#3} + { + \chemmacros_make_polymer_braces:nnnnVV {#2} {#2} {#4} {#5} + \l__chemmacros_polymer_subscript_tl + \l__chemmacros_polymer_superscript_tl + } + { + \chemmacros_make_polymer_braces:nnnnVV {#2} {#3} {#4} {#5} + \l__chemmacros_polymer_subscript_tl + \l__chemmacros_polymer_superscript_tl + } + \group_end: + } + +% -------------------------------------------------------------------------- +\tex_endinput:D + +2016/03/07 - first version +2016/03/08 - \makepolymerdelims + diff --git a/macros/latex/contrib/chemmacros/chemmacros.module.reactions.code.tex b/macros/latex/contrib/chemmacros/chemmacros.module.reactions.code.tex new file mode 100644 index 0000000000..35be8b3e90 --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.module.reactions.code.tex @@ -0,0 +1,433 @@ +% -------------------------------------------------------------------------- +% +% the CHEMMACROS package -- module: `reactions' +% +% -------------------------------------------------------------------------- +% 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-2017 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{reactions}{2016/05/04 reaction environments} + +\chemmacros_load_module:n {chemformula} + +\RequirePackage{mathtools} + +% -------------------------------------------------------------------------- +\cs_new_protected:Npn \__chemmacros_record_for_lor:nnnnn #1#2#3#4#5 + { + \tl_if_eq:nnT {#1} {reaction} + { + \group_begin: + % we need to prevent \Hy@make@anchor from being written to the lor + % file: + \bool_if:NT \l__chemmacros_hyperref_bool + { \cs_set:Npn \Hy@make@anchor {} } + \addcontentsline {lor} {reaction} + { + \tl_use:N \l__chemmacros_reaction_lorname_tl + \tl_use:N \c_space_tl + #2 #3 #4 #5 + \tl_use:N \g__chemmacros_reaction_description_tl + } + \tl_gclear:N \g__chemmacros_reaction_description_tl + \group_end: + } + } + +% redefine mathtools' command \MT_define_tagform:nwnn to ensure we add an +% entry to the list of reactions even if the user redefines the reaction tag +% this should probably be done via patching... +\AfterPackage* { mathtools } + { + \cs_set_protected:Npn \MT_define_tagform:nwnn #1[#2]#3#4 + { + \@namedef{MT_tagform_#1:n}##1 + { + % this is the original part: + \maketag@@@{#3\ignorespaces#2{##1}\unskip\@@italiccorr#4} + % this is added => this disturbs hyperref: + \__chemmacros_record_for_lor:nnnnn + {#1} {#3} {#2} {##1} {#4} + } + } + } + +\tl_new:N \g__chemmacros_reaction_description_tl + +\cs_new_protected:Npn \chemmacros_add_reaction_description:n #1 + { + \tl_if_blank:nF {#1} + { \tl_gset:Nn \g__chemmacros_reaction_description_tl {:~#1} } + } + +\NewDocumentCommand \AddRxnDesc {m} + { \chemmacros_add_reaction_description:n {#1} } + +% define \listofreactions +\tl_new:N \l__chemmacros_reaction_lorname_tl +\tl_new:N \reactionlistname +\tl_new:N \l__chemmacros_reaction_heading_tl + +\cs_new:Npn \__chemmacros_reaction_heading:n #1 + { \l__chemmacros_reaction_heading_tl {#1} } +\cs_generate_variant:Nn \__chemmacros_reaction_heading:n { V } + +\ChemCompatibilityTo{5.6} +\tl_set:Nn \l__chemmacros_reaction_lorname_tl + { \chemmacros_translate:n {reaction} } +\EndChemCompatibility +\ChemCompatibilityFrom{5.6} +\tl_set:Nn \l__chemmacros_reaction_lorname_tl + { \chemmacros_translate:n {Reaction} } +\EndChemCompatibility + +\tl_set:Nn \reactionlistname { \chemmacros_translate:n {list-of-reactions} } + +\chemmacros_define_keys:nn {reactions} + { + list-name .tl_set:N = \reactionlistname , + list-entry .tl_set:N = \l__chemmacros_reaction_lorname_tl , + } +\ChemCompatibilityFrom{5.2} +\chemmacros_define_keys:nn {reactions} + { + list-heading-cmd .code:n = + \cs_set_protected:Npn \__chemmacros_reaction_heading:n ##1 {#1} + } +\EndChemCompatibility + +\cs_if_exist:NTF \chapter + { + \chemmacros_if_compatibility:nnTF {>=} {5.2} + { + \chemmacros_set_keys:nn {reactions} + { list-heading-cmd = \chapter* {#1} } + } + { \cs_set_protected:Npn \__chemmacros_reaction_heading:n { \chapter* } } + } + { + \chemmacros_if_compatibility:nnTF {>=} {5.2} + { + \chemmacros_set_keys:nn {reactions} + { list-heading-cmd = \section* {#1} } + } + { \cs_set_protected:Npn \__chemmacros_reaction_heading:n { \section* } } + } + +\cs_new_protected:Npn \listofreactions + { + \__chemmacros_reaction_heading:V \reactionlistname + \@starttoc {lor} + } + +\ChemCompatibilityTo{5.6} +\cs_new_protected:Npn \l@reaction #1#2 + { \@dottedtocline {1} {1.5em} {2.3em} {#1} {#2} } +\EndChemCompatibility + +\ChemCompatibilityFrom{5.6} +\cs_new_eq:NN \l@reaction \l@figure + +\bool_new:N \l__chemmacros_reactions_tocbasic_bool +\cs_if_exist:NT \KOMAClassName + { \bool_set_true:N \l__chemmacros_reactions_tocbasic_bool } + +\tl_new:N \l__chemmacros_reactions_tag_open_tl +\tl_new:N \l__chemmacros_reactions_tag_close_tl +\tl_new:N \l__chemmacros_reactions_before_tag_tl + +\chemmacros_define_keys:nn {reactions} + { + tocbasic .bool_set:N = \l__chemmacros_reactions_tocbasic_bool , + tag-open .tl_set:N = \l__chemmacros_reactions_tag_open_tl , + tag-open .initial:n = \{ , + tag-close .tl_set:N = \l__chemmacros_reactions_tag_close_tl , + tag-close .initial:n = \} , + before-tag .tl_set:N = \l__chemmacros_reactions_before_tag_tl + } + +\AtEndPreamble + { + \bool_if:nT + { + \chemmacros_if_package_loaded_p:n {tocbasic} || + \l__chemmacros_reactions_tocbasic_bool + } + { + \RequirePackage {tocbasic} + \addtotoclist [float] {lor} + \cs_set_protected:Npn \listofreactions { \listoftoc {lor} } + \cs_new:Npn \listoflorname { \reactionlistname } + } + } + +\ChemCleverefSupport {reaction} + { \chemmacros_translate:n {reaction} } + [ \chemmacros_translate:n {Reaction} ] + { \chemmacros_translate:n {reactions} } + [ \chemmacros_translate:n {Reactions} ] + +\AfterPackage* {cleveref} + { + \creflabelformat {reaction} + { + #2 + \l__chemmacros_reactions_tag_open_tl + #1 + \l__chemmacros_reactions_tag_close_tl + #3 + } + } + +\ChemFancyrefSupport {rct} + { \chemmacros_translate:n {reaction} } + [ \chemmacros_translate:n {Reaction} ] +\EndChemCompatibility + +% create new tagform +\ChemCompatibilityTo{5.6} +\newtagform {reaction} {\{} {\}} +\EndChemCompatibility +\ChemCompatibilityFrom{5.6} +\newtagform {reaction} + [\l__chemmacros_reactions_before_tag_tl] + {\l__chemmacros_reactions_tag_open_tl} + {\l__chemmacros_reactions_tag_close_tl} +\EndChemCompatibility +\newcounter {chemmacros_save_reaction} +\newcounter {reaction} + +\ChemCompatibilityTo{5.6} +\cs_new_protected:Npn \__chemmacros_begin_reaction: + { + % create individual names for `hyperref': + \bool_if:NT \l__chemmacros_hyperref_bool + { + \cs_set:Npn \theHequation + { R . \theHsection . \arabic {reaction} } + } + % enable labelformat `reaction': + \bool_if:NT \l__chemmacros_varioref_bool + { \cs_set_eq:NN \p@equation \p@reaction } + \setcounter {chemmacros_save_reaction} { \value {equation} } + \setcounter {equation} { \value {reaction} } + \usetagform {reaction} + } +\EndChemCompatibility + +\ChemCompatibilityFrom{5.6} +\cs_new_protected:Npn \__chemmacros_begin_reaction: + { + \patchcmd \thereaction {reaction} {equation} {} {} + \cs_set_eq:NN \theequation \thereaction + \cs_set_eq:NN \r@equation \r@reaction + \cs_set_eq:NN \p@equation \p@reaction + \cs_set:Npn \theHequation { R . \theHsection . \theequation } + \setcounter {chemmacros_save_reaction} { \value {equation} } + \setcounter {equation} { \value {reaction} } + \chemmacros_if_package_loaded:nT {cleveref} + { \crefalias {equation} {reaction} } + \usetagform {reaction} + } +\EndChemCompatibility + +% switch back to equation tags +\cs_new_protected:Npn \__chemmacros_end_reaction: + { + \setcounter {reaction} { \value {equation} } + \setcounter {equation} { \value {chemmacros_save_reaction} } + } + +\tl_new:N \l__chemmacros_reactions_args_tl + +\cs_new_protected:Npn \__chemmacros_reactions_build_args:n #1 + { \tl_put_right:Nn \l__chemmacros_reactions_args_tl { {## #1} } } + +\cs_new_protected:Npn \chemmacros_define_reaction:nnn #1#2#3 + { + \int_compare:nNnT {#3+0} > {0} + { + \tl_clear:N \l__chemmacros_reactions_args_tl + \int_step_function:nnnN {2} {1} {#3+1} \__chemmacros_reactions_build_args:n + } + \chemmacros_declare_reaction_env:nnnV {#1} {#2} {#3} \l__chemmacros_reactions_args_tl + } + +% #1: chem +% #2: math +% #3: args number +% #4: argument list ({#2}{#3}...) +\cs_new_protected:Npn \chemmacros_declare_reaction_env:nnnn #1#2#3#4 + { + \exp_args:Nnx \DeclareDocumentEnvironment {#1} { O{} \prg_replicate:nn {#3+0} {m} } + { + \chemmacros_add_reaction_description:n {##1} + \__chemmacros_begin_reaction: + \chemmacros_reaction_read:nnw {#2} {#4} + } + { + \__chemmacros_end_reaction: + \ignorespacesafterend + } + } +\cs_generate_variant:Nn \chemmacros_declare_reaction_env:nnnn {nnnV} + +\ChemCompatibilityTo{5.6} +\cs_new_protected:Npn \chemmacros_reaction_read:nnw #1#2#3 \end + { + \begin{#1}#2 + \chemmacros_reaction:n {#3} + \end{#1} + \end + } +\EndChemCompatibility + +\ChemCompatibilityFrom{5.6} +\cs_new_protected:Npn \chemmacros_reaction_read:nnw #1#2#3 \end + { + \tl_clear:N \l__chemmacros_tmpa_tl + \seq_clear:N \l__chemmacros_tmpc_seq + \seq_set_split:Nnn \l__chemmacros_tmpa_seq {\\} {#3} + \int_set:Nn \l__chemmacros_tmpa_int + { \seq_count:N \l__chemmacros_tmpa_seq } + \int_zero:N \l__chemmacros_tmpb_int + \seq_map_inline:Nn \l__chemmacros_tmpa_seq + { + \int_incr:N \l__chemmacros_tmpb_int + \seq_clear:N \l__chemmacros_tmpc_seq + \seq_set_split:Nnn \l__chemmacros_tmpb_seq {&} {##1} + \seq_map_inline:Nn \l__chemmacros_tmpb_seq + { + \seq_put_right:Nn \l__chemmacros_tmpc_seq + { \chemmacros_reaction:n {####1} } + } + \tl_put_right:Nx \l__chemmacros_tmpa_tl + { \seq_use:Nn \l__chemmacros_tmpc_seq {&} } + \int_compare:nF + { \l__chemmacros_tmpa_int = \l__chemmacros_tmpb_int } + { \tl_put_right:Nn \l__chemmacros_tmpa_tl {\\} } + } + \chemmacros_reaction_write:nnV {#1} {#2} \l__chemmacros_tmpa_tl + \end + } + +\cs_new_protected:Npn \chemmacros_reaction_write:nnn #1#2#3 + { + \begin{#1}#2 + #3 + \end{#1} + } +\cs_generate_variant:Nn \chemmacros_reaction_write:nnn { nnV } +\EndChemCompatibility + +\NewChemMacroset* {Reaction} {mO{}m} + { \chemmacros_define_reaction:nnn {#1} {#3} {#2} } + +\NewChemReaction {reaction} {equation} +\NewChemReaction {reaction*} {equation*} +\NewChemReaction {reactions} {align} +\NewChemReaction {reactions*} {align*} + +% -------------------------------------------------------------------------- +\ChemCompatibilityTo{5.6} +\DeclareTranslationFallback {list-of-reactions} {List~ of~ Reactions} +\DeclareTranslation {English} {list-of-reactions} {List~ of~ Reactions} +\DeclareTranslation {German} {list-of-reactions} {Reaktionsverzeichnis} +\DeclareTranslation {Italian} {list-of-reactions} {Elenco~ delle~ reazioni} +\DeclareTranslation {French} {list-of-reactions} {Table~ des~ r\'{e}actions} +\DeclareTranslation {Dutch} {list-of-reactions} {Lijst~ van~ reacties} + +\DeclareTranslationFallback {reaction} {Reaction} +\DeclareTranslation {English} {reaction} {Reaction} +\DeclareTranslation {German} {reaction} {Reaktion} +\DeclareTranslation {Italian} {reaction} {Reazione} +\DeclareTranslation {French} {reaction} {R\'{e}action} +\DeclareTranslation {Dutch} {reaction} {Reactie} +\EndChemCompatibility + +\ChemCompatibilityFrom{5.6} +\chemmacros_declare_translations:nn {list-of-reactions} + { + fallback = List~ of~ Reactions , + English = List~ of~ Reactions , + German = Reaktionsverzeichnis , + Italian = Elenco~ delle~ reazioni , + French = Table~ des~ r\'{e}actions , + Dutch = Lijst~ van~ reacties + } + +\chemmacros_declare_translations:nn {reaction} + { + fallback = reaction , + English = reaction , + German = Reaktion , + Italian = reazione , + French = r\'{e}action , + Dutch = reactie + } + +\chemmacros_declare_translations:nn {reactions} + { + fallback = reactions , + English = reactions , + German = Reaktionen , + Italian = reazioni , + French = r\'{e}actions , + Dutch = reacties + } + +\chemmacros_declare_translations:nn {Reaction} + { + fallback = Reaction , + English = Reaction , + German = Reaktion , + Italian = Reazione , + French = R\'{e}action , + Dutch = Reactie + } + +\chemmacros_declare_translations:nn {Reactions} + { + fallback = Reactions , + English = Reactions , + German = Reaktionen , + Italian = Reazioni , + French = R\'{e}actions , + Dutch = Reacties + } +\EndChemCompatibility +% -------------------------------------------------------------------------- +\tex_endinput:D + +2015/09/15 - adapt to `method' option => do not use chemformula's macros + directly +2015/10/14 - new option `list-heading-cmd' +2016/02/09 - added \ignorespacesafterend to environments +2016/03/17 - tocbasic integration of lor + - add missing compatibility check for the usage of the + `list-heading-cmd' option +2016/04/02 - adapt to new formula methods +2016/04/27 - correct \__chemmacros_begin_reaction: so tags obey \thereaction + - add cleveref support + - add fancyref support + - moved translations from lang module to reactions module +2016/05/04 - options `tag-open', `tag-close' and `before-tag' diff --git a/macros/latex/contrib/chemmacros/chemmacros.module.redox.code.tex b/macros/latex/contrib/chemmacros/chemmacros.module.redox.code.tex new file mode 100644 index 0000000000..9e95b9b076 --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.module.redox.code.tex @@ -0,0 +1,440 @@ +% -------------------------------------------------------------------------- +% +% the CHEMMACROS package -- module: `redox' +% +% -------------------------------------------------------------------------- +% 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-2017 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{redox}{2015/09/30 oxidation numbers, redox reactions} + +\chemmacros_load_modules:n {tikz,xfrac} + +\RequirePackage{mathtools,relsize} + +\msg_new:nnn {chemmacros} {redox} + { \token_to_str:N #1 \c_space_tl : ~ #2 ~ \msg_line_context: . } + + +% -------------------------------------------------------------------------- +% 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 +\ChemCompatibilityFrom{5.2} +\bool_new:N \l__chemmacros_ox_explicit_zero_sign_bool +\EndChemCompatibility +\bool_new:N \l__chemmacros_ox_format_roman_bool +\bool_new:N \l__chemmacros_ox_decimal_marker_comma_bool +\bool_new:N \l__chemmacros_ox_parse_bool +\bool_new:N \l__chemmacros_ox_side_bool +\bool_new:N \l__chemmacros_ox_super_bool +\bool_new:N \l__chemmacros_ox_top_bool +\bool_new:N \l__chemmacros_ox_align_center_bool + +\int_new:N \l__chemmacros_ox_number_int +\fp_new:N \l__chemmacros_ox_number_fp + +\cs_new_protected:Npn \__chemmacros_ox_process_number:n #1 + { + \bool_if:NTF \l__chemmacros_ox_parse_bool + { + \tl_if_in:nnTF {#1} { / } + { \__chemmacros_ox_fraction:w #1 \q_stop } + { + \__chemmacros_ox_sign:n {#1} + \__chemmacros_ox_value:n {#1} + } + } + {#1} + } + +\cs_new_protected:Npn \__chemmacros_ox_fraction:w #1/#2 \q_stop + { + \group_begin: + \bool_set_false:N \l__chemmacros_ox_format_roman_bool + \__chemmacros_ox_sign:n {#1} + \bool_if:NTF \l__chemmacros_ox_side_bool + { \chemmacros_ox_text_frac:nn } + { \chemmacros_ox_super_frac:nn } + { \__chemmacros_ox_value:n {#1} } + {#2} + \group_end: + } + +\ChemCompatibilityTo{5.4} +\cs_new_protected:Npn \__chemmacros_ox_sign:n #1 + { + \bool_if:nT + { + \fp_compare_p:n { #1 > 0 } && + \l__chemmacros_ox_explicit_sign_bool + } + { \c_math_toggle_token + \c_math_toggle_token } + \bool_if:nT + { + \fp_compare_p:n { #1 = 0 } && + \l__chemmacros_ox_explicit_sign_bool + } + { \c_math_toggle_token \pm \c_math_toggle_token } + \fp_compare:nT { #1 < 0 } + { \c_math_toggle_token - \c_math_toggle_token } + } +\EndChemCompatibility +\ChemCompatibilityFrom{5.4} +\cs_new_protected:Npn \__chemmacros_ox_sign:n #1 + { + \bool_if:nT + { + \fp_compare_p:n { #1 > 0 } && + \l__chemmacros_ox_explicit_sign_bool + } + { \c_math_toggle_token + \c_math_toggle_token } + \bool_if:nT + { + \fp_compare_p:n { #1 = 0 } && + \l__chemmacros_ox_explicit_sign_bool && + \l__chemmacros_ox_explicit_zero_sign_bool + } + { \c_math_toggle_token \pm \c_math_toggle_token } + \fp_compare:nT { #1 < 0 } + { \c_math_toggle_token - \c_math_toggle_token } + } +\EndChemCompatibility + +\cs_new_protected:Npn \__chemmacros_ox_value:n #1 + { + \fp_set:Nn \l__chemmacros_ox_number_fp { abs(#1) } + \__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 + { + \c_math_toggle_token + \__chemmacros_fp_to_arabic:n { \l__chemmacros_ox_number_fp } + \c_math_toggle_token + } + { + \c_math_toggle_token + \fp_use:N \l__chemmacros_ox_number_fp + \c_math_toggle_token + } + } + } + +\cs_new_protected:Npn \__chemmacros_ox_is_integer:n #1 + { + \fp_compare:nNnTF {#1} = { round((#1) + 1 , 0 ) - 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_new_protected:Npn \__chemmacros_fp_to_Roman:n #1 + { + \group_begin: + \fp_compare:nNnTF {#1} = { 0 } + {0} + { \int_to_Roman:n { \fp_to_int:n {#1} } } + \group_end: + } + +\cs_new_protected:Npn \__chemmacros_fp_to_arabic:n #1 + { + \group_begin: + \bool_if:NTF \l__chemmacros_ox_decimal_marker_comma_bool + { + \tl_set:Nx \l__chemmacros_tmpa_tl { \fp_to_decimal:n {#1} } + \tl_replace_once:Nnn \l__chemmacros_tmpa_tl {.} { {,} } + \tl_use:N \l__chemmacros_tmpa_tl + } + { \fp_to_decimal:n {#1} } + \group_end: + } + +\tl_new:N \l__chemmacros_ox_side_connect_tl + +\cs_new_protected:Npn \__chemmacros_ox_write:nn #1#2 + { + \tl_if_blank:nT {#1} + { \msg_error:nnn {chemmacros} {redox} {\ox} {oxidation~number~missing} } + \tl_if_blank:nT {#2} + { \msg_error:nnn {chemmacros} {redox} {\ox} {oxidation-atom~missing} } + \hbox_set:Nn \l__chemmacros_tmpa_box + { + \chemmacros_text:n + { \relsize {-3} \__chemmacros_ox_process_number:n {#1} } + } + \hbox_set:Nn \l__chemmacros_tmpb_box { \chemmacros_chemformula:n {#2} } + \chemmacros_math:n + { + \bool_if:NT \l__chemmacros_ox_super_bool + { + \box_use:N \l__chemmacros_tmpb_box + \c_math_superscript_token { \box_use:N \l__chemmacros_tmpa_box } + } + \bool_if:NT \l__chemmacros_ox_side_bool + { + \chemmacros_text:n + { + \box_use:N \l__chemmacros_tmpb_box + \tl_use:N \l__chemmacros_ox_side_connect_tl + ( \__chemmacros_ox_process_number:n {#1} ) + } + } + \bool_if:NT \l__chemmacros_ox_top_bool + { + \bool_if:NF \l__chemmacros_ox_align_center_bool + { + \hbox_set_to_wd:Nnn \l__chemmacros_tmpa_box + { \box_wd:N \l__chemmacros_tmpb_box } + { \rlap { \hbox_unpack:N \l__chemmacros_tmpa_box } \hfil } + } + \overset + { + \bool_if:NTF \l__chemmacros_ox_align_center_bool + { \clap } + { \use:n } + { \box_use:N \l__chemmacros_tmpa_box } + } + { \box_use:N \l__chemmacros_tmpb_box } + } + } + } + +\cs_new_protected: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_protected: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_protected: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 + } + +\chemmacros_define_keys:nn {redox} + { + 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: , + pos .initial:n = super , + side-connect .tl_set:N = \l__chemmacros_ox_side_connect_tl , + side-connect .initial:n = \, , + text-frac .code:n = + \cs_set_protected:Npn \chemmacros_ox_text_frac:nn ##1##2 {#1} , + text-frac .initial:n = \chemfrac[text]{#1}{#2} , + super-frac .code:n = + \cs_set_protected:Npn \chemmacros_ox_super_frac:nn ##1##2 {#1} , + super-frac .initial:n = \chemfrac[superscript]{#1}{#2} , + roman .bool_set:N = \l__chemmacros_ox_format_roman_bool , + roman .default:n = true , + roman .initial:n = true , + parse .bool_set:N = \l__chemmacros_ox_parse_bool , + parse .default:n = true , + parse .initial: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 } , + decimal-marker .initial:n = point , + align .choice: , + align / center .code:n = + \bool_set_true:N \l__chemmacros_ox_align_center_bool , + align / right .code:n = + \bool_set_false:N \l__chemmacros_ox_align_center_bool , + align .initial:n = center + } + +\ChemCompatibilityFrom{5.4} +\chemmacros_define_keys:nn {redox} + { + explicit-zero-sign .bool_set:N = \l__chemmacros_ox_explicit_zero_sign_bool , + explicit-zero-sign .default:n = true + } +\EndChemCompatibility + +% \ox[<keyval>]{<num>,<atom>} +% \ox*[<keyval>]{<num>,<atom>} => always number on the top +\cs_new_protected:Npn \chemmacros_ox:nnnn #1#2#3#4 + { + \group_begin: + \chemmacros_set_keys:nn {redox} {#2} + \tl_if_blank:nF {#1} { \__chemmacros_ox_pos_top: } + \__chemmacros_ox_write:nn {#3} {#4} + \group_end: + } + +\NewDocumentCommand \ox { sO{}>{\SplitArgument{1}{,}}m } + { + \IfBooleanTF {#1} + { \chemmacros_ox:nnnn {#1} {#2} #3 } + { \chemmacros_ox:nnnn { } {#2} #3 } + } + +% --------------------------------------------------------------------------- +% redox reactions +\tl_new:N \l__chemmacros_redox_begin_tl +\tl_new:N \l__chemmacros_redox_end_tl +\tl_new:N \l__chemmacros_redox_tikz_tl +\tl_new:N \l__chemmacros_redox_shift_tl +\tl_new:N \l__chemmacros_redox_anchor_tl +\tl_new:N \l__chemmacros_redox_side_tl + +\fp_new:N \l__chemmacros_redox_shift_fp + +\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 } + +% TODO: add option to make `#2' be parsed as chem formula +\cs_new_protected:Npn \chemmacros_redox_partner:nn #1#2 + { + \chemmacros_tex_if:nnTF {measuring@} {} + { + \group_begin: + \tikz[baseline=(#1.base)] { \node [inner~sep=0pt] (#1) {#2} ; } + \group_end: + } + { + \tl_if_blank:nT {#1} + { \msg_error:nnnn {chemmacros} {redox} {\OX} {node~name~missing} } + \tl_if_blank:nT {#2} + { \msg_error:nnnn {chemmacros} {redox} {\OX} {atom~missing} } + \tikz[baseline=(#1.base),remember~picture] + { \node [inner~sep=0pt] (#1) {#2} ; } + } + } + +\cs_new_protected: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} + } + +\cs_new_protected:Npn \chemmacros_redox:nnnnn #1#2#3#4#5 + { + \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} {#2} + \tl_if_blank:nF {#3} + { \tl_set:Nn \l__chemmacros_redox_tikz_tl {#3} } + \tl_if_blank:nTF {#4} + { + \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 {#4} < {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 {#4} + } + \tl_set:Nx \l__chemmacros_redox_shift_tl + { \fp_to_decimal:N \l__chemmacros_redox_shift_fp } + \tikz[remember~picture,overlay] + { + \chemmacros_tikz_draw:x { \exp_not:V \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] { {#5} } + ($ + (\l__chemmacros_redox_end_tl . + \l__chemmacros_redox_side_tl)+(0,\l__chemmacros_redox_sep_dim) + $) ; + } + } + +\NewDocumentCommand \redox { >{\SplitArgument{1}{,}}r()ooG{} } + { + \IfNoValueT {#1} + { + \msg_error:nnnn {chemmacros} {redox} {\redox} + {You~need~to~specify~coordinates} + } + \IfNoValueTF {#2} + { \chemmacros_redox:nnnnn #1 { } { } {#4} } + { + \IfNoValueTF {#3} + { \chemmacros_redox:nnnnn #1 {#2} { } {#4} } + { \chemmacros_redox:nnnnn #1 {#2} {#3} {#4} } + } + } + +% redox-keys +\chemmacros_define_keys:nn {redox} + { + dist .dim_set:N = \l__chemmacros_redox_dist_dim , + dist .initial:n = {.6em} , + sep .dim_set:N = \l__chemmacros_redox_sep_default_dim , + sep .initial:n = {.2em} + } + +% -------------------------------------------------------------------------- +\tex_endinput:D +2015/09/30 - new option `explicit-zero-sign' + diff --git a/macros/latex/contrib/chemmacros/chemmacros.module.scheme.code.tex b/macros/latex/contrib/chemmacros/chemmacros.module.scheme.code.tex new file mode 100644 index 0000000000..1a07bd1c50 --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.module.scheme.code.tex @@ -0,0 +1,310 @@ +% -------------------------------------------------------------------------- +% +% the CHEMMACROS package -- module: `scheme' +% +% -------------------------------------------------------------------------- +% 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-2017 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{scheme}{2016/04/25 a scheme floating environment} + +\RequirePackage {chemnum} + +\bool_new:N \l__chemmacros_float_def_bool +\tl_new:N \l__chemmacros_float_method_tl +\seq_new:N \l__chemmacros_float_methods_seq +\prop_new:N \l__chemmacros_float_methods_prop +\prop_new:N \l__chemmacros_float_definitions_prop + +\msg_new:nnn {chemmacros} {float-method} + { Detected~ float~ defining~ method~ `#1'. } + +% -------------------------------------------------------------------------- +% #1: name +% #2: check +\cs_new_protected:Npn \chemmacros_define_float_method:nnn #1#2#3 + { + \seq_put_right:Nn \l__chemmacros_float_methods_seq {#1} + \prop_put:Nnn \l__chemmacros_float_methods_prop {#1} {#2} + \prop_put:Nnn \l__chemmacros_float_definitions_prop {#1} + { \cs_set_protected:Npn \__chemmacros_define_float:nn ##1##2 {#3} } + } + +% the order in which the methods are defined determines in which order the +% methods will be checked at begin document: +\chemmacros_define_float_method:nnn {KOMA} + { \cs_if_exist_p:N \KOMAClassName } + { + \DeclareNewTOC[ + type = #1 , + types = #1s , + float , + name = \chemmacros_translate:n {#1-name} , + listname = {\exp_not:N \chemmacros_translate:n {#1-list}} + ]{#2} + } + +\chemmacros_define_float_method:nnn {memoir} + { \chemmacros_if_class_loaded_p:n {memoir} } + { + \newfloat [chapter] {#1} {#2} {\chemmacros_translate:n {#1-name}} + \cs_set:cpn {the#1} {\thechapter.\arabic {#1}} + \newlistof {listof#1s} {#2} {\chemmacros_translate:n {#1-list}} + \newlistentry [chapter] {#1} {#2} {0} + \cftsetindents {#1} {0em} {2.3em} + \tl_put_right:Nn \@memfront@floats + { \counterwithout {#1} {chapter} } + \tl_put_right:Nn \@memmain@floats + { \counterwithin {#1} {chapter} } + \tl_put_right:Nn \@memback@floats + { + \counterwithin {#1} {chapter} + \setcounter {#1} {0} + } + \chemmacros_tex_if:nnT {artopt} {} + { \counterwithout {#1} {chapter} } + } + +\chemmacros_define_float_method:nnn {tocbasic} + { \chemmacros_if_package_loaded_p:n {tocbasic} } + { + \DeclareNewTOC[ + type = #1 , + types = #1s , + float , + name = \chemmacros_translate:n {#1-name} , + listname = {\exp_not:N \chemmacros_translate:n {#1-list}} + ]{#2} + } + +\chemmacros_define_float_method:nnn {newfloat} + { \chemmacros_if_package_loaded_p:n {newfloat} } + { + \DeclareFloatingEnvironment[{ + fileext = #2 , + listname = {\exp_not:N \chemmacros_translate:n {#1-list}} , + name = #2 + }]{#1} + } + +\ChemCompatibilityFrom{5.1} +\chemmacros_define_float_method:nnn {floatrow} + { \chemmacros_if_package_loaded_p:n {floatrow} } + { + \DeclareNewFloatType{#1}{% + fileext = #2, + placement = htp, + name = \chemmacros_translate:n {#1-name} + } + \cs_new_protected:cpn {listof#1s} + { \listof {#1} {\chemmacros_translate:n {#1-list}} } + } +\EndChemCompatibility + +\chemmacros_define_float_method:nnn {float} + { \chemmacros_if_package_loaded_p:n {float} } + { + \newfloat {#1} {htp} {#2} + \floatname {#1} {\chemmacros_translate:n {#1-name}} + \cs_new_protected:cpn {listof#1s} + { \listof {#1} {\chemmacros_translate:n {#1-list}} } + } + +% -------------------------------------------------------------------------- +% checks if one of the above defined methods is active. The first one found +% will be used. +\cs_new_protected:Npn \chemmacros_check_float_method:n #1 + { + \prop_get:NnNT \l__chemmacros_float_methods_prop {#1} + \l__chemmacros_tmpa_tl + \bool_if:nT + { !\l__chemmacros_float_def_bool && \l__chemmacros_tmpa_tl } + { + \bool_set_true:N \l__chemmacros_float_def_bool + \tl_set:Nn \l__chemmacros_float_method_tl {#1} + \msg_info:nnn {chemmacros} {float-method} {#1} + } + } + +\cs_new_protected:Npn \chemmacros_check_float_methods: + { + \seq_map_function:NN + \l__chemmacros_float_methods_seq + \chemmacros_check_float_method:n + } + +\AtEndPreamble + { + % the check is there since v5.3a -- let's wait and see if we actually need + % a compatibility check here: + \chemmacros_if_package_loaded:nF {chemscheme} + { + \chemmacros_check_float_methods: + \chemmacros_define_float:nn {scheme} {los} + } + } + +% -------------------------------------------------------------------------- +\ChemCompatibilityFrom{5.6} +\ChemCleverefSupport {scheme} + { \chemmacros_translate:n {scheme} } + [ \chemmacros_translate:n {Scheme} ] + { \chemmacros_translate:n {schemes} } + [ \chemmacros_translate:n {Schemes} ] + +\ChemFancyrefSupport {sch} + { \chemmacros_translate:n {scheme} } + [ \chemmacros_translate:n {Scheme} ] +\EndChemCompatibility + +% -------------------------------------------------------------------------- +% #1: env name +\cs_new_protected:Npn \chemmacros_define_float:nn #1#2 + { + \bool_if:nT + { !\cs_if_exist_p:c {#1} && !\cs_if_exist_p:c {end#1} } + { + \bool_if:NTF \l__chemmacros_float_def_bool + { + \prop_get:NVN \l__chemmacros_float_definitions_prop + \l__chemmacros_float_method_tl + \l__chemmacros_tmpa_tl + \tl_use:N \l__chemmacros_tmpa_tl + \__chemmacros_define_float:nn {#1} {#2} + } + { + \newcounter {#1} + \cs_set:cpn {the#1} {\arabic{#1}} + \cs_new:cpn {fps@#1} {tbp} + \cs_new:cpn {ftype@#1} {8} + \cs_new:cpn {ext@#1} {#2} + \cs_new:cpx {fnum@#1} { + \exp_not:c {#1name} + \exp_not:N \nobreakspace + \exp_not:c {the#1}} + \cs_new:cpn {#1name} {\chemmacros_translate:n {#1-name}} + \cs_new:cpn {list#1name} {\chemmacros_translate:n {#1-list}} + \newenvironment {#1} + {\@float{#1}} + {\end@float} + \newenvironment {#1*} + {\@dblfloat{#1}} + {\end@dblfloat} + \bool_if:nTF + { + \chemmacros_if_class_loaded_p:n {book} || + \chemmacros_if_class_loaded_p:n {report} + } + { + \cs_new_protected:cpn {listof#1s} + { + \chemmacros_tex_if:nnTF {@twocolumn} {} + { \@restonecoltrue\onecolumn } + { \@restonecolfalse } + \exp_args:NNx \chapter* {\exp_not:c {list#1name}} + \@mkboth + { \MakeUppercase \use:c {list#1name} } + { \MakeUppercase \use:c {list#1name} } + \@starttoc {#2} + \chemmacros_tex_if:nnT {@restonecol} {} + { \twocolumn } + } + } + { + \cs_new_protected:cpn {listof#1s} + { + \exp_args:NNx \section* {\exp_not:c {list#1name}} + \@mkboth + { \MakeUppercase \use:c {list#1name} } + { \MakeUppercase \use:c {list#1name} } + \@starttoc {#2} + } + } + \cs_new_eq:cN {l@#1} \l@figure + } + } + \cs_set:cpn {#1name} {\chemmacros_translate:n {#1-name}} + \cs_set:cpn {list#1name} {\chemmacros_translate:n {#1-list}} + } + +% -------------------------------------------------------------------------- +\ChemCompatibilityTo{5.6} +\DeclareTranslationFallback {scheme-name} {Scheme} +\DeclareTranslation {English} {scheme-name} {Scheme} +\DeclareTranslation {German} {scheme-name} {Schema} + +\DeclareTranslationFallback {scheme-list} {List~ of~ Schemes} +\DeclareTranslation {English} {scheme-list} {List~ of~ Schemes} +\DeclareTranslation {German} {scheme-list} {Verzeichnis~ der~ Schemata} +\EndChemCompatibility + +\ChemCompatibilityFrom{5.6} +\chemmacros_declare_translations:nn {scheme-name} + { + fallback = Scheme , + English = Scheme , + German = Schema + } + +\chemmacros_declare_translations:nn {scheme-list} + { + fallback = List~ of~ Schemes , + English = List~ of~ Schemes , + German = Verzeichnis~ der~ Schemata + } + +\chemmacros_declare_translations:nn {scheme} + { + fallback = scheme , + English = scheme , + German = Schema + } + +\chemmacros_declare_translations:nn {Scheme} + { + fallback = Scheme , + English = Scheme , + German = Schema + } + +\chemmacros_declare_translations:nn {schemes} + { + fallback = schemes , + English = schemes , + German = Schemata + } + +\chemmacros_declare_translations:nn {Schemes} + { + fallback = Schemes , + English = Schemes , + German = Schemata + } +\EndChemCompatibility + +\tex_endinput:D +% -------------------------------------------------------------------------- +2015/09/19 - make the module compatible with floatrow +2015/10/23 - add info message to float method detection +2016/01/23 - make the module compatible with chemscheme +2016/04/25 - cleveref and fancyref support +2016/12/28 - bug fix: typo in \chemmacros_tex_if:nnTF usage diff --git a/macros/latex/contrib/chemmacros/chemmacros.module.spectroscopy.code.tex b/macros/latex/contrib/chemmacros/chemmacros.module.spectroscopy.code.tex new file mode 100644 index 0000000000..30223fc583 --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.module.spectroscopy.code.tex @@ -0,0 +1,514 @@ +% -------------------------------------------------------------------------- +% +% the CHEMMACROS package -- module: `spectroscopy' +% +% -------------------------------------------------------------------------- +% 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-2017 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{spectroscopy}{2015/12/31 environment for spectroscopic data} + +\chemmacros_load_modules:n {chemformula} +\RequirePackage{siunitx} + +% spectroscopy +\tl_new:N \g__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_coupling_nuclei_tl +\tl_new:N \l__chemmacros_nmr_coupling_nuclei_pre_tl +\tl_set:Nn \l__chemmacros_nmr_coupling_nuclei_pre_tl { ( } +\tl_new:N \l__chemmacros_nmr_coupling_nuclei_post_tl +\tl_set:Nn \l__chemmacros_nmr_coupling_nuclei_post_tl { ) } +\tl_new:N \l__chemmacros_nmr_coupling_bonds_tl +\tl_new:N \l__chemmacros_nmr_coupling_bonds_pre_tl +\tl_set:Nn \l__chemmacros_nmr_coupling_bonds_pre_tl { } +\tl_set:Nn \l__chemmacros_nmr_coupling_bonds_post_tl { \! } +\tl_new:N \l__chemmacros_nmr_coupling_symbol_tl +\tl_set:Nn \l__chemmacros_nmr_coupling_symbol_tl { J } +\tl_new:N \g__chemmacros_nmr_element_coupled_tl +\tl_new:N \g__chemmacros_nmr_element_tl +\tl_new:N \l__chemmacros_nmr_element_default_tl +\tl_set:Nn \l__chemmacros_nmr_element_default_tl { H } +\tl_new:N \l__chemmacros_nmr_format_tl +\tl_new:N \l__chemmacros_nmr_delta_tl +\tl_new:N \l__chemmacros_nmr_coupling_unit_tl +\tl_set:Nn \l__chemmacros_nmr_coupling_unit_tl { \hertz } +\tl_new:N \l__chemmacros_nmr_unit_tl +\tl_set:Nn \l__chemmacros_nmr_unit_tl { \mega\hertz } +\tl_new:N \l__chemmacros_nmr_list_setup_tl +\tl_set:Nn \l__chemmacros_nmr_list_setup_tl + { + \topsep\z@skip \partopsep\z@skip + \itemsep\z@ \parsep\z@ \itemindent\z@ + \leftmargin\z@ + } +\tl_new:N \l__chemmacros_nmr_position_tl +\tl_new:N \l__chemmacros_nmr_element_method_connector_tl +\tl_set:Nn \l__chemmacros_nmr_element_method_connector_tl {-} +\tl_new:N \l__chemmacros_nmr_method_tl +\tl_set:Nn \l__chemmacros_nmr_method_tl {NMR} + +\bool_new:N \l__chemmacros_nmr_coupling_nuclei_sub_bool +\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 +\bool_new:N \l__chemmacros_nmr_inner_bool +\bool_new:N \l__chemmacros_nmr_position_side_bool +\bool_new:N \l__chemmacros_nmr_parse_bool +\bool_set_true:N \l__chemmacros_nmr_parse_bool +\bool_new:N \l__chemmacros_nmr_list_bool +\bool_new:N \l__chemmacros_nmr_use_equal_bool +\bool_new:N \l__chemmacros_nmr_custom_command_active_bool +\bool_new:N \l__chemmacros_nmr_custom_command_used_bool + +\skip_new:N \l__chemmacros_nmr_space_skip +\skip_set:Nn \l__chemmacros_nmr_space_skip { .16667em } + +\cs_new_protected:Npn \__chemmacros_nmr_nucleus:nn #1#2 + { + \tl_gset:Nn \g__chemmacros_nmr_isotope_tl {#1} + \tl_if_in:nnTF {#2} {[} % ] + { \__chemmacros_nmr_element:w #2 \q_stop } + { + \tl_gset:No \g__chemmacros_nmr_element_tl {#2} + \tl_gclear:N \g__chemmacros_nmr_element_coupled_tl + } + } +\cs_generate_variant:Nn \__chemmacros_nmr_nucleus:nn { VV } + +\cs_new_protected:Npn \__chemmacros_nmr_nucleus:w #1,#2 \q_stop + { + \tl_gset:Nn \g__chemmacros_nmr_isotope_tl {#1} + \tl_if_in:nnTF {#2} {[} % ] + { \__chemmacros_nmr_element:w #2 \q_stop } + { + \tl_gset:No \g__chemmacros_nmr_element_tl {#2} + \tl_gclear:N \g__chemmacros_nmr_element_coupled_tl + } + } + +\cs_new_protected:Npn \__chemmacros_nmr_element:w #1[#2] \q_stop + { + \tl_gset:Nn \g__chemmacros_nmr_element_tl {#1} + \tl_gset:Nn \g__chemmacros_nmr_element_coupled_tl {#2} + } + +\cs_new_protected:Npn \__chemmacros_nmr_default_nucleus:w #1,#2 \q_stop + { + \tl_set:Nn \l__chemmacros_nmr_isotope_default_tl {#1} + \tl_set:Nn \l__chemmacros_nmr_element_default_tl {#2} + } + +\ChemCompatibilityTo{5.8} +\cs_new_protected:Npn \__chemmacros_nmr_base:nn #1#2 + { + \tl_if_blank:VF \g__chemmacros_nmr_element_coupled_tl + { + \tl_put_left:Nn \g__chemmacros_nmr_element_coupled_tl { \{ } + \tl_put_right:Nn \g__chemmacros_nmr_element_coupled_tl { \} } + } + \tl_put_left:Nn \g__chemmacros_nmr_element_coupled_tl {#2} + \chemmacros_chemformula:n { ^{#1} } + \bool_if:NTF \l__chemmacros_nmr_parse_bool + { \chemformula_ch:nV {} \g__chemmacros_nmr_element_coupled_tl } + { \chemmacros_chemformula:V \g__chemmacros_nmr_element_coupled_tl } + \tl_use:N \l__chemmacros_nmr_element_method_connector_tl + \tl_use:N \l__chemmacros_nmr_method_tl + } +\EndChemCompatibility +\ChemCompatibilityFrom{5.8} +\tl_new:N \l__chemmacros_nmr_base_format_tl + +\chemmacros_define_keys:nn {spectroscopy} + { nmr-base-format .tl_set:N = \l__chemmacros_nmr_base_format_tl } + +\cs_new_protected:Npn \__chemmacros_nmr_base:nn #1#2 + { + \group_begin: + \tl_use:N \l__chemmacros_nmr_base_format_tl + \tl_if_blank:VF \g__chemmacros_nmr_element_coupled_tl + { + \tl_put_left:Nn \g__chemmacros_nmr_element_coupled_tl { \{ } + \tl_put_right:Nn \g__chemmacros_nmr_element_coupled_tl { \} } + } + \tl_put_left:Nn \g__chemmacros_nmr_element_coupled_tl {#2} + \chemmacros_chemformula:n { ^{#1} } + \tl_if_blank:VF \g__chemmacros_nmr_element_coupled_tl + { + \bool_if:NTF \l__chemmacros_nmr_parse_bool + { \chemformula_ch:nV {} \g__chemmacros_nmr_element_coupled_tl } + { \chemmacros_chemformula:V \g__chemmacros_nmr_element_coupled_tl } + } + \tl_use:N \l__chemmacros_nmr_element_method_connector_tl + \tl_use:N \l__chemmacros_nmr_method_tl + \group_end: + } +\EndChemCompatibility + +\cs_generate_variant:Nn \__chemmacros_nmr_base:nn { VV } + +\cs_new_protected:Npn \__chemmacros_nmr_frequency:n #1 + { + \tl_if_in:nnTF {#1} {,} + { \__chemmacros_nmr_frequency_aux_i:w #1 \q_stop } + { \__chemmacros_nmr_frequency_aux_ii:n {#1} } + } + +\cs_new_protected:Npn \__chemmacros_nmr_frequency_aux_i:w #1,#2 \q_stop + { \SI {#1} {#2} } + +\cs_new_protected:Npn \__chemmacros_nmr_frequency_aux_ii:n #1 + { \SI {#1} { \tl_use:N \l__chemmacros_nmr_unit_tl } } + +\cs_new_eq:NN \__chemmacros_nmr_number:n \use:n +\cs_new_eq:NN \__chemmacros_nmr_position:n \use:n + +\chemmacros_define_keys:nn {spectroscopy} + { + unit .tl_set:N = \l__chemmacros_nmr_unit_tl , + unit .default:n = \mega\hertz , + nucleus .code:n = + { \__chemmacros_nmr_default_nucleus:w #1 \q_stop } , + nucleus .default:n = {1,H} , + format .tl_set:N = \l__chemmacros_nmr_format_tl , + method .tl_set:N = \l__chemmacros_nmr_method_tl , + connector .tl_set:N = \l__chemmacros_nmr_element_method_connector_tl , + pos-number .choice: , + pos-number / sub .code:n = + \tl_set:Nn \l__chemmacros_nmr_position_tl {_} + \bool_set_false:N \l__chemmacros_nmr_position_side_bool , + pos-number / super .code:n = + \tl_set:Nn \l__chemmacros_nmr_position_tl {^} + \bool_set_false:N \l__chemmacros_nmr_position_side_bool , + pos-number / side .code:n = + \tl_set:Nn \l__chemmacros_nmr_position_tl {-} + \bool_set_true:N \l__chemmacros_nmr_position_side_bool , + coupling-unit .tl_set:N = \l__chemmacros_nmr_coupling_unit_tl , + coupling-pos .choice: , + coupling-pos / sub .code:n = + \bool_set_true:N \l__chemmacros_nmr_coupling_nuclei_sub_bool , + coupling-pos / side .code:n = + \bool_set_false:N \l__chemmacros_nmr_coupling_nuclei_sub_bool , + coupling-nuclei-pre .tl_set:N = + \l__chemmacros_nmr_coupling_nuclei_pre_tl , + coupling-nuclei-post .tl_set:N = + \l__chemmacros_nmr_coupling_nuclei_post_tl , + coupling-bonds-pre .tl_set:N = + \l__chemmacros_nmr_coupling_bonds_pre_tl , + coupling-bonds-post .tl_set:N = + \l__chemmacros_nmr_coupling_bonds_post_tl , + coupling-symbol .tl_set:N = + \l__chemmacros_nmr_coupling_symbol_tl , + atom-number-cs .code:n = + \cs_set_eq:NN \__chemmacros_nmr_number:n #1 , + \chemmacros_if_compatibility:nnT {>=} {5.3} + { atom-number-space .skip_set:N = \l__chemmacros_nmr_space_skip , } + coupling-pos-cs .code:n = + \cs_set_eq:NN \__chemmacros_nmr_position:n #1 , + parse .bool_set:N = \l__chemmacros_nmr_parse_bool , + delta .code:n = + \tl_set:Nn \l__chemmacros_nmr_delta_tl {\,#1} , + list .bool_set:N = \l__chemmacros_nmr_list_bool , + list .default:n = true , + list-setup .tl_set:N = \l__chemmacros_nmr_list_setup_tl , + use-equal .bool_set:N = \l__chemmacros_nmr_use_equal_bool , + use-equal .default:n = true + } + +\cs_new_protected:Npn \chemmacros_define_nmr:Nn #1#2 + { + \cs_if_exist:NTF #1 + { + \RenewDocumentCommand #1 {s} + { \IfBooleanTF {##1} { \NMR*{#2} } { \NMR{#2} } } + } + { + \NewDocumentCommand #1 {s} + { \IfBooleanTF {##1} { \NMR*{#2} } { \NMR{#2} } } + } + } + +\NewChemMacroset {NMR} {mm} + { \chemmacros_define_nmr:Nn #1 {#2} } + +\NewDocumentCommand \NMR { sG{}D(){}O{} } + { + \IfBooleanTF {#1} + { \chemmacros_nmr:nnnn {*} {#2} {#3} {#4} } + { \chemmacros_nmr:nnnn { } {#2} {#3} {#4} } + } + +\AtBeginDocument + { + % \NMR{<num>,<elem>}(<num>,<unit>)[<solvent>] ALL arguments are optional + % \NMR* same but without ": $\delta$" at end + \cs_new_protected:Npn \chemmacros_nmr:nnnn #1#2#3#4 + { + \bool_if:NT \l__chemmacros_nmr_list_bool { \item \scan_stop: } + \group_begin: + \chemmacros_leave_vmode: + \bool_set_false:N \l__chemmacros_nmr_frequency_bool + \bool_set_false:N \l__chemmacros_nmr_solvent_bool + \tl_if_empty:nF {#3} + { \bool_set_true:N \l__chemmacros_nmr_frequency_bool } + \tl_if_empty:nF {#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 } + \tl_if_empty:nTF {#2} + { + \__chemmacros_nmr_nucleus:VV + \l__chemmacros_nmr_isotope_default_tl + \l__chemmacros_nmr_element_default_tl + } + { \__chemmacros_nmr_nucleus:w #2 \q_stop } + \mode_if_math:TF + { + \text + { + \group_begin: + \tl_use:N \l__chemmacros_nmr_format_tl + \__chemmacros_nmr_base:VV + \g__chemmacros_nmr_isotope_tl + \g__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_chemformula:n {#4} } + \bool_if:NT \l__chemmacros_nmr_delimiters_bool + { ) } + \tl_if_blank:nT {#1} {:~} + \group_end: + } + \tl_if_blank:nT {#1} + { + \delta + \text { \l__chemmacros_nmr_delta_tl } + \bool_if:NT \l__chemmacros_nmr_use_equal_bool {=} + } + } + { + \group_begin: + \tl_use:N \l__chemmacros_nmr_format_tl + \__chemmacros_nmr_base:VV + \g__chemmacros_nmr_isotope_tl + \g__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 + { + \bool_if:NTF \l__chemmacros_nmr_parse_bool + { \chemformula_ch:nn { } {#4} } + {#4} + } + \bool_if:NT \l__chemmacros_nmr_delimiters_bool + {)} + \tl_if_blank:nT {#1} {:} + \group_end: + \tl_if_blank:nT {#1} + { + \tl_use:N \c_space_tl + \c_math_toggle_token + \delta + \c_math_toggle_token + \l__chemmacros_nmr_delta_tl + \bool_if:NT \l__chemmacros_nmr_use_equal_bool {~=} + } + } + \group_end: + } + } + +\NewDocumentCommand \chemmacros_data:w { smo } + { + \bool_if:NT \l__chemmacros_nmr_list_bool { \item } + { + \tl_use:N \l__chemmacros_nmr_format_tl #2 + \IfNoValueF {#3} { ~ ( #3 ) } + \IfBooleanT {#1} { \bool_if:NT \l__chemmacros_nmr_use_equal_bool { : } } + } + \IfBooleanF {#1} { \bool_if:NT \l__chemmacros_nmr_use_equal_bool { ~ = } } + } + +\cs_new_protected:Npn \chemmacros_val:n #1 + { + \tl_if_in:nnTF {#1} {--} + { \chemmacros_val_aux:w #1 \q_nil } + { \num {#1} } + } + +\cs_new_protected:Npn \chemmacros_val_aux:w #1--#2 \q_nil + { \numrange {#1} {#2} } + +\NewDocumentEnvironment {experimental} {o} + { + \group_begin: + \IfNoValueF {#1} { \chemmacros_set_keys:nn {spectroscopy} {#1} } + \bool_set_true:N \l__chemmacros_nmr_inner_bool + \cs_set_eq:NN \# \chemmacros_nmr_number:n + \cs_set_eq:NN \pos \chemmacros_nmr_position:n + \cs_set_eq:NN \J \chemmacros_nmr_coupling:w + \cs_set_eq:NN \data \chemmacros_data:w + \cs_set_eq:NN \val \chemmacros_val:n + \bool_if:NT \l__chemmacros_nmr_list_bool + { \list {} { \l__chemmacros_nmr_list_setup_tl } } + } + { + \bool_if:NT \l__chemmacros_nmr_list_bool + { \endlist } + \group_end: + \chemmacros_ignore_spaces: + } + +\cs_new_protected:Npn \chemmacros_nmr_number:n #1 + { + \__chemmacros_nmr_number:n {#1} + \skip_horizontal:N \l__chemmacros_nmr_space_skip + \chemmacros_chemformula:V \g__chemmacros_nmr_element_tl + } + +\cs_new_protected:Npn \chemmacros_nmr_position:n #1 + { + \chemmacros_chemformula:x + { + \exp_not:V \g__chemmacros_nmr_element_tl + \bool_if:NF \l__chemmacros_nmr_position_side_bool + { + \exp_not:V \l__chemmacros_nmr_position_tl + \exp_not:n { {#1} } + } + } + \bool_if:NT \l__chemmacros_nmr_position_side_bool + { + \tl_use:N \l__chemmacros_nmr_position_tl + \__chemmacros_nmr_position:n {#1} + } + } + +\cs_new_protected:Npn \chemmacros_nmr_coupling:w + { + \tl_clear:N \l__chemmacros_nmr_coupling_nuclei_tl + \tl_clear:N \l__chemmacros_nmr_coupling_bonds_tl + \peek_meaning:NTF ( + { \__chemmacros_nmr_coupling:w } + { \__chemmacros_nmr_coupling_aux_i:w } + } + +\cs_new_protected:Npn \__chemmacros_nmr_coupling:w (#1;#2) + { + \tl_set:Nn \l__chemmacros_nmr_coupling_bonds_tl + { + \l__chemmacros_nmr_coupling_bonds_pre_tl + #1 + \l__chemmacros_nmr_coupling_bonds_post_tl + } + \bool_if:NTF \l__chemmacros_nmr_coupling_nuclei_sub_bool + { + \tl_set:Nn \l__chemmacros_nmr_coupling_nuclei_tl + { + \c_math_subscript_token + { + \l__chemmacros_nmr_coupling_nuclei_pre_tl + \chemmacros_chemformula:n {#2} + \l__chemmacros_nmr_coupling_nuclei_post_tl + } + } + } + { + \tl_set:Nn \l__chemmacros_nmr_coupling_nuclei_tl + { + \l__chemmacros_nmr_coupling_nuclei_pre_tl + \chemmacros_chemformula:n {#2} + \l__chemmacros_nmr_coupling_nuclei_post_tl + } + } + \__chemmacros_nmr_coupling_aux_i:w + } + +\cs_new_protected:Npn \__chemmacros_nmr_coupling_aux_i:w + { + \peek_meaning:NTF [ + { \__chemmacros_nmr_coupling_aux_ii:w } + { \__chemmacros_nmr_coupling_aux_iii:n } + } + +\cs_new_protected:Npn \__chemmacros_nmr_coupling_aux_ii:w [#1]#2 + { + \group_begin: + \sisetup + { + list-final-separator={,~}, + list-pair-separator={,~}, + list-units=single + } + \c_math_toggle_token + ^{ \l__chemmacros_nmr_coupling_bonds_tl } + \l__chemmacros_nmr_coupling_symbol_tl + \l__chemmacros_nmr_coupling_nuclei_tl = \SIlist {#2} {#1} + \c_math_toggle_token + \group_end: + } + +\cs_new_protected:Npn \__chemmacros_nmr_coupling_aux_iii:n #1 + { + \group_begin: + \sisetup + { + list-final-separator={,~}, + list-pair-separator={,~}, + list-units=single + } + \c_math_toggle_token + ^{ \l__chemmacros_nmr_coupling_bonds_tl } + \l__chemmacros_nmr_coupling_symbol_tl + \l__chemmacros_nmr_coupling_nuclei_tl + = \exp_args:Nno \SIlist {#1} { \l__chemmacros_nmr_coupling_unit_tl } + \c_math_toggle_token + \group_end: + } + +% -------------------------------------------------------------------------- +\tex_endinput:D +2015/12/31 - new option `atom-number-space' +2017/01/27 - new option `nmr-base-format' diff --git a/macros/latex/contrib/chemmacros/chemmacros.module.symbols.code.tex b/macros/latex/contrib/chemmacros/chemmacros.module.symbols.code.tex new file mode 100644 index 0000000000..dfbc812d6f --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.module.symbols.code.tex @@ -0,0 +1,89 @@ +% -------------------------------------------------------------------------- +% +% the CHEMMACROS package -- module: `symbols' +% +% -------------------------------------------------------------------------- +% 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-2017 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{symbols}{2015/06/09 symbols} + +\RequirePackage{amstext} + +% --------------------------------------------------------------------------- +% transition state symbol +\cs_new_protected:Npn \__chemmacros_transition_state: + { + \text + { + \skip_horizontal:n { .1ex } + \hbox_overlap_right:n + { \rule { .6ex } { 0pt } \rule { .05ex } { 1.3ex } } + \hbox_overlap_right:n { \rule [ .4ex ] { 1.3ex } { .05ex } } + \rule [ .85ex ] { 1.3ex } { .05ex } + \skip_horizontal:n { .1ex } + } + } + +\cs_new_protected:Npn \chemmacros_transition_state: + { + \ensuremath + { + \mathchoice + { \displaystyle } + { \textstyle } + { \scriptstyle } + { \scriptscriptstyle } + \__chemmacros_transition_state: + } + } + +% \DeclareDocumentCommand? +\cs_new_eq:NN \transitionstatesymbol \chemmacros_transition_state: + +% \standardstate as defined by the chemstyle package. Thanks to Joseph Wright +% the `chemstyle' provides it with \providecommand so it doesn't matter which +% package defines it first +\ProvideDocumentCommand \standardstate {} + { { \ensuremath { \chemmacros_standardstate: } } } + +\cs_new_protected:Npn \chemmacros_standardstate: + { \mathpalette \chemmacros_standardstate_aux: \circ } + +\cs_new_protected:Npn \chemmacros_standardstate_aux: #1#2 + { + \ooalign + { + \tex_hfil:D + \c_math_toggle_token #1- \c_math_toggle_token + \tex_hfil:D + \tex_cr:D + \tex_hfil:D + \c_math_toggle_token #1#2 \c_math_toggle_token + \tex_hfil:D + \tex_cr:D + } + } + +\cs_new_protected:Npn \changestate { \ensuremath { \mathop{} \! \chemDelta } } + +% -------------------------------------------------------------------------- diff --git a/macros/latex/contrib/chemmacros/chemmacros.module.thermodynamics.code.tex b/macros/latex/contrib/chemmacros/chemmacros.module.thermodynamics.code.tex new file mode 100644 index 0000000000..cf49fd0695 --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.module.thermodynamics.code.tex @@ -0,0 +1,147 @@ +% -------------------------------------------------------------------------- +% +% 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-2017 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 + +% -------------------------------------------------------------------------- diff --git a/macros/latex/contrib/chemmacros/chemmacros.module.tikz.code.tex b/macros/latex/contrib/chemmacros/chemmacros.module.tikz.code.tex new file mode 100644 index 0000000000..2e8dfd243c --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.module.tikz.code.tex @@ -0,0 +1,187 @@ +% -------------------------------------------------------------------------- +% +% the CHEMMACROS package -- module: `tikz' +% +% -------------------------------------------------------------------------- +% 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-2017 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*{tikz}{2015/10/26 upright greek symbols} + +\RequirePackage{tikz} +\usetikzlibrary{calc,decorations.pathmorphing} + +\ExplSyntaxOn + +\tl_const:Nx \c_chemmacros_other_colon_tl { \token_to_str:N : } + +% -------------------------------------------------------------------------- +% TikZ drawings - helper macros +\cs_new_protected:Npn \chemmacros_tikz_picture:nn #1#2 + { \tikzpicture[{#1}] #2 \endtikzpicture } +\cs_new_protected:Npn \chemmacros_tikz:nn #1#2 { \tikz[{#1}] {#2} } +\cs_new_protected:Npn \chemmacros_tikz_draw:n #1 { \draw[{#1}] } +\cs_new_protected:Npn \chemmacros_tikz_node:n #1 { \node[{#1}] } +\cs_new_protected:Npn \chemmacros_tikz_shade:n #1 { \shade[{#1}] } +\cs_new_protected:Npn \chemmacros_tikz_shadedraw:n #1 { \shadedraw[{#1}] } +\cs_new_protected:Npn \chemmacros_tikz_node_in_draw:n #1 { node[{#1}] } + +\cs_generate_variant:Nn \chemmacros_tikz_picture:nn { xn } +\cs_generate_variant:Nn \chemmacros_tikz_draw:n { x } +\cs_generate_variant:Nn \chemmacros_tikz_node:n { x } +\cs_generate_variant:Nn \chemmacros_tikz_shade:n { x } +\cs_generate_variant:Nn \chemmacros_tikz_shadedraw:n { x } +\cs_generate_variant:Nn \chemmacros_tikz_node_in_draw:n { x } + +% -------------------------------------------------------------------------- +% arrow tips for electron movement +\dim_new:N \l__chemmacros_el_length_dim + +% full tip for pairs +\pgfarrowsdeclare { el } { el } + { + \dim_set:Nn \l__chemmacros_el_length_dim + { 2.5pt + 2.5\pgflinewidth } + \pgfarrowsleftextend { -\l__chemmacros_el_length_dim } + \pgfarrowsrightextend { .5\pgflinewidth } + } + { + \dim_set:Nn \l__chemmacros_el_length_dim + { 2.5pt + 2.5\pgflinewidth } + \pgfsetdash {} { 0pt } + \pgfsetroundjoin + \pgfsetroundcap + \pgfpathmoveto { \pgfpoint { 0pt } { 0pt } } + \pgfpathlineto + { + \pgfpoint + { -\l__chemmacros_el_length_dim } + { .3\l__chemmacros_el_length_dim } + } + \pgfpathlineto + { \pgfpoint { -.5\l__chemmacros_el_length_dim } { 0pt } } + \pgfpathlineto + { + \pgfpoint + { -\l__chemmacros_el_length_dim } + { -.3\l__chemmacros_el_length_dim } + } + \pgfpathlineto { \pgfpoint { 0pt } { 0pt } } + \pgfusepathqfillstroke + } + +% half tip on the left +\pgfarrowsdeclare { left~el } { left~el } + { + \dim_set:Nn \l__chemmacros_el_length_dim + { 2.5pt + 2.5\pgflinewidth } + \pgfarrowsleftextend { -\l__chemmacros_el_length_dim } + \pgfarrowsrightextend { .5\pgflinewidth } + } + { + \dim_set:Nn \l__chemmacros_el_length_dim + { 2.5pt + 2.5\pgflinewidth } + \pgfsetdash {} { 0pt } + \pgfsetroundjoin + \pgfsetroundcap + \pgfpathmoveto { \pgfpoint { 0pt } { 0pt } } + \pgfpathlineto + { + \pgfpoint + { -\l__chemmacros_el_length_dim } + { .3\l__chemmacros_el_length_dim } + } + \pgfpathlineto { \pgfpoint { -.5\l__chemmacros_el_length_dim } { 0pt } } + \pgfpathlineto { \pgfpoint { 0pt } { 0pt } } + \pgfusepathqfillstroke + } + +% half tip in the right +\pgfarrowsdeclare { right~el } { right~el } + { + \dim_set:Nn \l__chemmacros_el_length_dim + { 2.5pt + 2.5\pgflinewidth } + \pgfarrowsleftextend { -\l__chemmacros_el_length_dim } + \pgfarrowsrightextend { .5\pgflinewidth } + } + { + \dim_set:Nn \l__chemmacros_el_length_dim + { 2.5pt + 2.5\pgflinewidth } + \pgfsetdash {} { 0pt } + \pgfsetroundjoin + \pgfsetroundcap + \pgfpathmoveto { \pgfpoint { 0pt } { 0pt } } + \pgfpathlineto + { + \pgfpoint + { -\l__chemmacros_el_length_dim } + { -.3\l__chemmacros_el_length_dim } + } + \pgfpathlineto { \pgfpoint { -.5\l__chemmacros_el_length_dim } { 0pt } } + \pgfpathlineto { \pgfpoint { 0pt } { 0pt } } + \pgfusepathqfillstroke + } +% -------------------------------------------------------------------------- +% http://tex.stackexchange.com/a/25689/ +\ChemCompatibilityFrom{5.3} +\pgfdeclaredecoration{wave}{initial}{ + \state{initial}[ + width = +0pt , + next~ state = sine, + persistent~ precomputation = { + \pgfmathsetmacro\matchinglength{ + \pgfdecoratedinputsegmentlength / + int(\pgfdecoratedinputsegmentlength/\pgfdecorationsegmentlength) + } + \setlength{\pgfdecorationsegmentlength}{\matchinglength pt} + } + ]{} + \state{sine}[width=\pgfdecorationsegmentlength]{ + \pgfpathsine{ + \pgfpoint + {0.25\pgfdecorationsegmentlength} + {0.5\pgfdecorationsegmentamplitude} + } + \pgfpathcosine{ + \pgfpoint + {0.25\pgfdecorationsegmentlength} + {-0.5\pgfdecorationsegmentamplitude} + } + \pgfpathsine{ + \pgfpoint + {0.25\pgfdecorationsegmentlength} + {-0.5\pgfdecorationsegmentamplitude} + } + \pgfpathcosine{ + \pgfpoint + {0.25\pgfdecorationsegmentlength} + {0.5\pgfdecorationsegmentamplitude} + } + } + \state{final}{} +} +\EndChemCompatibility + +% -------------------------------------------------------------------------- +\tex_endinput:D + +2015/10/26 - add decoration `wave' (complete sines) diff --git a/macros/latex/contrib/chemmacros/chemmacros.module.units.code.tex b/macros/latex/contrib/chemmacros/chemmacros.module.units.code.tex new file mode 100644 index 0000000000..ce7142e3dd --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.module.units.code.tex @@ -0,0 +1,56 @@ +% -------------------------------------------------------------------------- +% +% the CHEMMACROS package -- module: `units' +% +% -------------------------------------------------------------------------- +% 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-2017 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{units}{2015/09/28 chemical units} + +\RequirePackage{siunitx} + +% -------------------------------------------------------------------------- +\DeclareSIUnit {\atm } {atm} +\DeclareSIUnit {\atmosphere} {atm} +\DeclareSIUnit {\calory } {cal} +\DeclareSIUnit {\cal } {cal} +\DeclareSIUnit {\moLar } {\mole\per\liter} +\DeclareSIUnit {\MolMass } {\gram\per\mole} +\DeclareSIUnit {\normal } {\textsc{n}} +\DeclareSIUnit {\torr } {torr} + +\AtEndPreamble + { + \chemmacros_if_package_loaded:nF {chemstyle} + { + \DeclareSIUnit {\cmc } {\cubic\centi\metre} + \DeclareSIUnit {\molar} {\mole\per\cubic\deci\metre} + \DeclareSIUnit {\Molar} {\textsc{m}} + } + } + +% -------------------------------------------------------------------------- +\tex_endinput:D + +2015/09/28 - change \AtBeginDocument into \AtEndPreamble + diff --git a/macros/latex/contrib/chemmacros/chemmacros.module.xfrac.code.tex b/macros/latex/contrib/chemmacros/chemmacros.module.xfrac.code.tex new file mode 100644 index 0000000000..6ad2fd7771 --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.module.xfrac.code.tex @@ -0,0 +1,137 @@ +% -------------------------------------------------------------------------- +% +% the CHEMMACROS package -- module: `xfrac' +% +% -------------------------------------------------------------------------- +% 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-2017 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{xfrac}{2015/07/22 use xfrac package with chemmacros} + +\RequirePackage{xfrac} + +% -------------------------------------------------------------------------- + +% #1: type +% #2: numerator +% #3: denominator +\cs_new_protected:Npn \chemmacros_frac:nnn #1#2#3 + { + \IfInstanceExistTF {xfrac} {chemmacros-frac-\f@family-#1} + { \sfrac [chemmacros-frac-\f@family-#1] {#2} {#3} } + { \sfrac [chemmacros-frac-default-#1]{#2} {#3} } + } + +\NewDocumentCommand \chemfrac {O{text}mm} + { \chemmacros_frac:nnn {#1} {#2} {#3} } + +% -------------------------------------------------------------------------- + +% default: +\DeclareInstance {xfrac} {chemmacros-frac-cmr-superscript} {text} + { + numerator-top-sep = -.1ex , + slash-left-kern = -.2em , + slash-right-kern = -.2em , + slash-symbol-font = cmr + } + +\DeclareInstance {xfrac} {chemmacros-frac-cmr-text} {text} + { + numerator-top-sep = 0ex , + slash-left-kern = -.2em , + slash-right-kern = -.2em , + slash-symbol-font = cmr + } + +% computer modern (same as default): +\DeclareInstance {xfrac} {chemmacros-frac-cmr-superscript} {text} + { + numerator-top-sep = -.1ex , + slash-left-kern = -.2em , + slash-right-kern = -.2em , + slash-symbol-font = cmr + } + +\DeclareInstance {xfrac} {chemmacros-frac-cmr-text} {text} + { + numerator-top-sep = 0ex , + slash-left-kern = -.2em , + slash-right-kern = -.2em , + slash-symbol-font = cmr + } + +% Linux Libertine T lining: +\DeclareInstance {xfrac} {chemmacros-frac-LinuxLibertineT-TLF-text} {text} + { + numerator-top-sep = 0ex , + slash-left-kern = 0em , + slash-right-kern = .05em , + slash-symbol-font = LinuxLibertineT-TLF + } + +\DeclareInstance {xfrac} {chemmacros-frac-LinuxLibertineT-TLF-superscript} {text} + { + scale-factor = 1.2 , + denominator-bot-sep = -.1ex , + numerator-top-sep = -.1ex , + slash-left-kern = .1em , + slash-right-kern = .1em , + slash-symbol-font = LinuxLibertineT-TLF + } + +% Linux Libertine T oldstyle: +\DeclareInstance {xfrac} {chemmacros-frac-LinuxLibertineT-TOsF-text} {text} + { + denominator-bot-sep = .1ex , + numerator-top-sep = -.2ex , + slash-left-kern = 0em , + slash-right-kern = 0em , + slash-symbol-font = LinuxLibertineT-TOsF + } + +\DeclareInstance {xfrac} {chemmacros-frac-LinuxLibertineT-TOsF-superscript} {text} + { + scale-factor = 1.2 , + denominator-bot-sep = -.1ex , + numerator-top-sep = -.2ex , + slash-left-kern = 0em , + slash-right-kern = .1em , + slash-symbol-font = LinuxLibertineT-TOsF + } + +% lmodern: +\DeclareInstance {xfrac} {chemmacros-frac-lmr-superscript} {text} + { + slash-left-kern = -.2em , + slash-right-kern = -.2em , + slash-symbol-font = lmr + } + +\DeclareInstance {xfrac} {chemmacros-frac-lmr-text} {text} + { + slash-left-kern = -.2em , + slash-right-kern = -.2em , + slash-symbol-font = lmr + } + +% -------------------------------------------------------------------------- diff --git a/macros/latex/contrib/chemmacros/chemmacros.sty b/macros/latex/contrib/chemmacros/chemmacros.sty new file mode 100644 index 0000000000..fb25545aad --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros.sty @@ -0,0 +1,272 @@ +% -------------------------------------------------------------------------- +% 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-2017 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 {2017/08/28} +\tl_const:Nn \c_chemmacros_version_major_number_tl {5} +\tl_const:Nn \c_chemmacros_version_minor_number_tl {8} +\tl_const:Nn \c_chemmacros_version_subrelease_tl {b} +\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)} + +% -------------------------------------------------------------------------- +% set compatibility +\tl_new:N \l__chemmacros_compatibility_version_tl +\tl_set_eq:NN \l__chemmacros_compatibility_version_tl \c_chemmacros_version_tl + +\keys_define:nn {chemmacros/compatibility} + { + compatibility .code:n = + \str_case:nnTF {#1} + { + {newest} {} + {latest} {} + } + { + \tl_set_eq:NN + \l__chemmacros_compatibility_version_tl + \c_chemmacros_version_tl + } + { \tl_set:Nn \l__chemmacros_compatibility_version_tl {#1} } , + unknown .code:n = + \PassOptionsToPackage{\CurrentOption}{chemmacros4} + \PassOptionsToPackage{\CurrentOption}{chemmacros5} + } + +\ProcessKeysPackageOptions {chemmacros/compatibility} + +% -------------------------------------------------------------------------- +% compare version numbers +% #1: version +% #2: relation +% #3: version +% #4: true +% #5: false +\prg_new_conditional:Npnn \chemmacros_if_version:nnn #1#2#3 {p,T,F,TF} + { + \fp_compare:nTF + { + ( + \chemmacros_get_major_version:n {#1} * 1e6 + + \chemmacros_get_minor_version:n {#1} * 1e3 + + 0 \chemmacros_get_subrelease:n {#1} + ) + #2 + ( + \chemmacros_get_major_version:n {#3} * 1e6 + + \chemmacros_get_minor_version:n {#3} * 1e3 + + 0 \chemmacros_get_subrelease:n {#3} + ) + } + { \prg_return_true: } + { \prg_return_false: } + } +\cs_generate_variant:Nn \chemmacros_if_version:nnnTF {fnf} + +\cs_new:Npn \__chemmacros_get_minor_version:w #1.#2.#3 \q_stop + { + \tl_if_blank:nTF {#2} {0} { + \tl_map_function:nN {#2} \__chemmacros_get_minor_number:n + } + } + +\cs_new:Npn \chemmacros_get_minor_version:n #1 + { \__chemmacros_get_minor_version:w #1.. \q_stop } + +\cs_new:Npn \__chemmacros_get_minor_number:n #1 + { + \str_case:nn {#1} + { + {0} {0} + {1} {1} + {2} {2} + {3} {3} + {4} {4} + {5} {5} + {6} {6} + {7} {7} + {8} {8} + {9} {9} + } + } + +\cs_new:Npn \__chemmacros_get_major_version:w #1.#2.#3 \q_stop + { \tl_if_blank:nTF {#1} {0} {#1} } + +\cs_new:Npn \chemmacros_get_major_version:n #1 + { \__chemmacros_get_major_version:w #1.. \q_stop } + +\cs_new:Npn \__chemmacros_get_subrelease:w #1.#2.#3 \q_stop + { + \tl_if_blank:nTF {#2} {0} { + \tl_map_function:nN {#2} \__chemmacros_get_subrelease_number:n + } + } + +\cs_new:Npn \chemmacros_get_subrelease:n #1 + { \__chemmacros_get_subrelease:w #1.. \q_stop } + +\cs_new:Npn \__chemmacros_get_subrelease_number:n #1 + { + \str_case:nnF {#1} + { + {0} {} + {1} {} + {2} {} + {3} {} + {4} {} + {5} {} + {6} {} + {7} {} + {8} {} + {9} {} + } + { \int_from_alph:n {#1} } + } + +% check compatibility +% #1: relation +% #2: number +% #3: true +% #4: false +\prg_new_conditional:Npnn \chemmacros_if_compatibility:nn #1#2 {p,T,F,TF} + { + \chemmacros_if_version:fnfTF + { \l__chemmacros_compatibility_version_tl } + {#1} + {#2} + { \prg_return_true: } + { \prg_return_false: } + } +\cs_generate_variant:Nn \chemmacros_if_compatibility:nnT {nV} + +% user checks: +\NewExpandableDocumentCommand \IfChemCompatibilityTF {mm+m+m} + { \chemmacros_if_compatibility:nnTF {#1} {#2} {#3} {#4} } + +\NewExpandableDocumentCommand \IfChemCompatibilityT {mm+m} + { \chemmacros_if_compatibility:nnT {#1} {#2} {#3} } + +\NewExpandableDocumentCommand \IfChemCompatibilityF {mm+m} + { \chemmacros_if_compatibility:nnF {#1} {#2} {#3} } + +% -------------------------------------------------------------------------- +% compatibility coding: +\cs_new_protected:Npn \ChemCompatibility #1#2 \EndChemCompatibility + { \chemmacros_if_compatibility:nnT {=} {#1} {#2} } + +\cs_new_protected:Npn \ChemCompatibilityFrom #1#2 \EndChemCompatibility + { \chemmacros_if_compatibility:nnT {>=} {#1} {#2} } + +\cs_new_protected:Npn \ChemCompatibilityTo #1#2 \EndChemCompatibility + { \chemmacros_if_compatibility:nnT {<} {#1} {#2} } + +\cs_new_protected:Npn \ChemCompatibilityBetween #1#2#3 \EndChemCompatibility + { + \bool_if:nT + { + \chemmacros_if_compatibility_p:nn {>=} {#1} && + \chemmacros_if_compatibility_p:nn {<} {#2} + } + {#3} + } + +% -------------------------------------------------------------------------- +% 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} {too-high-compatibility} + { + You~ requested~ compatibility~ mode~ v #1~ while~ the~ current~ version~ + of~ chemmacros~ is~ v \c_chemmacros_version_tl .~ Falling~ back~ + to~ v \c_chemmacros_version_number_tl ! + } + +\msg_new:nnn {chemmacros} {low-compatibility} + { + You~ requested~ compatibility~ mode~ v #1~ while~ the~ current~ version~ + of~ chemmacros~ is~ v \c_chemmacros_version_tl .~ Not~ all~ features~ + or~ fixes~ will~ be~ available! + } + +% -------------------------------------------------------------------------- +% let's see that the max number is the newest (=current) version +\chemmacros_if_compatibility:nnT {>} { \c_chemmacros_version_tl } + { + \tl_set_eq:NN + \l__chemmacros_compatibility_version_tl + \c_chemmacros_version_tl + } + +% -------------------------------------------------------------------------- +% compatibility too low: +\chemmacros_if_compatibility:nnT {<} {4.7} + { + \msg_warning:nnx {chemmacros} {too-low-compatibility} + { \l__chemmacros_compatibility_version_tl } + } + +% not the newest version: +\chemmacros_if_compatibility:nnT {<} { \c_chemmacros_version_tl } + { + \msg_warning:nnx {chemmacros} {low-compatibility} + { \l__chemmacros_compatibility_version_tl } + } + +% -------------------------------------------------------------------------- +\chemmacros_if_compatibility:nnTF {<} {5.0} + { \RequirePackage{chemmacros4} } + { \RequirePackage{chemmacros5} } + +% -------------------------------------------------------------------------- +\tex_endinput:D + diff --git a/macros/latex/contrib/chemmacros/chemmacros4.sty b/macros/latex/contrib/chemmacros/chemmacros4.sty new file mode 100644 index 0000000000..c47106a14b --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros4.sty @@ -0,0 +1,4100 @@ +% -------------------------------------------------------------------------- +% 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-2017 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 } +\def\chemmacros@version{4.7a} +\def\chemmacros@date{2015/08/16} + +\ExplSyntaxOn +\ProvidesExplPackage + {chemmacros4} + {\chemmacros@date} + {\chemmacros@version} + {\c_chemmacros_info_tl \c_space_tl (CN)} + +% -------------------------------------------------------------------------- +% variants of kernel commands: +\cs_generate_variant:Nn \prop_if_in:NnTF { NV , Nx } +\cs_generate_variant:Nn \prop_put:Nnn { NV , NVV , NVx } +\cs_generate_variant:Nn \prop_get:NnNTF { NV } +\cs_generate_variant:Nn \tl_set_rescan:Nnn { NnV } +\cs_generate_variant:Nn \tl_if_eq:nnTF { V } +\cs_generate_variant:Nn \tl_const:cn { cV } + +% -------------------------------------------------------------------------- +% load required packages +% the technical ones: +\RequirePackage { environ , scrlfile , etoolbox , translations } +% related to other topics like mathematics or graphics: +\RequirePackage { xfrac , siunitx , tikz, mathtools , bm } +% other packages of this bundle -- ghsystem is not loaded here but at the end +% of the preamble depending on a package option: +\RequirePackage { chemformula , chemgreek } +% TikZ libraries (the don't like expl3 syntax): +\ExplSyntaxOff +\usetikzlibrary{calc,arrows} +\ExplSyntaxOn + +% -------------------------------------------------------------------------- +% boolean variables for the package options +\bool_new:N \l__chemmacros_xspace_bool +\bool_set_true:N \l__chemmacros_xspace_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_new:N \l__chemmacros_Nu_mathspec_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 +\bool_new:N \l__chemmacros_ghsystem_bool +% \bool_set_true:N \l__chemmacros_ghsystem_bool + +\bool_new:N \l__chemmacros_iupac_restricted_bool +\bool_new:N \l__chemmacros_iupac_strict_bool +\bool_new:N \l__chemmacros_in_document_bool + +\AtBeginDocument + { + \bool_set_true:N \l__chemmacros_in_document_bool + \@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 } + } + +% -------------------------------------------------------------------------- +% warning / error messages +\msg_new:nnnn { chemmacros } { language-not-defined } + { The~ language~ `#1'~ is~ not~ defined~ by~ chemmacros. } + { + You~ chose~ the~ language~ `#1'~ which~ is~ not~ defined~ by~ chemmacros.~ + `english'~ is~ used~ instead.~ If~ you~ just~ mistyped~ try~ again!~ + Otherwise~ contact~ the~ author~ and~ he'll~ probably~ add~ your~ language. + } + +\msg_new:nnnn { chemmacros } { already-defined } + { The~ command~ #1~ is~ already~ defined. } + { + The~ command~ #1~ has~ already~ been~ otherwise.~ chemmacros~ also~ tries~ + to~ define~ it~ and~ fails.~ + } + +\msg_new:nnnn { chemmacros } { not-defined } + { The~ command~ #1~ is~ not~ defined,~ yet. } + { + The~ command~ #1~ is~ not~ defined,~ yet.~ chemmacros~ tries~ to~ + redefine~ it~ and~ fails.~ + } + +\msg_new:nnnn { chemmacros } { option-deprecated } + { The~ option~ `#1'~ is~ deprecated.~ I~ will~ ignore~ it. } + { + The~ package~ option~ `#1'~ is~ deprecated~ and~ not~ used~ by~ + chemmacros~ any~ more.~ It~ will~ therefore~ simply~ be~ ignored. + } + +\msg_new:nnnn { chemmacros } { command-deprecated } + { + The~ command~ \token_to_str:N #1 \c_space_tl is~ deprecated.~ Use~ + \token_to_str:N #2 \c_space_tl instead. + } + { + The~ command~ \token_to_str:N #1 \c_space_tl is~ deprecated.~ Use~ + \token_to_str:N #2 \c_space_tl instead. + } + +\msg_new:nnnn { chemmacros } { command-dropped } + { + The~ command~ \token_to_str:N #1 \c_space_tl has~ been~ dropped.~ I'm~ + sorry. + } + { + The~ command~ \token_to_str:N #1 \c_space_tl has~ been~ dropped.~ I'm~ + sorry. + } + +\msg_new:nnnn { chemmacros } { new-particle } + { + The~ command~ sequence~ \token_to_str:N #1 \c_space_tl is~ already~ + defined. + } + { + You've~ tried~ to~ define~ a~ particle~ with~ \token_to_str:N + \NewChemParticle ,~ but~ the~ command~ sequence~ \token_to_str:N #1 + \c_space_tl already~ exists.~ Please~ choose~ another~ name. + } + +\msg_new:nnnn { chemmacros } { renew-particle } + { The~ particle~ \token_to_str:N #1 \c_space_tl is~ not~ defined. } + { + You've~ tried~ to~ renew~ the~ particle~ \token_to_str:N #1 ,~ but~ it~ + doesn't~ exist. + } + +\msg_new:nnnn { chemmacros } { new-latin } + { + The~ command~ sequence~ \token_to_str:N #1 \c_space_tl is~ already~ + defined. + } + { + You've~ tried~ to~ define~ a~ latin~ phrase~ with~\token_to_str:N + \NewChemLatin ,~ but~ the~ command~ sequence~ \token_to_str:N #1 + \c_space_tl already~ exists.~ Please~ choose~ another~ name. + } + +\msg_new:nnnn { chemmacros } { renew-latin } + { The~ latin~ phrase \token_to_str:N #1 \c_space_tl is~ not~ defined. } + { + You've~ tried~ to~ renew~ the~ latin~ phrase~ \token_to_str:N #1 ,~ but~ + it~ doesn't~ exist. + } + +\msg_new:nnnn { chemmacros } { new-nmr } + { + The~ command~ sequence~ \token_to_str:N #1 \c_space_tl is~ already~ + defined. + } + { + You've~ tried~ to~ define~ a~ NMR~ command~ with~\token_to_str:N + \NewChemParticle ,~ but~ the~ command~ sequence~ \token_to_str:N #1 + \c_space_tl already~ exists.~ Please~ choose~ another~ name. + } + +\msg_new:nnnn { chemmacros } { renew-nmr } + { The~ NMR~ command~ \token_to_str:N #1 \c_space_tl is~ not~ defined. } + { + You've~ tried~ to~ renew~ the~ NMR~ command~ \token_to_str:N #1 ,~ but~ + it~ doesn't~ exist. + } + +\msg_new:nnnn { chemmacros } { new-phase } + { + The~ command~ sequence~ \token_to_str:N #1 \c_space_tl is~ already~ + defined. + } + { + You've~ tried~ to~ define~ a~ phase~ with~ \token_to_str:N + \NewChemPhase ,~ but~ the~ command~ sequence~ \token_to_str:N #1 + \c_space_tl already~ exists.~ Please~ choose~ another~ name. + } + +\msg_new:nnnn { chemmacros } { renew-phase } + { The~ phase~ \token_to_str:N #1 \c_space_tl is~ not~ defined. } + { + You've~ tried~ to~ renew~ the~ phase~ \token_to_str:N #1 ,~ but~ it~ + doesn't~ exist. + } + +\msg_new:nnnn { chemmacros } { new-iupac } + { + The~ iupac~ naming~ command~ \token_to_str:N #1 \c_space_tl is~ already~ + defined. + } + { + You've~ tried~ to~ define~ a~ iupac~ naming~ command~ with~ + \token_to_str:N \NewChemIUPAC ,~ but~ the~ iupac~ command~ + \token_to_str:N #1 \c_space_tl already~ exists.~ Choose~ another~ name~ + or~ use~ \token_to_str:N \RenewChemIUPAC . + } + +\msg_new:nnnn { chemmacros } { renew-iupac } + { + The~ iupac~ naming~ command~ \token_to_str:N #1 \c_space_tl is~ not~ + defined. + } + { + You've~ tried~ to~ renew~ the~ iupac~ command~ \token_to_str:N #1 ,~ but~ + it~ doesn't~ exist.~ Use~ \token_to_str:N \NewChemIUPAC \c_space_tl + instead. + } + +\msg_new:nnnn { chemmacros } { let-iupac } + { + The~ iupac~ naming~ command~ \token_to_str:N #2 \c_space_tl is~ not~ + defined. + } + { + You've~ tried~ to~ let~ the~ iupac~ command~ \token_to_str:N #1 ~ to~ the~ + iupac~ command~ \token_to_str:N #2 ,~ but~ the~ latter~ doesn't~ exist.~ + Use~ \token_to_str:N \NewChemIUPAC \c_space_tl instead~ or~declare~ + \token_to_str:N #2 \c_space_tl first. + } + +\msg_new:nnnn { chemmacros } { ox } + { \token_to_str:N \ox \c_space_tl : ~ #1 ~ \msg_line_context: . } + { \token_to_str:N \ox \c_space_tl : ~ #1 ~ \msg_line_context: . } + +\msg_new:nnnn { chemmacros } { OX } + { \token_to_str:N \OX \c_space_tl : ~ #1 ~ \msg_line_context: . } + { \token_to_str:N \OX \c_space_tl : ~ #1 ~ \msg_line_context: . } + +\msg_new:nnnn { chemmacros } { redox } + { \token_to_str:N \redox \c_space_tl : ~ #1 ~ \msg_line_context: . } + { \token_to_str:N \redox \c_space_tl : ~ #1 ~ \msg_line_context: . } + +\msg_new:nnnn { 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: . + } + { + 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_new:nnnn { chemmacros } { new-state } + { + 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 \RenewChemState + \c_space_tl to~ alter~ it~ \msg_line_context: . + } + { + 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 \RenewChemState + \c_space_tl to~ alter~ it~ \msg_line_context: . + } + +\msg_new:nnnn { chemmacros } { renew-state } + { + 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 + \NewChemState \c_space_tl to~ create~ it~ \msg_line_context: . + } + { + 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 + \NewChemState \c_space_tl to~ create ~it~ \msg_line_context: . + } + +\msg_new:nnn { chemmacros } { state-syntax } + { + You're~ using~ a~ no~ longer~ recommended~ syntax~ to~ (re-)define~ a~ + state~ variable~ \msg_line_context: .~ This~ syntax~ may~ deprecate~ and~ + be~ removed~ in~ the~ future. + } + +% declare an option as deprecated: +\cs_new_protected:Npn \chemmacros_option_deprecated:n #1 + { \msg_warning:nnn { chemmacros } { option-deprecated } { #1 } } + +% define a deprecated command with hints to the corresponding new one: +\cs_new_protected:Npn \chemmacros_define_deprecated:NN #1#2 + { + \cs_set_protected:Npn #1 + { + \msg_warning:nnxx { chemmacros } { command-deprecated } + { #1 } { #2 } + #2 + } + } + +\NewDocumentCommand \DeclareChemDeprecated { mm } + { \chemmacros_define_deprecated:NN #1 #2 } + +% define a command as dropped! +\cs_new_protected:Npn \chemmacros_define_dropped:N #1 + { + \cs_set_protected:Npn #1 + { \msg_error:nnn { chemmacros } { command-dropped } { #1 } } + } + +\NewDocumentCommand \DeclareChemDropped { m } + { \chemmacros_define_dropped:N #1 } + +% -------------------------------------------------------------------------- +% temporary variables +\tl_new:N \l__chemmacros_tmpa_tl +\tl_new:N \l__chemmacros_tmpb_tl +\int_new:N \l__chemmacros_tmpa_int +\box_new:N \l__chemmacros_tmpa_box + +% -------------------------------------------------------------------------- +% language settings: +\bool_new:N \l__chemmacros_language_auto_bool +\bool_set_true:N \l__chemmacros_language_auto_bool +% this token list will hold the chosen language for chemmacros; since the +% language is either chosen automatically or by option it is only available at +% begin document +\tl_new:N \l_chemmacros_language_tl +\tl_set:Nn \l_chemmacros_language_tl { english } +\tl_new:N \l__chemmacros_current_language_tl + +% translate the key #1 +\cs_new:Npn \chemmacros_translate:n #1 + { + \bool_if:NTF \l__chemmacros_language_auto_bool + { \GetTranslation{#1} } + { \GetTranslationFor{\l_chemmacros_language_tl}{#1} } + } + +\AtBeginDocument{ + \bool_if:NTF \l__chemmacros_language_auto_bool + { + \tl_set:Nx \l_chemmacros_language_tl + { \@trnslt@language{\@trnslt@current@language} } + } + { + \tl_set_eq:NN + \l_chemmacros_language_tl + \l__chemmacros_current_language_tl + } +} + +% -------------------------------------------------------------------------- +% package options +% circled => circle charges +% detect-bold => behaviour when font series bold +% EZ => cool or chemmacros version of \E +% german => change pKA => pKS etc +% iupac => behaviour of nomenclature commands +% ngerman => an alias :) +% ghsystem => load ghsystem or don't +% method => use `chemformula' or `mhchem' +% strict => errors or warnings +% synchronize => let particles et.al. adapt chemformula's font selection +% ugreek => behaviour of \chemDelta, \chemalpha, ... +% version=1 => compatibility for documents set with v1.* +% xspace => add an \xspace after a whole bunch of macros + +% this boolean has to be public since the other packages of the bundle may +% want to know its value + +\bool_new:N \l__chemmacros_detect_bold_bool +\bool_set_true:N \l__chemmacros_detect_bold_bool + +\bool_new:N \l__chemmacros_option_greek_set_bool +\bool_new:N \l__chemmacros_use_upgreek_bool +\bool_new:N \l__chemmacros_use_textgreek_bool +\bool_new:N \l__chemmacros_use_kpfonts_bool +\bool_new:N \l__chemmacros_use_newtx_bool + +\cs_new:Npn \chemmacros_inner_font: {} + +\keys_define:nn { chemmacros / option } + { + compatibility .code:n = , + bpchem .code:n = \chemmacros_option_deprecated:n { bpchem } , + 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 = all , + detect-bold .code:n = \chemmacros_option_deprecated:n { detect-bold } , + EZ .code:n = \chemmacros_option_deprecated:n { EZ } , + german .code:n = + \tl_set:Nn \l__chemmacros_current_language_tl { german } , + ngerman .code:n = + \tl_set:Nn \l__chemmacros_current_language_tl { ngerman } , + ghsystem .bool_set:N = \l__chemmacros_ghsystem_bool , + ghsystem .default:n = true , + iupac .choice: , + iupac / restricted .code:n = + \bool_set_true:N \l__chemmacros_iupac_restricted_bool + \bool_set_false:N \l__chemmacros_iupac_strict_bool , + iupac / auto .code:n = + \bool_set_false:N \l__chemmacros_iupac_restricted_bool + \bool_set_false:N \l__chemmacros_iupac_strict_bool , + iupac / strict .code:n = + \bool_set_false:N \l__chemmacros_iupac_restricted_bool + \bool_set_true:N \l__chemmacros_iupac_strict_bool , + language .code:n = + \tl_if_eq:nnTF { #1 } { auto } + { \bool_set_true:N \l__chemmacros_language_auto_bool } + { + \bool_set_false:N \l__chemmacros_language_auto_bool + \tl_set:Nn \l__chemmacros_current_language_tl { #1 } + } , + method .choice: , + method / chemformula .code:n = + \chemmacros_option_deprecated:n { method } , + method / mhchem .code:n = + \chemmacros_option_deprecated:n { method } , + Nu .choice: , + Nu / mathspec .code:n = + \bool_set_true:N \l__chemmacros_Nu_mathspec_bool , + Nu / chemmacros .code:n = + \bool_set_false:N \l__chemmacros_Nu_mathspec_bool , + strict .code:n = + \chemmacros_option_deprecated:n { strict } , + synchronize .choice: , + synchronize / true .code:n = + \cs_set_eq:NN \chemmacros_inner_font: \chemformula_font_inner: , + synchronize / false .code:n = \cs_set:Nn \chemmacros_inner_font: {} , + synchronize .default:n = true , + greek .choice: , + greek / upgreek .code:n = + \chemgreek_activate_mapping:n { upgreek } + \bool_set_true:N \l__chemmacros_option_greek_set_bool , + greek / textgreek .code:n = + \chemgreek_activate_mapping:n { textgreek } + \bool_set_true:N \l__chemmacros_option_greek_set_bool , + greek / kpfonts .code:n = + \chemgreek_activate_mapping:n { kpfonts } + \bool_set_true:N \l__chemmacros_option_greek_set_bool , + greek / newtx .code:n = + \chemgreek_activate_mapping:n { newtx } + \bool_set_true:N \l__chemmacros_option_greek_set_bool , + greek / mathdesign .code:n = + \chemgreek_activate_mapping:n { mathdesign } + \bool_set_true:N \l__chemmacros_option_greek_set_bool , + greek / fourier .code:n = + \chemgreek_activate_mapping:n { fourier } + \bool_set_true:N \l__chemmacros_option_greek_set_bool , + greek / textalpha .code:n = + \chemgreek_activate_mapping:n { textalpha } + \bool_set_true:N \l__chemmacros_option_greek_set_bool , + greek / math .code:n = + \chemgreek_activate_mapping:n { default } + \bool_set_true:N \l__chemmacros_option_greek_set_bool , + greek / auto .code:n = + \bool_set_false:N \l__chemmacros_option_greek_set_bool , + greek .default:n = auto , + upgreek .code:n = \chemmacros_option_deprecated:n { upgreek } , + version .code:n = \chemmacros_option_deprecated:n { version } , + cmversion .code:n = \chemmacros_option_deprecated:n { cmversion } , + cmversion .choice: , + xspace .bool_set:N = \l__chemmacros_xspace_bool , + xspace .default:n = true + } + + + +\ProcessKeysOptions { chemmacros / option } + +% -------------------------------------------------------------------------- +% set up a few things: +% - is `ghsystem' requested? +% - do we need `xspace'? +% - what about the greek letters? + +\seq_new:N \l__chemmacros_greek_packages_seq +\prop_new:N \l__chemmacros_greek_mapping_prop + +\cs_new_protected:Npn \chemmacros_add_greek_package_mapping:nn #1#2 + { + \seq_put_right:Nn \l__chemmacros_greek_packages_seq {#1} + \prop_put:Nnn \l__chemmacros_greek_mapping_prop {#1} {#2} + } + +\cs_generate_variant:Nn \chemgreek_activate_mapping:n { V } + +\cs_new_protected:Npn \__chemmacros_select_greek_mapping:n #1 + { + \bool_if:NF \l__chemmacros_option_greek_set_bool + { + \@ifpackageloaded { #1 } + { + \prop_get:NnN + \l__chemmacros_greek_mapping_prop + { #1 } + \l__chemmacros_tmpa_tl + \chemgreek_activate_mapping:V \l__chemmacros_tmpa_tl + \bool_set_true:N \l__chemmacros_option_greek_set_bool + \seq_map_break: + } + { } + } + } + +\chemmacros_add_greek_package_mapping:nn {upgreek} {upgreek} +\chemmacros_add_greek_package_mapping:nn {textgreek} {textgreek} +\chemmacros_add_greek_package_mapping:nn {mathdesign} {mathdesign} +\chemmacros_add_greek_package_mapping:nn {kpfonts} {kpfonts} +\chemmacros_add_greek_package_mapping:nn {newtxmath} {newtx} +\chemmacros_add_greek_package_mapping:nn {fourier} {fourier} +\chemmacros_add_greek_package_mapping:nn {textalpha} {textalpha} + +\AtEndPreamble + { + \bool_if:NT \l__chemmacros_ghsystem_bool + { \RequirePackage { ghsystem } } + \bool_if:NT \l__chemmacros_xspace_bool + { \RequirePackage { xspace } } + \seq_map_function:NN + \l__chemmacros_greek_packages_seq + \__chemmacros_select_greek_mapping:n + } + +\cs_new_protected:Npn \chemmacros_xspace: + { \bool_if:NT \l__chemmacros_xspace_bool { \xspace } } + +% -------------------------------------------------------------------------- +% TikZ drawings - helper macros +\cs_new_protected:Npn \chemmacros_tikz_picture:nn #1#2 + { \tikzpicture[#1] #2 \endtikzpicture } +\cs_generate_variant:Nn \chemmacros_tikz_picture:nn { fn,xn } + +\cs_new_protected:Npn \chemmacros_tikz_draw:n #1 + { \draw[#1] } +\cs_generate_variant:Nn \chemmacros_tikz_draw:n { f,x } + +\cs_new_protected:Npn \chemmacros_tikz_node:n #1 + { \node[#1] } +\cs_generate_variant:Nn \chemmacros_tikz_node:n { f,x } + +\cs_new_protected:Npn \chemmacros_tikz_shade:n #1 + { \shade[#1] } +\cs_generate_variant:Nn \chemmacros_tikz_shade:n { f,x } + +\cs_new_protected:Npn \chemmacros_tikz_shadedraw:n #1 + { \shadedraw[#1] } +\cs_generate_variant:Nn \chemmacros_tikz_shadedraw:n { f,x } + +\cs_new_protected:Npn \chemmacros_tikz_node_in_draw:n #1 + { node[#1] } +\cs_generate_variant:Nn \chemmacros_tikz_node_in_draw:n { f,x } + +% -------------------------------------------------------------------------- +% a few general functions: +\cs_new_eq:NN \chemmacros_leave_vmode: \chemformula_leave_vmode: +\cs_new_eq:NN \chemmacros_ignore_spaces: \tex_ignorespaces:D +\cs_new_eq:NN \chemmacros_nobreak: \chemformula_nobreak: +\cs_new_eq:NN \chemmacros_allow_break: \chemformula_allow_break: +\cs_new_eq:NN \chemmacros_skip_nobreak:N \chemformula_skip_nobreak:N +\cs_new:Npn \chemmacros_remove_backslash:N #1 + { \exp_after:wN \use_none:n \token_to_str:N #1 } + +\prg_new_protected_conditional:Npnn \chemmacros_if_is_cs:n #1 { T,F,TF } + { + \tl_set:Nx \l__chemmacros_tmpa_tl { \token_if_cs:NTF #1 { } { x } } + \tl_if_blank:VTF \l__chemmacros_tmpa_tl + { \prg_return_true: } + { \prg_return_false: } + } + +% detection and handling of bold face: +\prg_new_protected_conditional:Npnn \chemmacros_if_bold: { T,F,TF } + { + \seq_if_in:NVTF \l__chemmacros_if_bf_seq \f@series + { \prg_return_true: } + { \prg_return_false: } + } + +\seq_new:N \l__chemmacros_if_bf_seq + +\seq_set_split:Nnn \l__chemmacros_if_bf_seq { , } + { + b , bc , bm , bx , bux , + eb , ebc , ebx , mb , + sb , sbc , sbx , + ub , ubc , ubx + } + +\cs_new_protected:Npn \chemmacros_bm:n #1 + { + \bool_if:NTF \l__chemmacros_detect_bold_bool + { \bm { #1 } } + { #1 } + } + +\cs_new_protected:Npn \chemmacros_bf:n #1 + { + \bool_if:NTF \l__chemmacros_detect_bold_bool + { { \normalfont \bfseries #1 } } + { { \normalfont #1 } } + } + +\cs_new_protected:Npn \chemmacros_detect_bold:n #1 + { + \chemmacros_if_bold:TF + { + \mode_if_math:TF + { \chemmacros_bm:n { #1 } } + { \chemmacros_bf:n { #1 } } + } + { #1 } + } + +% --------------------------------------------------------------------------- +% transition state symbol +\cs_new_protected:Npn \__chemmacros_transition_state: + { + \text + { + \skip_horizontal:n { .1ex } + \hbox_overlap_right:n + { \rule { .6ex } { 0pt } \rule { .05ex } { 1.3ex } } + \hbox_overlap_right:n { \rule [ .4ex ] { 1.3ex } { .05ex } } + \rule [ .85ex ] { 1.3ex } { .05ex } + \skip_horizontal:n { .1ex } + } + } + +\cs_new_protected:Npn \chemmacros_transition_state: + { + \ensuremath + { + \mathchoice + { \displaystyle } + { \textstyle } + { \scriptstyle } + { \scriptscriptstyle } + \__chemmacros_transition_state: + } + } + +% \DeclareDocumentCommand? +\cs_new_eq:NN \transitionstatesymbol \chemmacros_transition_state: + +% -------------------------------------------------------------------------- +% let's make use of `chemformula' inside some of `chemmacros' commands: +\cs_new_protected:Nn \chemmacros_atom:n + { + \mode_if_math:TF + { \text { \chemmacros_inner_font: #1 } } + { \group_begin: \chemmacros_inner_font: #1 \group_end: } + } +\cs_generate_variant:Nn \chemmacros_atom:n { V } + +\cs_new_protected:Npn \chemmacros_text:n #1 + { \mode_if_math:TF { \text { #1 } } { #1 } } + +\tl_new:N \l__chemmacros_chemformula_tl + +\cs_new_protected:Npn \chemmacros_chemformula:n #1 + { + \group_begin: + \cs_set_eq:NN \chemformula_font_inner: \chemmacros_inner_font: + \chemformula_chcpd:nn {} { #1 } + \group_end: + } +\cs_generate_variant:Nn \chemmacros_chemformula:n { x,V } + +% -------------------------------------------------------------------------- +% particles, charges +\NewDocumentCommand \NewChemParticle { mm } + { + \cs_if_free:NTF #1 + { \chemmacros_define_particle:Nn #1 { #2 } } + { \msg_error:nnn { chemmacros } { new-particle } { #1 } } + } + +\NewDocumentCommand \RenewChemParticle { mm } + { + \cs_if_free:NTF #1 + { \msg_error:nnn { chemmacros } { renew-particle } { #1 } } + { \chemmacros_define_particle:Nn #1 { #2 } } + } + +\NewDocumentCommand \DeclareChemParticle { mm } + { \chemmacros_define_particle:Nn #1 { #2 } } + +\cs_new_protected:Nn \chemmacros_define_particle:Nn + { + \cs_set_protected:Npn #1 + { + \chemformula_chcpd:nn {} { #2 } + \chemmacros_xspace: + } + } + +\NewChemParticle \el { e- } +\NewChemParticle \prt { p+ } +\NewChemParticle \ntr { n^0 } + +% -------------------------------------------------------------------------- +% charges +% circled charge signs: they are defined in the `chemformula' module: +% use directly: + +\cs_new_protected:Npn \fplus { { \chemformula_fplus: } } +\cs_new_protected:Npn \fminus { { \chemformula_fminus: } } + +% change output depending on circled-option +\cs_new_eq:NN \chemmacros_plus: \chemformula_plus: +\cs_new_eq:NN \chemmacros_minus: \chemformula_minus: + +\cs_new_protected:Npn \chemmacros_formal_plus: + { + \group_begin: + \bool_set_true:N \l_chemformula_formal_charges_bool + \chemformula_plus: + \group_end: + } + +\cs_new_protected:Npn \chemmacros_formal_minus: + { + \group_begin: + \bool_set_true:N \l_chemformula_formal_charges_bool + \chemformula_minus: + \group_end: + } + +\cs_new_protected:Npn \chemmacros_charge:n #1 + { + \chemformula_superscript:n + { \chemmacros_detect_bold:n { #1 } } + } + +\keys_define:nn { chemmacros / charges } + { append .code:n = \chemmacros_option_deprecated:n { append } } + +\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: } } + } + +\tl_new:N \l__chemmacros_partial_charge_format_tl +\tl_set:Nn \l__chemmacros_partial_charge_format_tl { \tiny } + +\cs_new_protected:Npn \delm + { + \mbox { + \l__chemmacros_partial_charge_format_tl + \c_math_toggle_token \delta \chemmacros_minus: \c_math_toggle_token + } + \chemmacros_xspace: + } +\cs_new_protected:Npn \delp + { + \mbox { + \l__chemmacros_partial_charge_format_tl + \c_math_toggle_token \delta \chemmacros_plus: \c_math_toggle_token + } + \chemmacros_xspace: + } +\cs_new_protected:Npn \fdelm + { + \mbox { + \l__chemmacros_partial_charge_format_tl + \c_math_toggle_token \delta \chemmacros_formal_minus: \c_math_toggle_token + } + \chemmacros_xspace: + } +\cs_new_protected:Npn \fdelp + { + \mbox { + \l__chemmacros_partial_charge_format_tl + \c_math_toggle_token \delta \chemmacros_formal_plus: \c_math_toggle_token + } + \chemmacros_xspace: + } + +\cs_new_protected:Npn \scrm + { \ensuremath { \scriptstyle \chemmacros_minus: } } +\cs_new_protected:Npn \scrp + { \ensuremath { \scriptstyle \chemmacros_plus: } } +\cs_new_protected:Npn \fscrm + { \ensuremath { \scriptstyle \chemmacros_formal_minus: } } +\cs_new_protected:Npn \fscrp + { \ensuremath { \scriptstyle \chemmacros_formal_plus: } } +\cs_new_protected:Npn \fsscrm + { \ensuremath { \scriptscriptstyle \chemmacros_formal_minus: } } +\cs_new_protected:Npn \fsscrp + { \ensuremath { \scriptscriptstyle \chemmacros_formal_plus: } } + +\keys_define:nn { chemmacros / charges } + { + partial-format .tl_set:N = \l__chemmacros_partial_charge_format_tl + } + +% -------------------------------------------------------------------------- +% ions, molecules +% proton, hydroxide, hydronium/oxonium, water, nucleophile, electrophile +\NewChemParticle \Hpl { H+ } +\NewChemParticle \Hyd { OH- } +\NewChemParticle \HtO { H3O+ } +\NewChemParticle \El { E+ } +\NewChemParticle \water { H2O } + +\NewDocumentCommand \chemmacros_Nu:w { o } + { + \IfNoValueF { #1 } { \keys_set:nn { chemmacros / particle } { #1 } } + \bool_if:NTF \l__chemmacros_particle_elpair_bool + { \chemmacros_elpair:n { Nu } \mch } + { \chemmacros_chemformula:n { Nu- } } + \chemmacros_xspace: + } + +\AtBeginDocument + { + \bool_if:NTF \l__chemmacros_Nu_mathspec_bool + { \cs_set_eq:NN \Nuc \chemmacros_Nu:w } + { \cs_set_eq:NN \Nu \chemmacros_Nu:w } + } + +\cs_new_protected:Npn \chemmacros_ba: + { + \bool_if:NTF \l__chemmacros_particle_elpair_bool + { \chemmacros_elpair:n { ba } \mch } + { \chemmacros_chemformula:n { ba- } } + \chemmacros_xspace: + } + +\NewDocumentCommand \ba { o } + { + \group_begin: + \IfNoValueF { #1 } { \keys_set:nn { chemmacros / particle } { #1 } } + \chemmacros_ba: + \group_end: + } + +\cs_new_protected:Npn \chemmacros_elpair:n #1 + { + \bool_if:NTF \l__chemmacros_chemfig_bool + { + \bool_if:NTF \l__chemmacros_elpair_dots_bool + { \chlewis { 0: } { #1 } } + { \chlewis { 0| } { #1 } } +% { { \chemmacros_inner_font: #1 \chlewis { 0=| } { \vphantom { #1 } } } } + } + { + \msg_error:nnn { 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 + } + +% -------------------------------------------------------------------------- +% IUPAC +\prop_new:N \l__chemmacros_iupac_prop + +\cs_new_protected:Npn \chemmacros_new_iupac:Nn #1#2 + { + \tl_set:Nx \l__chemmacros_tmpa_tl + { \chemmacros_remove_backslash:N #1 } + \prop_if_in:NVTF \l__chemmacros_iupac_prop \l__chemmacros_tmpa_tl + { \msg_error:nnn { chemmacros } { new-iupac } { #1 } } + { + \prop_put:NVn \l__chemmacros_iupac_prop + \l__chemmacros_tmpa_tl + { #2 } + } + \chemmacros_make_iupac: + } + +\cs_new_protected:Npn \chemmacros_define_iupac:Nn #1#2 + { + \tl_set:Nx \l__chemmacros_tmpa_tl + { \chemmacros_remove_backslash:N #1 } + \prop_put:NVn \l__chemmacros_iupac_prop + \l__chemmacros_tmpa_tl + { #2 } + \chemmacros_make_iupac: + } + +\cs_new_protected:Npn \chemmacros_renew_iupac:Nn #1#2 + { + \tl_set:Nx \l__chemmacros_tmpa_tl + { \chemmacros_remove_backslash:N #1 } + \prop_if_in:NVTF \l__chemmacros_iupac_prop \l__chemmacros_tmpa_tl + { + \prop_put:NVn \l__chemmacros_iupac_prop + \l__chemmacros_tmpa_tl + { #2 } + } + { \msg_error:nnn { chemmacros } { renew-iupac } { #1 } } + \chemmacros_make_iupac: + } + +\cs_new_protected:Npn \chemmacros_let_iupac:NN #1#2 + { + \tl_set:Nx \l__chemmacros_tmpa_tl + { \chemmacros_remove_backslash:N #1 } + \tl_set:Nx \l__chemmacros_tmpb_tl + { \chemmacros_remove_backslash:N #2 } + \prop_get:NVNTF \l__chemmacros_iupac_prop + \l__chemmacros_tmpb_tl + \l__chemmacros_tmpc_tl + { + \prop_put:NVV \l__chemmacros_iupac_prop + \l__chemmacros_tmpa_tl + \l__chemmacros_tmpc_tl + } + { \msg_error:nnnn { chemmacros } { let-iupac } { #1 } { #2 } } + \chemmacros_make_iupac: + } + +\cs_new_protected:Npn \chemmacros_define_deprecated_iupac:NN #1#2 + { + \chemmacros_define_iupac:Nn #1 + { + \msg_warning:nnnn { chemmacros } { command-deprecated } + { #1 } { #2 } + #2 + } + } + + +\cs_new_protected:Npn \chemmacros_make_iupac: + { + \bool_if:NT \l__chemmacros_in_document_bool + { + \bool_if:NTF \l__chemmacros_inside_iupac_bool + { + \prop_map_inline:Nn \l__chemmacros_iupac_prop + { \cs_set_protected:cpn { ##1 } { ##2 } } + } + { + \bool_if:NF \l__chemmacros_iupac_restricted_bool + { + \bool_if:NTF \l__chemmacros_iupac_strict_bool + { + \prop_map_inline:Nn \l__chemmacros_iupac_prop + { \cs_set_protected:cpn { ##1 } { ##2 } } + } + { + \prop_map_inline:Nn \l__chemmacros_iupac_prop + { + \cs_if_exist:cF { ##1 } + { \cs_set_protected:cpn { ##1 } { ##2 } } + } + } + } + } + } + } + +\AtBeginDocument { \chemmacros_make_iupac: } + +\NewDocumentCommand \DeclareChemIUPAC { mm } + { \chemmacros_define_iupac:Nn #1 { #2 } } + +\NewDocumentCommand \NewChemIUPAC { mm } + { \chemmacros_new_iupac:Nn #1 { #2 } } + +\NewDocumentCommand \RenewChemIUPAC { mm } + { \chemmacros_renew_iupac:Nn #1 { #2 } } + +\NewDocumentCommand \LetChemIUPAC { mm } + { \chemmacros_let_iupac:NN #1 #2 } + +\NewDocumentCommand \DeprecateChemIUPAC { mm } + { \chemmacros_define_deprecated_iupac:NN #1 #2 } + +% stereo descriptors and other nomenclature commands +% Cahn-Ingold-Prelog +\dim_new:N \l__chemmacros_cip_kern_dim +\dim_set:Nn \l__chemmacros_cip_kern_dim { .075em } + +\keys_define:nn { chemmacros / iupac } + { cip-kern .dim_set:N = \l__chemmacros_cip_kern_dim } + +\NewDocumentCommand \cip { m } + { \chemmacros_cip:n { #1 } } + +\cs_new_protected:Npn \chemmacros_cip:n #1 + { ( \textit{#1} \tex_kern:D \l__chemmacros_cip_kern_dim ) } + +\DeprecateChemIUPAC \Rcip \rectus +\DeprecateChemIUPAC \Scip \sinister + +\NewChemIUPAC \rectus { \cip { R } } +\NewChemIUPAC \sinister { \cip { S } } + +\LetChemIUPAC \R \rectus +\LetChemIUPAC \S \sinister + +% TikZ needs : to be other +\ExplSyntaxOff +\protected\def\chemmacros@sconf#1% + {% + \begingroup + \tikz[baseline,text height=1.5ex,text depth=.25ex] + { + \node[anchor=base] (chemmacros@@Sconf) {#1} ; + \draw[->,thick,rotate=90] + ($(chemmacros@@Sconf.center)+(20:.8em)$) arc (20:340:.8em); + }% + \endgroup + } + +\protected\def\chemmacros@rconf#1% + {% + \begingroup + \tikz[baseline,text height=1.5ex,text depth=.25ex] + { + \node[anchor=base] (chemmacros@@Rconf) {#1} ; + \draw[<-,thick,rotate=90] + ($(chemmacros@@Rconf.center)+(20:.8em)$) arc (20:340:.8em) ; + }% + \endgroup + } +\ExplSyntaxOn + +\NewDocumentCommand \Sconf { O{S} } { \chemmacros@sconf { #1 } } +\NewDocumentCommand \Rconf { O{R} } { \chemmacros@rconf { #1 } } + +% E(ntgegen)/Z(usammen) +\NewChemIUPAC \entgegen { \cip { E } } +\NewChemIUPAC \zusammen { \cip { Z } } + +\LetChemIUPAC \E \entgegen +\LetChemIUPAC \Z \zusammen + +% cis/trans +\NewChemIUPAC \cis { \textit { cis } } +\NewChemIUPAC \trans { \textit { trans } } + +% fac/mer +\NewChemIUPAC \fac { \textit { fac } } +\NewChemIUPAC \mer { \textit { mer } } + +% tert +\NewChemIUPAC \tert { \textit { tert } } + +% Fischer +\NewChemIUPAC \dexter { \textsc { d } } +\NewChemIUPAC \laevus { \textsc { l } } + +\LetChemIUPAC \D \dexter +\LetChemIUPAC \L \laevus + +% ortho/meta/para +\NewChemIUPAC \ortho { \textit { o } } +\NewChemIUPAC \meta { \textit { m } } +\NewChemIUPAC \para { \textit { p } } + +% syn/anti +\NewChemIUPAC \syn { \textit { syn } } +\NewChemIUPAC \anti { \textit { anti } } + +% coordination chemistry +\bool_new:N \l__chemmacros_bridge_super_bool + +\keys_define:nn { chemmacros / iupac } + { + bridge-number .choice: , + bridge-number / sub .code:n = + \bool_set_false:N \l__chemmacros_bridge_super_bool , + bridge-number / super .code:n = + \bool_set_true:N \l__chemmacros_bridge_super_bool , + coord-use-hyphen .bool_set:N = \l__chemmacros_coord_use_hyphen_bool , + coord-use-hyphen .default:n = true + } + +\cs_new_protected:Npn \chemformula_hapto:n #1 + { + \chemeta \chemformula_superscript:n { #1 } + \bool_if:NT \l__chemmacros_coord_use_hyphen_bool + { \chemmacros_break_point_hyphen: } + } + +\cs_new_protected:Npn \chemformula_dento:n #1 + { + \chemkappa \chemformula_superscript:n { #1 } + \bool_if:NT \l__chemmacros_coord_use_hyphen_bool + { \chemmacros_break_point_hyphen: } + } + +\cs_new_protected:Npn \chemformula_bridge:n #1 + { + \chemmu + \tl_if_blank:nF { #1 } + { + \bool_if:NTF \l__chemmacros_bridge_super_bool + { \chemformula_superscript:n { #1 } } + { \chemformula_subscript:n { #1 } } + } + \bool_if:NT \l__chemmacros_coord_use_hyphen_bool + { \chemmacros_break_point_hyphen: } + } + +\NewChemIUPAC \hapto { \chemformula_hapto:n } +\NewChemIUPAC \dento { \chemformula_dento:n } +\NewChemIUPAC \bridge { \chemformula_bridge:n } + +% attachments to heteroatoms / added hydrogen +\NewChemIUPAC \hydrogen { \textit { H } } +\NewChemIUPAC \oxygen { \textit { O } } +\NewChemIUPAC \nitrogen { \textit { N } } +\NewChemIUPAC \sulfur { \textit { S } } +\NewChemIUPAC \phosphorus { \textit { P } } + +\LetChemIUPAC \H \hydrogen +\LetChemIUPAC \O \oxygen +\LetChemIUPAC \N \nitrogen +\LetChemIUPAC \Sf \sulfur +\LetChemIUPAC \P \phosphorus + +% language specific settings +\AtBeginDocument + { + \bool_if:NT \l__chemmacros_italian_bool + { + \NewChemIUPAC \sin { \textit { sin } } + \NewChemIUPAC \ter { \textit { ter } } + } + } + +% greek letters +\NewChemIUPAC \a { \chemalpha } +\NewChemIUPAC \b { \chembeta } +\NewChemIUPAC \g { \chemgamma } +\NewChemIUPAC \d { \chemdelta } +\NewChemIUPAC \k { \chemkappa } +\NewChemIUPAC \m { \chemmu } +\NewChemIUPAC \n { \chemeta } +\NewChemIUPAC \w { \chemomega } + +% \iupac (basically the same as bpchem's \IUPAC) +% - allows multiple breaking points as compound names can get really long and +% especially in multicolumn documents can span more than two lines +% - add a (very) little space before the hyphen and a little negative space +% after it +% - add a little space at breaking points if not broken +% - enables all naming commands regardless if they're definied otherwise or not +\cs_new_protected:Nn \chemmacros_allow_hyphens: + { + \chemmacros_nobreak: + \skip_horizontal:N \c_zero_dim + } + +\dim_new:N \l__chemmacros_iupac_hyphen_pre_dim +\dim_set:Nn \l__chemmacros_iupac_hyphen_pre_dim { .01em } +\dim_new:N \l__chemmacros_iupac_hyphen_post_dim +\dim_set:Nn \l__chemmacros_iupac_hyphen_post_dim { -.03em } +\dim_new:N \l__chemmacros_iupac_break_dim +\dim_set:Nn \l__chemmacros_iupac_break_dim { .03em } + +\keys_define:nn { chemmacros / iupac } + { + hyphen-pre-space .dim_set:N = \l__chemmacros_iupac_hyphen_pre_dim , + hyphen-post-space .dim_set:N = \l__chemmacros_iupac_hyphen_post_dim , + break-space .dim_set:N = \l__chemmacros_iupac_break_dim + } + +\cs_new_protected:Nn \chemmacros_break_point_hyphen: + { + \chemmacros_nobreak: + \tex_discretionary:D { - } { } + { + \tex_kern:D \l__chemmacros_iupac_hyphen_pre_dim + - + \tex_kern:D \l__chemmacros_iupac_hyphen_post_dim + } + \chemmacros_allow_hyphens: + } + +\cs_new_protected:Npn \chemmacros_break_point: + { + \chemmacros_nobreak: + \tex_discretionary:D { - } { } + { \tex_kern:D \l__chemmacros_iupac_break_dim } + \chemmacros_allow_hyphens: + } + +\cs_new_protected:Npn \chemmacros_superscript:n #1 + { \mode_if_math:TF { \sb {#1} } { \textsuperscript {#1} } } + +\bool_new:N \l__chemmacros_inside_iupac_bool + +\char_set_active_eq:NN | \chemmacros_break_point: +\char_set_active_eq:NN ^ \chemmacros_superscript:n + +\group_begin: +\char_set_catcode_active:N \| +\char_set_catcode_active:N \^ + +\cs_new_protected:Npn \chemmacros_iupac:n #1 + { + \group_begin: + \bool_set_true:N \l__chemmacros_inside_iupac_bool + \chemmacros_make_iupac: + \chemmacros_ignore_spaces: + \cs_set_eq:NN \- \chemmacros_break_point_hyphen: + \chemmacros_define_deprecated:NN \| | + \chemmacros_define_deprecated:NN \^ ^ + \tl_set_rescan:Nnn \l__chemmacros_tmpa_tl + { + \char_set_catcode_active:N \| + \char_set_catcode_active:N \^ + } + {#1} + \l__chemmacros_tmpa_tl + \group_end: + } + +\group_end: + +% Thanks to Joseph Wright and Enrico Gregorio for the help on the curious +% redefinition of \- and the end of the compilation +% see http://tex.stackexchange.com/q/42405/5049 for reference +\cs_set_protected:Npx \| { \exp_not:o { \| } } +\cs_set_protected:Npx \- { \exp_not:o { \- } } +\cs_set_eq:NN \@dischyph \- + +\NewDocumentCommand \iupac { } + { \chemmacros_iupac:n } + +% -------------------------------------------------------------------------- +% latin phrases +\tl_new:N \l__chemmacros_latin_format_tl +\tl_set:Nn \l__chemmacros_latin_format_tl { \itshape } + +\keys_define:nn { chemmacros / latin } + { format . tl_set:N = \l__chemmacros_latin_format_tl } + +\cs_new_protected:Npn \chemmacros_latin:n #1 + { { \l__chemmacros_latin_format_tl #1 } } + +\prop_new:N \l__chemmacros_latin_prop + +\cs_new_protected:Npn \chemmacros_new_latin:Nn #1#2 + { + \cs_if_free:NTF #1 + { + \cs_new_protected:Npn #1 + { \chemmacros_latin:n { #2 } \chemmacros_xspace: } + \prop_put:Nnn \l__chemmacros_latin_prop { #1 } { #2 } + } + { \msg_error:nnn { chemmacros } { new-latin } { #1 } } + } + +\cs_new_protected:Npn \chemmacros_define_latin:Nn #1#2 + { + \cs_if_free:NTF #1 + { + \cs_new_protected:Npn #1 + { \chemmacros_latin:n { #2 } \chemmacros_xspace: } + \prop_put:Nnn \l__chemmacros_latin_prop { #1 } { #2 } + } + { + \cs_set_protected:Npn #1 + { \chemmacros_latin:n { #2 } \chemmacros_xspace: } + \prop_put:Nnn \l__chemmacros_latin_prop { #1 } { #2 } + } + } + +\cs_new_protected:Npn \chemmacros_renew_latin:Nn #1#2 + { + \prop_if_in:NnTF \l__chemmacros_latin_prop { #1 } + { \cs_set:Npn #1 { \chemmacros_latin:n { #2 } \chemmacros_xspace: } } + { \msg_error:nnn { chemmacros } { renew-latin } { #1 } } + } + +\NewDocumentCommand \NewChemLatin { mm } + { \chemmacros_new_latin:Nn #1 { #2 } } + +\NewDocumentCommand \RenewChemLatin { mm } + { \chemmacros_renew_latin:Nn #1 { #2 } } + +\NewDocumentCommand \DeclareChemLatin { mm } + { \chemmacros_define_latin:Nn #1 { #2 } } + +\AtBeginDocument + { + \bool_if:NTF \l__chemmacros_chemstyle_bool + { + \AfterPackage* { chemstyle } + { + \cs_undefine:N \invacuo + \cs_set_eq:NN \chemmacros_latin:n \cst@latin + } + } + { + \cs_new_eq:NN \latin \chemmacros_latin:n + } + \NewChemLatin \insitu { in~situ } + \NewChemLatin \abinitio { ab~initio } + \NewChemLatin \invacuo { in~vacuo } + } + +% --------------------------------------------------------------------------- % +% acid / base +\tl_new:N \l__chemmacros_k_acid_tl +\tl_new:N \l__chemmacros_k_base_tl +\tl_new:N \l__chemmacros_k_water_tl + +% \bool_new:N \l__chemmacros_subscript_lowercase_bool + +\tl_set:Nn \l__chemmacros_k_acid_tl + { \chemmacros_translate:n {K-acid} } + +\tl_set:Nn \l__chemmacros_k_base_tl + { \chemmacros_translate:n {K-base} } + +\tl_set:Nn \l__chemmacros_k_water_tl + { \chemmacros_translate:n {K-water} } + +\keys_define:nn { chemmacros / 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 , + K-acid .tl_set:N = \l__chemmacros_k_acid_tl , + K-base .tl_set:N = \l__chemmacros_k_base_tl , + K-water .tl_set:N = \l__chemmacros_k_water_tl , + subscript .code:n = \chemmacros_option_deprecated:n {#1} + % subscript / lowercase .code:n = + % \bool_set_true:N \l__chemmacros_subscript_lowercase_bool , + % subscript / uppercase .code:n = + % \bool_set_false:N \l__chemmacros_subscript_lowercase_bool + } + +\cs_new_eq:NN \chemmacros_p_style:n \textup + +\cs_new_protected:Npn \Ka + { + \ensuremath + { + \chemmacros_detect_bold:n + { + K + \c_math_subscript_token + { \l__chemmacros_k_acid_tl } + } + } + \chemmacros_xspace: + } + +\cs_new_protected:Npn \Kb + { + \ensuremath + { + \chemmacros_detect_bold:n + { + K + \c_math_subscript_token + { \l__chemmacros_k_base_tl } + } + } + \chemmacros_xspace: + } + +\cs_new_protected:Npn \Kw + { + \ensuremath + { + \chemmacros_detect_bold:n + { + K + \c_math_subscript_token + { \l__chemmacros_k_water_tl } + } + } + \chemmacros_xspace: + } + +\cs_new_protected:Npn \chemmacros_p:n #1 + { + \group_begin: + \mbox + { + \chemmacros_p_style:n { p } + \ensuremath { #1 } + } + \group_end: + } + +\NewDocumentCommand \p { m } + { \chemmacros_p:n { #1 } } + +\cs_new_protected:Npn \pH + { + \chemmacros_p:n { \chemmacros_chemformula:n { H } } + \chemmacros_xspace: + } + +\cs_new_protected:Npn \pOH + { + \chemmacros_p:n { \chemmacros_chemformula:n { OH } } + \chemmacros_xspace: + } + +\NewDocumentCommand \pKa { o } + { + \chemmacros_p:n + { + \Ka \IfNoValueF { #1 } + { {} \c_math_subscript_token { \chemmacros_detect_bold:n { #1 } } } + } + \chemmacros_xspace: + } + +\NewDocumentCommand \pKb { o } + { + \chemmacros_p:n + { + \Kb \IfNoValueF { #1 } + { {} \c_math_subscript_token { \chemmacros_detect_bold:n { #1 } } } + } + \chemmacros_xspace: + } + +% -------------------------------------------------------------------------- +% 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_protected: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 } + } + +\keys_define:nn { chemmacros / mech } + { + type .choice: , + type / .code:n = + { + \__chemmacros_set_mech:nnn { S } + { + \c_math_toggle_token + \c_math_subscript_token { \text {N} } + \c_math_toggle_token + } + { } + } , + type / 1 .code:n = + { + \__chemmacros_set_mech:nnn { S } + { + \c_math_toggle_token + \c_math_subscript_token { \text {N} } + \c_math_toggle_token + 1 + } + { } + } , + type / 2 .code:n = + { + \__chemmacros_set_mech:nnn { S } + { + \c_math_toggle_token + \c_math_subscript_token { \text {N} } + \c_math_toggle_token + 2 + } + { } + } , + type / se .code:n = + { + \__chemmacros_set_mech:nnn { S } + { + \c_math_toggle_token + \c_math_subscript_token { \text {E} } + \c_math_toggle_token + } + { } + } , + type / 1e .code:n = + { + \__chemmacros_set_mech:nnn { S } + { + \c_math_toggle_token + \c_math_subscript_token { \text {E} } + \c_math_toggle_token + 1 + } + { } + } , + type / 2e .code:n = + { + \__chemmacros_set_mech:nnn { S } + { + \c_math_toggle_token + \c_math_subscript_token { \text {E} } + \c_math_toggle_token + 2 + } + { } + } , + type / ar .code:n = + { + \__chemmacros_set_mech:nnn { S } + { + \c_math_toggle_token + \c_math_subscript_token { \text {E} } + \c_math_toggle_token + } + { 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 + \c_math_toggle_token + \c_math_subscript_token { \text {cb} } + \c_math_toggle_token + } + { } + } , + type .default:n = + } + +\cs_new_protected:Npn \chemmacros_mech:n #1 + { + \tl_if_blank:nTF { #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: + } + +\NewDocumentCommand \mech { o } + { + \IfNoValueTF { #1 } + { \chemmacros_mech:n { } } + { \chemmacros_mech:n { #1 } } + } + +% -------------------------------------------------------------------------- +% 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 +\bool_new:N \l__chemmacros_ox_side_bool +\bool_new:N \l__chemmacros_ox_super_bool +\bool_new:N \l__chemmacros_ox_top_bool +\bool_set_true:N \l__chemmacros_ox_top_bool +\bool_new:N \l__chemmacros_ox_align_center_bool + +\int_new:N \l__chemmacros_ox_number_int +\fp_new:N \l__chemmacros_ox_number_fp + +\cs_new_protected:Npn \__chemmacros_ox_process_number:n #1 + { + \bool_if:NTF \l__chemmacros_ox_parse_bool + { + \tl_if_in:nnTF { #1 } { / } + { \__chemmacros_ox_fraction:w #1 \q_stop } + { + \__chemmacros_ox_sign:n { #1 } + \__chemmacros_ox_value:n { #1 } + } + } + { #1 } + } + +\DeclareInstance { xfrac } { chemmacros-ox-frac } { text } + { + scale-factor = 1.2 , + denominator-bot-sep = -.5ex , + numerator-top-sep = -.3ex , + slash-left-kern = -.2em , + slash-right-kern = -.2em , + slash-symbol-font = lmr + } + +\cs_new_protected:Npn \__chemmacros_ox_fraction:w #1/#2 \q_stop + { + \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_protected:Npn \__chemmacros_ox_sign:n #1 + { + \fp_compare:nNnT { #1 } > { 0 } + { + \bool_if:NT \l__chemmacros_ox_explicit_sign_bool + { \c_math_toggle_token + \c_math_toggle_token } + } + \fp_compare:nNnT { #1 } = { 0 } + { + \bool_if:NT \l__chemmacros_ox_explicit_sign_bool + { \c_math_toggle_token \pm \c_math_toggle_token } + } + \fp_compare:nNnT { #1 } < { 0 } + { \c_math_toggle_token - \c_math_toggle_token } + } + +\cs_new_protected:Npn \__chemmacros_ox_value:n #1 + { + \fp_set:Nn \l__chemmacros_ox_number_fp { abs(#1) } + \__chemmacros_ox_is_integer:V \l__chemmacros_ox_number_fp + \bool_if:NTF \l__chemmacros_ox_format_roman_bool + { \__chemmacros_fp_to_Roman:V \l__chemmacros_ox_number_fp } + { + \bool_if:NTF \l__chemmacros_ox_integer_bool + { + \c_math_toggle_token + \__chemmacros_fp_to_arabic:V \l__chemmacros_ox_number_fp + \c_math_toggle_token + } + { + \c_math_toggle_token + \__chemmacros_fp_show:V \l__chemmacros_ox_number_fp + \c_math_toggle_token + } + } + } + +\cs_new_protected:Npn \__chemmacros_ox_is_integer:n #1 + { + \fp_set:Nn \l__chemmacros_tmpa_fp { round(#1 + 1 , 0 ) - 1 } + \fp_compare:nNnTF { \l__chemmacros_tmpa_fp } = { #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 { V } + +\cs_new_protected:Npn \__chemmacros_fp_to_Roman:n #1 + { + \group_begin: + \fp_set:Nn \l__chemmacros_tmpa_fp { round(#1 , 0 ) } + \int_set:Nn \l__chemmacros_tmpa_int + { \fp_to_tl:N \l__chemmacros_tmpa_fp } + \int_compare:nTF { \l__chemmacros_tmpa_int = 0 } + { 0 } + { \int_to_Roman:n { \l__chemmacros_tmpa_int } } + \group_end: + } +\cs_generate_variant:Nn \__chemmacros_fp_to_Roman:n { V } + +\cs_new_protected:Npn \__chemmacros_fp_to_arabic:n #1 + { + \group_begin: + \fp_set:Nn \l__chemmacros_tmpa_tl { #1 } + \fp_to_tl:N \l__chemmacros_tmpa_tl + \group_end: + } +\cs_generate_variant:Nn \__chemmacros_fp_to_arabic:n { V } + +\cs_new_protected:Npn \__chemmacros_fp_show:n #1 + { + \group_begin: + \fp_set:Nn \l__chemmacros_tmpa_tl { #1 } + \bool_if:NTF \l__chemmacros_ox_decimal_marker_comma_bool + { + \tl_set:Nx \l__chemmacros_tmpb_tl + { \fp_to_tl:N \l__chemmacros_tmpa_tl } + \tl_replace_once:Nnn \l__chemmacros_tmpb_tl { . } { {,} } + \tl_use:N \l__chemmacros_tmpb_tl + } + { \fp_to_tl:N \l__chemmacros_tmpa_tl } + \group_end: + } +\cs_generate_variant:Nn \__chemmacros_fp_show:n { V } + +\cs_new_protected:Npn \__chemmacros_ox_write: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_text:n + { + #2 + \c_math_toggle_token + \c_math_superscript_token + { \text { \tiny \__chemmacros_ox_process_number:n { #1 } } } + \c_math_toggle_token + } + } + \bool_if:NT \l__chemmacros_ox_side_bool + { + \chemmacros_text:n + { #2 ( \text { \__chemmacros_ox_process_number:n { #1 } } ) } + } + \bool_if:NT \l__chemmacros_ox_top_bool + { + \overset + { + \bool_if:NTF \l__chemmacros_ox_align_center_bool + { \clap } { \rlap } + { + \chemmacros_text:n + { \tiny \__chemmacros_ox_process_number:n { #1 } } + } + } + { \chemmacros_text:n { #2 } } + } + } + } + +\cs_new_protected: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_protected: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_protected: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 } , + align .choice: , + align / center .code:n = \bool_set_true:N \l__chemmacros_ox_align_center_bool , + align / right .code:n = \bool_set_false:N \l__chemmacros_ox_align_center_bool + } + +% \ox[<keyval>]{<num>,<atom>} +% \ox*[<keyval>]{<num>,<atom>} => always number on the side +\cs_new_protected:Npn \chemmacros_ox:nnnn #1#2#3#4 + { + \group_begin: + \tl_if_blank:nF { #1 } { \__chemmacros_ox_pos_super: } + \keys_set:nn { chemmacros / ox } { #2 } + \__chemmacros_ox_write:nn { #3 } { #4 } + \group_end: + } + +\NewDocumentCommand \ox { s o > { \SplitArgument { 1 } { , } } m } + { + \IfBooleanTF { #1 } + { + \IfNoValueTF { #2 } + { \chemmacros_ox:nnnn { #1 } { } #3 } + { \chemmacros_ox:nnnn { #1 } { #2 } #3 } + } + { + \IfNoValueTF { #2 } + { \chemmacros_ox:nnnn { } { } #3 } + { \chemmacros_ox:nnnn { } { #2 } #3 } + } + } + +% --------------------------------------------------------------------------- % +% - 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 +\tl_new:N \l__chemmacros_redox_shift_tl +\tl_new:N \l__chemmacros_redox_anchor_tl +\tl_new:N \l__chemmacros_redox_side_tl + +\fp_new:N \l__chemmacros_redox_shift_fp + +\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_protected:Npn \chemmacros_redox_partner:nn #1#2 + { + \chemformula_latex_if:nTF { measuring@ } + { + \group_begin: + \tikz[baseline=(#1.base)] + { \node [inner~sep=0pt] (#1) { #2 } ; } + \group_end: + } + { + \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=0pt] (#1) { #2 } ; } + } + } + +\cs_new_protected: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 } + } + +\cs_new_protected:Npn \chemmacros_redox:nnnnn #1#2#3#4#5 + { + \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 } { #2 } + \tl_if_blank:nF { #3 } + { \tl_set:Nn \l__chemmacros_redox_tikz_tl { #3 } } + \tl_if_blank:nTF { #4 } + { + \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 { #4 } < { 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 { #4 } + } + \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] { { #5 } } + ($ + (\l__chemmacros_redox_end_tl . + \l__chemmacros_redox_side_tl)+(0,\l__chemmacros_redox_sep_dim) + $) ; + } + } + +\NewDocumentCommand \redox { > { \SplitArgument { 1 } { , } } r() o o G{} } + { + \IfNoValueT { #1 } + { + \msg_error:nnx { chemmacros } { redox } + { You~need~to~specify~coordinates } + } + \IfNoValueTF { #2 } + { \chemmacros_redox:nnnnn #1 { } { } { #4 } } + { + \IfNoValueTF { #3 } + { \chemmacros_redox:nnnnn #1 { #2 } { } { #4 } } + { \chemmacros_redox:nnnnn #1 { #2 } { #3 } { #4 } } + } + } + +% 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 } + } + +% --------------------------------------------------------------------------- % +% spectroscopy +\tl_new:N \g__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_coupling_nuclei_tl +\tl_new:N \l__chemmacros_nmr_coupling_nuclei_pre_tl +\tl_set:Nn \l__chemmacros_nmr_coupling_nuclei_pre_tl { ( } +\tl_new:N \l__chemmacros_nmr_coupling_nuclei_post_tl +\tl_set:Nn \l__chemmacros_nmr_coupling_nuclei_post_tl { ) } +\tl_new:N \l__chemmacros_nmr_coupling_bonds_tl +\tl_new:N \l__chemmacros_nmr_coupling_bonds_pre_tl +\tl_set:Nn \l__chemmacros_nmr_coupling_bonds_pre_tl { } +\tl_set:Nn \l__chemmacros_nmr_coupling_bonds_post_tl { \! } +\tl_new:N \l__chemmacros_nmr_coupling_symbol_tl +\tl_set:Nn \l__chemmacros_nmr_coupling_symbol_tl { J } +\tl_new:N \g__chemmacros_nmr_element_coupled_tl +\tl_new:N \g__chemmacros_nmr_element_tl +\tl_new:N \l__chemmacros_nmr_element_default_tl +\tl_set:Nn \l__chemmacros_nmr_element_default_tl { H } +\tl_new:N \l__chemmacros_nmr_format_tl +\tl_new:N \l__chemmacros_nmr_delta_tl +\tl_new:N \l__chemmacros_nmr_coupling_unit_tl +\tl_set:Nn \l__chemmacros_nmr_coupling_unit_tl { \hertz } +\tl_new:N \l__chemmacros_nmr_unit_tl +\tl_set:Nn \l__chemmacros_nmr_unit_tl { \mega\hertz } +\tl_new:N \l__chemmacros_nmr_list_setup_tl +\tl_set:Nn \l__chemmacros_nmr_list_setup_tl + { + \topsep\z@skip \partopsep\z@skip + \itemsep\z@ \parsep\z@ \itemindent\z@ + \leftmargin\z@ + } +\tl_new:N \l__chemmacros_nmr_position_tl +\tl_new:N \l__chemmacros_nmr_element_method_connector_tl +\tl_set:Nn \l__chemmacros_nmr_element_method_connector_tl {-} +\tl_new:N \l__chemmacros_nmr_method_tl +\tl_set:Nn \l__chemmacros_nmr_method_tl {NMR} + +\bool_new:N \l__chemmacros_nmr_coupling_nuclei_sub_bool +\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 +\bool_new:N \l__chemmacros_nmr_inner_bool +\bool_new:N \l__chemmacros_nmr_position_side_bool +\bool_new:N \l__chemmacros_nmr_parse_bool +\bool_set_true:N \l__chemmacros_nmr_parse_bool +\bool_new:N \l__chemmacros_nmr_list_bool +\bool_new:N \l__chemmacros_nmr_use_equal_bool +\bool_new:N \l__chemmacros_nmr_custom_command_active_bool +\bool_new:N \l__chemmacros_nmr_custom_command_used_bool + +\cs_new_protected:Npn \__chemmacros_nmr_nucleus:nn #1#2 + { + \tl_gset:Nn \g__chemmacros_nmr_isotope_tl { #1 } + \tl_if_in:nnTF { #2 } { [ } + { \__chemmacros_nmr_element:w #2 \q_stop } + { + \tl_gset:No \g__chemmacros_nmr_element_tl { #2 } + \tl_gclear:N \g__chemmacros_nmr_element_coupled_tl + } + } +\cs_generate_variant:Nn \__chemmacros_nmr_nucleus:nn { VV } + +\cs_new_protected:Npn \__chemmacros_nmr_nucleus:w #1,#2 \q_stop + { + \tl_gset:Nn \g__chemmacros_nmr_isotope_tl { #1 } + \tl_if_in:nnTF { #2 } { [ } + { \__chemmacros_nmr_element:w #2 \q_stop } + { + \tl_gset:No \g__chemmacros_nmr_element_tl { #2 } + \tl_gclear:N \g__chemmacros_nmr_element_coupled_tl + } + } + +\cs_new_protected:Npn \__chemmacros_nmr_element:w #1[#2] \q_stop + { + \tl_gset:Nn \g__chemmacros_nmr_element_tl { #1 } + \tl_gset:Nn \g__chemmacros_nmr_element_coupled_tl { #2 } + } + +\cs_new_protected:Npn \__chemmacros_nmr_default_nucleus:w #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_protected:Npn \__chemmacros_nmr_base:nn #1#2 + { + \tl_if_blank:VF \g__chemmacros_nmr_element_coupled_tl + { + \tl_put_left:Nn \g__chemmacros_nmr_element_coupled_tl { \{ } + \tl_put_right:Nn \g__chemmacros_nmr_element_coupled_tl { \} } + } + \tl_put_left:Nn \g__chemmacros_nmr_element_coupled_tl { #2 } + \iupac { ^ { #1 } } + \bool_if:NTF \l__chemmacros_nmr_parse_bool + { \chemformula_ch:nV {} \g__chemmacros_nmr_element_coupled_tl } + { \chemmacros_atom:V \g__chemmacros_nmr_element_coupled_tl } + \tl_use:N \l__chemmacros_nmr_element_method_connector_tl + \tl_use:N \l__chemmacros_nmr_method_tl + } +\cs_generate_variant:Nn \__chemmacros_nmr_base:nn { VV } + +\cs_new_protected:Npn \__chemmacros_nmr_frequency:n #1 + { + \tl_if_in:nnTF { #1 } { , } + { \__chemmacros_nmr_frequency_aux_i:w #1 \q_stop } + { \__chemmacros_nmr_frequency_aux_ii:n { #1 } } + } + +\cs_new_protected:Npn \__chemmacros_nmr_frequency_aux_i:w #1,#2 \q_stop + { \SI { #1 } { #2 } } + +\cs_new_protected:Npn \__chemmacros_nmr_frequency_aux_ii:n #1 + { \SI { #1 } { \tl_use:N \l__chemmacros_nmr_unit_tl } } + +\cs_new_eq:NN \__chemmacros_nmr_number:n \use:n +\cs_new_eq:NN \__chemmacros_nmr_position:n \use:n + +\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:w #1 \q_stop } , + nucleus .default:n = { 1,H } , + format .tl_set:N = \l__chemmacros_nmr_format_tl , + method .tl_set:N = \l__chemmacros_nmr_method_tl , + connector .tl_set:N = \l__chemmacros_nmr_element_method_connector_tl , + pos-number .choice: , + pos-number / sub .code:n = + \tl_set:Nn \l__chemmacros_nmr_position_tl { _ } + \bool_set_false:N \l__chemmacros_nmr_position_side_bool , + pos-number / super .code:n = + \tl_set:Nn \l__chemmacros_nmr_position_tl { ^ } + \bool_set_false:N \l__chemmacros_nmr_position_side_bool , + pos-number / side .code:n = + \tl_set:Nn \l__chemmacros_nmr_position_tl { - } + \bool_set_true:N \l__chemmacros_nmr_position_side_bool , + coupling-unit .tl_set:N = \l__chemmacros_nmr_coupling_unit_tl , + coupling-pos .choice: , + coupling-pos / sub .code:n = + \bool_set_true:N \l__chemmacros_nmr_coupling_nuclei_sub_bool , + coupling-pos / side .code:n = + \bool_set_false:N \l__chemmacros_nmr_coupling_nuclei_sub_bool , + coupling-nuclei-pre .tl_set:N = + \l__chemmacros_nmr_coupling_nuclei_pre_tl , + coupling-nuclei-post .tl_set:N = + \l__chemmacros_nmr_coupling_nuclei_post_tl , + coupling-bonds-pre .tl_set:N = + \l__chemmacros_nmr_coupling_bonds_pre_tl , + coupling-bonds-post .tl_set:N = + \l__chemmacros_nmr_coupling_bonds_post_tl , + coupling-symbol .tl_set:N = + \l__chemmacros_nmr_coupling_symbol_tl , + atom-number-cs .code:n = + \cs_set_eq:NN \__chemmacros_nmr_number:n #1 , + coupling-pos-cs .code:n = + \cs_set_eq:NN \__chemmacros_nmr_position:n #1 , + parse .bool_set:N = \l__chemmacros_nmr_parse_bool , + delta .code:n = + \tl_set:Nn \l__chemmacros_nmr_delta_tl { \, #1 } , + list .bool_set:N = \l__chemmacros_nmr_list_bool , + list .default:n = true , + list-setup .tl_set:N = \l__chemmacros_nmr_list_setup_tl , + use-equal .bool_set:N = \l__chemmacros_nmr_use_equal_bool , + use-equal .default:n = true + } + +\prop_new:N \l__chemmacros_nmr_prop + +\cs_new_protected:Npn \chemmacros_new_nmr:Nn #1#2 + { + \bool_if:nTF + { + \prop_if_in_p:Nn \l__chemmacros_nmr_prop { #1 } + || + \cs_if_exist_p:N #1 + } + { \msg_error:nnn { chemmacros } { new-nmr } { #1 } } + { + \prop_put:Nnn \l__chemmacros_nmr_prop { #1 } { #2 } + \NewDocumentCommand #1 { s } + { \IfBooleanTF {##1} { \NMR*{#2} } { \NMR{#2} } } + } + } + +\cs_new_protected:Npn \chemmacros_define_nmr:Nn #1#2 + { + \prop_put:Nnn \l__chemmacros_nmr_prop { #1 } { #2 } + \cs_if_exist:NTF #1 + { + \RenewDocumentCommand #1 { s } + { \IfBooleanTF {##1} { \NMR*{#2} } { \NMR{#2} } } + } + { + \NewDocumentCommand #1 { s } + { \IfBooleanTF {##1} { \NMR*{#2} } { \NMR{#2} } } + } + } + +\cs_new_protected:Npn \chemmacros_renew_nmr:Nn #1#2 + { + \bool_if:nTF + { + \prop_if_in_p:Nn \l__chemmacros_nmr_prop { #1 } + && + \cs_if_exist_p:N #1 + } + { + \prop_put:Nnn \l__chemmacros_nmr_prop { #1 } { #2 } + \RenewDocumentCommand #1 { s } + { \IfBooleanTF {##1} { \NMR*{#2} } { \NMR{#2} } } + } + { \msg_error:nnn { chemmacros } { renew-nmr } { #1 } } + } + +\NewDocumentCommand \NewChemNMR { mm } + { \chemmacros_new_nmr:Nn #1 { #2 } } + +\NewDocumentCommand \RenewChemNMR { mm } + { \chemmacros_renew_nmr:Nn #1 { #2 } } + +\NewDocumentCommand \DeclareChemNMR { mm } + { \chemmacros_define_nmr:Nn #1 { #2 } } + +\NewDocumentCommand \NMR { s G{} D(){} O{} } + { + \IfBooleanTF { #1 } + { \chemmacros_nmr:nnnn { * } { #2 } { #3 } { #4 } } + { \chemmacros_nmr:nnnn { } { #2 } { #3 } { #4 } } + } + +\AtBeginDocument + { + % \NMR{<num>,<elem>}(<num>,<unit>)[<solvent>] ALL arguments are optional + % \NMR* same but without ": $\delta$" at end + \cs_new_protected:Npn \chemmacros_nmr:nnnn #1#2#3#4 + { + \bool_if:NT \l__chemmacros_nmr_list_bool { \item \scan_stop: } + \group_begin: + \chemmacros_leave_vmode: + \bool_set_false:N \l__chemmacros_nmr_frequency_bool + \bool_set_false:N \l__chemmacros_nmr_solvent_bool + \tl_if_empty:nF { #3 } + { \bool_set_true:N \l__chemmacros_nmr_frequency_bool } + \tl_if_empty:nF { #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 } + \tl_if_empty:nTF { #2 } + { + \__chemmacros_nmr_nucleus:VV + \l__chemmacros_nmr_isotope_default_tl + \l__chemmacros_nmr_element_default_tl + } + { \__chemmacros_nmr_nucleus:w #2 \q_stop } + \mode_if_math:TF + { + \text + { + \group_begin: + \tl_use:N \l__chemmacros_nmr_format_tl + \__chemmacros_nmr_base:VV + \g__chemmacros_nmr_isotope_tl + \g__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 + { ) } + \tl_if_blank:nT { #1 } { : ~ } + \group_end: + } + \tl_if_blank:nT { #1 } + { + \delta + \text { \l__chemmacros_nmr_delta_tl } + \bool_if:NT \l__chemmacros_nmr_use_equal_bool { = } + } + } + { + \group_begin: + \tl_use:N \l__chemmacros_nmr_format_tl + \__chemmacros_nmr_base:VV + \g__chemmacros_nmr_isotope_tl + \g__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 + { + \bool_if:NTF \l__chemmacros_nmr_parse_bool + { \chemformula_ch:nn { } { #4 } } + { #4 } + } + \bool_if:NT \l__chemmacros_nmr_delimiters_bool + { ) } + \tl_if_blank:nT { #1 } { : } + \group_end: + \tl_if_blank:nT { #1 } + { + \tl_use:N \c_space_tl + \c_math_toggle_token + \delta + \c_math_toggle_token + \l__chemmacros_nmr_delta_tl + \bool_if:NT \l__chemmacros_nmr_use_equal_bool { ~ = } + } + \bool_if:NF \l__chemmacros_nmr_comma_bool + { \tl_if_blank:nT { #1 } { \chemmacros_xspace: } } + } + \group_end: + } + } + +\NewDocumentCommand \chemmacros_data:w { smo } + { + \bool_if:NT \l__chemmacros_nmr_list_bool { \item } + { + \tl_use:N \l__chemmacros_nmr_format_tl #2 + \IfNoValueF { #3 } { ~ ( #3 ) } + \IfBooleanT { #1 } { \bool_if:NT \l__chemmacros_nmr_use_equal_bool { : } } + } + \IfBooleanF { #1 } { \bool_if:NT \l__chemmacros_nmr_use_equal_bool { ~ = } } + } + +\cs_new_protected:Npn \chemmacros_val:n #1 + { + \tl_if_in:nnTF { #1 } { -- } + { \chemmacros_val_aux:w #1 \q_nil } + { \num { #1 } } + } + +\cs_new_protected:Npn \chemmacros_val_aux:w #1--#2 \q_nil + { \numrange { #1 } { #2 } } + +\NewDocumentEnvironment { experimental } { o } + { + \group_begin: + \IfNoValueF { #1 } { \keys_set:nn { chemmacros / nmr } { #1 } } + \bool_set_true:N \l__chemmacros_nmr_inner_bool + \cs_set_eq:NN \# \chemmacros_nmr_number:n + \cs_set_eq:NN \pos \chemmacros_nmr_position:n + \cs_set_eq:NN \J \chemmacros_nmr_coupling:w + \cs_set_eq:NN \data \chemmacros_data:w + \cs_set_eq:NN \val \chemmacros_val:n + \bool_if:NT \l__chemmacros_nmr_list_bool + { \list {} { \l__chemmacros_nmr_list_setup_tl } } + } + { + \bool_if:NT \l__chemmacros_nmr_list_bool + { \endlist } + \group_end: + \chemmacros_ignore_spaces: + } + +\cs_new_protected:Npn \chemmacros_nmr_number:n #1 + { + \__chemmacros_nmr_number:n { #1 } \, + \chemmacros_atom:V \g__chemmacros_nmr_element_tl + } + +\cs_new_protected:Npn \chemmacros_nmr_position:n #1 + { + \chemmacros_chemformula:x + { + \exp_not:V \g__chemmacros_nmr_element_tl + \bool_if:NF \l__chemmacros_nmr_position_side_bool + { + \exp_not:V \l__chemmacros_nmr_position_tl + \exp_not:n { {#1} } + } + } + \bool_if:NT \l__chemmacros_nmr_position_side_bool + { + \tl_use:N \l__chemmacros_nmr_position_tl + \__chemmacros_nmr_position:n { #1 } + } + } + +\cs_new_protected:Npn \chemmacros_nmr_coupling:w + { + \tl_clear:N \l__chemmacros_nmr_coupling_nuclei_tl + \tl_clear:N \l__chemmacros_nmr_coupling_bonds_tl + \peek_meaning:NTF ( + { \__chemmacros_nmr_coupling:w } + { \__chemmacros_nmr_coupling_aux_i:w } + } + +\cs_new_protected:Npn \__chemmacros_nmr_coupling:w (#1;#2) + { + \tl_set:Nn \l__chemmacros_nmr_coupling_bonds_tl + { + \l__chemmacros_nmr_coupling_bonds_pre_tl + #1 + \l__chemmacros_nmr_coupling_bonds_post_tl + } + \bool_if:NTF \l__chemmacros_nmr_coupling_nuclei_sub_bool + { + \tl_set:Nn \l__chemmacros_nmr_coupling_nuclei_tl + { + \c_math_subscript_token + { \chemmacros_chemformula:n {#2} } + } + } + { + \tl_set:Nn \l__chemmacros_nmr_coupling_nuclei_tl + { + \l__chemmacros_nmr_coupling_nuclei_pre_tl + \chemmacros_chemformula:n {#2} + \l__chemmacros_nmr_coupling_nuclei_post_tl + } + } + \__chemmacros_nmr_coupling_aux_i:w + } + +\cs_new_protected:Npn \__chemmacros_nmr_coupling_aux_i:w + { + \peek_meaning:NTF [ + { \__chemmacros_nmr_coupling_aux_ii:w } + { \__chemmacros_nmr_coupling_aux_iii:n } + } + +\cs_new_protected:Npn \__chemmacros_nmr_coupling_aux_ii:w [#1]#2 + { + \group_begin: + \sisetup + { + list-final-separator={,~}, + list-pair-separator={,~}, + list-units=single + } + \c_math_toggle_token + ^{ \l__chemmacros_nmr_coupling_bonds_tl } + \l__chemmacros_nmr_coupling_symbol_tl + \l__chemmacros_nmr_coupling_nuclei_tl = \SIlist{#2}{#1} + \c_math_toggle_token + \group_end: + } + +\cs_new_protected:Npn \__chemmacros_nmr_coupling_aux_iii:n #1 + { + \group_begin: + \sisetup + { + list-final-separator={,~}, + list-pair-separator={,~}, + list-units=single + } + \c_math_toggle_token + ^{ \l__chemmacros_nmr_coupling_bonds_tl } + \l__chemmacros_nmr_coupling_symbol_tl + \l__chemmacros_nmr_coupling_nuclei_tl + = \exp_args:Nno \SIlist { #1 } { \l__chemmacros_nmr_coupling_unit_tl } + \c_math_toggle_token + \group_end: + } + +% -------------------------------------------------------------------------- +% deprecated mhName: +\keys_define:nn { chemmacros } + { mhName .code:n = \chemmacros_option_deprecated:n { mhName } } + +% --------------------------------------------------------------------------- % +% - phases +\bool_new:N \l__chemmacros_phases_sub_bool +\dim_new:N \l__chemmacros_phases_space_dim +\dim_set:Nn \l__chemmacros_phases_space_dim { .1333 em } +\prop_new:N \l__chemmacros_phases_prop +\prop_new:N \l__chemmacros_phases_german_prop + +\keys_define:nn { chemmacros / phases } + { + pos .choice: , + pos / sub .code:n = \bool_set_true:N \l__chemmacros_phases_sub_bool , + pos / side .code:n = \bool_set_false:N \l__chemmacros_phases_sub_bool , + space .dim_set:N = \l__chemmacros_phases_space_dim + } + +\cs_new_protected:Npn \chemmacros_new_phase:Nn #1#2 + { + \tl_set:Nx \l__chemmacros_tmpa_tl + { \chemmacros_remove_backslash:N #1 } + \cs_if_free:NF #1 + { \msg_error:nnn {chemmacros} {new-phase} {#1} } + \exp_args:Nx \@trnslt@declare@translation + { phase-\l__chemmacros_tmpa_tl } {fallback} {#2} + \__chemmacros_define_phase:Nx #1 + { + \exp_not:N \chemmacros_translate:n + { phase-\l__chemmacros_tmpa_tl } + } + } + +\cs_new_protected:Npn \chemmacros_define_phase:Nn #1#2 + { + \tl_set:Nx \l__chemmacros_tmpa_tl + { \chemmacros_remove_backslash:N #1 } + \exp_args:Nx \@trnslt@declare@translation + { phase-\l__chemmacros_tmpa_tl } {fallback} {#2} + \__chemmacros_define_phase:Nx #1 + { + \exp_not:N \chemmacros_translate:n + { phase-\l__chemmacros_tmpa_tl } + } + } + +\cs_new_protected:Npn \chemmacros_renew_phase:Nn #1#2 + { + \tl_set:Nx \l__chemmacros_tmpa_tl + { \chemmacros_remove_backslash:N #1 } + \cs_if_exist:NF #1 + { \msg_error:nnn {chemmacros} {renew-phase} {#1} } + \exp_args:Nx \@trnslt@declare@translation + { phase-\l__chemmacros_tmpa_tl } {fallback} {#2} + \__chemmacros_define_phase:Nx #1 + { + \exp_not:N \chemmacros_translate:n + { phase-\l__chemmacros_tmpa_tl } + } + } + +\NewDocumentCommand \NewChemPhase { mom } + { \chemmacros_new_phase:Nn #1 {#3} } + +\NewDocumentCommand \DeclareChemPhase { mom } + { \chemmacros_define_phase:Nn #1 {#3} } + +\NewDocumentCommand \RenewChemPhase { mom } + { \chemmacros_renew_phase:Nn #1 {#3} } + +\cs_new_protected:Npn \__chemmacros_define_phase:Nn #1#2 + { + \cs_if_exist:NF #1 { \cs_new:Npn #1 {} } + \DeclareDocumentCommand #1 { o } + { + \bool_if:NTF \l__chemmacros_phases_sub_bool + { + \bool_if:NTF \l_chemformula_inside_ch_bool + { \chemformula_subscript:n { ( #2 \IfNoValueF {##1} {,~##1} ) } } + { + \ensuremath + { + \c_math_subscript_token + { \text { ( #2 \IfNoValueF {##1} {,~##1} ) } } + } + } + } + { + \ensuremath + { + \skip_horizontal:N \l__chemmacros_phases_space_dim + \text { ( #2 \IfNoValueF {##1} {,~##1} ) } + } + } + } + } +\cs_generate_variant:Nn \__chemmacros_define_phase:Nn { Nx } + +\NewChemPhase \sld {s} +\NewChemPhase \lqd {l} +\NewChemPhase \gas {g} +\NewChemPhase \aq {aq} + +\cs_new_protected:Npn \chemmacros_phase:n #1 + { + \bool_if:NTF \l__chemmacros_phases_sub_bool + { \ensuremath { \c_math_subscript_token { \text { (#1) } } } } + { + \ensuremath + { + \skip_horizontal:N \l__chemmacros_phases_space_dim + \text { (#1) } + } + } + } + +\NewDocumentCommand \phase { m } + { \chemmacros_phase:n {#1} } + +% -------------------------------------------------------------------------- +% reaction environments +\cs_new_protected:Npn \__chemmacros_record_for_lor:nnnnn #1#2#3#4#5 + { + \tl_if_eq:nnT { #1 } { reaction } + { + \group_begin: + % we need to prevent \Hy@make@anchor from being written to the lor + % file: + \bool_if:NT \l__chemmacros_hyperref_bool + { \cs_set:Npn \Hy@make@anchor {} } + \addcontentsline { lor } { reaction } + { + \tl_use:N \l__chemmacros_reaction_lorname_tl + \tl_use:N \c_space_tl + #2 #3 #4 #5 + \tl_use:N \g__chemmacros_reaction_description_tl + } + \tl_gclear:N \g__chemmacros_reaction_description_tl + \group_end: + } + } + +% redefine mathtools' command \MT_define_tagform:nwnn to ensure we add an +% entry to the list of reactions even if the user redefines the reaction tag +% this should probably be done via patching... +\AfterPackage* { mathtools } + { + \cs_set_protected:Npn \MT_define_tagform:nwnn #1[#2]#3#4 + { + \@namedef{MT_tagform_#1:n}##1 + { + % this is the original part: + \maketag@@@{#3\ignorespaces#2{##1}\unskip\@@italiccorr#4} + % this is added => this disturbs hyperref: + \__chemmacros_record_for_lor:nnnnn + { #1 } { #3 } { #2 } { ##1 } { #4 } + } + } + } + +\tl_new:N \g__chemmacros_reaction_description_tl + +\cs_new_protected:Npn \chemmacros_add_reaction_description:n #1 + { + \tl_if_blank:nF { #1 } + { \tl_gset:Nn \g__chemmacros_reaction_description_tl { : ~ #1 } } + } + +\NewDocumentCommand \AddRxnDesc { m } + { \chemmacros_add_reaction_description:n { #1 } } + +% define \listofreactions +\tl_new:N \l__chemmacros_reaction_lorname_tl +\tl_new:N \reactionlistname +\tl_new:N \l__chemmacros_reaction_heading_tl + +\cs_new:Npn \__chemmacros_reaction_heading:n #1 + { \l__chemmacros_reaction_heading_tl { #1 } } +\cs_generate_variant:Nn \__chemmacros_reaction_heading:n { V } + +\cs_new_protected:Npn \listofreactions + { + \__chemmacros_reaction_heading:V \reactionlistname + \@starttoc { lor } + } + +\cs_new_protected:Npn \l@reaction #1#2 + { \@dottedtocline { 1 } { 1.5em } { 2.3em } { #1 } { #2 } } + +% create tagform +\newtagform { reaction } { \{ } { \} } +\newcounter { chemmacros_save_reaction } +\newcounter { reaction } + +% switch to reaction tags +\cs_new_protected:Npn \__chemmacros_begin_reaction: + { + % create individual names for `hyperref': + \bool_if:NT \l__chemmacros_hyperref_bool + { + \cs_set:Npn \theHequation + { R . \theHsection . \arabic { reaction } } + } + % enable labelformat `reaction': + \bool_if:NT \l__chemmacros_varioref_bool + { \cs_set_eq:NN \p@equation \p@reaction } + \setcounter { chemmacros_save_reaction } { \value { equation } } + \setcounter { equation } { \value { reaction } } + \usetagform { reaction } + } + +% switch back to equation tags +\cs_new_protected:Npn \__chemmacros_end_reaction: + { + \setcounter { reaction } { \value { equation } } + \setcounter { equation } { \value { chemmacros_save_reaction } } + } + +% --------------------------------------------------------------------------- % +\bool_new:N \l__chemmacros_reactions_star_bool +\bool_new:N \l__chemmacros_reactions_args_bool + +\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 , + list-name .tl_set:N = \reactionlistname , + list-entry .code:n = + \tl_set:Nn \l__chemmacros_reaction_lorname_tl { #1 } , + list-heading .tl_set:N = \l__chemmacros_reaction_heading_tl + } + +% \DeclareChemReaction[<keyval>]{<name>}{<type>} +\cs_new_protected:Npn \__chemmacros_define_reaction:Nnnn #1#2#3#4 + { + \bool_set_false:N \l__chemmacros_reactions_star_bool + \bool_set_false:N \l__chemmacros_reactions_args_bool + \keys_set:nn { chemmacros / reaction } { #2 } + \bool_if:NTF \l__chemmacros_reactions_args_bool + { + #1 { #3 } [ 2 ] [] + { + \__chemmacros_begin_reaction: + \AddRxnDesc { ##1 } + \begin { #4 } { ##2 } + \chemmacros_equation_chemformula:V \BODY + \end{ #4 } + \__chemmacros_end_reaction: + } + \bool_if:NT \l__chemmacros_reactions_star_bool + { + #1 { #3* } [ 1 ] + { + \begin { #4* } { ##1 } + \chemmacros_equation_chemformula:V \BODY + \end { #4* } + } + } + } + { + #1 { #3 } [ 1 ] [] + { + \__chemmacros_begin_reaction: + \AddRxnDesc { ##1 } + \begin { #4 } + \chemmacros_equation_chemformula:V \BODY + \end { #4 } + \__chemmacros_end_reaction: + } + \bool_if:NT \l__chemmacros_reactions_star_bool + { + #1 { #3* } + { + \begin { #4* } + \chemmacros_equation_chemformula:V \BODY + \end { #4* } + } + } + } + \ignorespaces + } + +\cs_new_protected:Npn \chemmacros_define_reaction:nnn #1#2#3 + { + \cs_if_exist:cTF { #2 } + { \__chemmacros_define_reaction:Nnnn \RenewEnviron { #1 } { #2 } { #3 } } + { \__chemmacros_define_reaction:Nnnn \NewEnviron { #1 } { #2 } { #3 } } + } + +\cs_new_protected:Npn \chemmacros_new_reaction:nnn #1#2#3 + { + \cs_if_exist:cTF { #2 } + { \msg_error:nnx { chemmacros } { already-defined } { #2 } } + { \__chemmacros_define_reaction:Nnnn \NewEnviron { #1 } { #2 } { #3 } } + } + +\cs_new_protected:Npn \chemmacros_renew_reaction:nnn #1#2#3 + { + \cs_if_exist:cTF { #2 } + { \__chemmacros_define_reaction:Nnnn \RenewEnviron { #1 } { #2 } { #3 } } + { \msg_error:nnx { chemmacros } { not-defined } { #2 } } + } + +\NewDocumentCommand \NewChemReaction { O{} m m } + { \chemmacros_new_reaction:nnn { #1 } { #2 } { #3 } } +\NewDocumentCommand \RenewChemReaction { O{} m m } + { \chemmacros_renew_reaction:nnn { #1 } { #2 } { #3 } } +\NewDocumentCommand \DeclareChemReaction { O{} m m } + { \chemmacros_declare_reaction:nnn { #1 } { #2 } { #3 } } +\DeclareChemDeprecated \newreaction \NewChemReaction + +\cs_new_protected:Npn \chemmacros_equation_chemformula:n #1 + { \chemformula_ch:nn { } { #1 } } +\cs_generate_variant:Nn \chemmacros_equation_chemformula:n { V } + +% predefined: +\NewChemReaction [ star ] { reaction } { equation } +\NewChemReaction [ star ] { reactions } { align } + +% -------------------------------------------------------------------------- +% thermodynamics et.al. +% \standardstate as defined by the chemstyle package. Thanks to Joseph Wright +% the `chemstyle' provides it with \providecommand so it doesn't matter which +% package defines it first +\ProvideDocumentCommand \standardstate {} + { { \ensuremath { \chemmacros_standardstate: } } } + +\cs_new_protected:Npn \chemmacros_standardstate: + { \mathpalette \chemmacros_standardstate_aux: \circ } + +\cs_new_protected:Npn \chemmacros_standardstate_aux: #1#2 + { + \ooalign + { + \tex_hfil:D + \c_math_toggle_token #1- \c_math_toggle_token + \tex_hfil:D + \tex_cr:D + \tex_hfil:D + \c_math_toggle_token #1#2 \c_math_toggle_token + \tex_hfil:D + \tex_cr:D + } + } + +\cs_new_protected:Npn \changestate + { \mathop{} \! \chemDelta } + +% -------------------------------------------------------------------------- +% \State +\tl_new:N \l__chemmacros_State_delta_tl +\tl_set:Nn \l__chemmacros_State_delta_tl { \changestate } +\tl_new:N \l__chemmacros_State_exponent_tl +\tl_set:Nn \l__chemmacros_State_exponent_tl { \standardstate } + +\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 + +\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! +\cs_new_protected:Npn \chemmacros_state:nnn #1#2#3 + { + \group_begin: + \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 + { \c_math_subscript_token { \text { #3 } } } + #2 + \bool_if:NF \l__chemmacros_State_subscript_left_bool + { \c_math_subscript_token { \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 { xnV } + +\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: + } + +% -------------------------------------------------------------------------- +\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 { \changestate } + +\bool_new:N \l__chemmacros_renewstate_bool +\bool_new:N \l__chemmacros_state_overwrite_error_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 + } + +% \NewChemState{<name>}[<keyval>]{<symbol>}{<unit>} +\NewDocumentCommand \NewChemState { omO{}mm } + { + \bool_set_false:N \l__chemmacros_renewstate_bool + \bool_set_true:N \l__chemmacros_state_overwrite_error_bool + \__chemmacros_setnewstate_reset: + \IfNoValueTF { #1 } + { \chemmacros_define_state:nnnn { #3 } { #2 } { #4 } { #5 } } + { + \msg_warning:nn { chemmacros } { state-syntax } + \chemmacros_define_state:nnnn { #1#3 } { #2 } { #4 } { #5 } + } + } +% \DeclareChemState{<name>}[<keyval>]{<symbol>}{<unit>} +\NewDocumentCommand \DeclareChemState { omO{}mm } + { + \bool_set_false:N \l__chemmacros_renewstate_bool + \bool_set_false:N \l__chemmacros_state_overwrite_error_bool + \__chemmacros_setnewstate_reset: + \IfNoValueTF { #1 } + { \chemmacros_define_state:nnnn { #3 } { #2 } { #4 } { #5 } } + { + \msg_warning:nn { chemmacros } { state-syntax } + \chemmacros_define_state:nnnn { #1#3 } { #2 } { #4 } { #5 } + } + } +% \RenewChemState{<name>}[<keyval>]{<symbol>}{<unit>} +\NewDocumentCommand \RenewChemState { omO{}mm } + { + \bool_set_true:N \l__chemmacros_renewstate_bool + \bool_set_true:N \l__chemmacros_state_overwrite_error_bool + \__chemmacros_setnewstate_reset: + \IfNoValueTF { #1 } + { \chemmacros_define_state:nnnn { #3 } { #2 } { #4 } { #5 } } + { + \msg_warning:nn { chemmacros } { state-syntax } + \chemmacros_define_state:nnnn { #1#3 } { #2 } { #4 } { #5 } + } + } +% TODO +\cs_set_protected:Npn \setnewstate + { + \msg_warning:nnnn { chemmacros } { command-deprecated } + { \setnewstate } { \NewChemState } + \NewChemState + } +\cs_set_protected:Npn \renewstate + { + \msg_warning:nnnn { chemmacros } { command-deprecated } + { \renewstate } { \RenewChemState } + \RenewChemState + } + +\cs_new_protected: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 { \changestate } + } + +\cs_new_protected:Npn \chemmacros_define_state:nnnn #1#2#3#4 + { + \keys_set:nn { chemmacros / setnewstate } { #1 } + \chemmacros_if_is_cs:nTF { #2 } + { \__chemmacros_set_state:xnn { \cs_to_str:N #2 } { #3 } { #4 } } + { + \msg_warning:nn { chemmacros } { state-syntax } + \__chemmacros_set_state:nnn { #2 } { #3 } { #4 } + } + } + +\cs_new_protected:Npn \__chemmacros_set_state:nnn #1#2#3 + { + \bool_if:NT \l__chemmacros_state_overwrite_error_bool + { + \bool_if:NTF \l__chemmacros_renewstate_bool + { + \cs_if_exist:cF { #1 } + { \msg_error:nnx { chemmacros } { nenew-state } { #1 } } + } + { + \cs_if_exist:cT { #1 } + { \msg_error:nnx { chemmacros } { new-state } { #1 } } + } + } + \cs_undefine:c { chemmacros_ #1 _reset: } + \cs_undefine:c { c__chemmacros_ #1 _subscript_tl } + \cs_undefine:c { c__chemmacros_ #1 _exponent_tl } + \cs_undefine:c { c__chemmacros_ #1 _delta_tl } + \cs_undefine:c { c__chemmacros_ #1 _left_tl } + \cs_undefine:c { c__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 } + \group_begin: + \tl_const:cV + { c__chemmacros_ #1 _subscript_tl } + \l__chemmacros_thermod_subscript_default_tl + \tl_const:cV + { c__chemmacros_ #1 _exponent_tl } + \l__chemmacros_thermod_exponent_default_tl + \tl_const:cV + { c__chemmacros_ #1 _delta_tl } + \l__chemmacros_thermod_delta_default_tl + \tl_const:cV + { c__chemmacros_ #1 _left_tl } + \l__chemmacros_thermod_subscript_left_default_tl + \tl_const:cn + { c__chemmacros_ #1 _unit_tl } + { #3 } + \cs_new_protected:cpn {chemmacros_ #1 _reset: } + { + \tl_set_eq:Nc + \l__chemmacros_thermod_subscript_tl + { c__chemmacros_ #1 _subscript_tl } + \tl_set_eq:Nc + \l__chemmacros_thermod_exponent_tl + { c__chemmacros_ #1 _exponent_tl } + \tl_set_eq:Nc + \l__chemmacros_thermod_delta_tl + { c__chemmacros_ #1 _delta_tl } + \tl_set_eq:Nc + \l__chemmacros_thermod_subscript_left_tl + { c__chemmacros_ #1 _left_tl } + \tl_set_eq:Nc + \l__chemmacros_thermod_unit_tl + { c__chemmacros_ #1 _unit_tl } + } + \cs_new_protected: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_protected: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_protected:cpn { #1 _aux_ii:n } (##1) + { + \tl_set:Nn \l__chemmacros_thermod_subscript_tl { ##1 } + \tl_use:c { #1 _aux_iii:n } + } + \cs_new_protected:cpn { #1 _aux_iii:n } ##1 + { + \ensuremath + { + \tl_if_eq:VnTF + \l__chemmacros_thermod_subscript_left_tl { true } + { + \chemmacros_state:xnV + { + subscript-left = true , + exponent = + { \exp_not:V \l__chemmacros_thermod_exponent_tl } , + delta = + { \exp_not:V \l__chemmacros_thermod_delta_tl } + } + { #2 } + } + { + \chemmacros_state:xnV + { + subscript-left = false , + exponent = + { \exp_not:V \l__chemmacros_thermod_exponent_tl } , + delta = + { \exp_not:V \l__chemmacros_thermod_delta_tl } + } + { #2 } + } + \l__chemmacros_thermod_subscript_tl + = + \exp_args:NnV \SI { ##1 } \l__chemmacros_thermod_unit_tl + } + } + \group_end: + \ignorespaces + } +\cs_generate_variant:Nn \__chemmacros_set_state:nnn { x } + +% predefined: +\NewChemState \Enthalpy {H} {\kilo\joule\per\mole} +\NewChemState \Entropy [ delta=false, subscript-left=false ] + {S} {\joule\per\kelvin\per\mole} +\NewChemState \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 } +\fp_new:N \l__chemmacros_newman_x_fp +\fp_new:N \l__chemmacros_newman_y_fp + +\tl_new:N \l__chemmacros_newman_tikz_ring_tl +\tl_new:N \l__chemmacros_newman_tikz_front_tl +\tl_new:N \l__chemmacros_newman_tikz_back_tl + +\bool_new:N \l__chemmacros_newman_tikz_back_bool + +\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 + } + +% \newman[<keyval>](<angle>){<1>,<2>,<3>,<4>,<5>,<6>} +\NewDocumentCommand \newman { o d() > { \SplitArgument { 5 } { , } } m } + { + \group_begin: + \IfNoValueF { #1 } { \keys_set:nn { chemmacros / newman } { #1 } } + \IfNoValueTF { #2 } + { \chemmacros_newman_atoms:nnnnnnn { } #3 } + { \chemmacros_newman_atoms:nnnnnnn { #2 } #3 } + \group_end: + } + +% place atoms: +% #1: angle +% #2 - #7: atoms +\cs_new_protected:Npn \chemmacros_newman_atoms:nnnnnnn #1#2#3#4#5#6#7 + { + \tl_if_blank:nTF { #1 } + { + \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 { #1 } } + \chemmacros_tikz_picture:xn + { + scale = \fp_to_tl:N \l__chemmacros_newman_scale_fp , + chemmacros_newman_atom_front / .style = + { + inner~sep=0pt, + outer~sep=0pt, + \tl_use:N \l__chemmacros_newman_tikz_front_tl + }, + chemmacros_newman_atom_back / .style = + { + inner~sep=0pt, + outer~sep=0pt, + \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 } + (0pt,0pt) circle (\fp_to_dim:N \l__chemmacros_newman_scale_fp * 15) ; + \chemmacros_newman_back_node:nn + { 30 } + { \IfNoValueF { #6 } { #6 } } + \chemmacros_newman_back_node:nf + { 150 } + { \IfNoValueF { #7 } { #7 } } + \chemmacros_newman_back_node:nf + { 270 } + { \IfNoValueF { #5 } { #5 } } + \chemmacros_newman_front_node:nf + { 90 } + { \IfNoValueF { #2 } { #2 } } + \chemmacros_newman_front_node:nf + { 210 } + { \IfNoValueF { #3 } { #3 } } + \chemmacros_newman_front_node:nf + { 330 } + { \IfNoValueF { #4 } { #4 } } + } + } + +% provide cartesian coordiantes from polar coordinates +% #1: fp variable for x +% #2: fp variable for y +% #3: angle +% #4: radius +\cs_new_protected:Npn \chemmacros_polar_to_cartesian:NNnn #1#2#3#4 + { + \fp_set:Nn #1 { #4 * cos( #3 / 180 * pi ) }% x + \fp_set:Nn #2 { #4 * sin( #3 / 180 * pi ) }% y + } + +% place back nodes +\cs_new_protected:Npn \chemmacros_newman_back_node:nn #1#2 + { + \group_begin: + \fp_add:Nn \l__chemmacros_newman_rel_angle_fp { #1 } + \chemmacros_polar_to_cartesian:NNnn + \l__chemmacros_newman_x_fp + \l__chemmacros_newman_y_fp + { \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_polar_to_cartesian:NNnn + \l__chemmacros_newman_x_fp + \l__chemmacros_newman_y_fp + { \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_protected:Npn \chemmacros_newman_front_node:nn #1#2 + { + \chemmacros_polar_to_cartesian:NNnn + \l__chemmacros_newman_x_fp + \l__chemmacros_newman_y_fp + { #1 } + { \l__chemmacros_newman_scale_fp } + \chemmacros_tikz_draw:f + { \tl_use:N \l__chemmacros_newman_tikz_ring_tl } + (0pt,0pt) -- ++ + ( + 30 * \fp_to_dim:N \l__chemmacros_newman_x_fp , + 30 * \fp_to_dim:N \l__chemmacros_newman_y_fp + ) ; + \chemmacros_polar_to_cartesian:NNnn + \l__chemmacros_newman_x_fp + \l__chemmacros_newman_y_fp + { #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 +\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 +\bool_new:N \l__chemmacros_orbital_p_half_bool +\bool_new:N \l__chemmacros_orbital_overlay_bool +\bool_new:N \l__chemmacros_orbital_opacity_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 +\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 } +\fp_new:N \l__chemmacros_orbital_opacity_fp +\fp_set:Nn \l__chemmacros_orbital_opacity_fp { 0.5 } + +\cs_new: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:Npn \__chemmacros_orbital_overlay: + { \bool_if:NT \l__chemmacros_orbital_overlay_bool { overlay } } + +\cs_new: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_protected: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 } , + scale .tl_set:N = \l__chemmacros_orbital_s_scale_tl , + color .tl_set:N = \l__chemmacros_orbital_s_color_tl + } + +\cs_new_protected:Npn \__chemmacros_orbital_s_draw:n #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 } + (0pt,0pt) circle (\l__chemmacros_orbital_s_scale_tl * .6em) ; + } + } + +% -------------------------------------------------------------------------- +% p-orbitals +\cs_new_protected: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_protected:Npn \__chemmacros_orbital_p_draw:n #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 + } + (0pt,0pt) .. 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 + ) + .. (0pt,0pt); + \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 + } + (0pt,0pt) .. 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 + ) + .. (0pt,0pt); + } + } + } + +% -------------------------------------------------------------------------- +% sp-orbitals +\cs_new_protected: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_protected:Npn \__chemmacros_orbital_sp_draw:n #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 + } + (0pt,0pt) .. 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 + ) + .. (0pt,0pt); + \chemmacros_tikz_shadedraw:f + { + draw = \l__chemmacros_orbital_sp_mphase_color_tl , + ball~color = \l__chemmacros_orbital_sp_mphase_color_tl + } + (0pt,0pt) .. 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 + ) + .. (0pt,0pt); + } + } + +% -------------------------------------------------------------------------- +% sp2-orbitals +\cs_new_protected: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_protected:Npn \__chemmacros_orbital_sptwo_draw:n #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 + } + (0pt,0pt) .. 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 + ) + .. (0pt,0pt); + \chemmacros_tikz_shadedraw:f + { + draw = \l__chemmacros_orbital_sptwo_mphase_color_tl , + ball~color = \l__chemmacros_orbital_sptwo_mphase_color_tl + } + (0pt,0pt) .. 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 + ) + .. (0pt,0pt); + } + } + +% -------------------------------------------------------------------------- +% sp3-orbitals +\cs_new_protected: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_protected:Npn \__chemmacros_orbital_spthree_draw:n #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 + } + (0pt,0pt) .. 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 + ) + .. (0pt,0pt); + \chemmacros_tikz_shadedraw:f + { + draw = \l__chemmacros_orbital_spthree_mphase_color_tl , + ball~color = \l__chemmacros_orbital_spthree_mphase_color_tl + } + (0pt,0pt) .. 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 + ) + .. (0pt,0pt); + } + } + +% -------------------------------------------------------------------------- +% 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: } + } + +\cs_new_protected:Npn \chemmacros_orbital:n #1 + { + \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 } } + } + +\NewDocumentCommand \orbital { o m } + { + \group_begin: + \keys_set:nn { chemmacros / orbital / type } { #2 } + \IfNoValueTF { #1 } + { \chemmacros_orbital:n { } } + { \chemmacros_orbital:n { #1 } } + \group_end: + } + +% -------------------------------------------------------------------------- +% arrow tips for electron movement +\dim_new:N \l__chemmacros_el_length_dim + +% full tip for pairs +\pgfarrowsdeclare { el } { el } + { + \dim_set:Nn \l__chemmacros_el_length_dim + { 2.5pt + 2.5\pgflinewidth } + \pgfarrowsleftextend { -\l__chemmacros_el_length_dim } + \pgfarrowsrightextend { .5\pgflinewidth } + } + { + \dim_set:Nn \l__chemmacros_el_length_dim + { 2.5pt + 2.5\pgflinewidth } + \pgfsetdash {} { 0pt } + \pgfsetroundjoin + \pgfsetroundcap + \pgfpathmoveto { \pgfpoint { 0pt } { 0pt } } + \pgfpathlineto + { + \pgfpoint + { -\l__chemmacros_el_length_dim } + { .3\l__chemmacros_el_length_dim } + } + \pgfpathlineto + { \pgfpoint { -.5\l__chemmacros_el_length_dim } { 0pt } } + \pgfpathlineto + { + \pgfpoint + { -\l__chemmacros_el_length_dim } + { -.3\l__chemmacros_el_length_dim } + } + \pgfpathlineto { \pgfpoint { 0pt } { 0pt } } + \pgfusepathqfillstroke + } + +% half tip on the left +\pgfarrowsdeclare { left~el } { left~el } + { + \dim_set:Nn \l__chemmacros_el_length_dim + { 2.5pt + 2.5\pgflinewidth } + \pgfarrowsleftextend { -\l__chemmacros_el_length_dim } + \pgfarrowsrightextend { .5\pgflinewidth } + } + { + \dim_set:Nn \l__chemmacros_el_length_dim + { 2.5pt + 2.5\pgflinewidth } + \pgfsetdash {} { 0pt } + \pgfsetroundjoin + \pgfsetroundcap + \pgfpathmoveto { \pgfpoint { 0pt } { 0pt } } + \pgfpathlineto + { + \pgfpoint + { -\l__chemmacros_el_length_dim } + { .3\l__chemmacros_el_length_dim } + } + \pgfpathlineto { \pgfpoint { -.5\l__chemmacros_el_length_dim } { 0pt } } + \pgfpathlineto { \pgfpoint { 0pt } { 0pt } } + \pgfusepathqfillstroke + } + +% half tip in the right +\pgfarrowsdeclare { right~el } { right~el } + { + \dim_set:Nn \l__chemmacros_el_length_dim + { 2.5pt + 2.5\pgflinewidth } + \pgfarrowsleftextend { -\l__chemmacros_el_length_dim } + \pgfarrowsrightextend { .5\pgflinewidth } + } + { + \dim_set:Nn \l__chemmacros_el_length_dim + { 2.5pt + 2.5\pgflinewidth } + \pgfsetdash {} { 0pt } + \pgfsetroundjoin + \pgfsetroundcap + \pgfpathmoveto { \pgfpoint { 0pt } { 0pt } } + \pgfpathlineto + { + \pgfpoint + { -\l__chemmacros_el_length_dim } + { -.3\l__chemmacros_el_length_dim } + } + \pgfpathlineto { \pgfpoint { -.5\l__chemmacros_el_length_dim } { 0pt } } + \pgfpathlineto { \pgfpoint { 0pt } { 0pt } } + \pgfusepathqfillstroke + } + +% -------------------------------------------------------------------------- +% setup +\NewDocumentCommand \chemsetup { o m } + { + \IfNoValueTF { #1 } + { \keys_set:nn { chemmacros } { #2 } } + { + \tl_if_eq:nnTF { #1 } { chemformula } + { \setchemformula { #2 } } + { \keys_set:nn { chemmacros / #1 } { #2 } } + } + \ignorespaces + } + + +% -------------------------------------------------------------------------- +% hyperref support +% ?? unsure about adding IUPAC commands +\AfterPackage* { hyperref } + { + \pdfstringdefDisableCommands + { + % \cs_set:Npn \- { - } % maybe not a good idea... + \cs_set:Npn \| { } + \cs_set:Npn \pH { pH } + \cs_set:Npn \pOH { pOH } + \cs_set:Npn \iupac #1 { #1 } + \cs_set:Npn \cip #1 { (#1) } + \cs_set:Npn \cis { cis } + \cs_set:Npn \trans { trans } + \cs_set:Npn \tert { tert } + \cs_set:Npn \ortho { o } + \cs_set:Npn \meta { m } + \cs_set:Npn \para { p } + \cs_set:Npn \syn { syn } + \cs_set:Npn \anti { anti } + } + } + +% -------------------------------------------------------------------------- +% language support -- provided through `translations' +% equilibrium constants: +\DeclareTranslationFallback {K-acid} {\mathrm{a}} +\DeclareTranslation{German} {K-acid} {\mathrm{s}} +\DeclareTranslation{Dutch} {K-acid} {\mathrm{z}} + +\DeclareTranslationFallback {K-base} {\mathrm{b}} + +\DeclareTranslationFallback {K-water} {\mathrm{w}} + +% phases: +\DeclareTranslation{German}{phase-sld}{ f } +\DeclareTranslation{German}{phase-lqd}{ f{}l } +% list of reactions: +\DeclareTranslationFallback {list-of-reactions} { List~ of~ reactions } +\DeclareTranslation{English} {list-of-reactions} { List~ of~ reactions } +\DeclareTranslation{German} {list-of-reactions} { Reaktionsverzeichnis } +\DeclareTranslation{Italian} {list-of-reactions} { Elenco~ delle~ reazioni } +\DeclareTranslation{French} {list-of-reactions} { Table~ des~ r\'eactions } +\DeclareTranslation{Dutch} {list-of-reactions} { Lijst~ van~ reacties } +% +\DeclareTranslationFallback {reaction} { Reaction } +\DeclareTranslation{English} {reaction} { Reaction } +\DeclareTranslation{German} {reaction} { Reaktion } +\DeclareTranslation{Italian} {reaction} { Reazione } +\DeclareTranslation{French} {reaction} { R\'eaction } +\DeclareTranslation{Dutch} {reaction} { Reactie } + +\tl_set:Nn \l__chemmacros_reaction_lorname_tl + { \chemmacros_translate:n {reaction} } +\tl_set:Nn \reactionlistname + { \chemmacros_translate:n {list-of-reactions} } + +\tex_endinput:D + +% -------------------------------------------------------------------------- +Version history +2015/08/29 - version 5.0 - integration as v4.7 into v5.0 of chemmacros for + backwards compatibility + - fix typo in \l_chemformula_formal_charges_bool + - remove \tl_to_lowercase:n + +% --------------------------------------------------------------------------- % +% TODO: +- add d-orbitals +- make electron movement arrow tips (`el', `left el' and `right el') public +- phase commands with arguments (see http://texwelt.de/wissen/fragen/9264) + diff --git a/macros/latex/contrib/chemmacros/chemmacros5.sty b/macros/latex/contrib/chemmacros/chemmacros5.sty new file mode 100644 index 0000000000..6c267fe42c --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros5.sty @@ -0,0 +1,325 @@ +% -------------------------------------------------------------------------- +% 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-2017 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. +% -------------------------------------------------------------------------- +% The chemmacros package consists of the following files +% - chemmacros.sty, chemmacros4.sty, chemmacros5.sty, +% - chemmacros_en.tex, chemmacros_en.pdf, +% - quite a number of module files following the naming scheme +% chemmacros.module.*.code.tex +% - README + % -------------------------------------------------------------------------- +\RequirePackage{expl3,xparse,l3keys2e} +\ExplSyntaxOn + +% -------------------------------------------------------------------------- +% package information: +\ProvidesExplPackage + {chemmacros5} + {\c_chemmacros_date_tl} + {\c_chemmacros_version_tl} + {\c_chemmacros_info_tl \c_space_tl (CN)} + +% -------------------------------------------------------------------------- +\msg_new:nnn {chemmacros} {package-option} + { + Unknown~ option~ `#1'!~ Since~ v5.0~ chemmacros~ has~ no~ package~ + options~ any~ more! + } + +\msg_new:nnn {chemmacros} {module-not-available} + { + The~ module~ `#1'~ is~ only~ available~ in~ compatibility~ mode~ #2~ or~ + higher. + } + +\cs_generate_variant:Nn \msg_warning:nnn { nnV } + +\keys_define:nn {chemmacros/package-options} + { + compatibility .code:n = , + unknown .code:n = + \msg_warning:nnV {chemmacros} {package-option} \CurrentOption + } + +\ProcessKeysPackageOptions {chemmacros/package-options} + +% -------------------------------------------------------------------------- +% messages: +\msg_new:nnn {chemmacros} {module-missing} + { + You've~ requested~ the~ chemmacros~ module~ `#1'~ but~ it~ appears~ to~ + be~ missing~ on~ your~ system.~ Maybe~ you've~ misspelled~ the~ name?~ + Loading~ the~ module~ will~ abort~ \msg_line_context: + } + +\msg_new:nnn {chemmacros} {loading-module} + { + (chemmacros) \c_space_tl \c_space_tl \c_space_tl \c_space_tl + Loading~ module~ `#1'... + } + +% -------------------------------------------------------------------------- +% variants of kernel functions: +\cs_generate_variant:Nn \tl_if_eq:nnTF { xx , V } +\cs_generate_variant:Nn \seq_set_split:Nnn { Nnx } +\cs_generate_variant:Nn \prop_item:Nn { NV } +\cs_generate_variant:Nn \seq_item:Nn { cV } +\cs_generate_variant:Nn \int_to_arabic:n { V } +\cs_generate_variant:Nn \tl_replace_once:Nnn { NnV } +\cs_generate_variant:Nn \prop_gput:Nnn { cxx , NVf } +\cs_generate_variant:Nn \msg_error:nnn { nnV } +\cs_generate_variant:Nn \msg_warning:nnn { nnV } +\cs_generate_variant:Nn \msg_warning:nnnn { nnV } +\cs_generate_variant:Nn \vbox_set:Nn { NV } +\cs_generate_variant:Nn \keys_define:nn { x } +\cs_generate_variant:Nn \keys_set:nn { x , nx } + +% -------------------------------------------------------------------------- +% temporary variables: +\tl_new:N \l__chemmacros_tmpa_tl +\tl_new:N \l__chemmacros_tmpb_tl +\tl_new:N \l__chemmacros_tmpc_tl +\tl_new:N \l__chemmacros_tmpd_tl + +\bool_new:N \l__chemmacros_tmpa_bool +\bool_new:N \l__chemmacros_tmpb_bool +\bool_new:N \l__chemmacros_tmpc_bool + +\dim_new:N \l__chemmacros_tmpa_dim +\dim_new:N \l__chemmacros_tmpb_dim +\dim_new:N \l__chemmacros_tmpc_dim + +\seq_new:N \l__chemmacros_tmpa_seq +\seq_new:N \l__chemmacros_tmpb_seq +\seq_new:N \l__chemmacros_tmpc_seq + +\int_new:N \l__chemmacros_tmpa_int +\int_new:N \l__chemmacros_tmpb_int +\int_new:N \l__chemmacros_tmpc_int + +\box_new:N \l__chemmacros_tmpa_box +\box_new:N \l__chemmacros_tmpb_box +\box_new:N \l__chemmacros_tmpc_box + +\clist_new:N \l__chemmacros_tmpa_clist +\clist_new:N \l__chemmacros_tmpb_clist +\clist_new:N \l__chemmacros_tmpc_clist + +% -------------------------------------------------------------------------- +% module mechanism: +\tl_const:Nn \c__chemmacros_module_extension_tl {code.tex} +\tl_const:Nn \c__chemmacros_module_prefix_tl {chemmacros.module} + +\seq_new:N \g__chemmacros_loaded_modules_seq +\prop_new:N \g__chemmacros_loaded_modules_prop + +\cs_new_protected:Npn \chemmacros_load_modules:n #1 + { \clist_map_inline:nn {#1} { \chemmacros_load_module:n {##1} } } + +\cs_new_protected:Npn \chemmacros_load_module:n #1 + { + \tl_set:Nx \l__chemmacros_tmpa_tl { \tl_trim_spaces:n {#1} } + \__chemmacros_load_module:V \l__chemmacros_tmpa_tl + } + +\cs_new_protected:Npn \__chemmacros_load_module:n #1 + { + \chemmacros_if_module_loaded:nF {#1} + { + \chemmacros_if_module_exist:nTF {#1} + { + \__chemmacros_use_module_hook:nn {#1} {before} + \msg_log:nnn {chemmacros} {loading-module} {#1} + \@onefilewithoptions + {\c__chemmacros_module_prefix_tl.#1}[][] + \c__chemmacros_module_extension_tl + \__chemmacros_use_module_hook:nn {#1} {after} + } + { \msg_error:nnn {chemmacros} {module-missing} {#1} } + } + } +\cs_generate_variant:Nn \__chemmacros_load_module:n { V } + +\prg_new_conditional:Npnn \chemmacros_if_module_loaded:n #1 {p,T,F,TF} + { + \seq_if_in:NnTF \g__chemmacros_loaded_modules_seq {#1} + { \prg_return_true: } + { \prg_return_false: } + } + +\prg_new_conditional:Npnn \chemmacros_if_module_exist:n #1 {p,T,F,TF} + { + \file_if_exist:nTF + {\c__chemmacros_module_prefix_tl.#1.\c__chemmacros_module_extension_tl} + { \prg_return_true: } + { \prg_return_false: } + } + +% -------------------------------------------------------------------------- +\ChemCompatibilityFrom{5.1} +% module hooks: +% #1: module +% #2: code +\cs_new_protected:Npn \chemmacros_after_module:nn #1#2 + { + \chemmacros_if_module_loaded:nTF {#1} + {#2} + { \__chemmacros_add_to_module_hook:nnn {#1} {after} {#2} } + } + +% #1: module +% #2: code +\cs_new_protected:Npn \chemmacros_before_module:nn #1#2 + { + \chemmacros_if_module_loaded:nF {#1} + { \__chemmacros_add_to_module_hook:nnn {#1} {before} {#2} } + } +\EndChemCompatibility + +% #1: module +% #2: hook name +% #3: code +\cs_new_protected:Npn \__chemmacros_add_to_module_hook:nnn #1#2#3 + { + \chemmacros_if_module_loaded:nF {#1} + { + \tl_if_exist:cF {g__chemmacros_module_#1_#2_hook_tl} + { \tl_new:c {g__chemmacros_module_#1_#2_hook_tl} } + \tl_gput_right:cn {g__chemmacros_module_#1_#2_hook_tl} {#3} + } + } + +% #1: module +% #2: hook name +\cs_new_protected:Npn \__chemmacros_use_module_hook:nn #1#2 + { + \tl_if_exist:cT {g__chemmacros_module_#1_#2_hook_tl} + { + \tl_use:c {g__chemmacros_module_#1_#2_hook_tl} + \tl_gclear:c {g__chemmacros_module_#1_#2_hook_tl} + } + } + +% -------------------------------------------------------------------------- +\cs_new_protected:Npn \__chemmacros_module:nnnn #1#2#3#4 + { + \chemmacros_if_compatibility:nnF {>=} {#4} + { + \msg_warning:nnnn {chemmacros} {module-not-available} {#2} {#4} + \tex_endinput:D + } + \seq_gput_right:Nn \g__chemmacros_loaded_modules_seq {#2} + \prop_gput:Nnn \g__chemmacros_loaded_modules_prop {#2} {#3} + \ProvidesFile + {\c__chemmacros_module_prefix_tl.#2.\c__chemmacros_module_extension_tl} + [ + \c_chemmacros_date_tl + \c_space_tl + v \c_chemmacros_version_tl + \c_space_tl + chemmacros~ module~ `#2'~ #3 + ] + \bool_if:nF {#1} { \ExplSyntaxOn } + } + +% define a chemmacros module: +% standard modules are written in the expl3 programming environment, the +% starred version only uses a 2e programming environment, i.e., with @ as a +% letter +% #1: boolean +% #2: name +% #3: description +\NewDocumentCommand \ChemModule {smmO{5.0}} + { \__chemmacros_module:nnnn {#1} {#2} {#3} {#4} } + +% -------------------------------------------------------------------------- +% command for loading modules: +\NewDocumentCommand \usechemmodule {m} { \chemmacros_load_modules:n {#1} } + +% -------------------------------------------------------------------------- +% load default modules: +\chemmacros_load_modules:n + { + % required modules: + base, + errorcheck, + lang, greek, + chemformula, + % preloaded modules: + acid-base, + symbols, + charges, + particles, + phases , + nomenclature + } + +% -------------------------------------------------------------------------- +\tex_endinput:D + +% -------------------------------------------------------------------------- +Modules: (* = preloaded) + - internal modules: + - base * + - errorcheck * + - lang * + - greek * + - chemformula * + - tikz + - user modules: + - acid-base * + - all + - charges * + - isotopes + - mechanisms + - newman + - nomenclature * + - orbital + - particles * + - phases * + - reactions + - redox + - scheme + - spectroscopy + - symbols * + - thermodynamics + - units + - xfrac + +% -------------------------------------------------------------------------- +Version history +2015/08/29 - initial release v5.0 +2015/09/23 - add module hooks `before' and `after' + - allow to give minimal compatibility version to a module: this + should be the first version when a module is published and + shouldn't be changed any more; loading the corresponding module + will abort when compatibility is too low + - store loaded modules in a seq and in a prop +2015/10/14 - bug fix in the module hook mechanism + - bug fix in \chemmacros_if_module_loaded:n + - new `errorcheck' module diff --git a/macros/latex/contrib/chemmacros/chemmacros_en.pdf b/macros/latex/contrib/chemmacros/chemmacros_en.pdf Binary files differnew file mode 100644 index 0000000000..0f621ee561 --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros_en.pdf diff --git a/macros/latex/contrib/chemmacros/chemmacros_en.tex b/macros/latex/contrib/chemmacros/chemmacros_en.tex new file mode 100644 index 0000000000..d4928256f3 --- /dev/null +++ b/macros/latex/contrib/chemmacros/chemmacros_en.tex @@ -0,0 +1,3711 @@ +% !arara: pdflatex +% !arara: biber +% arara: pdflatex: { action: nonstopmode } +% arara: pdflatex: { action: nonstopmode } +% -------------------------------------------------------------------------- +% the CHEMMACROS package +% +% comprehensive support for typesetting chemistry documents +% +% -------------------------------------------------------------------------- +% Clemens Niederberger +% -------------------------------------------------------------------------- +% https://github.com/cgnieder/chemmacros/ +% contact@mychemistry.eu +% -------------------------------------------------------------------------- +% If you have any ideas, questions, suggestions or bugs to report, please +% feel free to contact me. +% -------------------------------------------------------------------------- +% Copyright 2011-2017 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. +% -------------------------------------------------------------------------- +\documentclass[load-preamble+]{cnltx-doc} +\usepackage[utf8]{inputenc} +\usepackage[compatibility=newest]{chemmacros} +\setcnltx{ + package = {chemmacros}, + info = {comprehensive support for typesetting chemistry documents}, + url = https://github.com/cgnieder/chemmacros , + authors = Clemens Niederberger , + email = contact@mychemistry.eu , + abstract = {% + \centering + \includegraphics{chemmacros-logo.pdf} + \par + } , + quote-format = \small\biolinumLF , + add-cmds = { + abinitio, activatechemgreekmapping, AddRxnDesc, anti, aq, aqi, + ba, bond, bridge, + cd, ch, changechemgreeksymbol, charrow, chcpd, chemabove, chemalpha, + chembeta, ChemCleverefSupport, chemdelta, chemDelta, + ChemFancyrefSupport, chemformula@bondlength, chemgamma, ChemModule, + chemomega, chemphi, chemPhi, chemsetup, chlewis, chname , cip, cis, ch, + CNMR, + data, DeclareChemArrow, DeclareChemBond, DeclareChemBondAlias, + DeclareChemCharge, DeclareChemEqConstant, declarechemgreekmapping, + DeclareChemIUPAC, DeclareChemIUPACShorthand, DeclareChemLatin, + DeclareChemNMR, DeclareChemNucleophile, DeclareChemPartialCharge, + DeclareChemParticle, DeclareChemPhase, DeclareChemReaction, + DeclareChemState, + delm, delp, Delta, dexter, Dfi, + el, ElPot, endo, entgegen, Enthalpy, enthalpy, entropy, + fdelm, fdelp, fmch, fminus, fpch, fplus, fscrm, fscrp, + gas, ghs, ghslistall, ghspic, gibbs, gram, + hapto, HNMR, Helmholtz, hydrogen, + IfChemCompatibilityF, IfChemCompatibilityT, IfChemCompatibilityTF, insitu, + invacuo, isotope, iupac, + Ka, Kb, Kw, + laevus, Lfi, listofreactions, lqd, + makepolymerdelims, mch, mega, meta, mhName, + NewChemArrow, NewChemBond, NewChemBondAlias, + NewChemCharge, NewChemEqConstant, newchemgreekmapping, NewChemIUPAC, + NewChemIUPACShorthand, NewChemLatin, NewChemMacroset, NewChemNMR, + NewChemNucleophile, NewChemPartialCharge, NewChemParticle, NewChemPhase, + NewChemReaction, NewChemState, + newman, nitrogen, NMR, Nu, Nuc, + orbital, ortho, ox, OX, oxygen, + para, pch, per, pH, phase, phosphorus, photon, pKa, pKb, pOH, pos, + positron, Pot, ProvideChemArrow, ProvideChemBond, ProvideChemCharge, + ProvideChemEqConstant, ProvideChemIUPAC, ProvideChemIUPACShorthand, + ProvideChemLatin, ProvideChemNMR, ProvideChemNucleophile, + ProvideChemPartialCharge, ProvideChemParticle, ProvideChemPhase, + ProvideChemReaction, + ProvideChemState, prt, + Rad, redox, RemoveChemIUPACShorthand, RenewChemArrow, RenewChemBond, + RenewChemCharge, RenewChemEqConstant, renewchemgreekmapping, + RenewChemIUPAC, RenewChemIUPACShorthand, RenewChemLatin, RenewChemNMR, + RenewChemNucleophile, RenewChemPartialCharge, RenewChemParticle, + RenewChemPhase, RenewChemState, + Sf, scrm, scrp, second, selectchemgreekmapping, setchemformula, + ShowChemArrow, ShowChemBond, sld, Sod, state, sulfur, + trans, + usechemmodule, + val, + zusammen + } , + add-silent-cmds = { + addplot, + bottomrule, + cancel, cdot, ce, cee, celsius, centering, chemfig, chemname, clap, + cnsetup, code, color, cstack, cstsetup, + DeclareInstance, DeclareSIUnit, definecolor, draw, + electronvolt, endtikzpicture, + footnotesize, + glqq, grqq, + hertz, hspace, + includegraphics, intertext, IUPAC, + joule, + kelvin, kilo, + latin, lc, lewis, Lewis, liquid, ltn, + metre, midrule, milli, mmHg, mole, + nano, nicefrac, num, numrange, + ominus, oplus, + percent, pgfarrowsdeclarealias, pgfarrowsrenewalias, + renewtagform, rightarrow, + sample, scriptscriptstyle, setatomsep, setbondoffset, sfrac, shade, + shadedraw, shorthandoff, si, SI, sisetup, square, subsection, + textcolor, textendash, textsuperscript, tikz, tikzpicture, tiny, toprule, + upbeta, upeta, upgamma, usetikzlibrary, + volt, vphantom, vspave, + xspace, + z@, z@skip + } , + index-setup = { othercode = \footnotesize , level = \section } , + makeindex-setup = { columns = 2 , columnsep = 1em } +} + +\usepackage{booktabs,array,longtable} + +\usepackage{chemfig,cancel,varioref,csquotes} + +\usepackage[ + a4paper, + top = .1\paperheight, + bottom = .1\paperheight, + left = .2\paperwidth, + right = .1\paperwidth +]{geometry} + + +\expandafter\def\csname libertine@figurestyle\endcsname{LF} +\usepackage[libertine]{newtxmath} +\expandafter\def\csname libertine@figurestyle\endcsname{OsF} + +\usepackage[biblatex]{embrac} +\ChangeEmph{[}[,.02em]{]}[.055em,-.08em] +\ChangeEmph{(}[-.01em,.04em]{)}[.04em,-.05em] + +\usepackage[accsupp]{acro} +\acsetup{ + long-format = \scshape , + short-format = \scshape +} +\DeclareAcronym{ghs}{ + short = ghs , + long = Globally Harmonized System of Classification and Labelling of + Chemicals , + pdfstring = GHS , + accsupp = GHS +} +\DeclareAcronym{eu}{ + short = EU , + long = European Union , + pdfstring = EU , + accsupp = EU +} +\DeclareAcronym{iupac}{ + short = iupac , + long = International Union of Pure and Applied Chemistry , + pdfstring = IUPAC , + accsupp = IUPAC +} +\DeclareAcronym{UN}{ + short = un , + long = United Nations , + pdfstring = UN , + accsupp = UN +} +\DeclareAcronym{dvi}{ + short = dvi , + long = device independent file format , + pdfstring = DVI , + accsupp = DVO +} +\DeclareAcronym{pdf}{ + short = pdf , + long = portable document file , + pdfstring = PDF , + accsupp = PDF +} +\DeclareAcronym{id}{ + short = id , + long = identification string , + pdfstring = ID , + accsupp = ID +} + +\chemsetup{ + modules = {all,polymers} , + greek = newtx , + formula = chemformula , + chemformula/format = \libertineLF +} + +\usepackage{siunitx} + +\sisetup{ + detect-mode=false, + mode=text, + text-rm=\libertineLF +} + +\usepackage{filecontents} + +\defbibheading{bibliography}{\section{References}} +\addbibresource{\jobname.bib} +\begin{filecontents*}{\jobname.bib} +@book{iupac:greenbook, + author = {E. Richard Cohan and Tomislav Cvita\v{s} and Jeremy G. Frey and + Bertil Holmstr\"om and Kozo Kuchitsu and Roberto Marquardt and Ian Mills and + Franco Pavese and Martin Quack and J\"urgen Stohner and Herbert L. Strauss and + Michio Takami and Anders J Thor} , + title = {``Quantities, Symbols and Units in Physical Chemistry'', \acs{iupac} + Green Book} , + shorttitle = {The \acs{iupac} Green Book} , + sorttitle = {Quantities, Symbols and Units in Physical Chemistry} , + indexsorttitle = {Quantities, Symbols and Units in Physical Chemistry} , + edition = {3rd Edition. 2nd Printing} , + year = {2008} , + publisher = {\acs{iupac} \&\ RSC Publishing, Cambridge} +} +@book{iupac:redbook, + author = {Neil G. Connelly and Ture Damhus and Richard M. Hartshorn and + Alan T. Hutton} , + title = {``Nomenclature of Inorganic Chemistry'', \acs{iupac} Red Book} , + shorttitle = {The \acs{iupac} Red Book} , + sorttitle = {Nomenclature of Inorganic Chemistry} , + indexsorttitle = {Nomenclature of Inorganic Chemistry} , + year = {2005} , + publisher = { \acs{iupac} \&\ RSC Publishing, Cambridge} , + isbn = {0-85404-438-8} +} +@book{iupac:bluebook, + author = {R. Panico and W. H. Powell and J-C. Richer}, + title = {``Nomenclature of Organic Chemistry, Sections A, B, C, D, E, F, + and H'', \acs{iupac} Blue Book}, + shorttitle = {The \acs{iupac} Blue Book} , + sorttitle = {Nomenclature of Organic Chemistry} , + indexsorttitle = {Nomenclature of Organic Chemistry} , + edition = {\mkbibacro{draft}}, + date = {2004-10-07}, + url = + {http://old.iupac.org/reports/provisional/abstract04/BB-prs310305/CompleteDraft.pdf}, + urldate = {2013-07-07} +} +@misc{eu:ghsystem_regulation, + author = {{The European Parliament and The Council of the European Union}}, + sortname = {European Parliament and The Council of the European Union} , + title = {Regulation (EC) No 1272/2008 of the European Parliament and of + the Council} , + subtitle = {on classification, labelling and packaging of substances and + mixtures, amending and repealing Directives 67/548/EEC and 1999/45/EC, and + amending Regulation (EC) No 1907/2006} , + journal = {Official Journal of the European Union} , + date = {2008-12-16} +} +@online{unece:ghsystem_implementation, + author = {{United Nations Economic Commission for Europe}} , + title = {GHS Implementation} , + url = + {http://www.unece.org/trans/danger/publi/ghs/implementation_e.html} , + urldate = {2012-03-20} , + date = {2012-03-20} +} +@online{mychemistry:chemmacros-dev, + author = {Clemens Niederberger} , + title = {chemmacros development} , + url = {http://www.mychemistry.eu/2015/06/chemmacros-development/} , + urldate = {2015-07-16} , + date = {2015-06-14} +} +@online{mychemistry:modular-chemmacros, + author = {Clemens Niederberger} , + title = {modular chemmacros} , + url = {http://www.mychemistry.eu/2015/06/modular-chemmacros/} , + urldate = {2015-07-16} , + date = {2015-06-08} +} +@online{mychemistry:chemmacros-update-how, + author = {Clemens Niederberger} , + title = {a new chemmacros -- but how?} , + url = {http://www.mychemistry.eu/2015/07/a-new-chemmacros-but-how/} , + urldate = {2015-07-16} , + date = {2015-07-15} +} +\end{filecontents*} + +\DeclareInstance{xfrac}{chemformula-text-frac}{text} + { + scale-factor = 1 , + denominator-bot-sep = -.2ex , + denominator-format = \scriptsize #1 , + numerator-top-sep = -.2ex , + numerator-format = \scriptsize #1 , + slash-right-kern = .05em , + slash-left-kern = .05em + } + +\usetikzlibrary{calc,positioning,decorations.pathmorphing,patterns} + +% \newpackagename\chemmacros{chemmacros} +\newcommand*\chemmacrosversion{\csname c_chemmacros_version_tl\endcsname} +\newpackagename\chemformula{chemformula} +\newpackagename\ghsystem{ghsystem} +\newpackagename\chemgreek{chemgreek} + +\renewcommand*\AmS{\hologo{AmS}} +\newcommand*\TikZ{Ti\textit{k}Z} +\newcommand*\tablehead[1]{\textrm{\bfseries#1}} + +\providecommand*\XyM{% + X\kern-.30em + \smash{\raise.50ex\hbox{\char'7}}% + \kern-.30em M% +} +\providecommand*\XyMTeX{\XyM\kern-.1em\TeX} + +% \NewChemPhase{\aqi}{aq,$\infty$}% aqueous solution at infinite dilution +% \NewChemPhase{\cd}{cd}% condensed phase +% \NewChemPhase{\lc}{lc}% liquid crystal + +\newname\hensel{Martin Hensel} +\newname\pedersen{Bj\o rn Pedersen} + +\newcommand*\iupaccs[3][]{% + \command{#2}[\quad\iupac{\csuse{#2}}] + #3\ifblank{#1}{}{\ifblank{#3}{}{ }An alias for this command is \cs{#1}.}% +} + +% \undef\module +% \undef\moduleidx +\newidxcmd\chemmodule{\code{#1}}[ (module)] +\newidxcmd\tikzdecoration{\code{#1}}[ (\TikZ\ decoration)] +\AtEndPreamble{% + \pdfstringdefDisableCommands{% + \def\chemmodule*#1{\textquotedblleft#1\textquotedblright}% + }% +} +\newidxcmd\sym{\code{#1}}[ (symbol)] + +\makeatletter +\def\cnltx@bash@listings@style{ + language = bash, + basicstyle = {\sourceformat\color{black}}, + % numbers = left, + % numberstyle = \tiny, + xleftmargin = 1em, + numbersep = .75em, + gobble = \cnltx@gobble , + columns = fullflexible, + literate = + {ä}{{\"a}}1 + {ö}{{\"o}}1 + {ü}{{\"u}}1 + {Ä}{{\"A}}1 + {Ö}{{\"O}}1 + {Ü}{{\"U}}1 + {ß}{{\ss}}1 , + breaklines = true, + keepspaces = true, + breakindent = 1em, + commentstyle = \color{comment}, + keywordstyle = \color{black}\bfseries , + stringstyle = \color{black} , + showstringspaces = false , + morekeywords = texdoc +} + +\cnltx@expandargs(nx)\lstdefinestyle + {bash} + {\expandonce\cnltx@bash@listings@style} + +\newcommand*\prompt{} +\patchcmd\lst@NewLine + {\hbox{}}% search + {\hbox{}\prompt}% replace + {}% success + {}% failure +\newsourcecodeenv[ + code-only, + sourcecode-options = { + style = bash , + deleteindex = [5][keyword5] , + deleteindex = [6][keyword6] + }, + pre-code = \def\prompt{\textasciitilde\space\$\space} +]{lbash} +\makeatother + +\renewcommand*\dictumauthorformat[1]{#1} +\renewcommand*\raggeddictumtext{} + +\newcommand*\TF{\textcolor{red}{\uline{\code{\textcolor{cs}{\textit{TF}}}}}} + +\makeatletter +\newrobustcmd*\explcsformat[1]{% + \code{\textbackslash\textcolor{cs}{\detokenize{#1}}}% +} +\newidxcmd\explcs{\explcsformat{#1}}[ (expl3)] + +\cnltx@deflistitem{\cnltx@explcommand}{\explcs} +\renewenvironment{commands} + {% + \let\command\cnltx@command + \let\explcommand\cnltx@explcommand + \cnltxlist + } + {\endcnltxlist} +\newenvironment{tikzcode} + {% + \def\arrowtip{\@cnltx@option@item\code}% + \cnltxlist + } + {\endcnltxlist} + +\newrobustcmd*\showenv[1]{\beginenv*\code{\{}\env{#1}\code{\}}} +\makeatother + +\ExplSyntaxOn +\cs_new_protected:Npn \chemboldchecks #1 + { + \seq_set_map:NNn \l_tmpa_seq \l__chemmacros_if_bf_seq { \code {##1} } + \seq_use:Nnnn \l_tmpa_seq {,~} {,~} {~#1~} + } +\ExplSyntaxOff + +\AtBeginDocument{\renewcommand*\reftextfaraway[1]{starting on page~\pageref{#1}}} + +\usepackage{bookmark} + +\begin{document} + +\part{Preliminaries} +\section{Licence, Requirements and \textsc{README}}\label{sec:licence-requ-readme} +\license + +\chemmacros\ loads the packages \pkg{expl3}~\cite{bnd:l3kernel} and +\pkg{xparse}~\cite{bnd:l3packages}. Depending on your usage other packages +will be loaded. They are mentioned when the corresponding module using the +package is described. + +\section{Motivation and Background}\label{sec:motiv-backgr} +This package grew from a small collection of personal helper macros back +in~2010 into a rather big package supporting various different chemical +typesetting tasks. I hope I have achieved the following points with this +package: +\begin{itemize} + \item Intuitive usage as far as the syntax of the commands is concerned. + \item A comprehensive set of macros! If there are any needs you might have + with respect to typesetting of chemistry which is not supported by this + package\footnote{Not including needs already solved by other packages such + as \pkg{chemnum} or \pkg{chemfig}.} then let me know so \chemmacros\ can + be extended. + \item The commands shall not only make typesetting easier and faster but + also the document source more readable with respect to semantics + (\code{\cs{ortho}-dichlorobenzene} is easier to read and understand than + \code{\cs*{textit}\Marg{o}-dichlorobenzene}); the first variant in my + opinion also is more in the spirit of \LaTeXe. + \item As much customizability as I could think of so every user can adapt + the commands to his or her own wishes. Every now and then users have + wishes which can't be solved with the available options. Almost always + I'll add options then. If you find something please contact me, see + section~\vref{sec:sugg-bug-reports}. + \item Default settings that are compliant with the recommendations of the + \acf{iupac}. +\end{itemize} +Especially the last point in the past needed some pushing from users to get +things right in many places. If you find anything not compliant with +\ac{iupac} recommendations please contact me, see +section~\vref{sec:sugg-bug-reports}. Don't forget to add references for the +corresponding \ac{iupac} recommendation. + +\section{The Structure of \chemmacros}\label{sec:structure-chemmacros} +\subsection{General Structure} +Since version~5.0 the \chemmacros\ package has a strictly modular +structure\sinceversion{5.0}. On the one hand this eases maintenance but it +will also allow for easy and quick extension in the future. In a way it is a +logical consequence from \chemmacros' history: since version~2.0, \ie, since +the fall of~2011 \chemmacros\ already had modular options. + +The different modules of \chemmacros\ are divided into two groups: +\begin{enumerate} + \item Internal modules which provide underlying functionality or basic + functionality which is not of direct interest from a user perspective but + might be if you plan to write a module yourself (see + section~\ref{sec:own-modules} for details). + \item User modules which provide all the stuff for typesetting. +\end{enumerate} +Both groups each are subdivided into two groups: preloaded modules and modules +which have to be loaded by the programmer (internal modules) or by the +document author (user modules). Those modules are described in +parts~\ref{part:preloaded-modules} (preloaded modules) +and~\ref{part:additional-modules} (additional modules) of this manual. + +The above means that not all functionality is available per default. If you +want to load \emph{all} modules no matter what then you can say: +\begin{sourcecode} + \usechemmodule{all} +\end{sourcecode} +or +\begin{sourcecode} + \chemsetup{modules=all} +\end{sourcecode} +which will load all modules which are part of \chemmacros\ (also see +section~\vref{sec:all-module}). Own modules (see +section~\vref{sec:own-modules}) are \emph{not} loaded through this, though, +and still have to be loaded additionally. + +In part~\vref{part:preloaded-modules} the preloaded modules are described, +first the user modules then the internal ones, in +part~\vref{part:additional-modules} the other available modules are described, +again the user modules first. In each section the modules are described in +an alphabetical order. + +\subsection{Using \chemmacros' Options}\label{sec:using-chemm-opti} +Prior to v5.0 \chemmacros\ had quite a number of package options. +\chemmacros\ v5.0 or higher has none! All of \chemmacros' options are set +using the command +\begin{commands} + \command{chemsetup}[\oarg{module}\marg{option list}] + \chemmacros' setup command. +\end{commands} + +When an option is described then in the left margin the module the option +belongs to is denoted. This looks something like this: +\begin{options} + \keyval{option}{value}\Module{module}\Default + Description of \option{option}. The module is printed in the left margin. + The default value to the right is the setting the option has when + \chemmacros\ is loaded. This can be an explicit setting but the option + can also be empty. + \keychoice{choice-option}{list,of,\default{choices}}\Module{module}\Default{list} + Description of \option{choice-option}. A choice option can only be used + with a predefined list of values. If one of the values is underlined it + means that the option can be used without value in which case the + underlined value is chosen. If no value is underlined then a value + \emph{has} to be given by the user. + \keybool{boolean-option}\Module{module}\Default{true} + Description of \option{boolean-option}. A boolean option is a choice + option with exactly the two values \code{true} and \code{false}. If the + option is called without value then the underlined value is chosen (which + is always \code{true} for a boolean option). +\end{options} + +An option or list of options belonging to a module \chemmodule{module} can be +set in two ways: +\begin{sourcecode} + % first possibility: + \chemsetup[module]{ + option1 = value , + option2 = value + } + % second possibility: + \chemsetup{ + module/option1 = value , + module/option2 = value + } +\end{sourcecode} +The second way allows to set options belonging to different modules with one +call of \cs{chemsetup}. + +\subsection{Support Package \chemformula} +\chemformula\ provides means of typesetting chemical formulas and reactions. +You will see its macros \cs{ch} and \cs{chcpd} every now and then in this +manual. When using \chemmacros\ you can consider the \chemformula\ +package~\cite{pkg:chemformula} to be loaded as \chemmacros\ makes use of it in +various places. \chemmacros\ and \chemformula\ are tightly intertwined. +Nevertheless you should be able to use the \pkg{mhchem}~\cite{pkg:mhchem} +package with \chemmacros. Please see section~\vref{sec:using-mhchem} for +details and \latin{caveat}s. \emph{The recommendation is to use + \chemformula.} + +A historical note: \chemformula\ started as a part of \chemmacros\ in +January~2012. Since July~2013 it is a completely independent package -- from +\chemformula's point of view. It is maintained independently and has a manual +of its own. + +\subsection{Upgrading from version $<5.0$} +People upgrading from versions $<5.0$ will find that almost everything they +know from earlier versions is the same in versions $\geq5.0$. But there are +important and \emph{breaking} differences: +\begin{itemize} + \item \chemmacros\ has no package options any more, all options are set via + \cs{chemsetup}, also see section~\vref{sec:using-chemm-opti}. + \item Not all of the features are available per default any more, for some + the corresponding module has to be loaded explicitly, see + section~\ref{sec:general-options}. If suddenly some commands or + environments seem to be undefined this is the most likely reason. + \item Some option modules have been renamed (\eg, \module*{iupac} is now + \module{nomenclature}). If you experience strange errors when you upgrade + your document this is the most likely source. + \item The command family \cs*{NewChem\ldots}, \cs*{RenewChem\ldots} and + \cs*{DeclareChem\ldots} has a new member \cs*{ProvideChem\ldots}. + \item In \cs{iupac} the macro \cs*{-} no longer gives a dash with breaking + point. Instead \sym*{-} can be used directly\footnote{\cs*{-} is provided + up to and including v5.2 but is dropped in higher versions.}. + \item The macro \cs{ox} has another default behaviour (\keyis{pos}{super}) + and the starred version has another effect (\keyis{pos}{top}) than the + same macro in earlier versions. Now the default behaviour follows + \acs{iupac} recommendations. A second change is that the atom is now + treated as a \chemformula\ input (this depends on the setting of the + \option{formula} option, see~\vref{sec:chemformula-module}). + \item The syntax of \cs{NewChemReaction} and friends is now different from + what it used to be. If you have defined your own reaction environments + you need to adapt! + \item \chemmacros\ offers a macro \cs{state} which is similar to but + different from the earlier macro \cs*{State}. \cs*{State} is deprecated. + There are also differences in the syntax of \cs{enthalpy} \vs\ the earlier + \cs*{Enthalpy}, \cs{entropy} \vs\ \cs*{Entropy} and \cs{gibbs} \vs\ + \cs*{Gibbs}. The uppercase versions are deprecated. The macro + \cs{NewChemState} also has a different syntax now. + \item At various places in the code improvements and fixes have been made, + too many to list them here. You should keep an open eye and first of all + read the manual closely. +\end{itemize} + +\subsection{Compatibility Mode} + +\subsubsection{For Users} +It is actually not true that \chemmacros' has no package options any more. It +has one very important package option: +\begin{options} + \keychoice{compatibility}{\meta{version},newest,latest}\Default{\chemmacrosversion} + Let's you specify the version of \chemmacros\ you want to use. Any + version earlier than 5.0 will load v4.7. \ie, the last version before + \chemmacros\ got its modular structure\footnote{Mostly: the loaded v4.7 + has got a few fixes}. Not using the option will always load the newest + version. + + Both values \code{newest} and \code{latest} will choose the latest version + available. +\end{options} + +In your document you can check for the compatibility mode. For the following +functions it is important to understand the rules: \emph{greater} means +\emph{newer}. The version number is \emph{not} a usual decimal number! The +syntax for \meta{version} is \meta{major}\code{.}\meta{minor}\meta{optional + subrelease}. This means that a version~5.11 is \emph{newer} than a +version~5.7! In the same way \emph{less} means \emph{older}. As last +example: 5.10~is \emph{newer} (greater) than~5.1. \meta{optional subrelease} +is a lowercase letter which might or might not be present in a version number. +Version~5.7b is newer than~5.7a which in turn is newer than~5.7. +\begin{commands} + \expandable\command{IfChemCompatibilityTF}[\marg{comp}\marg{version}% + \marg{true}\marg{false}] + Checks the value given through the option \option{compatibility} against + \meta{version} using \meta{comp} and either leaves \meta{true} or + \meta{false} in the input stream. \meta{comp} can be one of \code{<}, + \code{<=}, \code{=}, \code{>=} or \code{>}. + \expandable\command{IfChemCompatibilityT}[\marg{comp}\marg{version}\marg{true}] + Checks the value given through the option \option{compatibility} against + \meta{version} using \meta{comp} and leaves \meta{true} in the input + stream if the check is logically true. \meta{comp} can be one of + \code{<}, \code{<=}, \code{=}, \code{>=} or \code{>}. + \expandable\command{IfChemCompatibilityF}[\marg{comp}\marg{version}\marg{false}] + Checks the value given through the option \option{compatibility} against + \meta{version} using \meta{comp} and leaves \meta{false} in the input + stream if the check is logically false. \meta{comp} can be one of + \code{<}, \code{<=}, \code{=}, \code{>=} or \code{>}. +\end{commands} + +A possible usage: +\begin{sourcecode} + \IfChemCompatibilityT{>=}{5.0}{\usechemmodule{all}} +\end{sourcecode} + +Loading \chemmacros\ with \keyis{compatibility}{4.7} also allows to use the +package options from that version: +\begin{sourcecode} + \usepackage[compatibility=4.7,language=german]{chemmacros} +\end{sourcecode} + +\subsubsection{For Module Writers} +For future versions the aim is not to make such breaking changes again. While +we never know what the future actually will bring \chemmacros\ now has the +tools for tying code to a version number: +\begin{commands} + \expandable\explcommand{chemmacros_if_compatibility:nn}[\TF\ \marg{comp} + \marg{version} \marg{true} \marg{false}] + expl3 version of \cs{IfChemCompatibilityTF}. +\end{commands} + +In modules one can try adding code for a certain version or range of versions: +\begin{commands} + \command{ChemCompatibility}[\marg{version} \meta{code} \cs{EndChemCompatibility}] + Leaves \meta{code} in the input stream if the compatibility version $x$ + given by \option{compatibility} matches \meta{version} + ($x=\text{\meta{version}}$). + \command{ChemCompatibilityFrom}[\marg{version} \meta{code} \cs{EndChemCompatibility}] + Leaves \meta{code} in the input stream if the compatibility version $x$ + given by \option{compatibility} matches \meta{version} or newer. This + means \meta{version} is the \emph{oldest} version allowed + ($x\geq\text{\meta{version}}$). + \command{ChemCompatibilityTo}[\marg{version} \meta{code} \cs{EndChemCompatibility}] + \changedversion{5.8a}Leaves \meta{code} in the input stream if the + compatibility version $x$ given by \option{compatibility} matches any + version up to and \emph{excluding} \meta{version}. This means + \meta{version} is the \emph{oldest} version \emph{not} allowed + ($x<\text{\meta{version}}$). + \command{ChemCompatibilityBetween}[\marg{version 1}\marg{version 2} \meta{code} + \cs{EndChemCompatibility}] + \changedversion{5.8a}Leaves \meta{code} in the input stream if the + compatibility version $x$ given by \option{compatibility} lies between and + \emph{including} \meta{version 1} up to and \emph{excluding} \meta{version 2} + ($\text{\meta{version 1}}\leq x<\text{\meta{version 2}}$). + \command{EndChemCompatibility} + This macro \emph{must} end each of the \cs*{ChemCompatibility\ldots} + macros. +\end{commands} + +You may refer to the current version of \chemmacros\ with the following +tokenlists: +\begin{commands} + \explcommand{c_chemmacros_date_tl} + The current release date: \enquote{\csname + c_chemmacros_date_tl\endcsname}. + \explcommand{c_chemmacros_version_major_number_tl} + The current major version: \enquote{\csname + c_chemmacros_version_major_number_tl\endcsname}. + \explcommand{c_chemmacros_version_minor_number_tl} + The current minor version: \enquote{\csname + c_chemmacros_version_minor_number_tl\endcsname}. + \explcommand{c_chemmacros_version_number_tl} + The current version number: \enquote{\csname + c_chemmacros_version_number_tl\endcsname}. + \explcommand{c_chemmacros_version_subrelease_tl} + The current sub-release: \enquote{\csname + c_chemmacros_version_subrelease_tl\endcsname}. + \explcommand{c_chemmacros_version_tl} + The current version: \enquote{\csname c_chemmacros_version_tl\endcsname}. + \explcommand{c_chemmacros_info_tl} + The package information: \enquote{\csname + c_chemmacros_info_tl\endcsname}. +\end{commands} + +\section{General Options}\label{sec:general-options} + +\chemmacros\ has some core options which don't belong to any of the modules +described in parts~\ref{part:preloaded-modules} +and~\ref{part:additional-modules}. Those options have no module denoted in +the left margin next to their descriptions and are also set without specifying +a module: +\begin{sourcecode} + \chemsetup{ + option1 = value , + option2 = value + } +\end{sourcecode} + +Two of those options are explained now: +\begin{options} + \keyval{modules}{comma separated list of module names}\Default + With this option you can specify which modules you want to load. + Alternatively you can use \cs{usechemmodule}\marg{comma separated list of + module names}. + \keyval{greek}{mapping}\Default + Explicitly specify which mapping should be used by the \chemgreek\ + package~\cite{pkg:chemgreek}. For details about what this means please + refer to section~\vref{sec:greek-module}. +\end{options} + +Some internal modules may also define core options, \eg, the \chemmodule{lang} +module, see section~\vref{sec:lang-module}. + +\part{The Preloaded Modules}\label{part:preloaded-modules} + +\section{User Modules} +\subsection{The \chemmodule*{acid-base} Module}\label{sec:acid-base-module} + +Easy representation of \pH, \pKa \ldots +\begin{commands} + \command{pH} \pH + \command{pOH} \pOH + \command{Ka} \Ka, depends on language settings, see + section~\vref{sec:lang-module}. The translations can be adapted. + \command{Kb} \Kb + \command{Kw} \Kw + \command{pKa}[\oarg{num}] \cs{pKa}: \pKa, \cs{pKa}\Oarg{1}: \pKa[1], depends + on language settings, see section~\vref{sec:lang-module}. The translations + can be adapted. + \command{pKb}[\oarg{num}] \cs{pKb}: \pKb, \cs{pKb}\Oarg{1}: \pKb[1] + \command{p}[\marg{anything}] \eg\ \cs{p}\Marg{\cs{Kw}} \p{\Kw} +\end{commands} + +\begin{example}[side-by-side] + \Ka\ \Kb\ \pKa\ \pKa[1] \pKb\ \pKb[1] +\end{example} + +\begin{cnltxquote}[{\citetitle{iupac:greenbook} \cite[][p.\,103]{iupac:greenbook}}] + The operator \p{} \textelp{} shall be printed in Roman type. +\end{cnltxquote} + +There is one option which changes the style the \p{} is typeset, other options +allow to change the subscript of the constants: +\begin{options} + \keychoice{p-style}{italics,slanted,upright}\Module{acid-base}\Default{upright} + Set the style of the \p{} operator. + \keyval{K-acid}{text}\Module{acid-base}\Default{\cs{ChemTranslate}\Marg{K-acid}} + The subscript to \cs{Ka} and \cs{pKa}. + \keyval{K-base}{text}\Module{acid-base}\Default{\cs{ChemTranslate}\Marg{K-base}} + The subscript to \cs{Kb} and \cs{pKb}. + \keyval{K-water}{text}\Module{acid-base}\Default{\cs{ChemTranslate}\Marg{K-water}} + The subscript to \cs{Kw}. + \keyval{eq-constant}{text}\Module{acid-base}\Default{K} + The\sinceversion{5.4} symbol of the constants. +\end{options} +\begin{example} + \pH, \pKa \par + \chemsetup[acid-base]{p-style=slanted} \pH, \pKa \par + \chemsetup[acid-base]{p-style=italics} \pH, \pKa +\end{example} + +As you can see the default subscripts of \cs{Kw}, \cs{Ka} and \cs{Kb} are +lowercase letters. The literature is inconclusive about if this is the right +way or if uppercase letters should be preferred. In textbooks the uppercase +variant usually seems to be used while journals seem to prefer the lowercase +variant. \chemmacros' default follows the usage in +\citetitle{iupac:greenbook}~\cite{iupac:greenbook}. If you want to change +this you have two possibilities: + +\begin{example} + % this works only in the preamble: + % \DeclareTranslation{English}{K-acid}{\mathrm{A}}% use your language here + % alternative: + \chemsetup{acid-base/K-acid=\mathrm{A}}% overwrites language dependent settings + \pKa +\end{example} + +The\sinceversion{5.4} constants \Ka, \Kb, and \Kw\ were defined using the +following commands: +\begin{commands} + \command{NewChemEqConstant}[\marg{cs}\marg{name}\marg{subscript}] + Define the constant \meta{cs} with the name \meta{name} and the subscript + \meta{subscript}. This also defines the default translation with the key + \meta{name} using \meta{subscript} as fallback translation (see + section~\vref{sec:lang-module} for details). It also defines the option + \meta{name} for setting the subscript. + \command{RenewChemEqConstant}[\marg{cs}\marg{name}\marg{default appearance}] + The same as \cs{NewChemEqConstant} but renews an existing command. + \command{DeclareChemEqConstant}[\marg{cs}\marg{name}\marg{default appearance}] + The same as \cs{NewChemEqConstant} but overwrites existing commands. + \command{ProvideChemEqConstant}[\marg{cs}\marg{name}\marg{default appearance}] + The same as \cs{NewChemEqConstant} but doesn't throw an error if \meta{cs} + already exists. +\end{commands} + +This is how \cs{Ka} is defined: +\begin{sourcecode} + \NewChemEqConstant\Ka{K-acid}{\mathrm{a}} +\end{sourcecode} + +\subsection{The \chemmodule*{charges} Module}\label{sec:charges-module} + +The \chemmodule{charges} module loads the module \chemmodule{chemformula}. + +\subsubsection{Charge Symbols} +\begin{commands} + \command{fplus} \fplus\ formal positive charge + \command{fminus} \fminus\ formal negative charge + \command{scrp} \scrp\ scriptstyle positive charge (\eg, for usage in + \pkg{chemfig}'s~\cite{pkg:chemfig} formulas). + \command{scrm} \scrm\ scriptstyle negative charge (\eg, for usage in + \pkg{chemfig}'s formulas). + \command{fscrp} \fscrp\ scriptstyle formal positive charge (\eg, for usage + in \pkg{chemfig}'s formulas). + \command{fscrm} \fscrm\ scriptstyle formal negative charge (\eg, for usage + in \pkg{chemfig}'s formulas). + \command{fsscrp} \fsscrp\ scriptscriptstyle formal positive charge (\eg, for + usage in \pkg{chemfig}'s formulas). + \command{fsscrm} \fsscrm\ scriptscriptstyle formal negative charge (\eg, for + usage in \pkg{chemfig}'s formulas). +\end{commands} + +\subsubsection{Ion Charges}\label{sec:ion-charges} +Simple displaying of (real) charges. It is worth noting that these commands +really are relicts from a time when \chemmacros\ tried hard to be compliant +with \pkg{mhchem} and \chemformula\ didn't exist, yet. \textbf{They are still + provided for backwards compatibility but \emph{my recommendation is to use} + \cs{ch} (see the documentation of the \chemformula\ + package~\cite{pkg:chemformula}) \emph{and forget about these commands:}} +\begin{commands} + \command{pch}[\oarg{number}] + positive charge + \command{mch}[\oarg{number}] + negative charge + \command{fpch}[\oarg{number}] + formal positive charge + \command{fmch}[\oarg{number}] + formal negative charge +\end{commands} +\begin{example}[side-by-side] + A\pch\ B\mch[3] C\fpch[2] D\fmch +\end{example} + +\subsubsection{Partial Charges and Similar Stuff}\label{sec:part-charg-simil} + +The next ones probably are seldomly needed but nevertheless useful: +\begin{commands} + \command{delp} \delp\ partial positive charge + \command{delm} \delm\ partial negative charge + \command{fdelp} \fdelp\ partial formal positive charge + \command{fdelm} \fdelm\ partial formal negative charge +\end{commands} + +These macros for example can be used with the \cs{ox} command (see +section~\vref{sec:redox-module}) or with the \pkg{chemfig} package: +\begin{example} + \chemsetup{ + charges/circled = all, + redox/parse = false, + redox/pos = top + } + \ch{"\ox{\delp,H}" -{} "\ox{\delm,Cl}"} \hspace*{1cm} + \chemfig{\chemabove[3pt]{\lewis{246,Br}}{\delm}-\chemabove[3pt]{H}{\delp}} +\end{example} + +\subsubsection{Charge Options} + +\begin{options} + \keychoice{circled}{formal,\default{all},none}\Module{charges}\Default{formal} + \chemmacros\ uses two different kinds of charges which indicate the usage + of real ($+/-$) and formal (\fplus/\fminus) charges. The option + \code{formal} distinguishes between them, option \code{none} displays them + all without circle, option \code{all} circles all. + \keychoice{circletype}{chem,math}\Module{charges}\Default{chem} + This option switches between two kinds of circled charge symbols: + \cs{fplus} \fplus/\cs{fminus} \fminus\ (\code{chem}) and + \verbcode+$\oplus$+ $\oplus$/\verbcode+$\ominus$+ $\ominus$ (\code{math}). + \keyval{partial-format}{\LaTeX\ code}\Module{charges}\Default{\cs*{tiny}} + Code which formats the macros defined with \cs{NewChemPartialCharge} (see + section~\ref{sec:own-charge-macros}). +\end{options} + +\subsubsection{Own Charge Macros}\label{sec:own-charge-macros} +Just in case the existing macros don't fit you needs there are commands for +defining new ones or modifying the existing ones. These commands define +macros like those described in section~\vref{sec:ion-charges}. + +\begin{commands} + \command{NewChemCharge}[\marg{cs}\marg{charge symbol}] + Defines a new macro \meta{cs}. Raises an error if \meta{cs} already + exists. + \command{RenewChemCharge}[\marg{cs}\marg{charge symbol}] + Redefines a new macro \meta{cs}. Raises an error if \meta{cs} doesn't + exist. + \command{DeclareChemCharge}[\marg{cs}\marg{charge symbol}] + Defines a macro \meta{cs}. Silently overwrites \meta{cs} if it exists. + \command{ProvideChemCharge}[\marg{cs}\marg{charge symbol}] + Defines a new macro \meta{cs}. Does nothing if \meta{cs} already exists. +\end{commands} +An example of usage is the definition of the existing ion charge macros: +\begin{sourcecode} + \NewChemCharge\fpch{\fplus} + \NewChemCharge\fmch{\fminus} +\end{sourcecode} + +These commands define macros like those described in +section~\vref{sec:part-charg-simil}. +\begin{commands} + \command{NewChemPartialCharge}[\marg{cs}\marg{charge symbol}] + Defines a new macro \meta{cs}. Raises an error if \meta{cs} already + exists. + \command{RenewChemPartialCharge}[\marg{cs}\marg{charge symbol}] + Redefines a new macro \meta{cs}. Raises an error if \meta{cs} doesn't + exist. + \command{DeclareChemPartialCharge}[\marg{cs}\marg{charge symbol}] + Defines a macro \meta{cs}. Silently overwrites \meta{cs} if it exists. + \command{ProvideChemPartialCharge}[\marg{cs}\marg{charge symbol}] + Defines a new macro \meta{cs}. Does nothing if \meta{cs} already exists. +\end{commands} +An example of usage is the definition of the existing partial charge macros: +\begin{sourcecode} + \NewChemPartialCharge\fdelp{\fplus} + \NewChemPartialCharge\fdelm{\fminus} +\end{sourcecode} + +\subsection{The \chemmodule*{nomenclature} Module}\label{sec:nomenclature-module} + +The \chemmodule{nomenclature} module loads the \chemmodule{tikz} module. It +also loads the package \pkg{scrlfile} which is part of the +\KOMAScript\ bundle~\cite{bnd:koma-script}. + +\subsubsection{The \cs*{iupac} Command} + +Similar to the \pkg{bpchem} package~\cite{pkg:bpchem} \chemmacros\ provides a +command\footnote{The idea and initial implementation is shamelessly borrowed + from \pkg{bpchem} by \pedersen.} for typesetting \ac{iupac} names. Why is +that useful? \ac{iupac} names can get very long. So long indeed that they +span over more than two lines, especially in two-column documents. This means +they must be allowed to be broken more than one time. This is what the +following command does. +\begin{commands} + \command{iupac}[\marg{IUPAC name}] + Inside this command use \sym{\textbar} indicate a breaking point + \sym{\textasciicircum} as a shortcut for \cs*{textsuperscript}. \sym{-}, + \sym{(} and \sym{)} allow words to be broken while still allow the rest of + word to be hyphenated, likewise \sym{[} and \sym{]}. +\end{commands} + +\begin{example} + \begin{minipage}{.4\linewidth} + \iupac{% + Tetra|cyclo[2.2.2.1^{1,4}]-un|decane-2-dodecyl-% + 5-(hepta|decyl|iso|dodecyl|thio|ester)% + } + \end{minipage} +\end{example} + +The \cs{iupac} command is more of a semantic command. In many cases you can +achieve (nearly) the same thing by using \cs*{-} instead of \sym{\textbar}, +and \cs*{textsuperscript} instead of \sym{\textasciicircum} without +\cs{iupac}. There are some important differences, though: +\begin{itemize} + \item The character \sym{-} inserts a small space before the hyphen and + removes a small space after it. Also usually words with hyphens are only + allowed to break at the hyphen. Inside \cs{iupac} the hyphen will not + prevent further hyphenation. The amount of inserted space can be + customized. + \item The character \sym{\textbar} not only prevents ligatures but also + inserts a small space. The amount of inserted space can be customized. + \item The characters \sym{(} and \sym{)} allow the word to be hyphenated and + don't prevent further hyphenation, likewise \sym{[} and \sym{]}. + \item \sinceversion{5.3}The character \sym{'} is printed as \cs{chemprime}. +\end{itemize} +\begin{example}[side-by-side] + \huge\iupac{2,4-Di|chlor|pentan} \par + 2,4-Dichlorpentan +\end{example} +\begin{commands} + \command{chemprime} + Prints\sinceversion{5.3} a prime character in superscript position. It is + defined as \verbcode+\ensuremath{{}^{\prime}}+. +\end{commands} + +The spaces inserted by \sym{-} and \sym{\textbar} can be +customized. +\begin{options} + \keyval{hyphen-pre-space}{dim}\Module{nomenclature}\Default{.01em} + Set the space that is inserted before the hyphen set with \sym{-}. + \keyval{hyphen-post-space}{dim}\Module{nomenclature}\Default{-.03em} + Set the space that is inserted after the hyphen set with \sym{-}. + \keyval{break-space}{dim}\Module{nomenclature}\Default{.01em} + Set the space inserted by \sym{\textbar}. +\end{options} + +The command \cs{iupac} serves another purpose, too, however. Regardless of +the setting of the \option{iupac} option (see below) all the commands +presented in this section are always defined \emph{inside} \cs{iupac}. Quite +a number of the naming commands have very general names: \cs{meta}, \cs{D}, +\cs{E}, \cs{L}, \cs{R}, \cs{S}, \cs{trans} and so forth\footnote{Please read + section~\vref{sec:one-letter-commands} before you consider using the + one-letter commands}. This means they either are predefined already (\cs{L} +\L) or are easily defined by another package or class (the \pkg{cool} package +defines both \cs{D} and \cs{E}, for example). In order to give you control +which commands are defined in which way, there is the option \option{iupac}: +\begin{options} + \keychoice{iupac}{auto,restricted,strict}\Module{nomenclature}\Default{auto} + Take care of how \ac{iupac} naming commands are defined. +\end{options} +It has three modes: +\begin{itemize} + \item \keyis{iupac}{auto}: if the commands are \emph{not} defined by any + package or class you're using they are available generally, otherwise only + \emph{inside} \cs{iupac}. + \item \keyis{iupac}{restricted}: all naming commands are \emph{only} defined + inside \cs{iupac}. If the commands are defined by another package they of + course have that meaning outside. They're not defined outside otherwise. + \item \keyis{iupac}{strict}: \chemmacros\ overwrites any other definition and + makes the commands available throughout the document. Of course the + commands can be redefined (but only in the document body). They will still + be available inside \cs{iupac} then. +\end{itemize} +Table~\vref{tab:iupac_modes} demonstrates the different modes. + +\begin{table} + \centering + \caption{Demonstration of \option*{iupac}'s modes.}\label{tab:iupac_modes} + \begin{tabular}{lccc} + \toprule + & auto & restricted & strict \\ + \midrule + \cs{L} & \L & \L & \iupac{\L} \\ + \cs{iupac}\Marg{\cs{L}} & \iupac{\L} & \iupac{\L} & \iupac{\L} \\ + \cs{D} & \D & --- & \D \\ + \cs{iupac}\Marg{\cs{D}} & \iupac{\D} & \iupac{\D} & \iupac{\D} \\ + \bottomrule + \end{tabular} +\end{table} + +\subsubsection{Macros Defined (Not Only) For Usage in \cs*{iupac}} + +\paragraph{One-letter Macros}\label{sec:one-letter-commands} +For some of the macros explained in this section one-letter commands are +defined -- with a \latin{caveat} in mind, though: they are not actively +recommended. One-letter commands seldomly have meaningful names and often +they've also been defined by other packages. This means they make +collaboration more difficult than it needs to be and are a source for package +conflicts. \chemmacros\ solves the latter problem by only providing them +inside the argument of \cs{iupac}. The one exception \chemmacros\ makes is +the command \cs{p} (for things like \pH) which is and will remain an official +command (see section~\vref{sec:acid-base-module}). For all other one-letter +macros alternatives with more meaningful names exist. + +\paragraph{Greek Letters}\label{par:greek_letters} + +Greek letters in compound names are typeset upright. Here are a few examples +for the existing macros: +\begin{commands} + \command{chemalpha}[\quad\chemalpha] + Upright lowercase alpha + \command{chembeta}[\quad\chembeta] + Upright lowercase alpha + \command{chemgamma}[\quad\chemgamma] + Upright lowercase alpha + \command{chemdelta}[\quad\chemdelta] + Upright lowercase alpha +\end{commands} +There exist two commands for each of the twenty-four Greek letters: a +lowercase and an uppercase version (\cs{chemalpha} and \cs{chemAlpha}). Those +commands are actually provided by the \chemgreek\ package. For more details +read section~\vref{sec:greek-module} and also refer to \chemgreek's +documentation. + +There are a number of one-letter commands that some people may find convenient +to use which use above mentioned commands to print Greek letters inside +\cs{iupac}. They're listed in table~\vref{tab:iupac-greek-shortcuts}. + +\begin{table} + \centering + \caption{\acs*{iupac} shortcuts for Greek letters.} + \label{tab:iupac-greek-shortcuts} + \begin{tabular}{*9l} + \toprule + macro & + \cs{a} & \cs{b} & \cs{g} & \cs{d} & + \cs{k} & \cs{m} & \cs{n} & \cs{w} \\ + \midrule + letter & + \iupac{\a} & \iupac{\b} & \iupac{\g} & \iupac{\d} & + \iupac{\k} & \iupac{\m} & \iupac{\n} & \iupac{\w} \\ + \bottomrule + \end{tabular} +\end{table} + +\begin{example} + \iupac{5\chemalpha-androstan-3\chembeta-ol} \par + \iupac{\chemalpha-(tri|chloro|methyl)-\chemomega + -chloro|poly(1,4-phenylene|methylene)} +\end{example} + +\paragraph{Hetero Atoms and added Hydrogen} + +Attachments to hetero atoms and added hydrogen atoms are indicated by italic +letters~\cite{iupac:greenbook}. \chemmacros\ defines a few macros for the +most common ones. +\begin{commands} + \iupaccs[H]{hydrogen}{The italic H for hydrogen.} + \iupaccs[O]{oxygen}{The italic O for oxygen.} + \iupaccs[N]{nitrogen}{The italic N for nitrogen.} + \iupaccs[Sf]{sulfur}{The italic S for sulfur.} + \iupaccs[P]{phosphorus}{The italic P for phosphorus.} +\end{commands} +\begin{example}[side-by-side] + \iupac{\nitrogen-methyl|benz|amide} + + \iupac{3\hydrogen-pyrrole} + + \iupac{\oxygen-ethyl hexanethioate} +\end{example} + +\paragraph{Cahn-Ingold-Prelog}\label{par:cip} +\begin{commands} + \command{cip}[\marg{conf}] + Typeset Cahn-Ingol-Prelog descriptors, \eg: \cs{cip}\Marg{R,S} + \cip{R,S}. \meta{conf} may be a csv list of entries. + \iupaccs[R]{rectus}{The rectus descriptor.} + \iupaccs[S]{sinister}{The sinister descriptor.} +\end{commands} + +Both these commands and the entgegen/zusammen descriptors get a small +additional amount of kerning after the closing parenthesis. This amount can +be changed through the following option: +\begin{options} + \keyval{cip-kern}{dim}\Module{nomenclature}\Default{.075em} + Set the amount of kerning after the closing parenthesis. +\end{options} +The entries typeset by and implemented with \cs{cip} can be customized +further: +\begin{options} + \keyval{cip-outer-format}{format}\Default{\cs*{upshape}} + \sinceversion{5.8}The format of parentheses and commas typeset by + \cs{cip}. + \keyval{cip-inner-format}{format}\Default{\cs*{itshape}} + \sinceversion{5.8}The format of the entries in \cs{cip}. This format + works additive to the outer format. + \keyval{cip-number-format}{format}\Default{\cs*{itshape}} + \sinceversion{5.8}The format of numbers in \cs{cip}. This format works + additive to the outer format and is applied to arabic figures only. +\end{options} + +\paragraph{Fischer} +\begin{commands} + \iupaccs[D]{dexter}{The dexter descriptor.} + \iupaccs[L]{laevus}{The laevus descriptor.} +\end{commands} + +\paragraph{cis/trans, zusammen/entgegen, syn/anti \& tert} +\begin{itemize} + \item \cs{cis} \iupac{\cis} \quad \cs{trans} \iupac{\trans} + \item \cs{fac} \iupac{\fac} \quad \cs{mer} \iupac{\mer} + \item \cs{sin} \iupac{\sin} \quad \cs{ter} \iupac{\ter} + \item \cs{zusammen} \iupac{\zusammen} \quad \cs{entgegen} \iupac{\entgegen} + \item \cs{syn} \iupac{\syn} \quad \cs{anti} \iupac{\anti} + \item \cs{tert} \iupac{\tert} +\end{itemize} +An alias for \cs{entgegen} is \cs{E} and an alias for \cs{zusammen} is +\cs{Z}. + +\paragraph{ortho/meta/para} +\begin{center} + \cs{ortho} \iupac{\ortho} \quad + \cs{meta} \iupac{\meta} \quad + \cs{para} \iupac{\para} +\end{center} + +Although these commands are provided I like to cite +\citetitle{iupac:bluebook}~\cite{iupac:bluebook}: + +\begin{cnltxquote}[{\cite[][p.\,90]{iupac:bluebook}}] + The letters \iupac{\ortho}, \iupac{\meta}, and \iupac{\para} have been used + in place of \textit{ortho}, \textit{meta}, and \textit{para}, respectively, + to designate the 1,2-, 1,3-, and 1,4- isomers of disubstituted benzene. + This usage is strongly discouraged and is not used in preferred \acs{iupac} + names. +\end{cnltxquote} + +\paragraph{Absolute Configuration} +\begin{commands} + \command{Rconf}[\oarg{letter}] + \cs{Rconf}: \Rconf \quad \cs{Rconf}\oarg{}: \Rconf[] + \command{Sconf}[\oarg{letter}] + \cs{Sconf}: \Sconf \quad \cs{Sconf}\oarg{}: \Sconf[] +\end{commands} + +\paragraph{Coordination Chemistry} + +\chemmacros\ provides a few commands useful in coordination chemistry: +\begin{commands} + \command{bridge}[\marg{num}\quad\bridge{3}] + Denote bridging ligand connection. + \command{hapto}[\marg{num}\quad\hapto{5}] + Denote hapticity. + \command{dento}[\marg{num}\quad\dento{2}] + Denote denticity. +\end{commands} +\begin{example} + Ferrocene = \iupac{bis(\hapto{5}cyclo|penta|dienyl)iron} \par + \iupac{tetra-\bridge{3}iodido-tetrakis[tri|methyl|platinum(IV)]} +\end{example} + +Two options allow customization: +\begin{options} + \keychoice{bridge-number}{sub,super}\Module{nomenclature}\Default{sub} + Appends the number as a subscript or superscript, depending on the choice. + The \ac{iupac} recommendation is the subscript~\cite{iupac:redbook}. + \keybool{coord-use-hyphen}\Module{nomenclature}\Default{true} + Append a hyphen to \cs{hapto}, \cs{dento} and \cs{bridge} or don't. +\end{options} + +The default behaviour\sinceversion{5.8} of \cs{hapto} and \cs{dento} has +changed with version~5.8 to follow \ac{iupac} recommendations. + +\paragraph{Examples} +\begin{example} + \iupac{\dexter-Wein|s\"aure} = + \iupac{\cip{2S,3S}-Wein|s\"aure} \par + \iupac{\dexter-($-$)-Threose} = + \iupac{\cip{2S,3R}-($-$)-2,3,4-Tri|hydroxy|butanal} \par + \iupac{\cis-2-Butene} = + \iupac{\zusammen-2-Butene}, \par + \iupac{\cip{2E,4Z}-Hexa|diene} \par + \iupac{\meta-Xylol} = + \iupac{1,3-Di|methyl|benzene} +\end{example} + +\subsubsection{Own \cs*{iupac} Macros And Shorthands} + +If you find any commands missing you can define them using +\begin{commands} + \command{NewChemIUPAC}[\marg{cs}\marg{declaration}] + Define a new \ac{iupac} command that is in any case defined inside of + \cs{iupac} regardless if \meta{cs} is defined elsewhere already. + \command{ProvideChemIUPAC}[\marg{cs}\marg{declaration}] + Define a new \ac{iupac} command that is in any case defined inside of + \cs{iupac} regardless if \meta{cs} is defined elsewhere already only if + the corresponding \ac{iupac} macro is not defined, yet. + \command{RenewChemIUPAC}[\marg{cs}\marg{declaration}] + Redefine an existing \ac{iupac} command that is in any case defined inside + of \cs{iupac} regardless if \meta{cs} is defined elsewhere already. + \command{DeclareChemIUPAC}[\marg{cs}\marg{declaration}] + Define a new \ac{iupac} command that is in any case defined inside of + \cs{iupac} regardless if \meta{cs} is defined elsewhere already. This + silently overwrites an existing \ac{iupac} macro definition. + \command{LetChemIUPAC}[\marg{cs1}\marg{cs2}] + Defines \meta{cs1} to be an alias of \meta{cs2}. +\end{commands} +A command defined in this way will obey the setting of the option +\option{iupac}. This means any existing command is only overwritten with +\keyis{iupac}{strict}. However, \cs{NewChemIUPAC} will \emph{not} change the +definition of an existing \ac{iupac} naming command but issue an error if the +\ac{iupac} naming command already exists. \cs{DeclareChemIUPAC} \emph{will} +overwrite an existing \ac{iupac} command. +\begin{example} + \NewChemIUPAC\endo{\textsc{endo}} + \RenewChemIUPAC\anti{\textsc{anti}} + \iupac{(2-\endo,7-\anti)-2-bromo-7-fluoro|bicyclo[2.2.1]heptane} +\end{example} + +\cs{RenewChemIUPAC} allows you to redefine the existing \ac{iupac} naming +commands. +\begin{example}[side-by-side] + \iupac{\meta-Xylol} \par + \RenewChemIUPAC\meta{\textup{m}} + \iupac{\meta-Xylol} +\end{example} + +There's also a way for defining new \ac{iupac} shorthands or changing the +existing ones: +\begin{commands} + \command{NewChemIUPACShorthand}[\meta{shorthand token}\meta{control sequence}] + Defines a new \ac{iupac} shorthand. Inside \cs{iupac} it will be equal to + using \meta{control sequence}. This throws an error if \meta{shorthand + token} is already defined. + \command{RenewChemIUPACShorthand}[\meta{shorthand token}\meta{control sequence}] + Redefines an existing \ac{iupac} shorthand. This throws an error if + \meta{shorthand token} is not defined, yet. + \command{DeclareChemIUPACShorthand}[\meta{shorthand token}\meta{control sequence}] + Defines a new \ac{iupac} shorthand or redefines an existing one. + \command{ProvideChemIUPACShorthand}[\meta{shorthand token}\meta{control sequence}] + Provides a new \ac{iupac} shorthand. Does nothing if \meta{shorthand + token} is already defined. + \command{RemoveChemIUPACShorthand}[\meta{shorthand token}] + Deletes an existing \ac{iupac} shorthand. +\end{commands} + +\subsubsection{Latin Phrases} + +\chemmacros\ provides a command for typesetting latin phrases: +\begin{commands} + \command{latin}[\oarg{options}\marg{phrase}] + Typesets \meta{phrase} according to the option \option{format} described + below. + \command{insitu}[\quad\insitu] + \command{invacuo}[\quad\invacuo] + \command{abinitio}[\quad\abinitio] +\end{commands} + +If you additionally load \pkg{chemstyle}~\cite{pkg:chemstyle} said package +will \emph{not} define its own \cs{latin}. + +% The package \pkg{chemstyle}~\cite{pkg:chemstyle} provides the command +% \cs{latin} to typeset common latin phrases in a consistent way. \chemmacros\ +% defines a similar \cs{latin} only if \pkg{chemstyle} has \emph{not} been +% loaded and additionally provides these commands: +% \begin{center} +% \cs{insitu} \insitu \quad +% \cs{abinitio} \abinitio \quad +% \cs{invacuo} \invacuo +% \end{center} + +% \emph{If the package \pkg{chemstyle} has been loaded they are defined using +% \pkg{chemstyle}'s \cs{latin} command. This means that then the appearance +% depends on \pkg{chemstyle}'s option \code{abbremph}.} + +The last three commands mentioned above are defined through +\begin{commands} + \command{NewChemLatin}[\marg{cs}\marg{phrase}] + Define a new latin phrase. Gives an error if \meta{cs} already exists. + \command{DeclareChemLatin}[\marg{cs}\marg{phrase}] + Define a new latin phrase. Silently redefined existing macros. + \command{RenewChemLatin}[\marg{cs}\marg{phrase}] + Redefine an existing latin phrase. Gives an error if \meta{cs} doesn't + exist. + \command{ProvideChemLatin}[\marg{cs}\marg{phrase}] + Define a new latin phrase only if \meta{cs} doesn't exist. +\end{commands} +\begin{example}[side-by-side] + \NewChemLatin\ltn{latin text}\ltn +\end{example} +You can change the appearance with this option: +\begin{options} + \keyval{format}{definition}\Module{nomenclature}\Default{\cs*{emph}} + \changedversion{5.7}Sets the format for the latin phrases. +\end{options} + +\subsection{The \chemmodule*{particles} Module}\label{sec:particles-module} + +The \chemmodule{particles} module loads the modules \chemmodule{charges} and +\chemmodule{chemformula}. + +\subsubsection{Provided Particle Macros} +The \chemmodule{particles} defines a number of macros which can be used for +typesetting common particles in the running text. Most of them don't make +much sense in \pkg{chemformula}~\cite{pkg:chemformula}'s \cs{ch}, though, +which doesn't mean that they can't be used there, of course: +\begin{center} + \cs{el} \el\ \cs{prt} \prt\ \cs{ntr} \ntr\ \cs{Hyd} \Hyd\ \cs{Oxo} \Oxo\ + \cs{water} \water\ \cs{El} \El\ \cs{Nuc} \Nuc\ \cs{ba} \ba +\end{center} +All of these macros are defined using \pkg{chemformula}'s \cs{chcpd}. The +details are explained in section~\vref{sec:defin-own-part}. + +The macros \cs{Nuc} and \cs{ba} are special: they have an optional argument +for the following options: +\begin{options} + \keychoice{elpair}{dots,dash,false}\Module{particles}\Default{false} + Determine how the electron pair of the nucleophiles is displayed. The + electron pair is drawn using \chemformula's \cs{chlewis} macro. + \keyval{space}{dim}\Module{particles}\Default{.1em} + Sets\sinceversion{5.3} the space that is inserted between the electron + pair and the negative charge sign. +\end{options} +Both options can of course also be set with \cs{chemsetup}. + +\begin{example}[side-by-side] + \ba[elpair=dots] \Nuc[elpair=dash] + + \chemsetup[particles]{elpair=false} + \ba\ \Nuc +\end{example} + +\subsubsection{Defining Own Particle Macros}\label{sec:defin-own-part} + +There are two sets of macros, one for defining particles and one for defining +nucleophiles. +\begin{commands} + \command{NewChemParticle}[\marg{cs}\marg{formula}] + Defines a new macro \meta{cs}. \meta{formula} is any valid \chemformula\ + input (this depends on the setting of the \option{formula} option, + see~\vref{sec:chemformula-module}). Raises an error if \meta{cs} already + exists. + \command{RenewChemParticle}[\marg{cs}\marg{formula}] + Redefines a new macro \meta{cs}. \meta{formula} is any valid \chemformula\ + input (this depends on the setting of the \option{formula} option, + see~\vref{sec:chemformula-module}). Raises an error if \meta{cs} doesn't + exist. + \command{DeclareChemParticle}[\marg{cs}\marg{formula}] + Defines a macro \meta{cs}. \meta{formula} is any valid \chemformula\ + input (this depends on the setting of the \option{formula} option, + see~\vref{sec:chemformula-module}). Silently overwrites \meta{cs} if it + exists. + \command{ProvideChemParticle}[\marg{cs}\marg{formula}] + Defines a new macro \meta{cs}. \meta{formula} is any valid \chemformula\ + input (this depends on the setting of the \option{formula} option, + see~\vref{sec:chemformula-module}). Does nothing if \meta{cs} already + exists. +\end{commands} +An example of usage is the definition of the existing particle macros: +\begin{sourcecode} + \NewChemParticle\el {e-} + \NewChemParticle\prt{p+} + \NewChemParticle\ntr{n^0} +\end{sourcecode} + +The following set defines macros like \cs{Nuc} +\begin{commands} + \command{NewChemNucleophile}[\marg{cs}\marg{formula}] + Defines a new macro \meta{cs}. \meta{formula} is any valid \chemformula\ + input (this depends on the setting of the \option{formula} option, + see~\vref{sec:chemformula-module}). Note that \meta{formula} will get a + trailing negative charge! Raises an error if \meta{cs} already exists. + \command{RenewChemNucleophile}[\marg{cs}\marg{formula}] + Redefines a new macro \meta{cs}. \meta{formula} is any valid \chemformula\ + (this depends on the setting of the \option{formula} option, + see~\vref{sec:chemformula-module}). Note that \meta{formula} will get a + trailing negative charge! Raises an error if \meta{cs} doesn't exist. + \command{DeclareChemNucleophile}[\marg{cs}\marg{formula}] + Defines a macro \meta{cs}. \meta{formula} is any valid \chemformula\ + (this depends on the setting of the \option{formula} option, + see~\vref{sec:chemformula-module}). Note that \meta{formula} will get a + trailing negative charge! Silently overwrites \meta{cs} if it exists. + \command{ProvideChemNucleophile}[\marg{cs}\marg{formula}] + Defines a new macro \meta{cs}. \meta{formula} is any valid \chemformula\ + (this depends on the setting of the \option{formula} option, + see~\vref{sec:chemformula-module}). Note that \meta{formula} will get a + trailing negative charge! Does nothing if \meta{cs} already exists. +\end{commands} +An example of usage is the definition of the existing nucleophile macros: +\begin{sourcecode} + \NewChemNucleophile\Nuc{Nu} + \NewChemNucleophile\ba {ba} +\end{sourcecode} +A macro defined this way will have an optional argument for the +\option{elpair} option. + +\subsection{The \chemmodule*{phases} Module}\label{sec:phases-module} + +The \chemmodule{phases} module loads the \chemmodule{chemformula} modul. + +\subsubsection{Basics} + +These commands are intended to indicate the phase of a compound. +\begin{center} + \cs{sld} \sld \quad \cs{lqd} \lqd \quad \cs{gas} \gas \quad \cs{aq} \aq +\end{center} +\begin{example} + \ch{C\sld{} + 2 H2O\lqd{} -> CO2\gas{} + 2 H2\gas}\par + To make it complete: NaCl\aq. +\end{example} + +The \ac{iupac} recommendation to indicate the state of aggregation is to put +it in parentheses after the compound \cite{iupac:greenbook}. However, you +might want to put it as a subscript which is also very common. + +\begin{cnltxquote}[{\citetitle{iupac:greenbook}~\cite[][p.\,54]{iupac:greenbook}}] + The \textelp{} symbols are used to represent the states of aggregation of + chemical species. The letters are appended to the formula in parentheses + and should be printed in Roman (upright) type without a full stop (period). +\end{cnltxquote} + +There are two options to customize the output: +\begin{options} + \keychoice{pos}{side,sub}\Module{phases}\Default{side} + Switch the position of the phase indicator. + \keyval{space}{dim}\Module{phases}\Default{.1333em} + Change the default spacing between compound a phase indicator if + \keyis{pos}{side}. A \TeX\ dimension. +\end{options} +\begin{example} + \chemsetup[phases]{pos=sub} + \ch{C\sld{} + 2 H2O\lqd{} -> CO2\gas{} + 2 H2\gas}\par + To make it complete: NaCl\aq. +\end{example} + +All those phase commands have an optional argument: +\begin{example}[side-by-side] + \ch{H2O "\lqd[\SI{5}{\celsius}]"} +\end{example} + +There is also a generic phase command: +\begin{commands} + \command{phase}[\marg{phase}] + If you need a phase indicator just once or twice. You can use it to + denote a phase for which there is no phase command, yet. +\end{commands} + +\subsubsection{Define Own Phases} +Depending on the subject of your document you might need to indicate other +states of aggregation. You can easily define them. +\begin{commands} + \command{NewChemPhase}[\marg{cs}\marg{symbol}] + Define a new phase command. See section~\vref{sec:lang-depend} for a way + to define language dependent settings. Gives an error if \meta{cs} + already exists. + \command{DeclareChemPhase}[\marg{cs}\marg{symbol}] + Define a new phase command. See section~\vref{sec:lang-depend} for a way to + define language dependent settings. Overwrites previous definitions of + \meta{cs}. + \command{RenewChemPhase}[\marg{cs}\marg{symbol}] + Redefine an existing phase command. See section~\vref{sec:lang-depend} for + a way to define language dependent settings. Gives an error if \meta{cs} + is not defined. + \command{ProvideChemPhase}[\marg{cs}\marg{symbol}] + Define a new phase command. See section~\vref{sec:lang-depend} for a way + to define language dependent settings. Does nothing if \meta{cs} is + already defined. +\end{commands} + +\begin{example} + % preamble: + \NewChemPhase\aqi{aq,$\infty$} % aqueous solution at infinite dilution + \NewChemPhase\cd {cd} % condensed phase + \NewChemPhase\lc {lc} % liquid crystal + \ch{NaOH\aqi} \ch{H2O\cd} \ch{U\phase{cr}} \ch{A\lc}\par + \chemsetup[phases]{pos=sub} + \ch{NaOH\aqi} \ch{H2O\cd} \ch{U\phase{cr}} \ch{A\lc} +\end{example} + +\subsubsection{Language Dependencies}\label{sec:lang-depend} +For each phase command a translation into the custom language can be defined. +If a phase is declared with \cs{NewChemPhase} no translation exists and +for every \pkg{babel} language the literal string is used that was provided +as a definition. Let's say you define the phase +\begin{sourcecode} + \NewChemPhase\liquid{l} +\end{sourcecode} +and want to add the German translation ``f\/l''. Then you could do +\begin{sourcecode} + \DeclareTranslation{German}{phase-liquid}{f\/l} +\end{sourcecode} +This way, when you use it in a German document using the appropriate +\pkg{babel} option using \cs*{liquid} would correctly translate. For this the +package \pkg{translations}~\cite{pkg:translations} is used. The \acs{id} +always is \code{phase-\meta{csname}} where \meta{csname} is the name of the +phase command you defined without leading backslash. + +See section~\vref{sec:lang-module} for predefined translations and general +language options of \chemmacros. + +\subsection{The \chemmodule*{symbols} Module}\label{sec:symbols-module} + +The \chemmodule{symbols} module defines a few symbols chemists need now and +then. It loads the package \pkg{amstext}~\cite{pkg:amstext}. +\begin{commands} + \command{transitionstatesymbol} + This is self-explaining: \transitionstatesymbol + \command{standardstate} + Again self-explaining: \standardstate + \command{changestate} + The uppercase delta used in \state[superscript=]{H} for example. +\end{commands} + +\section{Internal Modules} +\subsection{The \chemmodule*{base} Module}\label{sec:base-module} + +The \chemmodule{base} module is the core module of \chemmacros. It defines +some tools which can (and should) be used in other modules. This means this +section is only interesting for you if you plan to write a module yourself +(see section~\vref{sec:own-modules} for details). + +This module requires the packages \pkg{bm}~\cite{pkg:bm}, +\pkg{amstext}~\cite{pkg:amstext}, and \pkg{etoolbox}~\cite{pkg:etoolbox}. + +This module also provides \cs{chemsetup} and the option \option{modules}. + +It also provides a number of (expl3) macros which may be used in other +modules. In the macro descriptions below \TF\ denotes that a \code{T}, an +\code{F} and a \code{TF} variant exist. In case of an expandable conditional +(\expandablesymbol) also the predicate variant is available. +\begin{commands} + \expandable\explcommand{chemmacros_if_loaded:nn}[\TF\ + \Marg{package|class} \marg{name} \marg{true} \marg{false}] + Checks if package (or class) \meta{name} has been loaded. Also works after + begin document. + \expandable\explcommand{chemmacros_if_package_loaded:n}[\TF\ \marg{name} + \marg{true} \marg{false}] + Checks if package \meta{name} has been loaded. Also works after begin + document. + \expandable\explcommand{chemmacros_if_class_loaded:n}[\TF\ \marg{name} + \marg{true} \marg{false}] + Checks if class \meta{name} has been loaded. Also works after begin + document. + \explcommand{chemmacros_leave_vmode:} + Equivalent of \cs*{leavevmode}. + \explcommand{chemmacros_nobreak:} + Inserts a penalty of \num{10000}. + \explcommand{chemmacros_allow_break:} + Inserts a penalty of \num{0}. + \explcommand{chemmacros_skip_nobreak:N}[ \meta{skip/length variable}] + Insert a horizontal skip where a linebreak is disallowed. + \expandable\explcommand{chemmacros_if_is_int:n}[\TF\ \marg{input} \marg{true} + \marg{false}] + Checks if \meta{input} is an integer or something else. + \explcommand{chemmacros_if_bold:}[\TF\ \marg{true} \marg{false}] + Checks if the current font weight is one of \chemboldchecks{or}. + \explcommand{chemmacros_bold:n}[ \marg{text}] + Checks if the current font weight is bold and if yes places \meta{text} in + \cs*{textbf} if in text mode or in \cs*{bm} if in math mode. If no + \meta{text} simply is placed in the input stream as is. + \explcommand{chemmacros_text:n}[ \marg{text}] + Ensures that \meta{text} is placed in text mode. + \explcommand{chemmacros_math:n}[ \marg{text}] + Ensures that \meta{text} is placed in math mode. + \explcommand{chemmacros_new_macroset:nnn}[ \marg{name} \marg{arg spec} + \marg{internal command call}] + \changedversion{5.3b}A command to define a set of macros + \cs*{NewChem\meta{name}}, \cs*{RenewChem\meta{name}}, + \cs*{DeclareChem\meta{name}} and \cs*{ProvideChem\meta{name}} where the + first letter of \meta{name} is converted to uppercase, other letters are + kept unchanged. \meta{arg spec} is any valid argument specification for + \pkg{xparse}'s \\ + \cs{DeclareDocumentCommand}~\cite{bnd:l3packages}. \meta{internal command + call} should be a macro which makes definitions \emph{without} error + checks, \ie, define new macros or redefine existing ones like \cs*{def} + does. This macro just should get the arguments passed on to. Have a look + at the example below. + \explcommand{chemmacros_new_environment_macroset:nnn}[ \marg{name} \marg{arg spec} + \marg{internal command call}] + Like \explcs{chemmacros_new_macroset:nnn} but for environments. + \command{NewChemMacroset}[\sarg\marg{name}\marg{arg spec}\marg{internal + command call}] + A non-expl3 version of \explcs{chemmacros_new_macroset:nnn} for \LaTeXe\ + programmers. The starred version calls + \explcs{chemmacros_new_environment_macroset:nnn}. + \explcommand{chemmacros_add_cleveref_support:nnnnn}[ \marg{counter} + \marg{singular} \marg{plural} \marg{uppercase singular} \marg{uppercase + plural}] + A\sinceversion{5.6} command to add suiting names for a counter for the + \pkg{cleveref} package's \cs*{cref} commands. This command acts at the + end of the preamble and only if a user hasn't provided definitions with + \cs*{crefname} already. + \command{ChemCleverefSupport}[\marg{counter}\marg{singular}\oarg{uppercase + singular}\marg{plural}\oarg{uppercase plural}] + \sinceversion{5.6}\LaTeXe-version of + \explcs{chemmacros_add_cleveref_support:nnnnn}. + \explcommand{chemmacros_add_fancyref_support:nnn}[ \marg{prefix} \marg{name} + \marg{uppercase name}] + A\sinceversion{5.6} command to add suiting names for a counter for the + \pkg{fancyref} package's \cs*{fref} commands. This command acts at the + end of the preamble and doesn't override definitions made by the users. + \command{ChemFancyrefSupport}[\marg{prefix}\marg{name}\oarg{uppercase name}] + \sinceversion{5.6}\LaTeXe-version of + \explcs{chemmacros_add_fancyref_support:nnnnn}. +\end{commands} +This is how the macros \cs{NewChemParticle}, \cs{RenewChemParticle}, +\cs{DeclareChemParticle} and \cs{ProvideChemParticle} were defined: +\begin{sourcecode} + \NewChemMacroset {Particle} {mm} + { \chemmacros_define_particle:Nn #1 {#2} } +\end{sourcecode} + +The following macros strictly speaking are not provided by the +\chemmodule{base} module but this place fits best for their description. +\begin{commands} + \expandable\explcommand{chemmacros_if_module_exist:n}[\TF\ \marg{module} + \marg{true} \marg{false}] + Checks if a file with the correct name for a module \meta{module} can be + found. + \expandable\explcommand{chemmacros_if_module_loaded:n}[\TF\ \marg{module} + \marg{true} \marg{false}] + Checks if the module \meta{module} has already been loaded or not. + \explcommand{chemmacros_load_module:n}[ \marg{module}] + Loads module \meta{module} if it hasn't been loaded, yet. + \explcommand{chemmacros_load_modules:n}[ \marg{csv list of modules}] + Loads every module in \meta{csv list of modules} if they haven't been + loaded, yet. This is the code level variant of \cs{usechemmodule}. + \explcommand{chemmacros_before_module:nn}[ \marg{module} \marg{code}] + Saves\sinceversion{5.1} \meta{code} and inserts it right before + \meta{module} is loaded. If \meta{module} is never loaded then + \meta{code} is never inserted. If \meta{module} already is loaded when + the command is used then \meta{code} also is never inserted. + \explcommand{chemmacros_after_module:nn}[ \marg{module} \marg{code}] + Saves\sinceversion{5.1} \meta{code} and inserts it right after + \meta{module} is loaded. If \meta{module} is never loaded then + \meta{code} is never inserted. If \meta{module} already is loaded when + the command is used then \meta{code} is inserted immediately. +\end{commands} + +\subsection{The \chemmodule*{chemformula} Module}\label{sec:chemformula-module} + +The \chemmodule{chemformula} module loads the \pkg{amstext} +package~\cite{pkg:amstext} and the \chemmodule{charges} module. + +\subsubsection{For Users} +There are different packages which provide means for typesetting chemical +formulas: +\begin{itemize} + \item \pkg{chemformula}~\cite{pkg:chemformula}. This is probably well known + to users of \chemmacros. + \item \pkg{mhchem}~\cite{pkg:mhchem}. This is the \enquote{older brother} of + \chemformula. + \item \pkg{chemfig}~\cite{pkg:chemfig}. The easiest and most complete of the + packages for drawing skeletal formulas. + \item \XyMTeX~\cite{pkg:xymtex}. A very comprehensive alternative for + typesetting chemistry. +\end{itemize} +In order to help authors getting a consistent layout \chemmacros\ does not +make a choice which package to use for typesetting formulas. Although +\chemformula\ is well tested and preferred users can choose other packages if +they like. + +this is done with the following general option: +\begin{options} + \keyval{formula}{method}\Default{chemformula} + This\sinceversion{5.1} option let's you choose how chemical formulas are + typeset. Available methods are + \begin{itemize} + \item \pkg{chemformula} + \item \pkg{mhchem} + \item \pkg{chemist}\sinceversion{5.6} (from the \XyMTeX\ bundle) + \item \pkg{chemfig}\sinceversion{5.6} + \end{itemize} + The corresponding package with the same name is loaded. +\end{options} +If you explicitly set this option the corresponding package is loaded +immediately and the method is set up. Otherwise the option will be set by +\chemmacros\ at the end of the preamble. + +If\sinceversion{5.2} you load a method package in a way that a unique choice +is possible then \chemmacros\ will set the method accordingly if you haven't +set the option by yourself. If \emph{no} unique choice is possible +\chemmacros\ will raise a warning and choose \pkg{chemformula} regardless if +the package is loaded or not. In this case if you want to use another method +you'll have to choose manually. \emph{All automatic choices only happen at the + end of the preamble}. + +\paragraph{Using the \pkg*{chemformula} Package} +If you set \keyis{formula}{chemformula} the \chemmodule{chemformula} module +makes it possible that you can set all \chemformula\ options via the +\cs{chemsetup} command using the module \module{chemformula}, for example: +\begin{sourcecode} + \chemsetup[chemformula]{format=\sffamily} +\end{sourcecode} + +Everywhere where \chemmacros\ typesets chemical formulas \chemformula's macros +\cs{chcpd} or \cs{ch} are used, for example in the reaction environments +provided by the \chemmodule{reactions} module. + +\emph{This method is the recommended choice!} + +\paragraph{Using the \pkg*{mhchem} Package}\sinceversion{5.1}\label{sec:using-mhchem} +If you set \keyis{formula}{mhchem} the \chemmodule{chemformula} module makes +it possible that you can set all of \pkg{mhchem}'s options via the +\cs{chemsetup} command using the module \module{mhchem}, for example: +\begin{sourcecode} + \chemsetup[mhchem]{format=\sffamily} +\end{sourcecode} + +Everywhere where \chemmacros\ typesets chemical formulas \pkg{mhchem}'s macro +\cs{ce} is used, for example in the reaction environments provided by the +\chemmodule{reactions} module. + +There are some \latin{caveat}s if you use this method: +\begin{itemize} + \item This method has not been extensively tested, yet. There may be errors + and wrong output at unexpected places. + \item Using this method effectively disables the different values of the + \module{particles} option \option{elpair} (see + section~\ref{sec:particles-module}). + \item The different kinds of formal charges provided by the + \chemmodule{charges} module (see section~\ref{sec:ion-charges}) are + disabled. Formal charges always use the math method now. + \item There may also be other incompatibilities (\eg, \pkg{mhchem} has it's + own method of setting upright Greek letters so it may or may not disable + \chemmacros' mechanism). +\end{itemize} + +\paragraph{Using the \pkg*{chemfig} Package}\sinceversion{5.6}\label{sec:using-chemfig} +Everywhere where \chemmacros\ typesets chemical formulas \pkg{chemfig}'s macro +\cs{printatom} is used, for example in the reaction environments provided by +the \chemmodule{reactions} module. + +There are some \latin{caveat}s if you use this method: +\begin{itemize} + \item This method has not been extensively tested, yet. There may be errors + and wrong output at unexpected places. + \item Using this method effectively disables the different values of the + \module{particles} option \option{elpair} (see + section~\ref{sec:particles-module}). + \item The different kinds of formal charges provided by the + \chemmodule{charges} module (see section~\ref{sec:ion-charges}) are + disabled. Formal charges always use the math method now. + \item The reaction environments by the \chemmodule{reactions} module may + work only to a limited respect. If you plan to use them consider using + methods \pkg{chemformula} or \pkg{mhchem} instead. +\end{itemize} + +\paragraph{Using the \pkg*{chemist} Package}\sinceversion{5.6}\label{sec:using-chemist} +Everywhere where \chemmacros\ typesets chemical formulas \pkg{chemist}'s macro +\cs{ChemForm} is used, for example in the reaction environments provided by +the \chemmodule{reactions} module. + +There are some \latin{caveat}s if you use this method: +\begin{itemize} + \item This method has not been extensively tested, yet. There may be errors + and wrong output at unexpected places. + \item Using this method effectively disables the different values of the + \module{particles} option \option{elpair} (see + section~\ref{sec:particles-module}). + \item The different kinds of formal charges provided by the + \chemmodule{charges} module (see section~\ref{sec:ion-charges}) are + disabled. Formal charges always use the math method now. + \item The reaction environments by the \chemmodule{reactions} module may + work only to a limited respect. If you plan to use them consider using + methods \pkg{chemformula} or \pkg{mhchem} instead\footnote{On the other + hand \XyMTeX\ (and especially the \pkg{chemist} package) provides quite + a number of chemical reaction environments itself.}. +\end{itemize} + +\subsubsection{For Module Writers} + +There are two macros for module writers: +\begin{commands} + \explcommand{chemmacros_chemformula:n}[ \marg{formula}] + This is only a wrapper for \cs{chcpd} or \cs{ce}. It is recommended that + module writers use this macro (or a variant thereof) inside of + \chemmacros' macros whenever they want to display a chemical formula. + Writers who prefer traditional \LaTeXe\ programming over expl3 should use + \cs*{chemmacros@formula}. + \explcommand{chemmacros_reaction:n}[ \marg{reaction}] + This is only a wrapper for \cs{ch} or \cs{ce}. It is recommended that + module writers use this macro (or a variant thereof) inside of + \chemmacros' macros whenever they want to display a chemical reaction. + Writers who prefer traditional \LaTeXe\ programming over expl3 should use + \cs*{chemmacros@reaction}. +\end{commands} + +\subsection{The \chemmodule*{errorcheck} Module}\label{sec:errorcheck-module} +The\sinceversion{5.2} \chemmodule{errorcheck} module provides some rudimentary +support for giving users more meaningful messages when they use a command or +environment provided by a module that they haven't loaded. + +\subsection{The \chemmodule*{greek} Module}\label{sec:greek-module} + +The \chemmodule{greek} module loads the \pkg{chemgreek} +package~\cite{pkg:chemgreek}. + +This module provides one option: +\begin{options} + \keyval{greek}{mapping} + A valid value is any valid \chemgreek\ \meta{mapping}. \chemmacros\ will + warn you if no mapping has been chosen or if you are using the + \code{default} or the \code{var-default} mapping because this means that + no upright Greek letters are available. +\end{options} +If you load a \chemgreek\ support package which allows an unambiguous choice +of a mapping \chemgreek\ will make this choice automatically. This means if +you say +\begin{sourcecode} + \usepackage{upgreek} + \usepackage{chemmacros} +\end{sourcecode} +then \chemmacros\ will use \pkg{upgreek}'s upright Greek letters. If you +have +\begin{sourcecode} + \usepackage{upgreek} + \usepackage{chemmacros} + \usepackage{textgreek} +\end{sourcecode} +then no unambiguous choice is possible and you should choose a mapping +yourself, for example: +\begin{sourcecode} + \usepackage{upgreek} + \usepackage{chemmacros} + \usepackage{textgreek} + \chemsetup{greek=textgreek} +\end{sourcecode} +For further details on mappings please refer to \chemgreek's manual. + +\subsection{The \chemmodule*{lang} Module}\label{sec:lang-module} + +The \chemmodule{lang} module provides language support for \chemmacros. It +loads the package \pkg{translations}~\cite{pkg:translations}. + +\subsubsection{Information For Users}\label{sec:information-users} + +This module defines the following option: +\begin{options} + \keychoice{language}{auto,\meta{language}}\Default{auto} + If set to \code{auto} \chemmacros\ will detect the language used by + \pkg{babel}~\cite{pkg:babel} or \pkg{polyglossia}~\cite{pkg:polyglossia} + automatically, the fallback translation is English and will be used if no + translation for the actual language is available. Any language known to + the \pkg{translations} package is a valid value for \meta{language}. +\end{options} + +The language chosen via \option{language} is used for translation of certain +strings in different places all over \chemmacros. They are mentioned in the +places when the corresponding function of \chemmacros\ is explained. + +Translation is done with the help of the \pkg{translations} package, available +translation keys are listed in section~\vref{sec:avail-transl-keys}. + +\subsubsection{Available Translation Keys}\label{sec:avail-transl-keys} + +Table~\vref{tab:translation-keys} lists all predefined translations of the +available keys. \emph{Some of the translations have changed in + version~5.6\changedversion{5.6}.} The \chemmodule{lang} module doesn't +provide the translations themselves -- they are provided by the corresponding +modules. A translation key is a unique string\footnote{That is, a string + using the definition for strings used for expl3, i.e., converted to a series + of category code~12 characters..} of characters. Each key is used to +identify a replacement text which depends on the current language or the +language set through the \option{language} option. For each key at least the +English fallback translation is provided, for most also the German translation +is provided. For a few keys also other translations are provided. If you +find that a translation for your language is missing you can provide it in the +preamble: +\begin{commands} + % \command{DeclareTranslation}[\marg{language}\marg{key}\marg{translation}] + % Defines a translation of key \meta{key} for the language \meta{language}. + % No error will be raised if a translation of \meta{key} already exists. + % This command can only be used in the preamble and is defined by the + % \pkg{translations} package. + \command{DeclareChemTranslation}[\marg{language}\marg{key}\marg{translation}] + \sinceversion{5.6}A command which makes an abstraction from the + \pkg{translations} package. It should be used in documents for adding + missing translations that are needed. This command can only be used in + the preamble. + \command{DeclareChemTranslations}[\marg{key}\Marg{\meta{language} = + \meta{translation}}] + \sinceversion{5.6}A command rather meant for module writers but can be + used by document authors as well, of course. It gets a csv list of + key\slash value pairs of translations. This command can only be used in + the preamble. +\end{commands} +If you send me an email (see section~\vref{sec:sugg-bug-reports}) with the +translations for your language I'll gladly add them to the next release of +\chemmacros! + +\emph{Please do not use \pkg{translations}' \cs{DeclareTranslation} for + declaring translations.} + +\ForAllChemTranslationsDo{ + \appto\chemtranslationtable{\texttt{#1} & #2 & \texttt{\detokenize{#3}} \\} +} + +\begin{longtable}{lll} + \caption{Translation keys predefined by \chemmacros\ (except + \code{phase-aqi}, \code{phase-cd} and \code{phase-lc} which were defined + in this document).} + \label{tab:translation-keys} \\ + \toprule + \bfseries key & \bfseries language & \bfseries translation \\ + \midrule + \endfirsthead + \toprule + \bfseries key & \bfseries language & \bfseries translation \\ + \midrule + \endhead + \bottomrule + \endlastfoot + \midrule + & & \hfill\emph{continues} \\ + \endfoot + \chemtranslationtable +\end{longtable} + +\subsubsection{Information For Module Writers} + +In addition to the commands from section~\vref{sec:avail-transl-keys} the +following macros are available: +\begin{commands} + \expandable\explcommand{chemmacros_translate:n}[ \marg{translation key}] + Translates the given key to the language which is detected automatically + or given by the user. Should be used in \chemmacros' macros instead of + \pkg{translations}' \cs*{GetTranslation}. + \explcommand{l_chemmacros_language_tl} + A token list variable that holds the language which is used by + \explcs{chemmacros_translate:n} for translation, \emph{after begin + document}. + \command{ChemTranslate}[\marg{translation key}] + A version of \explcs{chemmacros_translate:n} for those who prefer + traditional \LaTeXe\ programming over expl3. + \explcommand{chemmacros_declare_translation:nnn}[\marg{language}\marg{key}% + \marg{translation}] + The expl3 version of \cs{DeclareChemTranslation}. + \explcommand{chemmacros_declare_translations:nn}[\marg{key}\Marg{\meta{language} + = \meta{translation}}] + The expl3 version of \cs{DeclareChemTranslations}. +\end{commands} + +\clearpage + +\part{Additional Modules}\label{part:additional-modules} + +\section{User Modules} +\subsection{The \chemmodule*{all} \emph{pseudo}-module}\label{sec:all-module} + +The \chemmodule{all} module is a pseudo module: it doesn't define any +functionality at all. It does however load all other modules. So you can say +\begin{sourcecode} + \chemsetup{ modules = all } +\end{sourcecode} +to ensure that every module is available. This \emph{will not} load personal +modules! + +\subsection{The \chemmodule*{isotopes} Module}\label{sec:isotopes-module} + +The \chemmodule{isotope} module loads the \pkg{elements} +package~\cite{pkg:elements}. This module defines one user command: +\begin{commands} + \command{isotope}[\sarg\marg{input}] + \meta{input} can either be the \emph{symbol} of an element or the + \emph{name} of an element. Be aware that \emph{the name is language + dependent}, refer to the manual of the \pkg{elements} package for + details. To be on the safe side use the element symbol. + + \meta{input} can also be comma separated list: + \cs{isotope}\Marg{\meta{nuc},\meta{symbol}}. If you leave \meta{nuc} out + then \cs{isotope} will display the most common isotope. Otherwise + \meta{nuc} will be used. If \meta{nuc} is an isotope unknown to the + \pkg{elements} package \cs{isotope} will write a warning to the log file. + + The starred variant omits the element number. +\end{commands} + +\begin{example}[side-by-side] + \isotope{C} + \isotope*{C} + \isotope{14,C} + \isotope*{14,C} +\end{example} + +As input for the element symbol you can choose any of the elements known to +the \pkg{elements} package. + +There are options which allow you to determine how the isotope is printed: +\begin{options} + \keychoice{format}{super,side}\Module{isotopes}\Default{super} + Either print the isotope number as superscript or to the right of the + element symbol. + \keyval{side-connect}{input}\Module{isotopes}\Default{-} + Determine what is printed between the element symbol and the isotope + number if \keyis{format}{side}. +\end{options} + +\begin{example}[side-by-side] + \isotope{C} + \chemsetup[isotopes]{format=side} + \isotope{C} + \chemsetup[isotopes]{side-connect=} + \isotope{C} +\end{example} + +\subsection{The \chemmodule*{mechanisms} Module}\label{sec:mechanisms-module} + +The module \chemmodule{mechanisms} loads the package +\pkg{amstext}~\cite{pkg:amstext}. It provides one macro: + +\begin{commands} + \command{mech}[\oarg{type}] + Allows to specify the most common reaction mechanisms. +\end{commands} +\meta{type} can have one of the following values: +\begin{commands} + \command{mech} + (empty, no opt. argument) nucleophilic substitution \mech + \command{mech}[\Oarg{1}] + unimolecular nucleophilic substitution \mech[1] + \command{mech}[\Oarg{2}] + bimolecular nucleophilic substitution \mech[2] + \command{mech}[\Oarg{se}] + electrophilic substitution \mech[se] + \command{mech}[\Oarg{1e}] + unimolecular electrophilic substitution \mech[1e] + \command{mech}[\Oarg{2e}] + bimolecular electrophilic substitution \mech[2e] + \command{mech}[\Oarg{ar}] + electrophilic aromatic substitution \mech[ar] + \command{mech}[\Oarg{e}] + elimination \mech[e] + \command{mech}[\Oarg{e1}] + unimolecular elimination \mech[e1] + \command{mech}[\Oarg{e2}] + bimolecular elimination \mech[e2] + \command{mech}[\Oarg{cb}] + unimolecular elimination \enquote{conjugated base}, \ie, via carbanion + \mech[cb] +\end{commands} + +\subsection{The \chemmodule*{newman} Module}\label{sec:newman-module} +The \chemmodule{newman} module provides a command for drawing Newman +projections. It loads the \chemmodule{tikz} module. +\begin{commands} + \command{newman}[\oarg{options}\darg{angle}% + \Marg{\meta{1},\meta{2},\meta{3},\meta{4},\meta{5},\meta{6}}] + Create Newman projections. This command uses \TikZ\ internally. + \meta{angle} rotates the back atoms counter clockwise with respect to the + front atoms and is an optional argument. \meta{1} to \meta{6} are the + positions, the first three are the front atoms, the last three the back + atoms. +\end{commands} + +\begin{example} + \newman{} \newman(170){} + \newman{1,2,3,4,5,6} \newman{1,2,3} \newman{,,,4,5,6} +\end{example} + +Several options allow customization: +\begin{options} + \keyval{angle}{angle}\Module{newman}\Default{0} + Default angle. + \keyval{scale}{factor}\Module{newman}\Default{1} + Scale the whole projection by factor \meta{factor}. + \keyval{ring}{tikz}\Module{newman}\Default + Customize the ring with \TikZ\ keys. + \keyval{atoms}{tikz}\Module{newman}\Default + Customize the nodes within which the atoms are set with \TikZ\ keys. + \keyval{back-atoms}{tikz}\Module{newman}\Default + Explicitly customize the nodes of the back atoms with \TikZ\ keys. +\end{options} + +\begin{example} + \chemsetup[newman]{angle=45} \newman{} + \newman[scale=.75,ring={draw=blue,fill=blue!20}]{} +\end{example} + +\begin{example} + \chemsetup[newman]{atoms={draw=red,fill=red!20,inner sep=2pt,rounded corners}} + \newman{1,2,3,4,5,6} +\end{example} + +\begin{example} + \chemsetup[newman]{ + atoms = {draw=red,fill=red!20,inner sep=2pt,rounded corners}, + back-atoms = {draw=blue,fill=blue!20,inner sep=2pt,rounded corners} + } + \newman{1,2,3,4,5,6} \newman(170){1,2,3,4,5,6} +\end{example} + +\subsection{The \chemmodule*{orbital} Module}\label{sec:orbital-module} +The \chemmodule{orbital} module loads the \chemmodule{tikz} module. It +provides the following command to create orbitals: +\begin{commands} + \command{orbital}[\oarg{options}\marg{type}] + Draw an orbital shape of type \meta{type}. This command uses \TikZ\ + internally. +\end{commands} + +There are the following types available for \meta{type}: +\begin{center} + \code{s} \quad + \code{p} \quad + \code{sp} \quad + \code{sp2} \quad + \code{sp3} +\end{center} + +\begin{example} + \orbital{s} \orbital{p} \orbital{sp} \orbital{sp2} \orbital{sp3} +\end{example} + +Depending on the type you have different options to modify the orbitals: +\begin{options} + \keychoice{phase}{+,-}\Module{orbital}\Default{+} + changes the phase of the orbital (all types) + \keyval{scale}{factor}\Module{orbital}\Default{1} + changes the size of the orbital (all types) + \keyval{color}{color}\Module{orbital}\Default{black} + changes the color of the orbital (all types) + \keyval{angle}{angle}\Module{orbital}\Default{0} + rotates the orbitals with a p contribution counter clockwise (all types + except \code{s}) + \keybool{half}\Module{orbital}\Default{false} + displays only half an orbital (only \code{p}) +\end{options} + +\begin{example} + \orbital{s} \orbital[phase=-]{s} + \orbital{p} \orbital[phase=-]{p} + \orbital{sp3} \orbital[phase=-]{sp3} + + \orbital[angle=0]{p} \orbital[color=red!50]{p} + \orbital[angle=135,scale=1.5]{p} \orbital[half]{p} +\end{example} + +Additionally there are two options, with which the \TikZ\ behaviour can be +changed. +\begin{options} + \keybool{overlay}\Module{orbital} + The orbital \enquote{doesn't need space}; it is displayed with the \TikZ\ + option \code{overlay}. + \keyval{opacity}{num}\Module{orbital} + The orbital becomes transparent; \meta{value} can have values between + \code{1} (fully opaque) to \code{0} (invisible). +\end{options} +\begin{example} + \vspace{7mm} + \chemsetup[orbital]{ + overlay, + p/color = black!70 + } + \setbondoffset{0pt} + \chemfig{ + ?\orbital{p} + -[,1.3]{\orbital[phase=-]{p}} + -[:30,1.1]\orbital{p} + -[:150,.9]{\orbital[phase=-]{p}} + -[4,1.3]\orbital{p} + -[:-150,1.1]{\orbital[phase=-]{p}}? + } + \vspace{7mm} +\end{example} + +\begin{example} + \vspace{7mm} + \setbondoffset{0pt} + \chemsetup[orbital]{ + overlay , + opacity = .75 , + p/scale = 1.6 , + s/color = blue!50 , + s/scale = 1.6 + } + \chemfig{ + \orbital{s} + -[:-20]{\orbital[scale=2]{p}} + {\orbital[half,angle=0]{p}} + {\orbital[angle=170,half]{p}} + {\orbital[angle=-150,half]{p}} + (-[:-150]\orbital{s})-\orbital{s} + } + \vspace{1cm} +\end{example} + +\subsection{The \chemmodule*{polymers} Module}\label{sec:polymers-module} +The\sinceversion{5.5} \chemmodule{polymers} module loads the +\chemmodule{nomenclature} and the \chemmodule{tikz} modules. + +\subsubsection{Nomenclature} + +The \chemmodule{polymers} module defines a number of \ac{iupac} macros for +usage inside \cs{iupac} which are used in polymer chemistry. + +\paragraph{Copolymers} +\begin{commands} + \iupaccs[co]{copolymer}{unspecified copolymer.} + \iupaccs[stat]{statistical}{statistical copolymer.} + \iupaccs[ran]{random}{random copolymer.} + \iupaccs[alt]{alternating}{alternating copolymer.} + \iupaccs[per]{periodic}{periodic copolymer.} + \iupaccs{block}{block copolymer.} + \iupaccs{graft}{graft copolymer.} +\end{commands} + +\paragraph{Non-linear (Co) Polymers and Polymer Assemblies} +\begin{commands} + \iupaccs{blend}{The blend qualifier.} + \iupaccs{comb}{The comb qualifier.} + \iupaccs[compl]{complex}{The complex qualifier.} + \iupaccs[cyclo]{cyclic}{The cyclic qualifier.} + \iupaccs{branch}{The branch qualifier.} + \iupaccs[net]{network}{The network qualifier.} + \iupaccs[ipn]{ipnetwork}{The interpenetrating network qualifier.} + \iupaccs[sipn]{sipnetwork}{The semi-interpenetrating network qualifier.} + \iupaccs{star}{The star qualifier.} +\end{commands} + +\subsubsection{Polymer Denotations in \pkg*{chemfig}'s Molecules} +The \pkg{chemfig} manual proposes some code defining the macros +\cs*{setpolymerdelim} and \cs*{makebraces} which make it possible to add +delimiters to \pkg{chemfig} molecules. The \chemmodule{polymers} module +implements the following macro based on the same idea: +\begin{commands} + \command{makepolymerdelims}[\oarg{options}\marg{height}\oarg{depth}\marg{opening + node}\marg{closing node}] + The value of \meta{depth} is the same as \meta{height} unless it is + specified explicitly. \meta{opening node} and \meta{closing node} are the + names of \TikZ' nodes where the delimites are placed. +\end{commands} +\begin{options} + \keychoice{delimiters}{\Marg{\meta{left}\meta{right}}}\Module{polymers}\Default{[]} + This option demands two tokens as argument, the first being the opening + brace, the second the closing brace. A dot (\code{.}) denotes an empty + delimiter. + \keyval{subscript}{subscript}\Module{polymers}\Default{\$n\$} + Subscript to the right delimiter. + \keyval{superscript}{superscript}\Module{polymers} + Superscript to the right delimiter. +\end{options} + +\begin{example} + \setatomsep{2em} + \chemfig{-[@{op,.75}]CH_2-CH(-[6]Cl)-[@{cl,0.25}]} + \makepolymerdelims{5pt}[27pt]{op}{cl} + \chemfig{-[@{op,.75}]CH_2-CH(-[6]Cl)-[@{cl,0.25}]} + \makepolymerdelims[delimiters=()]{5pt}[27pt]{op}{cl} +\end{example} + +\subsection{The \chemmodule*{reactions} Module}\label{sec:reactions-module} +The \chemmodule{reactions} module loads the \chemmodule{chemformula} module +and the \pkg{mathtools} package~\cite{pkg:mathtools}. + +\subsubsection{Predefined Environments} + +You can use these environments for numbered\ldots +\begin{environments} + \environment{reaction} + A single reaction where \chemformula\ code is placed directly in the + environment body. A wrapper around the \env*{equation} environment. The + environment body is parsed with \cs{ch} or \cs{ce} depending on the value + of the \option{formula} option, see + section~\vref{sec:chemformula-module}. + \environment{reactions} + Several aligned reactions. A wrapper around \pkg{amsmath}'s \env*{align} + environment. The environment body is parsed with \cs{ch} or \cs{ce} + depending on the value of the \option{formula} option, see + section~\vref{sec:chemformula-module}. +\end{environments} + +\ldots and their starred versions for unnumbered reactions. +\begin{environments} + \environment{reaction*} + A wrapper around the \env*{equation*} environment. The environment body + is parsed with \cs{ch} or \cs{ce} depending on the value of the + \option{formula} option, see section~\vref{sec:chemformula-module}. + \environment{reactions*} + A wrapper around \pkg{amsmath}'s \env*{align*} environment. The + environment body is parsed with \cs{ch} or \cs{ce} depending on the value + of the \option{formula} option, see + section~\vref{sec:chemformula-module}. +\end{environments} + +With those environments you can create (un)numbered reaction equations similar +to mathematical equations. + +Theses environments use the \env*{equation}/\env*{equation*} environments or +the \env*{align}/\env*{align*} environments, respectively, to display the +reactions. + +\begin{example} + Reaction with counter: + \begin{reaction} + A -> B + \end{reaction} +\end{example} + +\begin{example} + Reaction without counter: + \begin{reaction*} + C -> D + \end{reaction*} +\end{example} + +\begin{example} + Several aligned reactions with counter: + \begin{reactions} + A &-> B + C \\ + D + E &-> F + \end{reactions} +\end{example} + +\begin{example} + Several aligned reactions without counter: + \begin{reactions*} + G &-> H + I \\ + J + K &-> L + \end{reactions*} +\end{example} + +If you want to change the layout of the counter tags, you can use +\begin{commands} + \command*{renewtagform}[\marg{tagname}\oarg{format}\marg{left + delimiter}\marg{right delimiter}] + Provided by the \pkg{mathtools} package. +\end{commands} +or use the following options: +\begin{options} + \keyval{tag-open}{left delimiter}\Module{reactions}\Default{\{} + \sinceversion{5.6}The left delimiter. + \keyval{tag-close}{right delimiter}\Module{reactions}\Default{\}} + \sinceversion{5.6}The right delimiter. + \keyval{before-tag}{format}\Module{reactions}\Default + \sinceversion{5.6}Code inserted before the tags. +\end{options} + +\begin{example} + \chemsetup[reactions]{ + before-tag = R \textbf , + tag-open = [ , + tag-close = ] + } + \begin{reaction} + H2O + CO2 <<=> H2CO3 + \end{reaction} +\end{example} + +The use of \AmS math's \cs{intertext} is possible: +\begin{example} + \begin{reactions} + A + 2 B &-> 3 C + D "\label{rxn:test}" + \intertext{Some text in between aligned reactions} + 3 E + F &<=> G + 1/2 H + \end{reactions} + See reaction~\ref{rxn:test}. +\end{example} + +If\sinceversion{5.6} you are using either \pkg{cleveref} or \pkg{fancyref} the +\env{reaction} counter is supported already. For \pkg{fancyref} use the +prefix \code{rct}. + +\subsubsection{Own Reactions} +You can create new types of reactions with the command: +\begin{commands} + \command{NewChemReaction}[\marg{name}\oarg{number of arguments}\marg{math name}] + \meta{name} will be the name of the new chem environment. \meta{math name} is + the underlying math environment. Gives an error if \meta{name} already + exists. + \command{RenewChemReaction}[\marg{name}\oarg{number of arguments}\marg{math name}] + \meta{name} is the name of the renewed chem environment. \meta{math name} is + the underlying math environment. Gives an error if \meta{name} does not exist. + \command{DeclareChemReaction}[\marg{name}\oarg{number of arguments}\marg{math name}] + \meta{name} will be the name of the chem environment. \meta{math name} is + the underlying math environment. + \command{ProvideChemReaction}[\marg{name}\oarg{number of arguments}\marg{math name}] + \meta{name} will be the name of the new chem environment. \meta{math name} is + the underlying math environment. The new environment is only defined if + it doesn't exist, yet. +\end{commands} + +\begin{sourcecode} + \NewChemReaction{reaction} {equation} + \NewChemReaction{reaction*} {equation*} + \NewChemReaction{reactions} {align} + \NewChemReaction{reactions*}{align*} +\end{sourcecode} + +Let's suppose, you'd like to have the alignment behaviour of the \env{alignat} +environment for \chemformula\ reactions. You could do the following: + +\begin{sourcecode} + \NewChemReaction{reactionsat}[1]{alignat} +\end{sourcecode} + +With this the \env{reactionsat} environment is defined. +\begin{example} + \NewChemReaction{reactionsat}[1]{alignat} + \NewChemReaction{reactionsat*}[1]{alignat*} + \begin{reactionsat}{3} + A &-> B &&-> C &&-> D \\ + aaaaa &-> bbbbb &&-> ccccc &&-> ddddd + \end{reactionsat} + \begin{reactionsat*}{2} + A &-> B & C &-> D \\ + aaaaa &-> bbbbb &\quad{} ccccc &-> ddddd + \end{reactionsat*} +\end{example} + +\subsubsection{List of Reactions} + +The \chemmodule{reactions} module also provides a command to display a list of +the reactions created with the \env{reaction} environment. +\begin{commands} + \command{listofreactions} + Print a list of reactions. +\end{commands} +\begin{example} + \listofreactions +\end{example} + +The output of this list can be modified by two options: +\begin{options} + \keyval{list-name}{name of the + list}\Module{reactions}\Default{\cs*{ChemTranslate}\Marg{{list-of-reactions}}} + Let's you set the name of the list manually. The default name is language + dependent, see section~\vref{sec:lang-module}. + \keyval{list-entry}{prefix to each + entry}\Module{reactions}\Default{\cs*{ChemTranslate}\Marg{reaction}} + Let's you set a prefix to each list entry. The default name is language + dependent, see section~\vref{sec:lang-module}. + \keyval{list-heading-cmd}{code}\Module{reactions}\Default{\cs*{section}\sarg\Marg{\#1}} + The\sinceversion{5.2} macro that is called at the beginning of the list. + Inside of \meta{code} \code{\#1} refers to the actual heading of the list. + The default setting is not entirely true: if a macro \cs*{chapter} is + defined \code{\cs*{chapter}\sarg\Marg{\#1}} is used. + \keybool{tocbasic}\Module{reactions}\Default{false} + \sinceversion{5.6}If you use a \KOMAScript\ class \emph{or} if you load + the \pkg{tocbasic} package \emph{or} if you set this option to \code{true} + the list of reactions will be set up using the \pkg{tocbasic} package. + This \emph{disables} the \option{list-heading-cmd} option. For a + \KOMAScript\ class this means that the list of reactions obeys + \KOMAScript's \option*{listof} option. +\end{options} +Instead of using the option \option{list-name} you also could redefine +\cs{reactionlistname}. + +The list lists all reactions with a number and disregards reactions without +number. All reaction environments without star have an optional argument +which let's you add a description (or caption) for the entry in the list. +\begin{example} + \begin{reaction}[Autoprotolyse] + 2 H2O <<=> H3O+ + OH- + \end{reaction} +\end{example} + +If you use the \env{reactions} environment this will not work, though. In +this case you can use +\begin{commands} + \command{AddRxnDesc}[\marg{description}] + Add a description to a reaction. +\end{commands} + +\begin{example} + \begin{reactions} + "\chlewis{0.}{Cl}" + CH4 & + -> HCl + "\chlewis{180.}{C}" H3 \AddRxnDesc{first~step~of~chain} \\ + "\chlewis{180.}{C}" H3 + Cl2 & + -> CH3Cl + "\chlewis{0.}{Cl}" \AddRxnDesc{second~step~of~chain} + \end{reactions} +\end{example} + +\subsection{The \chemmodule*{redox} Module}\label{sec:redox-module} + +The \chemmodule{redox} module loads the modules \chemmodule{tikz} and +\chemmodule{xfrac}. It also loads the packages +\pkg{mathtools}~\cite{pkg:mathtools} and \pkg{relsize}~\cite{pkg:relsize}. + +\subsubsection{Oxidation Numbers}\label{sec:oxidation-numbers} + +Regarding the typesetting of oxidation numbers +\citetitle{iupac:greenbook}~\cite{iupac:greenbook} says the following: +\begin{cnltxquote}[{\cite[][p.\,50]{iupac:greenbook}}] + Oxidation numbers are denoted by positive or negative Roman numerals or by + zero \textelp{} + + \textit{Examples}\quad \ox{7,Mn}, \ox[pos=side]{7,manganese}, \ox{-2,O}, + \ox{0,Ni} +\end{cnltxquote} + +The following command is provided to set oxidation numbers: +\begin{commands} + \command{ox}[\sarg\oarg{options}\Marg{\meta{number},\meta{atom}}] + Places \meta{number} as right superscript to \meta{atom}; \meta{number} + has to be a (rational) number! \meta{atom} is treated as a \chemformula\ + formula, like it would be in \cs{chcpd} (this depends on the setting of + the \option{formula} option, see~\vref{sec:chemformula-module}). +\end{commands} + +\begin{example} + \ox{+1,Na}, \ox{2,Ca}, \ox{-2,S}, \ox{-1,F} +\end{example} + +There are a number of options that can be used to modify the typeset result: +\begin{options} + \keybool{parse}\Module{redox}\Default{true} + When \code{false} an arbitrary entry can be used for \code{<number>}. + \keybool{roman}\Module{redox}\Default{false} + Switches from roman to arabic numbers. + \keychoice{pos}{top,super,side}\Module{redox}\Default{super} + \code{top} places \meta{number} above \meta{atom}, \code{super} to the + upper right as superscript and \code{side} to the right and inside + brackets. Both \code{super} and \code{side} follow \ac{iupac} + recommendation, \code{top} does not! + \keybool{explicit-sign}\Module{redox}\Default{false} + Shows the $+$ for positiv numbers and the $\pm$ for $0$. + \keybool{explizit-zero-sign}\Module{redox}\Default{true} + Only\sinceversion{5.4} if both \option{explicit-sign} and + \option{explicit-zero-sign} are set to \code{true} $\pm0$ will be + printed. + \keychoice{decimal-marker}{comma,point}\Module{redox}\Default{point} + Choice for the decimal marker for formal oxidation numbers like \ox{1.2,X}. + \keychoice{align}{center,right}\Module{redox}\Default{center} + Center the oxidation number relative to the atom or right-align it. + \keyval{side-connect}{code}\Module{redox}\Default{\cs*{,}} + Code that is inserted between atom and oxidation number if + \keyis{pos}{side} is used. + \keyval{text-frac}{cs}\Module{redox}\Default{\cs{chemfrac}\Oarg{text}\Marg{\#1}\Marg{\#2}} + The fraction macro that is used for fractions if \keyis{pos}{side} is + used. \meta{cs} must be a macro that takes two mandatory arguments, the + first for the numerator and the second for the denominator. + \keyval{super-frac}{cs}\Module{redox}\Default{\cs{chemfrac}\Oarg{superscript}% + \Marg{\#1}\Marg{\#2}} + The fraction macro that is used for fractions if \keyis{pos}{top} or + \keyis{pos}{super} is used. \meta{cs} must be a macro that takes two + mandatory arguments, the first for the numerator and the second for the + denominator. +\end{options} + +\begin{example}[side-by-side] + \ox[roman=false]{2,Ca} \ox{2,Ca} \\ + \ox[pos=top]{3,Fe}-Oxide \\ + \ox[pos=side]{3,Fe}-Oxide \\ + \ox[parse=false]{?,Mn} \\ + \ox[pos=top,align=right]{2,Ca} +\end{example} + +The \keyis{pos}{top} variant also can be set with the shortcut \cs{ox}\sarg: +\begin{example}[side-by-side] + \ox{3,Fe} \ox*{3,Fe} +\end{example} + +Using the \option{explicit-sign} option will always show the sign of the +oxidation number: +\begin{example} + \chemsetup[redox]{explicit-sign = true} + \ox{+1,Na}, \ox{2,Ca}, \ox{-2,S}, \ch{"\ox{0,F}" {}2} +\end{example} + +\begin{example} + \chemsetup[redox]{pos=top} + Compare \ox{-1,O2^2-} to \ch{"\ox{-1,O}" {}2^2-} +\end{example} + +Sometimes one might want to use formal oxidation numbers like \num{.5} or +\chemfrac{1}{3}: +\begin{example}[side-by-side] + \chemsetup[redox]{pos=top} + \ox{.5,Br2} + \ch{"\ox{1/3,I}" {}3+} + + \chemsetup[redox]{pos=side} + \ox{1/3,I3+} +\end{example} + +The fraction is displayed with the help of the \pkg{xfrac} +package~\cite{bnd:l3packages}. For more details on how \chemmacros\ uses it +read section~\vref{sec:xfrac-module}. + +\subsubsection{Redox Reactions}\label{sec:redox-reactions} + +\chemmacros\ provides two commands to visualize the transfer of electrons in +redox reactions. Both commands are using \TikZ. +\begin{commands} + \command{OX}[\Marg{\meta{name},\meta{atom}}] + Label \meta{atom} with the label \meta{name}. + \command{redox}[\Darg{\meta{name1},\meta{name2}}\oarg{tikz}\oarg{num}\marg{text}] + Connect two \meta{atom}s previously labelled with \cs{OX}. Only the first + argument \Darg{\meta{name1},\meta{name2}} is required, the others are all + optional. +\end{commands} + +\cs{OX} places \meta{atom} into a node, which is named with \meta{name}. If +you have set two \cs{OX}, they can be connected with a line using \cs{redox}. +To do so the names of the two nodes that are to be connected are written in +the round braces. Since \cs{redox} draws a \code{tikzpicture} with options +\code{remember picture,overlay}, the document needs to be \emph{compiled at + least two times}. + +\begin{example} + \vspace{7mm} + \OX{a,Na} $\rightarrow$ \OX{b,Na}\pch\redox(a,b){oxidation} +\end{example} + +This line can be customized using \TikZ\ keys in \oarg{tikz}: +\begin{example} + \vspace{7mm} + \OX{a,Na} $\rightarrow$ \OX{b,Na}\pch\redox(a,b)[->,red]{ox} +\end{example} + +With the argument \oarg{num} the length of the vertical parts of the line can +be adjusted. The default length is \code{.6em}. This length is multiplied +with \meta{num}. If you use a negative value the line is placed \emph{below} +the text. +\begin{example} + \vspace{7mm} + \OX{a,Na} $\rightarrow$ \OX{b,Na}\pch + \redox(a,b)[->,red]{ox} + \redox(a,b)[<-,blue][-1]{red} + \vspace{7mm} +\end{example} + +The default length of the vertical lines can be customized with the option +\begin{options} + \keyval{dist}{dim}\Module{redox}\Default{.6em} + A \TeX\ dimension. +\end{options} + +\begin{example} + \vspace{7mm} + \chemsetup{redox/dist=1em} + \OX{a,Na} $\rightarrow$ \OX{b,Na}\pch\redox(a,b)[->,red]{ox} +\end{example} + +\begin{options} + \keyval{sep}{dim}\Module{redox}\Default{.2em} + The option can be used to change the distance between the atom and the + beginning of the line. +\end{options} + +\begin{example} + \vspace{7mm} + \chemsetup{redox/sep=.5em} + \OX{a,Na} $\rightarrow$ \OX{b,Na}\pch\redox(a,b)[->,red]{ox} +\end{example} + +\paragraph{Examples} +\begin{example} + \vspace{7mm} + \ch{ + 2 "\OX{o1,Na}" + "\OX{r1,Cl}" {}2 + -> + 2 "\OX{o2,Na}" {}+ + 2 "\OX{r2,Cl}" {}- + } + \redox(o1,o2){\small OX: $- 2\el$} + \redox(r1,r2)[][-1]{\small RED: $+ 2\el$} + \vspace{7mm} +\end{example} + +\begin{example} + \vspace{7mm} + \ch{ + 2 "\OX{o1,\ox*{0,Na}}" + "\OX{r1,\ox*{0,Cl}}" {}2 + -> + 2 "\OX{o2,\ox*{+1,Na}}" {}+ + 2 "\OX{r2,\ox*{-1,Cl}}" {}- + } + \redox(o1,o2){\small OX: $- 2\el$} + \redox(r1,r2)[][-1]{\small RED: $+ 2\el$} + \vspace{7mm} +\end{example} + +\begin{example} + \vspace{14mm} + \ch{ + 2 "\OX{o1,\ox*{0,Na}}" + "\OX{r1,\ox*{0,Cl}}" {}2 + -> + 2 "\OX{o2,\ox*{+1,Na}}" {}+ + 2 "\OX{r2,\ox*{-1,Cl}}" {}- + } + \redox(o1,o2)[draw=red,->][3.33]{\small OX: $- 2\el$} + \redox(r1,r2)[draw=blue,->]{\small RED: $+ 2\el$} +\end{example} + +\begin{example} + \vspace{7mm} + \ch{ + 2 "\OX{o1,\ox*{0,Na}}" + "\OX{r1,\ox*{0,Cl}}" {}2 + -> 2 "\OX{o2,\ox*{+1,Na}}" {}+ + 2 "\OX{r2,\ox*{-1,Cl}}" {}- + } + \redox(o1,o2)[green,-stealth]{\small OX} + \redox(r1,r2)[purple,-stealth][-1]{\small RED} + \vspace{7mm} +\end{example} + +\subsection{The \chemmodule*{scheme} Module}\label{sec:scheme-module} + +The \chemmodule{scheme} module loads the \pkg{chemnum} +package~\cite{pkg:chemnum} and defines a floating environment +\showenv{scheme}. That is, it \emph{only} defines this float if no +environment \env{scheme} exists at the end of the preamble. The module checks +for different available float defining methods, in \emph{this} order: +\begin{itemize} + \item If the current class is a \KOMAScript\ class \cs*{DeclareNewTOC} will + be used. + \item If the current class is \cls{memoir}, \cls{memoir}'s methods are used. + \item If the package \pkg{tocbasic} has been loaded \cs*{DeclareNewTOC} will + be used. + \item If the package \pkg{newfloat} has been loaded + \cs*{DeclareFloatingEnvironment} will be used. + \item \sinceversion{5.1}If the package \pkg{floatrow} has been loaded its + method will be used. + \item If the package \pkg{float} has been loaded its method will be used. + \item If neither of the above the \enquote{manual} method is used. This + means the environment is defined the same way like \env*{figure} is + defined in the \cls*{article} class or the \cls*{book} class, depending if + \cs*{chapter} is defined or not. +\end{itemize} + +The list name and the caption name both are translated to the language +specified according to the \option{lang} option and the provided translations, +see section~\vref{sec:lang-module} for details. If you want to manually change +them then redefine these macros after begin document: +\begin{commands} + \command{listschemename} + The name of the list of schemes. + \command{schemename} + The name used in captions. +\end{commands} +The list of schemes is printed as expected with +\begin{commands} + \command{listofschemes} +\end{commands} + +If\sinceversion{5.6} you are using either \pkg{cleveref} or \pkg{fancyref} the +\env{scheme} environment (or rather its captions) are supported already. For +\pkg{fancyref} use the prefix \code{sch}. + +\subsection{The \chemmodule*{spectroscopy} Module}\label{sec:spectroscopy-module} + +The \chemmodule{spectroscopy} module loads the \chemmodule{chemformula} module +and the \pkg{siunitx} package~\cite{pkg:siunitx}. + +\subsubsection{The \cs*{NMR} Command} + +When you're trying to find out if a compound is the one you think it is often +NMR spectroscopy is used. The experimental data are typeset similar to this: +\begin{center} + \NMR(400)[CDCl3] = \num{1.59} +\end{center} +The \chemmodule{spectroscopy} module provides a command which simplifies the +input. + +\begin{commands} + \command{NMR}[\sarg\Marg{\meta{num},\meta{element}}% + \Darg{\meta{num},\meta{unit}}\oarg{solvent}] + Typeset nuclear magnetic resonance data. \meta{num} is a valid + \pkg{siunitx} number input, \meta{unit} is a valid \pkg{siunitx} unit + input. \meta{solvent} is any valid \chemformula\ input as in \cs{chcpd} + (this depends on the setting of the \option{formula} option, + see~\vref{sec:chemformula-module}). +\end{commands} + +\emph{All} Argument are optional! Without arguments we get: +\begin{example}[side-by-side] + \NMR \par + \NMR* +\end{example} + +The first argument specifies the kind of NMR: +\begin{example}[side-by-side] + \NMR{13,C} +\end{example} + +The second argument sets the frequency (in \si{\mega\hertz}): +\begin{example}[side-by-side] + \NMR(400) +\end{example} +You can choose another unit: +\begin{example}[side-by-side] + \NMR(4e8,\hertz) +\end{example} +Please note that the setup of \pkg{siunitx} also affects this command: +\begin{example}[side-by-side] + \sisetup{exponent-product=\cdot} + \NMR(4e8,\hertz) +\end{example} + +The third argument specifies the solvent: +\begin{example}[side-by-side] + \NMR[CDCl3] +\end{example} + +\subsubsection{Short Cuts} + +It is possible to define short cut commands for specific nuclei. +\begin{commands} + \command{NewChemNMR}[\marg{cs}\Marg{\meta{num},\meta{atom}}] + Define a new shortcut macro for typesetting a certain type of magnetic + resonence data. Gives an error if \meta{cs} already exists. + \command{DeclareChemNMR}[\marg{cs}\Marg{\meta{num},\meta{atom}}] + Define a new shortcut macro for typesetting a certain type of magnetic + resonence data. Overwrites an existing macro. + \command{RenewChemNMR}[\marg{cs}\Marg{\meta{num},\meta{atom}}] + Redefine an existing shortcut macro for typesetting a certain type of + magnetic resonence data. Gives an error if \meta{cs} doesn't exist. + \command{ProvideChemNMR}[\marg{cs}\Marg{\meta{num},\meta{atom}}] + Define a new shortcut macro for typesetting a certain type of magnetic + resonence data. \meta{cs} is only defined if it doesn't exist, yet. +\end{commands} + +This defines a command with the same arguments as \cs{NMR} \emph{except} for +\Marg{\meta{num},\meta{atom}}: +\begin{example}[side-by-side] + \NewChemNMR\HNMR{1,H}% + \NewChemNMR\CNMR{13,C}% + \CNMR*(100) \par + \HNMR*(400) +\end{example} + +\subsubsection{An Environment to Typeset Experimental Data} + +The \chemmodule{spectroscopy} module provides an environment to ease the input +of experimental data. +\begin{environments} + \environment{experimental} + Environment for the output of experimental data. Inside the environment + the following commands are defined. +\end{environments} +\begin{commands} + \command{data}[\marg{type}\oarg{specification}] + Type of data, \eg\ IR, MS\ldots\ The optional argument takes further + specifications which are output in parentheses. + \command{data}[\sarg\marg{type}\oarg{specification}] + Like \cs{data} but changes the \code{=} into a \code{:}, given that + \keyis{use-equal}{true} is used. + \command{NMR}[\Marg{\meta{num},\meta{elem}\oarg{coupling + core}}\Darg{\meta{num},\meta{unit}}\oarg{solvent}] + This command gets an additional argument: + \cs{NMR}\Marg{13,C[\textasciicircum 1H]} \NMR{13,C[^1H]} + \command{J}[\Darg{\meta{bonds};\meta{nuclei}}\oarg{unit}\marg{list of nums}] + Coupling constant, values are input separated by \code{;} (NMR). The + arguments \Darg{\meta{bonds};\meta{nuclei}} and \oarg{unit} are optional + and enable further specifications of the coupling. + \command{\#}[\marg{num}] + Number of nuclei (NMR). + \command{pos}[\marg{num}] + Position of nuclues (NMR). + \command{val}[\marg{num}] + A number, an alias of \pkg{siunitx}' \cs*{num}\marg{num}. + \command{val}[\Marg{\meta{num1}--\meta{num2}}] + An alias of \pkg{siunitx}' \cs*{numrange}\marg{num1}\marg{num2}. +\end{commands} + +\begin{example} + \begin{experimental} + \data{type1} Data. + \data{type2}[specifications] More data. + \data*{type3} Even more data. + \end{experimental} +\end{example} + +\paragraph{Customization}\label{sec:experimental-customization} + +The output of the environment and of the NMR commands can be customized be a +number of options. For historical reasons they all belong to the module +\module{nmr}. +\begin{options} + \keyval{unit}{unit}\Module{spectroscopy}\Default{\cs*{mega}\cs*{hertz}} + The used default unit. + \keychoice{nucleus}{\Marg{\meta{num},\meta{atom}}}\Module{spectroscopy}\Default{\Marg{1,H}} + The used default nucleus. + \keyval{connector}{code}\Module{spectroscopy}\Default{-} + Places \meta{code} between the nucleus and the method. + \keyval{method}{code}\Module{spectroscopy}\Default{NMR} + The measuring method. + \keyval{format}{commands}\Module{spectroscopy}\Default + For example \cs*{bfseries}. + \keyval{nmr-base-format}{commands}\Module{spectroscopy}\Default + \sinceversion{5.8}Formatting instructions for the NMR base. + \keychoice{pos-number}{side,sub,super}\Module{spectroscopy}\Default{side} + Position of the number next to the atom. + \keyval{coupling-symbol}{code}\Module{spectroscopy}\Default{J} + The symbol used for the coupling constant. + \keyval{coupling-unit}{unit}\Module{spectroscopy}\Default{\cs*{hertz}} + A \pkg{siunitx} unit. + \keychoice{coupling-pos}{side,sub}\Module{spectroscopy}\Default{side} + Placement of the coupling nuclei next to the symbol $J$ (or rather the + symbol specified with option \option{coupling-symbol}). + \keyval{coupling-nuclei-pre}{code}\Module{spectroscopy}\Default{(} + Code inserted before the coupling nuclei when \keyis{coupling-pos}{side}. + \keyval{coupling-nuclei-post}{code}\Module{spectroscopy}\Default{)} + Code inserted after the coupling nuclei when \keyis{coupling-pos}{side}. + \keyval{coupling-bonds-pre}{code}\Module{spectroscopy}\Default + Code inserted before the coupling bonds. + \keyval{coupling-bonds-post}{code}\Module{spectroscopy}\Default{\cs*{!}} + Code inserted after the coupling bonds. + \keyval{coupling-pos-cs}{cs}\Module{spectroscopy}\Default{\cs*{@firstofone}} + Set the macro that prints the number set with the \cs{pos} macro. This + needs to be a command with one mandatory argument. + \keyval{atom-number-cs}{cs}\Module{spectroscopy}\Default{\cs*{@firstofone}} + Set the macro that prints the number set with the \cs{\#} macro. This + needs to be a command with one mandatory argument. + \keyval{atom-number-space}{dim}\Module{spectroscopy}\Default{.16667em} + Horizontal\sinceversion{5.3} space inserted between number and atom + (printed by \cs{\#}). + \keybool{parse}\Module{spectroscopy}\Default{true} + Treat the solvent as \chemformula\ formula (this depends on the setting of + the \option{formula} option, see~\vref{sec:chemformula-module}) or not. + \keyval{delta}{tokens}\Module{spectroscopy}\Default + The \meta{tokens} are added after $\delta$. + \keybool{list}\Module{spectroscopy}\Default{false} + The environment \env{nmr}[<optionen>]{} is formatted as a list + \keyval{list-setup}{setup}\Module{spectroscopy} + Setup of the list. See below for the default settings. + \keybool{use-equal}\Module{spectroscopy}\Default{false} + Add egual sign after \cs{NMR} and \cs{data}. +\end{options} + +The default setup of the list: +\begin{sourcecode} + \topsep\z@skip \partopsep\z@skip + \itemsep\z@ \parsep\z@ \itemindent\z@ + \leftmargin\z@ +\end{sourcecode} + +\begin{example} + \begin{experimental}[format=\bfseries] + \data{type1} Data. + \data{type2}[specifications] More data. + \data*{type3} Even more data. + \end{experimental} +\end{example} + +The command \cs{NMR} and all commands defined through \cs{NewChemNMR} +can be used like \cs{data} for the NMR data. + +\begin{example} + \begin{experimental}[format=\bfseries,use-equal] + \data{type1} Data. + \data{type2}[specifications] More data. + \NMR Even more data. + \end{experimental} +\end{example} + +\paragraph{An Example} +The code below is shown with different specifications for \meta{options}. +Of course options can also be chosen with \cs{chemsetup}. + +\begin{sourcecode} + \sisetup{separate-uncertainty,per-mode=symbol,detect-all,range-phrase=--} + \begin{experimental}[<optionen>] + \data*{yield} \SI{17}{\milli\gram} yellow needles (\SI{0.04}{\milli\mole}, + \SI{13}{\percent}). + % + \data{mp.} \SI{277}{\celsius} (DSC). + % + \NMR(600)[CDCl3] \val{2.01} (s, \#{24}, \pos{5}), \val{2.31} (s, \#{12}, + \pos{1}), \val{6.72--6.74} (m, \#{2}, \pos{11}), \val{6.82} (s, \#{8}, + \pos{3}), \val{7.05--7.07} (m, \#{2}, \pos{12}), \val{7.39--7.41} (m, \#{4}, + \pos{9}), \val{7.48--7.49} (m, \#{4}, \pos{8}). + % + \NMR{13,C}(150)[CDCl3] \val{21.2} ($+$, \#{4}, \pos{1}), \val{23.4} ($+$, + \#{8}, \pos{5}), \val{126.0} ($+$, \#{4}, \pos{9}), \val{128.2} ($+$, \#{8}, + \pos{3}), \val{130.8} ($+$, \#{2}, \pos{12}), \val{133.6} ($+$, \#{2}, + \pos{11}), \val{137.0} ($+$, \#{4}, \pos{8}), \val{138.6} (q, \#{4}, + \pos{2}), \val{140.6} (q, \#{2}, \pos{10}), \val{140.8} (q, \#{8}, \pos{4}), + \val{141.8} (q, \#{4}, \pos{6}), \val{145.6} (q, \#{2}, \pos{7}). + % + \data{MS}[DCP, EI, \SI{60}{\electronvolt}] \val{703} (2, \ch{M+}), \val{582} + (1), \val{462} (1), \val{249} (13), \val{120} (41), \val{105} (100). + % + \data{MS}[\ch{MeOH + H2O + KI}, ESI, \SI{10}{\electronvolt}] \val{720} (100, + \ch{M+ + OH-}), \val{368} (\ch{M+ + 2 OH-}). + % + \data{IR}[KBr] \val{3443} (w), \val{3061} (w), \val{2957} (m), \val{2918} + (m), \val{2856} (w), \val{2729} (w), \val{1725} (w), \val{1606} (s), + \val{1592} (s), \val{1545} (w), \val{1446} (m), \val{1421} (m), \val{1402} + (m), \val{1357} (w), \val{1278} (w), \val{1238} (s), \val{1214} (s), + \val{1172} (s), \val{1154} (m), \val{1101} (w), \val{1030} (w), \val{979} + (m), \val{874} (m), \val{846} (s), \val{818} (w), \val{798} (m), \val{744} + (w), \val{724} (m), \val{663} (w), \val{586} (w), \val{562} (w), \val{515} + (w). + % + \data*{UV-Vis} \SI{386}{\nano\metre} ($\varepsilon = \val{65984}$), + \SI{406}{\nano\metre} ($\varepsilon = \val{65378}$). + % + \data*{quantum yield} $\Phi = \val{0.74+-0.1}$\,. + \end{experimental} +\end{sourcecode} + +\paragraph{Nearly Standard} +Output with these options: + +\begin{sourcecode} + delta=(ppm),pos-number=sub,use-equal +\end{sourcecode} + +\begin{experimental}[delta=(ppm),pos-number=sub,use-equal] + \sisetup{separate-uncertainty,per-mode=symbol,detect-all,range-phrase=--} + \data*{yield} \SI{17}{\milli\gram} yellow needles (\SI{0.04}{\milli\mole}, + \SI{13}{\percent}). + % + \data{mp.} \SI{277}{\celsius} (DSC). + % + \NMR(600)[CDCl3] \val{2.01} (s, \#{24}, \pos{5}), \val{2.31} (s, \#{12}, + \pos{1}), \val{6.72--6.74} (m, \#{2}, \pos{11}), \val{6.82} (s, \#{8}, + \pos{3}), \val{7.05--7.07} (m, \#{2}, \pos{12}), \val{7.39--7.41} (m, \#{4}, + \pos{9}), \val{7.48--7.49} (m, \#{4}, \pos{8}). + % + \NMR{13,C}(150)[CDCl3] \val{21.2} ($+$, \#{4}, \pos{1}), \val{23.4} ($+$, + \#{8}, \pos{5}), \val{126.0} ($+$, \#{4}, \pos{9}), \val{128.2} ($+$, \#{8}, + \pos{3}), \val{130.8} ($+$, \#{2}, \pos{12}), \val{133.6} ($+$, \#{2}, + \pos{11}), \val{137.0} ($+$, \#{4}, \pos{8}), \val{138.6} (q, \#{4}, + \pos{2}), \val{140.6} (q, \#{2}, \pos{10}), \val{140.8} (q, \#{8}, \pos{4}), + \val{141.8} (q, \#{4}, \pos{6}), \val{145.6} (q, \#{2}, \pos{7}). + % + \data{MS}[DCP, EI, \SI{60}{\electronvolt}] \val{703} (2, \ch{M+}), \val{582} + (1), \val{462} (1), \val{249} (13), \val{120} (41), \val{105} (100). + % + \data{MS}[\ch{MeOH + H2O + KI}, ESI, \SI{10}{\electronvolt}] \val{720} (100, + \ch{M+ + OH-}), \val{368} (\ch{M+ + 2 OH-}). + % + \data{IR}[KBr] \val{3443} (w), \val{3061} (w), \val{2957} (m), \val{2918} + (m), \val{2856} (w), \val{2729} (w), \val{1725} (w), \val{1606} (s), + \val{1592} (s), \val{1545} (w), \val{1446} (m), \val{1421} (m), \val{1402} + (m), \val{1357} (w), \val{1278} (w), \val{1238} (s), \val{1214} (s), + \val{1172} (s), \val{1154} (m), \val{1101} (w), \val{1030} (w), \val{979} + (m), \val{874} (m), \val{846} (s), \val{818} (w), \val{798} (m), \val{744} + (w), \val{724} (m), \val{663} (w), \val{586} (w), \val{562} (w), \val{515} + (w). + % + \data*{UV-Vis} \SI{386}{\nano\metre} ($\varepsilon = \val{65984}$), + \SI{406}{\nano\metre} ($\varepsilon = \val{65378}$). + % + \data*{quantum yield} $\Phi = \val{0.74+-0.1}$\,. +\end{experimental} + +\paragraph{Formatted List} +Output with these options: + +\begin{sourcecode} + format=\bfseries,delta=(ppm),list=true,use-equal +\end{sourcecode} + +\begin{experimental}[format=\bfseries,delta=(ppm),list=true,use-equal] + \sisetup{separate-uncertainty,per-mode=symbol,detect-all,range-phrase=--} + \data*{yield} \SI{17}{\milli\gram} yellow needles (\SI{0.04}{\milli\mole}, + \SI{13}{\percent}). + % + \data{mp.} \SI{277}{\celsius} (DSC). + % + \NMR(600)[CDCl3] \val{2.01} (s, \#{24}, \pos{5}), \val{2.31} (s, \#{12}, + \pos{1}), \val{6.72--6.74} (m, \#{2}, \pos{11}), \val{6.82} (s, \#{8}, + \pos{3}), \val{7.05--7.07} (m, \#{2}, \pos{12}), \val{7.39--7.41} (m, \#{4}, + \pos{9}), \val{7.48--7.49} (m, \#{4}, \pos{8}). + % + \NMR{13,C}(150)[CDCl3] \val{21.2} ($+$, \#{4}, \pos{1}), \val{23.4} ($+$, + \#{8}, \pos{5}), \val{126.0} ($+$, \#{4}, \pos{9}), \val{128.2} ($+$, \#{8}, + \pos{3}), \val{130.8} ($+$, \#{2}, \pos{12}), \val{133.6} ($+$, \#{2}, + \pos{11}), \val{137.0} ($+$, \#{4}, \pos{8}), \val{138.6} (q, \#{4}, + \pos{2}), \val{140.6} (q, \#{2}, \pos{10}), \val{140.8} (q, \#{8}, \pos{4}), + \val{141.8} (q, \#{4}, \pos{6}), \val{145.6} (q, \#{2}, \pos{7}). + % + \data{MS}[DCP, EI, \SI{60}{\electronvolt}] \val{703} (2, \ch{M+}), \val{582} + (1), \val{462} (1), \val{249} (13), \val{120} (41), \val{105} (100). + % + \data{MS}[\ch{MeOH + H2O + KI}, ESI, \SI{10}{\electronvolt}] \val{720} (100, + \ch{M+ + OH-}), \val{368} (\ch{M+ + 2 OH-}). + % + \data{IR}[KBr] \val{3443} (w), \val{3061} (w), \val{2957} (m), \val{2918} + (m), \val{2856} (w), \val{2729} (w), \val{1725} (w), \val{1606} (s), + \val{1592} (s), \val{1545} (w), \val{1446} (m), \val{1421} (m), \val{1402} + (m), \val{1357} (w), \val{1278} (w), \val{1238} (s), \val{1214} (s), + \val{1172} (s), \val{1154} (m), \val{1101} (w), \val{1030} (w), \val{979} + (m), \val{874} (m), \val{846} (s), \val{818} (w), \val{798} (m), \val{744} + (w), \val{724} (m), \val{663} (w), \val{586} (w), \val{562} (w), \val{515} + (w). + % + \data*{UV-Vis} \SI{386}{\nano\metre} ($\varepsilon = \val{65984}$), + \SI{406}{\nano\metre} ($\varepsilon = \val{65378}$). + % + \data*{quantum yield} $\Phi = \val{0.74+-0.1}$\,. +\end{experimental} + +\paragraph{Crazy} +Output for these options: + +\begin{sourcecode} + format=\color{red}\itshape, + list=true, + delta=\textcolor{green}{\ch{M+ + H2O}}, + pos-number=side, + coupling-unit=\mega\gram\per\square\second, + list-setup=, + use-equal +\end{sourcecode} + +\begin{experimental}[ + format=\color{red}\itshape, + list=true, + delta=\textcolor{green}{\ch{M+ + H2O}}, + pos-number=side, + coupling-unit=\mega\gram\per\square\second, + list-setup=,use-equal] + \sisetup{separate-uncertainty,per-mode=symbol,detect-all,range-phrase=--} + \data*{yield} \SI{17}{\milli\gram} yellow needles (\SI{0.04}{\milli\mole}, + \SI{13}{\percent}). + % + \data{mp.} \SI{277}{\celsius} (DSC). + % + \NMR(600)[CDCl3] \val{2.01} (s, \#{24}, \pos{5}), \val{2.31} (s, \#{12}, + \pos{1}), \val{6.72--6.74} (m, \#{2}, \pos{11}), \val{6.82} (s, \#{8}, + \pos{3}), \val{7.05--7.07} (m, \#{2}, \pos{12}), \val{7.39--7.41} (m, \#{4}, + \pos{9}), \val{7.48--7.49} (m, \#{4}, \pos{8}). + % + \NMR{13,C}(150)[CDCl3] \val{21.2} ($+$, \#{4}, \pos{1}), \val{23.4} ($+$, + \#{8}, \pos{5}), \val{126.0} ($+$, \#{4}, \pos{9}), \val{128.2} ($+$, \#{8}, + \pos{3}), \val{130.8} ($+$, \#{2}, \pos{12}), \val{133.6} ($+$, \#{2}, + \pos{11}), \val{137.0} ($+$, \#{4}, \pos{8}), \val{138.6} (q, \#{4}, + \pos{2}), \val{140.6} (q, \#{2}, \pos{10}), \val{140.8} (q, \#{8}, \pos{4}), + \val{141.8} (q, \#{4}, \pos{6}), \val{145.6} (q, \#{2}, \pos{7}). + % + \data{MS}[DCP, EI, \SI{60}{\electronvolt}] \val{703} (2, \ch{M+}), \val{582} + (1), \val{462} (1), \val{249} (13), \val{120} (41), \val{105} (100). + % + \data{MS}[\ch{MeOH + H2O + KI}, ESI, \SI{10}{\electronvolt}] \val{720} (100, + \ch{M+ + OH-}), \val{368} (\ch{M+ + 2 OH-}). + % + \data{IR}[KBr] \val{3443} (w), \val{3061} (w), \val{2957} (m), \val{2918} + (m), \val{2856} (w), \val{2729} (w), \val{1725} (w), \val{1606} (s), + \val{1592} (s), \val{1545} (w), \val{1446} (m), \val{1421} (m), \val{1402} + (m), \val{1357} (w), \val{1278} (w), \val{1238} (s), \val{1214} (s), + \val{1172} (s), \val{1154} (m), \val{1101} (w), \val{1030} (w), \val{979} + (m), \val{874} (m), \val{846} (s), \val{818} (w), \val{798} (m), \val{744} + (w), \val{724} (m), \val{663} (w), \val{586} (w), \val{562} (w), \val{515} + (w). + % + \data*{UV-Vis} \SI{386}{\nano\metre} ($\varepsilon = \val{65984}$), + \SI{406}{\nano\metre} ($\varepsilon = \val{65378}$). + % + \data*{quantum yield} $\Phi = \val{0.74+-0.1}$\,. +\end{experimental} + +\subsection{The \chemmodule*{thermodynamics} Module}\label{sec:thermodynamics-module} + +The \chemmodule{thermodynamics} module loads the \pkg{siunitx} +package~\cite{pkg:siunitx}. + +\subsubsection{The \cs*{state} Macro} + +\begin{commands} + \command{state}[\oarg{options}\marg{symbol}] + Typeset a state variable. +\end{commands} + +This macro can be used to write the thermodynamic state variables. +\begin{example} + \state{A}, \state[subscript-left=f]{G} , + \state[subscript-right=\ch{Na}]{E}, + \state[superscript-right=\SI{1000}{\celsius}]{H} +\end{example} + +These options are available: +\begin{options} + \keyval{pre}{text}\Module{thermodynamics}\Default{\cs{changestate}} + Code inserted before the variable. Inserted in text mode. + \keyval{post}{text}\Module{thermodynamics}\Default + Code inserted after the variable. Inserted in text mode. + \keyval{superscript-left}{text}\Module{thermodynamics}\Default + The left superscript. Inserted in text mode. + \keyval{superscript-right}{text}\Module{thermodynamics}\Default{\cs{standardstate}} + The right superscript. Inserted in text mode. + \keyval{superscript}{text}\Module{thermodynamics} + An alias of \option{superscript-right}. + \keyval{subscript-left}{text}\Module{thermodynamics}\Default + The left subscript. Inserted in text mode. + \keyval{subscript-right}{text}\Module{thermodynamics}\Default + The right subscript. Inserted in text mode. + \keyval{subscript}{text}\Module{thermodynamics} + An alias of \option{subscript-left}. +\end{options} + +\subsubsection{Thermodynamic Variables} + +The \chemmodule{thermodynamics} module provides a few commands for specific +thermodynamic variables: +\begin{commands} + \command{enthalpy}[\sarg\oarg{options}\darg{subscript}\marg{value}] + Typeset the amount of enthalpy. + \command{entropy}[\sarg\oarg{options}\darg{subscript}\marg{value}] + Typeset the amount of entropy. + \command{gibbs}[\sarg\oarg{options}\darg{subscript}\marg{value}] + Typeset the amount of Gibbs enthalpy. +\end{commands} + +Their usage is pretty much self-explaining: +\begin{example}[side-by-side] + \enthalpy{123} \par + \entropy{123} \par + \gibbs{123} +\end{example} +The argument \darg{subscript} adds a subscript for specification, \sarg\ hides +number and unit: +\begin{example}[side-by-side] + \enthalpy(r){123} \par + \enthalpy*{123} \par +\end{example} + +\begin{options} + \keyval{pre}{text}\Module{thermodynamics}\Default{\cs{changestate}} + Code inserted before the variable. Inserted in text mode. + \keyval{post}{text}\Module{thermodynamics}\Default + Code inserted after the variable. Inserted in text mode. + \keyval{superscript-left}{text}\Module{thermodynamics}\Default + The left superscript. Inserted in text mode. + \keyval{superscript-right}{text}\Module{thermodynamics}\Default{\cs{standardstate}} + The right superscript. Inserted in text mode. + \keyval{superscript}{text}\Module{thermodynamics} + An alias of \option{superscript-right}. + \keyval{subscript-left}{text}\Module{thermodynamics}\Default + The left subscript. Inserted in text mode. + \keyval{subscript-right}{text}\Module{thermodynamics}\Default + The right subscript. Inserted in text mode. + \keyval{subscript}{text}\Module{thermodynamics} + An alias of \option{subscript-left}. + \keychoice{subscript-pos}{left,right}\Module{thermodynamics}\Default{left} + Determines wether the subscript given in \darg{subscript} is placed to the + left or the right of the variable. + \keyval{symbol}{symbol}\Module{thermodynamics}\Default + The symbol of the variable. Inserted in math mode. + \keyval{unit}{unit}\Module{thermodynamics}\Default + A valid \pkg{siunitx} unit. +\end{options} + +The default values depend on the command. +\begin{example}[side-by-side] + \enthalpy[unit=\kilo\joule]{-285} \par + \gibbs[pre=]{0} \par + \entropy[pre=$\Delta$,superscript=]{56.7} +\end{example} +The unit is set corresponding to the rules of \pkg{siunitx} and depends on +its settings: +\begin{example}[side-by-side] + \enthalpy{-1234.56e3} \par + \sisetup{ + per-mode=symbol, + exponent-product=\cdot, + output-decimal-marker={,}, + group-four-digits=true + } + \enthalpy{-1234.56e3} +\end{example} + +\subsubsection{Create New Variables or Redefine Existing Ones} + +\begin{commands} + \command{NewChemState}[\marg{cs}\marg{options}] + Define new state commands like \cs{enthalpy}. Gives an error is \meta{cs} + already exists. + \command{RenewChemState}[\marg{cs}\marg{options}] + Redefine existing state commands. + \command{DeclareChemState}[\marg{cs}\marg{options}] + Like \cs{NewChemState} but gives now error if \meta{cs} already exists. + \command{ProvideChemState}[\marg{cs}\marg{options}] + Define new state commands like \cs{enthalpy}. Defines \meta{cs} only if + it is not defined, yet. +\end{commands} +The argument \meta{options} is a comma separated list of key/value options: +\begin{options} + \keyval{pre}{text}\Module{thermodynamics}\Default{\cs{changestate}} + Code inserted before the variable. Inserted in text mode. + \keyval{post}{text}\Module{thermodynamics}\Default + Code inserted after the variable. Inserted in text mode. + \keyval{superscript-left}{text}\Module{thermodynamics}\Default + The left superscript. Inserted in text mode. + \keyval{superscript-right}{text}\Module{thermodynamics}\Default{\cs{standardstate}} + The right superscript. + \keyval{superscript}{text}\Module{thermodynamics} + An alias of \option{superscript-right}. + \keyval{subscript-left}{text}\Module{thermodynamics}\Default + The left subscript. Inserted in text mode. + \keyval{subscript-right}{text}\Module{thermodynamics}\Default + The right subscript. Inserted in text mode. + \keyval{subscript}{text}\Module{thermodynamics} + An alias of \option{subscript-left}. + \keychoice{subscript-pos}{left,right}\Module{thermodynamics}\Default{left} + Determines wether the subscript given in \darg{subscript} is placed to the + left or the right of the variable. + \keyval{symbol}{symbol}\Module{thermodynamics}\Default + The symbol of the variable. + \keyval{unit}{unit}\Module{thermodynamics}\Default + A valid \pkg{siunitx} unit. +\end{options} + +\begin{example} + \NewChemState\Helmholtz{ symbol=A , unit=\kilo\joule\per\mole } + \NewChemState\ElPot{ symbol=E , subscript-pos=right , superscript= , unit=\volt } + \Helmholtz{123.4} \par + \ElPot{-1.1} \par + \ElPot[superscript=0]($\ch{Sn}|\ch{Sn^2+}||\ch{Pb^2+}|\ch{Pb}$){0.01} \par + \RenewChemState\enthalpy{ symbol=h , unit=\joule} \par + \enthalpy(f){12.5} +\end{example} + +The existing commands have been defined like this: +\begin{sourcecode} + \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 } +\end{sourcecode} + +So -- for following thermodynamic conventions -- one could define a molar and +an absolute variable: +\begin{example} + \RenewChemState\enthalpy{symbol=h,superscript=,unit=\kilo\joule\per\mole}% molar + \NewChemState\Enthalpy{symbol=H,superscript=,unit=\kilo\joule}% absolute + \enthalpy{-12.3} \Enthalpy{-12.3} +\end{example} + +\subsection{The \chemmodule*{units} Module}\label{sec:units-module} + +The \chemmodule{units} module loads the \pkg{siunitx} +package~\cite{pkg:siunitx}. + +In chemistry some non-SI units are very common. \pkg{siunitx} provides the +command +\begin{commands} + \command*{DeclareSIUnit}[\marg{cs}\marg{unit}] + Define \meta{cs} to be a valid unit command inside \pkg{siunitx}' macros + \cs*{SI} and \cs*{si} which represents \meta{unit}. +\end{commands} +to add arbitrary units. \chemmacros\ uses that command to provide some +units. Like all \pkg{siunitx} units they're only valid inside +\cs*{SI}\marg{num}\marg{unit} and \cs*{si}\marg{unit}. +\begin{commands} + \command{atmosphere} \si{\atmosphere} + \command{atm} \si{\atm} + \command{calory} \si{\calory} + \command{cal} \si{\cal} + \command{cmc} \si{\cmc} \par + The units \cs{cmc}, \cs{molar}, and \cs{Molar} are defined by the + package \pkg{chemstyle} as well. \chemmacros\ only defines them, if + \pkg{chemstyle} is not loaded. + \command{molar} \si{\molar} + \command{moLar} \si{\moLar} + \command{Molar} \si{\Molar} + \command{MolMass} \si{\MolMass} + \command{normal} \si{\normal} + \command{torr} \si{\torr} +\end{commands} + +By the way: \cs*{mmHg} \si{\mmHg} already is defined by \pkg{siunitx}. + +\section{Internal Modules} + +\subsection{The \chemmodule*{tikz} Module}\label{sec:tikz-module} + +The \chemmodule{tikz} module loads the \pkg{tikz} package~\cite{pkg:pgf} and +the \TikZ\ library \code{calc}. + +\subsubsection{For Users} +The \chemmodule{tikz} module defines a few arrow tips: +\begin{tikzcode} + \arrowtip{el} + An arrow tip: \verbcode+\tikz\draw[-el](0,0)--(1,0);+ + \tikz\draw[-el](0,0)--(1,0); + \arrowtip{left el} + An arrow tip: \verbcode+\tikz\draw[-left el](0,0)--(1,0);+ + \tikz\draw[-left el](0,0)--(1,0); + \arrowtip{right el} + An arrow tip: \verbcode+\tikz\draw[-right el](0,0)--(1,0);+ + \tikz\draw[-right el](0,0)--(1,0); +\end{tikzcode} + +The\sinceversion{5.3} \chemmodule{tikz} module also loads the libraries +\code{calc} and \code{decorations.pathmorphing}. It uses those libraries for +defining a new decoration \tikzdecoration{wave}. +\begin{example}[side-by-side] + \begin{tikzpicture} + \draw[decorate,decoration=wave] (0,0) -- (2,0) ; + \end{tikzpicture} +\end{example} + +\subsubsection{For Module Writers} +The \chemmodule{tikz} module provides some macros for common \TikZ\ +functions. This allows to use expl3's powerful function variants for +expansion control. + +\begin{commands} + \explcommand{c_chemmacros_other_colon_tl} + A constant tokenlist which contains a colon with category code~12 (other). + This is useful since \TikZ\ sometimes expects an other colon and in an + expl3 programming environment \code{:} has category code~11 (letter). + \explcommand{chemmacros_tikz_picture:nn}[ \marg{options} \marg{code}] + Defined as \verbcode+\tikzpicture[{#1}] #2 \endtikzpicture+. + \explcommand{chemmacros_tikz:nn}[ \marg{options} \marg{code}] + Defined as \verbcode+\tikz[{#1}]{#2}+. + \explcommand{chemmacros_tikz_draw:n}[ \marg{options}] + Defined as \verbcode+\draw[{#1}]+. + \explcommand{chemmacros_tikz_node:n}[ \marg{options}] + Defined as \verbcode+\node[{#1}]+. + \explcommand{chemmacros_tikz_shade:n}[ \marg{options}] + Defined as \verbcode+\shade[{#1}]+. + \explcommand{chemmacros_tikz_shadedraw:n}[ \marg{options}] + Defined as \verbcode+\shadedraw[{#1}]+. + \explcommand{chemmacros_tikz_node_in_draw:n}[ \marg{options}] + Defined as \verbcode+node[{#1}]+. +\end{commands} + +\subsection{The \chemmodule*{xfrac} Module}\label{sec:xfrac-module} + +The \chemmodule{xfrac} module loads the package +\pkg{xfrac}~\cite{bnd:l3packages}. For the following explanations it will be +helpful if you know about said package and how it works first. This module is +a support module that defines the macro +\begin{commands} + \command{chemfrac}[\oarg{type}\marg{numerator}\marg{denominator}] + \meta{type} can either be \code{text} or \code{superscript}. +\end{commands} +This macro calls a certain instance of the \pkg{xfrac} \code{text} template, +depending on the option \meta{type} and the current font family. If used +\cs{chemfrac} looks if an instance +\begin{center} + \code{chemmacros-frac-\cs*{f@family}-\meta{type}} +\end{center} +exists. If yes this instance is used, if no the instance +\code{chemmacros-frac-default-\meta{type}} is used. The \code{default} +instances are the same as the ones for \code{cmr}. + +\begin{table} + \centering + \newcommand*\showfrac[1]{% + \code{#1} & + \fontfamily{#1}\selectfont + \chemfrac[text]{2}{3} & + \fontfamily{#1}\selectfont + \chemfrac[superscript]{2}{3}% + } + \caption{Predefined \chemmodule{xfrac} \code{text} instances.} + \label{tab:xfrac} + \begin{tabular}{llcc} + \toprule + \bfseries font family & \bfseries text & \bfseries superscript \\ + \midrule + \showfrac{cmr} \\ + \showfrac{lmr} \\ + \showfrac{LinuxLibertineT-TLF} \\ + \showfrac{LinuxLibertineT-TOsF} \\ + \bottomrule + \end{tabular} +\end{table} + +The \chemmodule{xfrac} module defines instances some font families, they are +listed and demonstrated in table~\vref{tab:xfrac}. The \code{superscript} +type fractions \emph{look} larger than the \code{text} types. The reason is +that the \code{superscript} types are typically used with a smaller font size. +Let's take a look at an example where both instances are used: +\begin{example}[side-by-side] + \chemsetup[redox]{pos=top} + \code{superscript}: + \ch{"\ox{1/3,I}" {}3+} + + \chemsetup[redox]{pos=side} + \code{text}: \ox{1/3,I3+} + + \huge + \chemsetup[redox]{pos=top} + \code{superscript}: + \ch{"\ox{1/3,I}" {}3+} + + \chemsetup[redox]{pos=side} + \code{text}: \ox{1/3,I3+} +\end{example} + +If you define instances for other families please feel free to submit them to +me (see section~\vref{sec:submitting-module}) so they can be added to the +\chemmodule{xfrac} module. + +\appendix +\part{Appendix} +\section{Own Modules}\label{sec:own-modules} +\subsection{How To} + +If you have additional functionality which you think might be useful as a +\chemmacros\ module then you can easily write one yourself. The module must +be a file in a path where \TeX\ can find it following a certain naming +scheme. The file for a module \chemmodule*{foo} \emph{must be named} +\code{chemmacros.module.foo.code.tex}. + +\begin{commands} + \command{ChemModule}[\sarg\marg{name}\marg{description}\oarg{minimal + compatibility version}] + Register module \meta{name}. The optional argument \meta{minimal + compatibility version} ensures that this module is only loaded if the + option \option{compatibility} has a high enough version number. If it is + omitted the module can be loaded in each version~5.0 or higher. +\end{commands} + +The first line in the file then should look similar to this: +\begin{sourcecode} + \ChemModule{foo}{2015/07/14 description of foo} +\end{sourcecode} +This registers module \chemmodule*{foo} which means \chemmacros\ will accept +this file as a valid module. + +Since \chemmacros\ is written using expl3 \cs{ChemModule} starts an expl3 +programming environment. If you don't want that but rather want to write your +module using traditional \LaTeXe\ methods then use the starred variant: +\begin{sourcecode} + \ChemModule*{foo}{2015/07/14 description of foo} +\end{sourcecode} +In both variants \code{@} has category code~11 (letter). + +Since new modules very likely might rely on code provided first in a certain +version of \chemmacros\ you might want to make sure that your module only is +loaded when the compatibility mode is high enough to provide the features you +want: +\begin{sourcecode} + \ChemModule{foo}{2015/10/14 description of foo}[5.2] +\end{sourcecode} + +You should be aware that your module \emph{will not be loaded} with +\verbcode+\usechemmodule{all}+! The pseudo-module \chemmodule{all} contains a +manually maintained list of the modules that are loaded by it. + +If you decide to write your module \chemmodule*{foo} using expl3 and add +options you want to be able to set using +\cs{chemsetup}\Oarg{foo}\marg{options} please make sure you define (and set) +them with the following macros: +\begin{commands} + \explcommand{chemmacros_define_keys:nn}[ \marg{module} \marg{key definitions}] + Define l3keys options for the module \meta{module}. This is a wrapper for + \explcs*{keys_define:nn} \Marg{chemmacros/\meta{module}} \marg{key + definitions}. + \explcommand{chemmacros_set_keys:nn}[ \marg{module} \marg{input}] + Sets l3keys options for the module \meta{module}. This is a wrapper for + \explcs*{keys_set:nn} \Marg{chemmacros/\meta{module}} \marg{input}. +\end{commands} +Also (\emph{especially if you consider submitting the module, see + section~\vref{sec:submitting-module}}) please follow the expl3 naming +conventions for variables and functions, \ie, use \code{chemmacros} as expl3 +module name: +\begin{sourcecode} + \tl_new:N \l__chemmacros_my_internal_variable_tl + \tl_new:N \l_chemmacros_my_public_variable_tl + \cs_new:Npn \__chemmacros_my_internal_function:n #1 { ... } + \cs_new_protected:Npn \chemmacros_my_public_function:n #1 { ... } + \NewDocumentCommand \publicfunction {m} + { \chemmacros_my_public_function:n {#1} } +\end{sourcecode} +You will find more details on the naming conventions in \code{interface3.pdf} +which most likely is available on your system: +\begin{lbash} + texdoc interface3 +\end{lbash} +If you haven't read section~\vref{sec:base-module} about the \chemmodule{base} +module, yet, please have a look. There some macros for module writers are +described. Also other modules define macros for module writers which may be +useful. + +\subsection{Submitting a Module}\label{sec:submitting-module} + +If you have written a module and feel it might be useful for other users +please feel free to contact me and submit the module. I will surely take at +look at both functionality and code and if I feel that it adds value to +\chemmacros\ I will add it to the package. Requirement for this is that the +module is licensed with the \LPPL\ (v1.3 or later) and that I take over +maintenance (according to the \enquote{maintainer} status of the \lppl). + +Please do \emph{not} submit your module via pull request but send me the files +directly. In the best case you also have a short piece of documentation. + +\section{Suggestions, Bug Reports, Support}\label{sec:sugg-bug-reports} + +\paragraph{Support} +If you need support or help with anything regarding \chemmacros\ please use +the usual support forums +\begin{itemize} + \item \url{http://www.golatex.de/} or + \item \url{http://texwelt.de/wissen/} if you speak German, + \item \url{http://www.latex-community.org/forum/} or + \item \url{http://tex.stackexchange.com/} if you speak English +\end{itemize} +or go the \emph{dedicated support forum} +\begin{itemize} + \item \url{http://www.mychemistry.eu/forums/forum/chemmacros/} +\end{itemize} +where you can be sure that I will see the question. + +\paragraph{Suggestions} +If you have any suggestions on how \chemmacros\ could be improved, adding +missing features \etc, please feel free to contact me via +\email{contact@mychemistry.eu}. + +\paragraph{Bug reports} +If you find any bugs, \ie, errors (something not working as described, +conflicts with other packages, \ldots) then please go to +\url{https://github.com/cgnieder/chemmacros/issues/} and open a new issue +describing the error including a minimal working example. + +\end{document} |