diff options
author | Karl Berry <karl@freefriends.org> | 2022-03-12 20:32:53 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2022-03-12 20:32:53 +0000 |
commit | fa397b3cb5be4c244c628f9afde3d88a1302a3fe (patch) | |
tree | 3bb4cf0fb5a589926667569463072217135c1f78 /Master/texmf-dist/tex | |
parent | df57333a15353ed7a8a5754080d95e07bd8cf878 (diff) |
chemmacros (12mar22)
git-svn-id: svn://tug.org/texlive/trunk@62655 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex')
3 files changed, 4389 insertions, 7 deletions
diff --git a/Master/texmf-dist/tex/latex/chemmacros/chemmacros-2015-02-08.sty b/Master/texmf-dist/tex/latex/chemmacros/chemmacros-2015-02-08.sty new file mode 100644 index 00000000000..85e1c475c12 --- /dev/null +++ b/Master/texmf-dist/tex/latex/chemmacros/chemmacros-2015-02-08.sty @@ -0,0 +1,4112 @@ +% -------------------------------------------------------------------------- +% the CHEMMACROS package +% +% loads of little helpers for chemists +% +% -------------------------------------------------------------------------- +% Clemens Niederberger +% -------------------------------------------------------------------------- +% https://github.org/cgnieder/chemmacros/ +% contact@mychemistry.eu +% -------------------------------------------------------------------------- +% If you have any ideas, questions, suggestions or bugs to report, please +% feel free to contact me. +% -------------------------------------------------------------------------- +% Copyright 2011-2015 Clemens Niederberger +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Clemens Niederberger. +% -------------------------------------------------------------------------- +\RequirePackage{ expl3 , xparse , l3keys2e } +\def\chemmacros@version{4.7} +\def\chemmacros@date{2015/02/08} + +\ProvidesExplPackage + {chemmacros} + {\chemmacros@date} + {\chemmacros@version} + {loads of little helpers for chemists (CN)} + +% -------------------------------------------------------------------------- +% check expl3 version: +\@ifpackagelater { expl3 } { 2013/12/14 } + { } + { + \PackageError { chemmacros } { Support~package~expl3~too~old } + { + You~need~to~update~your~installation~of~the~bundles~'l3kernel'~and~ + 'l3packages'.\MessageBreak + Loading~chemmacros~will~abort! + } + \tex_endinput:D + } + +% -------------------------------------------------------------------------- +% 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 } +\cs_generate_variant:Nn \tl_to_lowercase:n { f } + +% -------------------------------------------------------------------------- +% 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 } + { + 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: + { \mode_if_math:TF { \sb } { \textsuperscript } } + +\bool_new:N \l__chemmacros_inside_iupac_bool + +\group_begin: +\char_set_catcode_active:N \~ +\char_set_lccode:nn {`~} {`|} +\tl_to_lowercase:n { \group_end: \cs_set_eq:NN ~ } \chemmacros_break_point: + +\group_begin: +\char_set_catcode_active:N \~ +\char_set_lccode:nn {`~} {`^} +\tl_to_lowercase:n { \group_end: \cs_set_protected:Npn ~ } + { \chemmacros_superscript: } + +\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: + } + +% \cs_new_protected:Npn \chemmacros_iupac_aux:n #1 +% { +% #1 +% \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 diff --git a/Master/texmf-dist/tex/latex/chemmacros/chemmacros-2020-03-07.sty b/Master/texmf-dist/tex/latex/chemmacros/chemmacros-2020-03-07.sty new file mode 100644 index 00000000000..0930f27a2ce --- /dev/null +++ b/Master/texmf-dist/tex/latex/chemmacros/chemmacros-2020-03-07.sty @@ -0,0 +1,268 @@ +% -------------------------------------------------------------------------- +% 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--2020 Clemens Niederberger +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Clemens Niederberger. +% -------------------------------------------------------------------------- +\RequirePackage{expl3,xparse,l3keys2e} +\ExplSyntaxOn + +% -------------------------------------------------------------------------- +% package information: +\tl_const:Nn \c_chemmacros_date_tl {2020/03/07} +\tl_const:Nn \c_chemmacros_version_major_number_tl {5} +\tl_const:Nn \c_chemmacros_version_minor_number_tl {11} +\tl_const:Nn \c_chemmacros_version_subrelease_tl {} +\tl_const:Nx \c_chemmacros_version_number_tl + { + \c_chemmacros_version_major_number_tl . + \c_chemmacros_version_minor_number_tl + } +\tl_const:Nx \c_chemmacros_version_tl + { + \c_chemmacros_version_number_tl + \c_chemmacros_version_subrelease_tl + } +\tl_const:Nn \c_chemmacros_info_tl + {comprehensive~ support~ for~ typesetting~ chemistry~ documents} + +\ProvidesExplPackage + {chemmacros} + {\c_chemmacros_date_tl} + {\c_chemmacros_version_tl} + {\c_chemmacros_info_tl \c_space_tl (CN)} + +% -------------------------------------------------------------------------- +% 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_lazy_and:nnT + { \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} } + +\file_input_stop: diff --git a/Master/texmf-dist/tex/latex/chemmacros/chemmacros.sty b/Master/texmf-dist/tex/latex/chemmacros/chemmacros.sty index f9b0bf50cde..64f237e629d 100644 --- a/Master/texmf-dist/tex/latex/chemmacros/chemmacros.sty +++ b/Master/texmf-dist/tex/latex/chemmacros/chemmacros.sty @@ -1,5 +1,5 @@ % -------------------------------------------------------------------------- -% the CHEMMACROS package v6.2 2022/03/05 +% the CHEMMACROS package v6.2a 2022/03/12 % % comprehensive support for typesetting chemistry documents % @@ -34,10 +34,10 @@ % -------------------------------------------------------------------------- % package information: -\tl_const:Nn \c_chemmacros_date_tl {2022/03/05} +\tl_const:Nn \c_chemmacros_date_tl {2022/03/11} \tl_const:Nn \c_chemmacros_version_major_number_tl {6} \tl_const:Nn \c_chemmacros_version_minor_number_tl {2} -\tl_const:Nn \c_chemmacros_version_subrelease_tl {} +\tl_const:Nn \c_chemmacros_version_subrelease_tl {a} \tl_const:Nx \c_chemmacros_version_number_tl { \c_chemmacros_version_major_number_tl . @@ -1708,9 +1708,9 @@ { { \ensuremath { \chemmacros_standardstate: } } } \cs_new_protected:Npn \chemmacros_standardstate: - { \mathpalette \chemmacros_standardstate_aux: \circ } + { \mathpalette \__chemmacros_standardstate: \circ } -\cs_new_protected:Npn \chemmacros_standardstate_aux: #1#2 +\cs_new_protected:Npn \__chemmacros_standardstate: #1#2 { \ooalign { @@ -3959,9 +3959,10 @@ % -------------------------------------------------------------------------- \ChemModuleEnd -\ChemModule{reactions}{2022/02/05 reaction environments} +\ChemModule{reactions}{2022/03/11 reaction environments} \newcounter {reaction} + \hook_gput_code:nnn {package/hyperref/after} {chemmacros} { \cs_if_exist:NTF \chapter @@ -4118,10 +4119,11 @@ { \bool_if:NT \l__chemmacros_reactions_counter_bool { + \chemmacros_patch_cmd:Nnn \thereaction {reaction} {equation} \cs_set_eq:NN \r@equation \r@reaction \cs_set_eq:NN \p@equation \p@reaction \cs_set_eq:NN \c@equation \c@reaction - \chemmacros_patch_cmd:Nnn \thereaction {reaction} {equation} + \cs_set_eq:NN \theequation \thereaction \chemmacros_if_package_loaded:nT {cleveref} { \crefalias {equation} {reaction} } % this only works if nobody steps counters inside reactions: |