%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % --------------------------------------------------------------------------- % % - the CHEMMACROS bundle - % % - chemmacros.sty - % % - macros and commands for chemists - % % --------------------------------------------------------------------------- % % - Clemens Niederberger - % % --------------------------------------------------------------------------- % % - https://bitbucket.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-2013 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 , xfrac , siunitx } \RequirePackage{ tikz , mathtools , environ , scrlfile , etoolbox , bm } \usetikzlibrary{calc,arrows} \def\chemmacros@version{3.5} \def\chemmacros@date{2013/01/28} \ProvidesExplPackage {chemmacros} {\chemmacros@date} {\chemmacros@version} {macros and commands for chemists} \@ifpackageloaded { chemformula } {} { \RequirePackage { chemformula } } \bool_new:N \l__chemmacros_version_one_bool \bool_new:N \l__chemmacros_xspace_bool \bool_set_true:N \l__chemmacros_xspace_bool \bool_new:N \l__chemmacros_bpchem_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_use_mhchem_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 \cs_new:Npn \chemmacros_msg:nnxx #1#2#3#4 { \bool_if:NTF \l__chemmacros_strict_bool { \msg_error:nnxx { #1 } { #2 } { #3 } { #4 } } { \msg_warning:nnxx { #1 } { #2 } { #3 } { #4 } } } \msg_set: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_set:nnnn { chemmacros } { already-defined } { The~command~#1~has~also~been~defined~by~another~package. } { The~command~#1~has~also~been~defined~by~another~package.~ chemmacros~provides~an~alternative~definition.~ See~the~documentation~for~more~information. } \msg_set: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_set: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. } \cs_new_protected:Npn \chemmacros_define_deprecated:NNn #1#2#3 { \cs_new_protected:Npn #1 { \chemmacros_msg:nnxx { chemmacros } { command-deprecated } { #1 } { #2 } #3 } } \NewDocumentCommand \DeclareChemDeprecated { mmm } { \chemmacros_define_deprecated:NNn #1 #2 { #3 } } \msg_set: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_set:nnnn { chemmacros } { declare-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 \DeclareChemParticle, ~but~the~command~sequence~ \token_to_str:N #1 \c_space_tl already~exists. ~Please~choose~another~name. } \msg_set: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_set:nnnn { chemmacros } { declare-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 \DeclareChemLatin,~but~the~command~sequence~ \token_to_str:N #1 \c_space_tl already~exists.~Please~choose~another~name. } \msg_set: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_set:nnnn { chemmacros } { declare-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 \DeclareChemParticle, ~but~the~command~sequence~ \token_to_str:N #1 \c_space_tl already~exists.~Please~choose~another~name. } \msg_set: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_set:nnnn { chemmacros } { declare-phase } { 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 \DeclareChemPhase , ~but~the~command~sequence~ \token_to_str:N #1 \c_space_tl already~exists. ~Please~choose~another~name. } \msg_set: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_set:nnnn { chemmacros } { declare-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 \DeclareChemIUPAC,~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_set: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 \DeclareChemIUPAC \c_space_tl instead . } \msg_set: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_set: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_set: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_set: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_set:nnnn { chemmacros } { DeclareChemState } { 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. } { 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_set:nnnn { chemmacros } { RenewChemState } { 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 \DeclareChemState \c_space_tl to~create~it. } { 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 \DeclareChemState \c_space_tl to~create~it. } % --------------------------------------------------------------------------- % % scratch 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 % --------------------------------------------------------------------------- % % package options % bpchem => use \IUPAC inside for \NMR command % 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 \bool_new:N \l__chemmacros_strict_bool \bool_new:N \l__chemmacros_detect_bold_bool \bool_set_true:N \l__chemmacros_detect_bold_bool \bool_new:N \l__chemmacros_use_upgreek_bool \bool_new:N \l__chemmacros_use_textgreek_bool \bool_new:N \l__chemmacros_option_greek_set_bool \tl_new:N \l__chemmacros_language_tl \tl_set:Nn \l__chemmacros_language_tl { english } \tl_new:N \l__chemmacros_current_language_tl \tl_set:Nn \l__chemmacros_current_language_tl { english } \cs_new:Npn \chemmacros_inner_font: {} \keys_define:nn { chemmacros / option } { bpchem .bool_set:N = \l__chemmacros_bpchem_bool , bpchem .default:n = true , 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 } , 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_msg:nnxx { chemmacros } { option-deprecated } { detect-bold } {} , EZ .code:n = \chemmacros_msg:nnxx { chemmacros } { option-deprecated } { EZ } {} , german .code:n = \tl_set:Nn \l__chemmacros_language_tl { german } , ngerman .code:n = \tl_set:Nn \l__chemmacros_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 .tl_set:N = \l__chemmacros_language_tl , method .choice: , method / chemformula .code:n = \bool_set_false:N \l__chemmacros_use_mhchem_bool , method / mhchem .code:n = \bool_set_true:N \l__chemmacros_use_mhchem_bool , 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 .bool_set:N = \l__chemmacros_strict_bool , strict .default:n = true , 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 = \bool_set_true:N \l__chemmacros_use_upgreek_bool \bool_set_false:N \l__chemmacros_use_textgreek_bool \bool_set_true:N \l__chemmacros_option_greek_set_bool , greek / textgreek .code:n = \bool_set_false:N \l__chemmacros_use_upgreek_bool \bool_set_true:N \l__chemmacros_use_textgreek_bool \bool_set_true:N \l__chemmacros_option_greek_set_bool , greek / math .code:n = \bool_set_false:N \l__chemmacros_use_upgreek_bool \bool_set_false:N \l__chemmacros_use_textgreek_bool \bool_set_true:N \l__chemmacros_option_greek_set_bool , greek / auto .code:n = \bool_set_false:N \l__chemmacros_use_upgreek_bool \bool_set_false:N \l__chemmacros_use_textgreek_bool \bool_set_false:N \l__chemmacros_option_greek_set_bool , greek .default:n = auto , upgreek .code:n = \chemmacros_msg:nnxx { chemmacros } { option-deprecated } { upgreek } {} , % dummy version for compatibility with KOMA's global option and backwards % compatibility of chemmacros version .code:n = \chemmacros_msg:nnxx { chemmacros } { option-deprecated } { version } {} , cmversion .choice: , cmversion / 1 .code:n = { \bool_set_true:N \l__chemmacros_version_one_bool } , cmversion / 2 .code:n = { \bool_set_false:N \l__chemmacros_version_one_bool } , cmversion / bundle .code:n = { \bool_set_false:N \l__chemmacros_version_one_bool } , xspace .bool_set:N = \l__chemmacros_xspace_bool , xspace .default:n = true } \ProcessKeysOptions { chemmacros / option } % --------------------------------------------------------------------------- % % language settings: \prop_new:N \l__chemmacros_language_prop \prop_put:Nnn \l__chemmacros_language_prop { english } { english } \prop_put:Nnn \l__chemmacros_language_prop { american } { english } \prop_put:Nnn \l__chemmacros_language_prop { british } { english } \prop_put:Nnn \l__chemmacros_language_prop { german } { german } \prop_put:Nnn \l__chemmacros_language_prop { ngerman } { german } \prop_put:Nnn \l__chemmacros_language_prop { italian } { italian } \prop_put:Nnn \l__chemmacros_language_prop { french } { french } \prop_map_inline:Nn \l__chemmacros_language_prop { \cs_if_exist:cF { l__chemmacros_ #2 _bool } { \bool_new:c { l__chemmacros_ #2 _bool } } } \cs_new_protected:Npn \chemmacros_set_language: { \prop_get:NoNTF \l__chemmacros_language_prop { \l__chemmacros_language_tl } \l__chemmacros_current_language_tl { \bool_set_true:c { l__chemmacros_ \l__chemmacros_current_language_tl _bool } } { \chemmacros_msg:nnxx { chemmacros } { language-not-defined } { \l__chemmacros_language_tl } { } } } \AtEndPreamble { \chemmacros_set_language: \chemmacros_make_phases: \bool_if:NT \l__chemmacros_ghsystem_bool { \RequirePackage { ghsystem } } \bool_if:NT \l__chemmacros_bpchem_bool { \RequirePackage { bpchem } } \bool_if:NT \l__chemmacros_xspace_bool { \RequirePackage { xspace } } \bool_if:NT \l__chemmacros_use_mhchem_bool { \RequirePackage[ version=3 ]{ mhchem } } \bool_if:NF \l__chemmacros_option_greek_set_bool { \@ifpackageloaded { upgreek } { \bool_set_true:N \l__chemmacros_use_upgreek_bool } { \@ifpackageloaded { textgreek } { \bool_set_true:N \l__chemmacros_use_textgreek_bool } { } } } \bool_if:NTF \l__chemmacros_use_upgreek_bool { \cs_set:Npn \Chemalpha { \ensuremath { \upalpha } } \cs_set:Npn \Chembeta { \ensuremath { \upbeta } } \cs_set:Npn \Chemgamma { \ensuremath { \upgamma } } \cs_set:Npn \Chemdelta { \ensuremath { \updelta } } \cs_set:Npn \Chemepsilon { \ensuremath { \upvarepsilon } } \cs_set:Npn \Chemeta { \ensuremath { \upeta } } \cs_set:Npn \Chemkappa { \ensuremath { \upkappa } } \cs_set:Npn \Chemmu { \ensuremath { \upmu } } \cs_set:Npn \Chemnu { \ensuremath { \upnu } } \cs_set:Npn \Chemrho { \ensuremath { \uprho } } \cs_set:Npn \Chempi { \ensuremath { \uppi } } \cs_set:Npn \Chemsigma { \ensuremath { \upsigma } } \cs_set:Npn \Chemomega { \ensuremath { \upomega } } \cs_set:Npn \ChemDelta { \ensuremath { \Updelta } } } { \bool_if:NT \l__chemmacros_use_textgreek_bool { \cs_set_protected:Npn \Chemalpha { \ensuremath { \text { \textalpha } } } \cs_set_protected:Npn \Chembeta { \ensuremath { \text { \textbeta } } } \cs_set_protected:Npn \Chemgamma { \ensuremath { \text { \textgamma } } } \cs_set_protected:Npn \Chemdelta { \ensuremath { \text { \textdelta } } } \cs_set_protected:Npn \Chemepsilon { \ensuremath { \text { \textepsilon } } } \cs_set_protected:Npn \Chemeta { \ensuremath { \text { \texteta } } } \cs_set_protected:Npn \Chemkappa { \ensuremath { \text { \textkappa } } } \cs_set_protected:Npn \Chemmu { \ensuremath { \text { \textmu } } } \cs_set_protected:Npn \Chemnu { \ensuremath { \text { \textnu } } } \cs_set_protected:Npn \Chemrho { \ensuremath { \text { \textrho } } } \cs_set_protected:Npn \Chempi { \ensuremath { \text { \textpi } } } \cs_set_protected:Npn \Chemsigma { \ensuremath { \text { \textsigma } } } \cs_set_protected:Npn \Chemomega { \ensuremath { \text { \textomega } } } \cs_set_protected:Npn \ChemDelta { \ensuremath { \text { \textDelta } } } } } } \cs_new:Npn \Chemalpha { \ensuremath { \alpha } } \cs_new:Npn \Chembeta { \ensuremath { \beta } } \cs_new:Npn \Chemgamma { \ensuremath { \gamma } } \cs_new:Npn \Chemdelta { \ensuremath { \delta } } \cs_new:Npn \Chemepsilon { \ensuremath { \varepsilon } } \cs_new:Npn \Chemeta { \ensuremath { \eta } } \cs_new:Npn \Chemkappa { \ensuremath { \kappa } } \cs_new:Npn \Chemmu { \ensuremath { \mu } } \cs_new:Npn \Chemnu { \ensuremath { \nu } } \cs_new:Npn \Chemrho { \ensuremath { \rho } } \cs_new:Npn \Chempi { \ensuremath { \pi } } \cs_new:Npn \Chemsigma { \ensuremath { \sigma } } \cs_new:Npn \Chemomega { \ensuremath { \omega } } \cs_new:Npn \ChemDelta { \ensuremath { \Delta } } \cs_new:Npn \chemmacros_xspace: { \bool_if:NT \l__chemmacros_xspace_bool { \xspace } } % --------------------------------------------------------------------------- % % TikZ drawings \cs_new:Npn \chemmacros_tikz_picture:nn #1#2 { \tikzpicture[#1] #2 \endtikzpicture } \cs_generate_variant:Nn \chemmacros_tikz_picture:nn { fn,xn } \cs_new:Npn \chemmacros_tikz_draw:n #1 { \draw[#1] } \cs_generate_variant:Nn \chemmacros_tikz_draw:n { f,x } \cs_new:Npn \chemmacros_tikz_node:n #1 { \node[#1] } \cs_generate_variant:Nn \chemmacros_tikz_node:n { f,x } \cs_new:Npn \chemmacros_tikz_shade:n #1 { \shade[#1] } \cs_generate_variant:Nn \chemmacros_tikz_shade:n { f,x } \cs_new:Npn \chemmacros_tikz_shadedraw:n #1 { \shadedraw[#1] } \cs_generate_variant:Nn \chemmacros_tikz_shadedraw:n { f,x } \cs_new:Npn \chemmacros_tikz_node_in_draw:n #1 { node[#1] } \cs_generate_variant:Nn \chemmacros_tikz_node_in_draw:n { f,x } % --------------------------------------------------------------------------- % % general functions \cs_new_protected:Npn \chemmacros_leave_vmode: { \hbox_unpack:N \c_empty_box } \cs_new_eq:NN \chemmacros_ignore_spaces: \tex_ignorespaces:D \cs_new:Npn \chemmacros_nobreak: { \tex_penalty:D \c_ten_thousand } \cs_new:Npn \chemmacros_allow_break: { \tex_penalty:D \c_zero } \cs_new:Npn \chemmacros_skip_nobreak:N #1 { \chemmacros_nobreak: \skip_horizontal:N #1 \chemmacros_nobreak: } % --------------------------------------------------------------------------- % % circled charge signs \cs_new_protected:Npn \chemmacros_fplus: { \ensuremath { \chemmacros_fplus_aux_i: } } \cs_new:Npn \chemmacros_fplus_aux_i: { \mathpalette \chemmacros_fplus_aux_ii: \bigcirc } % TODO: can I rewrite this in a more "expl3-way"? \cs_new:Npn \chemmacros_fplus_aux_ii: #1#2 { \ooalign { \tex_hfil:D $#1+$ \tex_hfil:D \tex_cr:D \tex_hfil:D $#1#2$ \tex_hfil:D \tex_cr:D } } \cs_new_protected:Npn \chemmacros_fminus: { \ensuremath { \chemmacros_fminus_aux_i: } } \cs_new:Npn \chemmacros_fminus_aux_i: { \mathpalette \chemmacros_fminus_aux_aux_ii: \bigcirc } \cs_new:Npn \chemmacros_fminus_aux_aux_ii: #1#2 { \ooalign { \tex_hfil:D $#1-$ \tex_hfil:D \tex_cr:D \tex_hfil:D $#1#2$ \tex_hfil:D \tex_cr:D } } % use directly: \cs_new_eq:NN \fplus \chemmacros_fplus: \cs_new_eq:NN \fminus \chemmacros_fminus: % change output depending on circled-option \cs_new:Npn \chemmacros_plus: { \bool_if:nTF { \l__chemmacros_circled_bool && !\l__chemmacros_circled_formal_bool } { \bool_if:NTF \l__chemmacros_circled_chem_bool { \chemmacros_fplus: } { \oplus } } { + } } \cs_new:Npn \chemmacros_minus: { \bool_if:nTF { \l__chemmacros_circled_bool && !\l__chemmacros_circled_formal_bool } { \bool_if:NTF \l__chemmacros_circled_chem_bool { \chemmacros_fminus: } { \ominus } } { - } } \cs_new_protected:Npn \chemmacros_formal_plus: { \group_begin: \bool_set_false:N \l__chemmacros_circled_formal_bool \chemmacros_plus: \group_end: } \cs_new_protected:Npn \chemmacros_formal_minus: { \group_begin: \bool_set_false:N \l__chemmacros_circled_formal_bool \chemmacros_minus: \group_end: } % --------------------------------------------------------------------------- % % transition state symbol \cs_new:Npn \chemmacros_transition_state_aux: { \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_aux: } } \cs_new_eq:NN \transitionstatesymbol \chemmacros_transition_state: \cs_new: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 { o,f,x,V } \cs_new:Npn \chemmacros_text:n #1 { \mode_if_math:TF { \text { #1 } } { #1 } } % add a possibility to let chemformula use the chemformula % with method=chemformula, too \tl_new:N \l__chemmacros_chemformula_tl \cs_new_protected:Npn \chemmacros_chemformula:n #1 { \bool_if:NTF \l__chemmacros_use_mhchem_bool { \ce { #1 } } { \group_begin: \cs_set_eq:NN \chemformula_font_inner: \chemmacros_inner_font: \chemformula_input_cmpd:nN { #1 } \l__chemmacros_chemformula_tl \mode_if_math:TF { \text { \l__chemmacros_chemformula_tl } } { { \l__chemmacros_chemformula_tl } } \group_end: } } \cs_generate_variant:Nn \chemmacros_chemformula:n { x,V } % --------------------------------------------------------------------------- % % particles, charges \bool_new:N \l__chemmacros_charge_append_bool \bool_set_false:N \l__chemmacros_charge_append_bool % TODO separate document and module level % \DeclareChemParticle, \RenewChemParticle \bool_if:NTF \l__chemmacros_use_mhchem_bool { \NewDocumentCommand \DeclareChemParticle { mm } { \cs_if_free:NTF #1 { \cs_new:Npn #1 { \ce { #2 } \chemmacros_xspace: } } { \chemmacros_msg:nnxx { chemmacros } { declare-particle } { #1 } {} } } \NewDocumentCommand \RenewChemParticle { mm } { \cs_if_free:NTF #1 { \chemmacros_msg:nnxx { chemmacros } { renew-particle } { #1 } {} } { \cs_set:Npn #1 { \ce { #2 } \chemmacros_xspace: } } } } { \NewDocumentCommand \DeclareChemParticle { mm } { \cs_if_free:NTF #1 { \chemmacros_chem_particle:Nn #1 { #2 } } { \chemmacros_msg:nnxx { chemmacros } { declare-particle } { #1 } {} } } \NewDocumentCommand \RenewChemParticle { mm } { \cs_if_free:NTF #1 { \chemmacros_msg:nnxx { chemmacros } { renew-particle } { #1 } {} } { \chemmacros_chem_particle:Nn #1 { #2 } } } } \cs_new_protected:Nn \chemmacros_chem_particle:Nn { \cs_set:Npn #1 { \bool_if:NTF \l__chemformula_inside_ch_bool { \chemformula_input_cmpd:nN { #2 } \l__chemmacros_chemformula_tl \tl_set_rescan:Nno \l__chemmacros_chemformula_tl { \ExplSyntaxOn } { \l__chemmacros_chemformula_tl } \tl_use:N \l__chemmacros_chemformula_tl \tl_clear:N \l__chemmacros_chemformula_tl } { \group_begin: \chemformula_input:n { #2 } \tl_set_rescan:Nno \l__chemmacros_tmpa_tl { \ExplSyntaxOn } { \l__chemformula_input_tl } \chemformula_write:V \l__chemmacros_tmpa_tl \group_end: \chemmacros_xspace: } } } \bool_if:NTF \l__chemmacros_use_mhchem_bool { \cs_new:Npn \el { \chemmacros_atom:n { e } \mch \chemmacros_xspace: } \cs_new:Npn \prt { \chemmacros_atom:n { p } \pch \chemmacros_xspace: } } { \DeclareChemParticle \el { e- } \DeclareChemParticle \prt { p+ } } \DeclareChemParticle \ntr { n^0 } \cs_new:Npn \chemmacros_bm:n #1 { \bool_if:NTF \l__chemmacros_detect_bold_bool { \bm { #1 } } { #1 } } \cs_new:Npn \chemmacros_bf:n #1 { \bool_if:NTF \l__chemmacros_detect_bold_bool { { \normalfont \bfseries #1 } } { { \normalfont #1 } } } \cs_new:Npn \chemmacros_detect_bold:n #1 { \chemmacros_if_bold:TF { \mode_if_math:TF { \chemmacros_bm:n { #1 } } { \chemmacros_bf:n { #1 } } } { #1 } } \NewDocumentCommand \Rad { O{}G{} } { \chemmacros_msg:nnxx { chemmacros } { command-dropped } { \Rad } { } #1#2 } % charges \cs_new:Npn \chemmacros_charge:n #1 { \bool_if:NTF \l__chemmacros_charge_append_bool { \mode_if_math:TF { {}^ { \chemmacros_detect_bold:n { #1 } } } { $ {}^ { \chemmacros_detect_bold:n { #1 } } $ } } { \mode_if_math:TF { ^ { \chemmacros_detect_bold:n { #1 } } } { $ ^ { \chemmacros_detect_bold:n { #1 } } $ } } } \keys_define:nn { chemmacros / charges } { append .bool_set:N = \l__chemmacros_charge_append_bool , append .default:n = true } \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: } } } \cs_new:Npn \delm { \mbox { \tiny \( \delta \chemmacros_minus: \) } \chemmacros_xspace: } \cs_new:Npn \delp { \mbox { \tiny \( \delta \chemmacros_plus: \) } \chemmacros_xspace: } \cs_new:Npn \fdelm { \mbox { \tiny \( \delta \chemmacros_formal_minus: \) } \chemmacros_xspace: } \cs_new:Npn \fdelp { \mbox { \tiny \( \delta \chemmacros_formal_plus: \) } \chemmacros_xspace: } \cs_new:Npn \scrm { \ensuremath { \scriptstyle \chemmacros_minus: } } \cs_new:Npn \scrp { \ensuremath { \scriptstyle \chemmacros_plus: } } \cs_new:Npn \fscrm { \ensuremath { \scriptstyle \chemmacros_formal_minus: } } \cs_new:Npn \fscrp { \ensuremath { \scriptstyle \chemmacros_formal_plus: } } \cs_new:Npn \fsscrm { \ensuremath { \scriptscriptstyle \chemmacros_formal_minus: } } \cs_new:Npn \fsscrp { \ensuremath { \scriptscriptstyle \chemmacros_formal_plus: } } % --------------------------------------------------------------------------- % % ions, molecules % proton, hydroxide, hydronium/oxonium, water, nucleophile, electrophile \bool_if:NTF \l__chemmacros_use_mhchem_bool { \cs_new:Npn \Hpl { \chemmacros_atom:n { H } \pch \chemmacros_xspace: } \cs_new:Npn \Hyd { \chemmacros_atom:n { OH } \mch \chemmacros_xspace: } \cs_new:Npn \HtO { \chemmacros_chemformula:n { H3O } \pch \chemmacros_xspace: } \cs_new:Npn \El { \chemmacros_atom:n { E } \pch \chemmacros_xspace: } } { \DeclareChemParticle \Hpl { H+ } \DeclareChemParticle \Hyd { OH- } \DeclareChemParticle \HtO { H3O+ } \DeclareChemParticle \El { E+ } } \DeclareChemParticle \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 } { \bool_if:NTF \l__chemmacros_use_mhchem_bool { \chemmacros_atom: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 } } \NewDocumentCommand \ba { o } { \IfNoValueF { #1 } { \keys_set:nn { chemmacros / particle } { #1 } } \bool_if:NTF \l__chemmacros_particle_elpair_bool { \chemmacros_elpair:n { ba } \mch } { \bool_if:NTF \l__chemmacros_use_mhchem_bool { \chemmacros_atom:n { ba } \mch } { \chemmacros_chemformula:n { ba- } } } \chemmacros_xspace: } \cs_new:Npn \chemmacros_elpair:n #1 { \bool_if:NTF \l__chemmacros_chemfig_bool { \bool_if:NTF \l__chemmacros_elpair_dots_bool { { \chemmacros_inner_font: #1 \Lewis { 0: , { \vphantom { #1 } } } } } { { \chemmacros_inner_font: #1 \Lewis { 0 , \vphantom { #1 } } } } } { \chemmacros_msg:nnxx { 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_declare_iupac:Nn #1#2 { \tl_set_rescan:Nnn \l__chemmacros_tmpa_tl { \char_set_catcode_letter:N \\ } { #1 } \tl_set:Nf \l__chemmacros_tmpa_tl { \tl_tail:V \l__chemmacros_tmpa_tl } \prop_if_in:NoTF \l__chemmacros_iupac_prop { \l__chemmacros_tmpa_tl } { \chemmacros_msg:nnxx { chemmacros } { declare-iupac } { #1 } { } } { \prop_put:Non \l__chemmacros_iupac_prop { \l__chemmacros_tmpa_tl } { #2 } } \chemmacros_make_iupac: } \cs_new_protected:Npn \chemmacros_renew_iupac:Nn #1#2 { \tl_set_rescan:Nnn \l__chemmacros_tmpa_tl { \char_set_catcode_letter:N \\ } { #1 } \tl_set:Nf \l__chemmacros_tmpa_tl { \tl_tail:V \l__chemmacros_tmpa_tl } \prop_if_in:NoTF \l__chemmacros_iupac_prop { \l__chemmacros_tmpa_tl } { \prop_put:Non \l__chemmacros_iupac_prop { \l__chemmacros_tmpa_tl } { #2 } } { \chemmacros_msg:nnxx { chemmacros } { renew-iupac } { #1 } { } } \chemmacros_make_iupac: } \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_declare_iupac:Nn #1 { #2 } } \NewDocumentCommand \RenewChemIUPAC { mm } { \chemmacros_renew_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 } { \cs_if_exist:NTF \EmbracOff { \textit* { (#1) } } { \textit { (#1) } } \tex_kern:D \l__chemmacros_cip_kern_dim } \DeclareChemDeprecated \Rcip \R { \cip { R } } \DeclareChemDeprecated \Scip \S { \cip { S } } \DeclareChemIUPAC \R { \cip { R } } \DeclareChemIUPAC \S { \cip { S } } % TikZ needs : to be other \ExplSyntaxOff \NewDocumentCommand\Sconf{O{S}} {% \tikz[baseline=(a.base),text height=1.5ex,text depth=.25ex] { \node(a) {#1} ; \draw[->,thick,rotate=90] ($(a.center)+(20:.8em)$) arc (20:340:.8em); }% } \NewDocumentCommand\Rconf{O{R}} {% \tikz[baseline=(a.base),text height=1.5ex,text depth=.25ex] { \node(a) {#1} ; \draw[<-,thick,rotate=90] ($(a.center)+(20:.8em)$) arc (20:340:.8em) ; }% } \ExplSyntaxOn % E(ntgegen)/Z(usammen) \DeclareChemIUPAC \E { \cip { E } } \DeclareChemIUPAC \Z { \cip { Z } } % cis/trans & tert \DeclareChemIUPAC \cis { \textit{ cis } } \DeclareChemIUPAC \trans { \textit { trans } } \DeclareChemIUPAC \tert { \textit { tert } } % Fischer \DeclareChemDeprecated \Dfi \D { \textsc { d } } \DeclareChemDeprecated \Lfi \L { \textsc { l } } \DeclareChemIUPAC \D { \textsc { d } } \DeclareChemIUPAC \L { \textsc { l } } % ortho/meta/para \DeclareChemIUPAC \ortho { \textsl { o } } \DeclareChemIUPAC \meta { \textsl { m } } \DeclareChemIUPAC \para { \textsl { p } } % syn/anti \DeclareChemIUPAC \syn { \textit { syn } } \DeclareChemIUPAC \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:Npn \chemformula_hapto:n #1 { \Chemeta \chemformula_superscript:n { #1 } \chemmacros_break_point_hyphen: } \cs_new: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 } } } \chemmacros_break_point_hyphen: } \DeclareChemIUPAC \hapto { \chemformula_hapto:n } \DeclareChemIUPAC \bridge { \chemformula_bridge:n } % attachments to heteroatoms / added hydrogen \DeclareChemIUPAC \H { \textit { H } } \DeclareChemIUPAC \O { \textit { O } } \DeclareChemIUPAC \N { \textit { N } } \DeclareChemIUPAC \Sf { \textit { S } } \DeclareChemIUPAC \P { \textit { P } } % language specific settings \AtBeginDocument { \bool_if:NT \l__chemmacros_italian_bool { \DeclareChemIUPAC \sin { \textit { sin } } \DeclareChemIUPAC \ter { \textit { ter } } } } % greek letters \DeclareChemIUPAC \a { \Chemalpha } \DeclareChemIUPAC \b { \Chembeta } \DeclareChemIUPAC \g { \Chemgamma } \DeclareChemIUPAC \d { \Chemdelta } \DeclareChemIUPAC \k { \Chemkappa } \DeclareChemIUPAC \m { \Chemmu } \DeclareChemIUPAC \n { \Chemeta } \DeclareChemIUPAC \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:Nn \chemmacros_break_point: { \chemmacros_nobreak: \tex_discretionary:D { - } { } { \tex_kern:D \l__chemmacros_iupac_break_dim } \chemmacros_allow_hyphens: } \bool_new:N \l__chemmacros_inside_iupac_bool \cs_new_protected:Nn \chemmacros_iupac:n { \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: \cs_set_eq:NN \| \chemmacros_break_point: \cs_set_eq:NN \^ \textsuperscript #1 \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 { m } { \chemmacros_iupac:n { #1 } } % 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:Npn \chemmacros_latin:n #1 { { \l__chemmacros_latin_format_tl #1 } } \prop_new:N \l__chemmacros_latin_prop \cs_new_protected:Npn \chemmacros_declare_latin:Nn #1#2 { \cs_if_free:NTF #1 { \cs_new:Npn #1 { \chemmacros_latin:n { #2 } \chemmacros_xspace: } \prop_put:Nnn \l__chemmacros_latin_prop { #1 } { #2 } } { \chemmacros_msg:nnxx { chemmacros } { declare-latin } { #1 } { } } } \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: } } { \chemmacros_msg:nnxx { chemmacros } { renew-latin } { #1 } { } } } \NewDocumentCommand \DeclareChemLatin { mm } { \chemmacros_declare_latin:Nn #1 { #2 } } \NewDocumentCommand \RenewChemLatin { mm } { \chemmacros_renew_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 } \DeclareChemLatin \insitu { in~situ } \DeclareChemLatin \abinitio { ab~initio } \DeclareChemLatin \invacuo { in~vacuo } } % --------------------------------------------------------------------------- % % acid/base \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 } \cs_new_eq:NN \chemmacros_p_style:n \textup % TODO: rewrite in expl3 style \cs_new:Npn \chemmacros_if_bold:TF #1#2 { \ifx\f@series\l__chemmacros_if_bf_tl \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi { #1 }{ #2 } } \tl_new:N \l__chemmacros_if_bf_tl \tl_set:Nn \l__chemmacros_if_bf_tl { bx } \cs_new_protected:Npn \Ka { \mbox { \( \chemmacros_detect_bold:n { K \c_math_subscript_token \mathrm { \bool_if:NTF \l__chemmacros_german_bool { S } { A } } } \) } \chemmacros_xspace: } \cs_new_protected:Npn \Kb { \mbox { \( \chemmacros_detect_bold:n { K \c_math_subscript_token \mathrm { B } } \) } \chemmacros_xspace: } \cs_new_protected:Npn \Kw { \mbox { \( \chemmacros_detect_bold:n { K \c_math_subscript_token \mathrm { W } } \) } \chemmacros_xspace: } \NewDocumentCommand \p { m } { \group_begin: \chemmacros_p_style:n { p } \ensuremath { #1 } \group_end: } \cs_new_protected:Npn \pH { \p { \chemmacros_chemformula:n { H } } \chemmacros_xspace: } \cs_new_protected:Npn \pOH { \p { \chemmacros_chemformula:n { OH } } \chemmacros_xspace: } \NewDocumentCommand \pKa { o } { \p { \Ka \IfNoValueF { #1 } { \c_math_subscript_token { \chemmacros_detect_bold:n { #1 } } } } \chemmacros_xspace: } \NewDocumentCommand \pKb { o } { \p { \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[] % - 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_subscript_token { \text {N} } \) } { } } , type / 1 .code:n = { \chemmacros_set_mech:nnn { S } { \( \c_math_subscript_token { \text {N} } \) 1 } { } } , type / 2 .code:n = { \chemmacros_set_mech:nnn { S } { \( \c_math_subscript_token { \text {N} } \) 2 } { } } , type / se .code:n = { \chemmacros_set_mech:nnn { S } { \( \c_math_subscript_token { \text {E} } \) } { } } , type / 1e .code:n = { \chemmacros_set_mech:nnn { S } { \( \c_math_subscript_token { \text {E} } \) 1 } { } } , type / 2e .code:n = { \chemmacros_set_mech:nnn { S } { \( \c_math_subscript_token { \text {E} } \) 2 } { } } , type / ar .code:n = { \chemmacros_set_mech:nnn { S } { \( \c_math_subscript_token { \text {E} } \) } { 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_subscript_token { \text {cb} } \) } { } } , 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{,} \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:n #1 } { \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:Npn \chemmacros_ox_fraction:n #1/#2 { \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:Npn \chemmacros_ox_sign:n #1 { \fp_compare:nNnT { #1 } > { 0 } { \bool_if:NT \l__chemmacros_ox_explicit_sign_bool { $+$ } } \fp_compare:nNnT { #1 } = { 0 } { \bool_if:NT \l__chemmacros_ox_explicit_sign_bool { $\pm$ } } \fp_compare:nNnT { #1 } < { 0 } { $-$ } } \cs_new_protected:Npn \chemmacros_ox_value:n #1 { \fp_set:Nn \l__chemmacros_ox_number_fp { #1 } \fp_abs:N \l__chemmacros_ox_number_fp \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 { \chemmacros_fp_to_arabic:V \l__chemmacros_ox_number_fp } { \chemmacros_fp_show:V \l__chemmacros_ox_number_fp } } } \cs_new_protected:Npn \chemmacros_ox_is_integer:n #1 { \fp_set:Nn \l__chemmacros_tmpa_tl { #1 } \fp_add:Nn \l__chemmacros_tmpa_tl { 1 } \fp_round_places:Nn \l__chemmacros_tmpa_tl { 0 } \fp_sub:Nn \l__chemmacros_tmpa_tl { 1 } \fp_compare:nNnTF { \l__chemmacros_tmpa_tl } = { #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_tl { #1 } \fp_round_places:Nn \l__chemmacros_tmpa_tl { 0 } \int_set:Nn \l__chemmacros_tmpa_int { \fp_to_tl:N \l__chemmacros_tmpa_tl } \int_compare:nTF { \l__chemmacros_tmpa_int = 0 } { 0 } { \int_to_Roman:n { \int_use: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 $ ^ { \text { \tiny \chemmacros_ox_process_number:n { #1 } } } $ } } \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[]{,} % \ox*[]{,} => 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: } \bool_if:NTF \l__chemmacros_version_one_bool { \keys_set:nn { chemmacros / ox } { parse = false } } { \tl_if_blank:nF { #2 } { \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{,} \NewDocumentCommand \OX { > { \SplitArgument { 1 } { , } } m } { \chemmacros_redox_partner:nn #1 } \cs_new_protected:Npn \chemmacros_redox_partner:nn #1#2 { \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=0] (#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_empty: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 { } { } { #4 } } { \chemmacros_redox:nnnnn #1 { } { #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 } } \bool_if:NT \l__chemmacros_version_one_bool { \NewDocumentCommand \setredoxdist { m } { \tl_if_blank:nTF { #1 } { \dim_set:Nn \l__chemmacros_redox_dist_dim { .6em } } { \dim_set:Nn \l__chemmacros_redox_dist_dim { #1 } } } } % --------------------------------------------------------------------------- % % 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_bonds_tl \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@ } \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_sub_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_set_true:N \l__chemmacros_nmr_list_bool \bool_new:N \l__chemmacros_nmr_use_equal_bool % \bool_set_true: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: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 } \bool_if:NTF \l__chemmacros_bpchem_bool { \IUPAC { \^ { #1 } \g__chemmacros_nmr_element_coupled_tl - NMR } } { \iupac { \^ { #1 } } \bool_if:NTF \l__chemmacros_nmr_parse_bool { \bool_if:NTF \l__chemmacros_use_mhchem_bool { \exp_args:No \ce { \g__chemmacros_nmr_element_coupled_tl } } { \exp_args:No \ch { \g__chemmacros_nmr_element_coupled_tl } } } { \chemmacros_atom:V \g__chemmacros_nmr_element_coupled_tl } - NMR } } \cs_generate_variant:Nn \chemmacros_nmr_base:nn { VV } \cs_new: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:Npn \chemmacros_nmr_frequency_aux_i:w #1,#2 \q_stop { \SI { #1 } { #2 } } \cs_new:Npn \chemmacros_nmr_frequency_aux_ii:n #1 { \SI { #1 } { \tl_use:N \l__chemmacros_nmr_unit_tl } } \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 , pos-number .choice: , pos-number / sub .code:n = \bool_set_true:N \l__chemmacros_nmr_position_sub_bool , pos-number / side .code:n = \bool_set_false:N \l__chemmacros_nmr_position_sub_bool , coupling-unit .tl_set:N = \l__chemmacros_nmr_coupling_unit_tl , 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_declare_nmr:Nn #1#2 { \prop_if_in:NnTF \l__chemmacros_nmr_prop { #1 } { \chemmacros_msg:nnxx { chemmacros } { declare-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_renew_nmr:Nn #1#2 { \prop_if_in:NnTF \l__chemmacros_nmr_prop { #1 } { \prop_put:Nnn \l__chemmacros_nmr_prop { #1 } { #2 } \NewDocumentCommand #1 { s } { \IfBooleanTF {##1} { \NMR*{#2} } { \NMR{#2} } } } { \chemmacros_msg:nnxx { chemmacros } { renew-nmr } { #1 } { } } } \NewDocumentCommand \DeclareChemNMR { mm } { \chemmacros_declare_nmr:Nn #1 { #2 } } \NewDocumentCommand \RenewChemNMR { mm } { \chemmacros_renew_nmr:Nn #1 { #2 } } \AtBeginDocument { % \NMR{,}(,)[] ALL arguments are optional % \NMR* same but without ": $\delta$" at end \NewDocumentCommand \NMR { s g d() o } { \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 \IfNoValueF { #3 } { \bool_set_true:N \l__chemmacros_nmr_frequency_bool } \IfNoValueF { #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 } \IfNoValueTF { #2 } { \chemmacros_nmr_nucleus:w \l__chemmacros_nmr_isotope_default_tl , \l__chemmacros_nmr_element_default_tl \q_stop } { \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 { ) } \IfBooleanF { #1 } { : ~ } \group_end: } \IfBooleanF { #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 { \bool_if:NTF \l__chemmacros_use_mhchem_bool { \ce { #4 } } { \ch { #4 } } } { #4 } } \bool_if:NT \l__chemmacros_nmr_delimiters_bool { ) } \IfBooleanF { #1 } { : } \group_end: \IfBooleanF { #1 } { \tl_use:N \c_space_tl $ \delta $ \l__chemmacros_nmr_delta_tl \bool_if:NT \l__chemmacros_nmr_use_equal_bool { ~ = } } \bool_if:NF \l__chemmacros_nmr_comma_bool { \IfBooleanF { #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:Npn \chemmacros_nmr_number:n #1 { #1 \, \bool_if:NTF \l__chemmacros_bpchem_bool { \g__chemmacros_nmr_element_tl } { \chemmacros_atom:V \g__chemmacros_nmr_element_tl } } \cs_new:Npn \chemmacros_nmr_position:n #1 { \bool_if:NTF \l__chemmacros_bpchem_bool { \tl_use:N \g__chemmacros_nmr_element_tl \bool_if:NTF \l__chemmacros_nmr_position_sub_bool { $\sb{#1}$ } { - #1 } } { \bool_if:NTF \l__chemmacros_nmr_position_sub_bool { \chemmacros_chemformula:x { \g__chemmacros_nmr_element_tl _ #1 } } { \chemmacros_atom:V \g__chemmacros_nmr_element_tl - #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_auxi:w } { \chemmacros_nmr_coupling_auxii:w } } \cs_new_protected:Npn \chemmacros_nmr_coupling_auxi:w (#1;#2) { \tl_set:Nn \l__chemmacros_nmr_coupling_bonds_tl { #1 } \tl_set:Nn \l__chemmacros_nmr_coupling_nuclei_tl { #2 } \tl_put_right:Nn \l__chemmacros_nmr_coupling_nuclei_tl { ) } \tl_put_left:Nn \l__chemmacros_nmr_coupling_nuclei_tl { ( } \chemmacros_nmr_coupling_auxii:w } \cs_new:Npn \chemmacros_nmr_coupling_auxii:w { \peek_meaning:NTF [ { \chemmacros_nmr_coupling_auxiii:w } { \chemmacros_nmr_coupling_auxiv:n } } \cs_new:Npn \chemmacros_nmr_coupling_auxiii:w [#1]#2 { \group_begin: \sisetup { list-final-separator={,~}, list-pair-separator={,~}, list-units=single } \( ^{ \l__chemmacros_nmr_coupling_bonds_tl } J \l__chemmacros_nmr_coupling_nuclei_tl = \SIlist{#2}{#1} \) \group_end: } \cs_new:Npn \chemmacros_nmr_coupling_auxiv:n #1 { \group_begin: \sisetup { list-final-separator={,~}, list-pair-separator={,~}, list-units=single } \( ^{ \l__chemmacros_nmr_coupling_bonds_tl } J \l__chemmacros_nmr_coupling_nuclei_tl = \exp_args:Nno \SIlist { #1 } { \l__chemmacros_nmr_coupling_unit_tl } \) \group_end: } % --------------------------------------------------------------------------- % % placing text below atom/molecule \cs_new_protected:Npn \chemmacros_dim_to_width:Nn #1#2 { \hbox_set:Nn \l__chemmacros_tmpa_box { #2 } \dim_set:Nn #1 { \box_wd:N \l__chemmacros_tmpa_box } \box_clear:N \l__chemmacros_tmpa_box } \bool_new:N \l__chemmacros_mhname_width_bool \bool_set_false:N \l__chemmacros_mhname_width_bool \dim_new:N \l__chemmacros_mhname_width_dim \tl_new:N \l__chemmacros_mhname_align_tl \tl_set:Nn \l__chemmacros_mhname_align_tl { \centering } \tl_new:N \l__chemmacros_mhname_format_tl \tl_new:N \l__chemmacros_mhname_fontsize_tl \tl_set:Nn \l__chemmacros_mhname_fontsize_tl { \tiny } \keys_define:nn { chemmacros / mhName } { align .tl_set:N = \l__chemmacros_mhname_align_tl , format .tl_set:N = \l__chemmacros_mhname_format_tl , fontsize .tl_set:N = \l__chemmacros_mhname_fontsize_tl , width .code:n = { \tl_if_eq:nnTF { #1 } { auto } { \bool_set_false:N \l__chemmacros_mhname_width_bool } { \bool_set_true:N \l__chemmacros_mhname_width_bool \dim_set:Nn \l__chemmacros_mhname_width_dim { #1 } } } } % \mhName[]{}{} \bool_if:nF { \l__chemmacros_version_one_bool || \l__chemmacros_use_mhchem_bool } { \NewDocumentCommand \mhName { o m m } { \group_begin: \IfNoValueF { #1 } { \keys_set:nn { chemmacros / mhName } { #1 } } \ensuremath { \underset { \bool_if:NF \l__chemmacros_mhname_width_bool { \chemmacros_dim_to_width:Nn \l__chemmacros_mhname_width_dim { #2 } } \parbox { \dim_use:N \l__chemmacros_mhname_width_dim } { \tl_use:N \l__chemmacros_mhname_align_tl \tl_use:N \l__chemmacros_mhname_format_tl \tl_use:N \l__chemmacros_mhname_fontsize_tl #3 } } { \ce { #2 } } } \group_end: } } % --------------------------------------------------------------------------- % % - 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_declare_phase:Nnn #1#2#3 { \tl_set_rescan:Nnn \l__chemmacros_tmpa_tl { \char_set_catcode_letter:N \\ } { #1 } \tl_set:Nf \l__chemmacros_tmpa_tl { \tl_tail:V \l__chemmacros_tmpa_tl } \cs_if_free:NTF #1 { \cs_new:Npn #1 {} } { \chemmacros_msg:nnxx { chemmacros } { declare-phase } { #1 } {} } \tl_if_blank:nTF { #2 } { \prop_put:Non \l__chemmacros_phases_german_prop { \l__chemmacros_tmpa_tl } { #3 } } { \prop_put:Non \l__chemmacros_phases_german_prop { \l__chemmacros_tmpa_tl } { #2 } } \prop_put:Non \l__chemmacros_phases_prop { \l__chemmacros_tmpa_tl } { #3 } \chemmacros_make_phases: } \cs_new_protected:Npn \chemmacros_renew_phase:Nnn #1#2#3 { \tl_set_rescan:Nnn \l__chemmacros_tmpa_tl { \char_set_catcode_letter:N \\ } { #1 } \tl_set:Nf \l__chemmacros_tmpa_tl { \tl_tail:V \l__chemmacros_tmpa_tl } \cs_if_free:NT #1 { \chemmacros_msg:nnxx { chemmacros } { renew-phase } { #1 } {} } \tl_if_blank:nTF { #2 } { \prop_put:Non \l__chemmacros_phases_german_prop { \l__chemmacros_tmpa_tl } { #3 } } { \prop_put:Non \l__chemmacros_phases_german_prop { \l__chemmacros_tmpa_tl } { #2 } } \prop_put:Non \l__chemmacros_phases_prop { \l__chemmacros_tmpa_tl } { #3 } \chemmacros_make_phases: } \NewDocumentCommand \DeclareChemPhase { mom } { \IfNoValueTF { #2 } { \chemmacros_declare_phase:Nnn #1 { } { #3 } } { \chemmacros_declare_phase:Nnn #1 { #2 } { #3 } } } \NewDocumentCommand \RenewChemPhase { mom } { \IfNoValueTF { #2 } { \chemmacros_renew_phase:Nnn #1 { } { #3 } } { \chemmacros_renew_phase:Nnn #1 { #2 } { #3 } } } \cs_new_protected:Npn \chemmacros_make_phases: { \bool_if:NTF \l__chemmacros_german_bool { \prop_map_function:NN \l__chemmacros_phases_german_prop \chemmacros_define_phases:nn } { \prop_map_function:NN \l__chemmacros_phases_prop \chemmacros_define_phases:nn } } \cs_new_protected:Npn \chemmacros_define_phases:nn #1#2 { \cs_set:cpn { #1 } { \bool_if:NTF \l__chemmacros_phases_sub_bool { \bool_if:NTF \l__chemformula_inside_ch_bool { \chemformula_subscript:n { ( #2 ) } } { \ensuremath { \c_math_subscript_token { \text { (#2) } } } } } { \ensuremath { \skip_horizontal:N \l__chemmacros_phases_space_dim \text { (#2) } } } } } \DeclareChemPhase \sld [ f ] { s } \DeclareChemPhase \lqd [ f{}l ] { l } \DeclareChemPhase \gas { g } \DeclareChemPhase \aq { aq } \cs_new: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 } } \bool_if:NT \l__chemmacros_version_one_bool { \cs_new_eq:NN \solid \sld \cs_new_eq:NN \liquid \lqd } % --------------------------------------------------------------------------- % % reaction environments % 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 \AfterPackage* { mathtools } { \cs_set: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: \tl_if_eq:nnT { #1 } { reaction } { \addcontentsline { lor } { reaction } { \l__chemmacros_reaction_lorname_tl #3 #2 ##1 #4 \tl_use:N \g__chemmacros_reaction_description_tl } \tl_gclear:N \g__chemmacros_reaction_description_tl } } } } \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_set:Nn \l__chemmacros_reaction_lorname_tl { Reaction ~ } \tl_new:N \reactionlistname \tl_set:Nn \reactionlistname { List~of~reactions } % language settings % TODO \AtBeginDocument { \bool_if:NT \l__chemmacros_german_bool { \tl_set:Nn \reactionlistname { Reaktionsverzeichnis } \tl_set:Nn \l__chemmacros_reaction_lorname_tl { Reaktion ~ } } \bool_if:NT \l__chemmacros_italian_bool { \tl_set:Nn \reactionlistname { Elenco ~ delle ~ reazioni } \tl_set:Nn \l__chemmacros_reaction_lorname_tl { Reazione ~ } } \bool_if:NT \l__chemmacros_french_bool { \tl_set:Nn \reactionlistname { Table ~ des ~ r\'eactions } \tl_set:Nn \l__chemmacros_reaction_lorname_tl { R\'eaction ~ } } } \cs_new:Npn \listofreactions { \section* { \reactionlistname } \@starttoc { lor } } \cs_new:Npn \l@reaction #1#2 { \@dottedtocline { 1 } { 1.5em } { 2.3em } { #1 } { #2 } } % create tagform \bool_if:NTF \l__chemmacros_version_one_bool { \newtagform { CMreaction } { \{ } { \} } } { \newtagform { reaction } { \{ } { \} } } \newcounter { chemmacros_save_reaction } \newcounter { reaction } % switch to reaction tags \cs_new: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 } } \bool_if:NTF \l__chemmacros_version_one_bool { \usetagform { CMreaction } } { \usetagform { reaction } } } % switch back to equation tags \cs_new: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 ~ } } % TODO separate document and module level % \DeclareChemReaction[]{}{} \bool_if:NF \l__chemmacros_version_one_bool { \NewDocumentCommand \DeclareChemReaction { o m m } { \cs_if_exist:cTF { #2 } { \msg_error:nnx { chemmacros } { already-defined } { #2 } } { \IfNoValueTF { #1 } { \bool_set_false:N \l__chemmacros_reactions_star_bool \bool_set_false:N \l__chemmacros_reactions_args_bool } { \keys_set:nn { chemmacros / reaction } { #1 } } \bool_if:NTF \l__chemmacros_reactions_args_bool { \NewEnviron { #2 } [ 2 ] [] { \chemmacros_begin_reaction: \AddRxnDesc { ##1 } \begin { #3 } { ##2 } \chemmacros_equation_chemformula:o { \BODY } \end{ #3 } \chemmacros_end_reaction: } \bool_if:NT \l__chemmacros_reactions_star_bool { \NewEnviron { #2* } [ 1 ] { \begin { #3* } { ##1 } \chemmacros_equation_chemformula:o { \BODY } \end { #3* } } } } { \NewEnviron { #2 } [ 1 ] [] { \chemmacros_begin_reaction: \AddRxnDesc { ##1 } \begin { #3 } \chemmacros_equation_chemformula:o { \BODY } \end { #3 } \chemmacros_end_reaction: } \bool_if:NT \l__chemmacros_reactions_star_bool { \NewEnviron { #2* } { \begin { #3* } \chemmacros_equation_chemformula:o { \BODY } \end { #3* } } } } } \ignorespaces } \cs_set:Npn \newreaction { \chemmacros_msg:nnxx { chemmacros } { command-deprecated } { \newreaction } { \DeclareChemReaction } \DeclareChemReaction } } \cs_new:Npn \chemmacros_equation_chemformula:n #1 { \bool_if:NTF \l__chemmacros_use_mhchem_bool { \cee { #1 } } { \ch { #1 } } } \cs_generate_variant:Nn \chemmacros_equation_chemformula:n { o } % predefined: \bool_if:NF \l__chemmacros_version_one_bool { \DeclareChemReaction [ star ] { reaction } { equation } \DeclareChemReaction [ star ] { reactions } { align } } % --------------------------------------------------------------------------- % % thermodynamics et.al. % \standardstate as defined by the chemstyle package. Thanks to Joseph Wright \cs_if_exist:NF \standardstate { \cs_new:Npn \standardstate { \ensuremath { \chemmacros_standardstate: } } \cs_new:Npn \chemmacros_standardstate: { \mathpalette \chemmacros_standardstate_aux: \circ } \cs_new:Npn \chemmacros_standardstate_aux: #1#2 { \ooalign { \tex_hfil:D $#1-$ \tex_hfil:D \tex_cr:D \tex_hfil:D $#1#2$ \tex_hfil:D \tex_cr:D } } } % --------------------------------------------------------------------------- % % \State \tl_new:N \l__chemmacros_State_delta_tl \tl_set:Nn \l__chemmacros_State_delta_tl { \Delta } \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[,,]{}{} % old syntax (v2.0): % \State[]{}{} % {} is an optional argument! \cs_new:Npn \chemmacros_state:nnn #1#2#3 { \group_begin: \IfNoValueF { #1 } { \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 { fnn,xnn } \bool_if:NF \l__chemmacros_version_one_bool { \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 { \Delta } \bool_new:N \l__chemmacros_renewstate_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 } % TODO: separate document and module lavel % \DeclareChemState[]{}{}{} \bool_if:NF \l__chemmacros_version_one_bool { \cs_new:Npn \DeclareChemState { \bool_set_false:N \l__chemmacros_renewstate_bool \chemmacros_setnewstate_reset: \peek_meaning:NTF [ { \setnewstate_aux_i:n } { \setnewstate_aux_ii:nnn } } % \RenewChemState[]{}{}{} \cs_new:Npn \RenewChemState { \bool_set_true:N \l__chemmacros_renewstate_bool \chemmacros_setnewstate_reset: \peek_meaning:NTF [ { \setnewstate_aux_i:n } { \setnewstate_aux_ii:nnn } } \cs_set:Npn \setnewstate { \chemmacros_msg:nnxx { chemmacros } { command-deprecated } { \setnewstate } { \DeclareChemState } \DeclareChemState } \cs_set:Npn \renewstate { \chemmacros_msg:nnxx { chemmacros } { command-deprecated } { \renewstate } { \RenewChemState } \RenewChemState } } \cs_new: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 { \Delta } } \cs_new:Npn \setnewstate_aux_i:n [#1] { \keys_set:nn { chemmacros / setnewstate } { #1 } \setnewstate_aux_ii:nnn } \cs_new:Npn \setnewstate_aux_ii:nnn #1#2#3 { \bool_if:NTF \l__chemmacros_renewstate_bool { \cs_if_exist:cF { #1 } { \msg_error:nnx { chemmacros } { renewstate } { #1 } } \cs_undefine:c {chemmacros_ #1 _reset: } \cs_undefine:c { l__chemmacros_ #1 _subscript_tl } \cs_undefine:c { l__chemmacros_ #1 _exponent_tl } \cs_undefine:c { l__chemmacros_ #1 _delta_tl } \cs_undefine:c { l__chemmacros_ #1 _left_tl } \cs_undefine:c { l__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 } } { \cs_if_exist:cT { #1 } { \msg_error:nnx { chemmacros } { setnewstate } { #1 } } } \group_begin: \exp_args:Nnf \tl_const:cn { l__chemmacros_ #1 _subscript_tl } { \tl_use:N \l__chemmacros_thermod_subscript_default_tl } \exp_args:Nnf \tl_const:cn { l__chemmacros_ #1 _exponent_tl } { \tl_use:N \l__chemmacros_thermod_exponent_default_tl } \exp_args:Nnf \tl_const:cn { l__chemmacros_ #1 _delta_tl } { \tl_use:N \l__chemmacros_thermod_delta_default_tl } \exp_args:Nnf \tl_const:cn { l__chemmacros_ #1 _left_tl } { \tl_use:N \l__chemmacros_thermod_subscript_left_default_tl } \tl_const:cn { l__chemmacros_ #1 _unit_tl } { #3 } \cs_new:cpn {chemmacros_ #1 _reset: } { \tl_set_eq:Nc \l__chemmacros_thermod_subscript_tl { l__chemmacros_ #1 _subscript_tl } \tl_set_eq:Nc \l__chemmacros_thermod_exponent_tl { l__chemmacros_ #1 _exponent_tl } \tl_set_eq:Nc \l__chemmacros_thermod_delta_tl { l__chemmacros_ #1 _delta_tl } \tl_set_eq:Nc \l__chemmacros_thermod_subscript_left_tl { l__chemmacros_ #1 _left_tl } \tl_set_eq:Nc \l__chemmacros_thermod_unit_tl { l__chemmacros_ #1 _unit_tl } } \cs_new: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: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:cpn { #1 _aux_ii:n } (##1) { \tl_set:Nn \l__chemmacros_thermod_subscript_tl { ##1 } \tl_use:c { #1 _aux_iii:n } } \cs_new:cpn { #1 _aux_iii:n } ##1 { \ensuremath { \exp_args:Nf \tl_if_eq:nnTF { \tl_use:N \l__chemmacros_thermod_subscript_left_tl } { true } { \chemmacros_state:fnn { subscript-left = true , exponent = { \tl_use:N \l__chemmacros_thermod_exponent_tl } , delta = { \tl_use:N \l__chemmacros_thermod_delta_tl } } { #2 } } { \chemmacros_state:fnn { subscript-left = false , exponent = { \tl_use:N \l__chemmacros_thermod_exponent_tl } , delta = { \tl_use:N \l__chemmacros_thermod_delta_tl } } { #2 } } { \tl_use:N \l__chemmacros_thermod_subscript_tl } = \exp_args:Nno \SI { ##1 } { \l__chemmacros_thermod_unit_tl } } } \group_end: \ignorespaces } % predefined: \bool_if:NF \l__chemmacros_version_one_bool { \DeclareChemState {Enthalpy} {H} {\kilo\joule\per\mole} \DeclareChemState [ delta=false, subscript-left=false ] {Entropy} {S} {\joule\per\kelvin\per\mole} \DeclareChemState {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 } % TODO separate document and module level % \newman[](){<1>,<2>,<3>,<4>,<5>,<6>} \bool_if:NF \l__chemmacros_version_one_bool { \NewDocumentCommand \newman { o d() > { \SplitArgument { 5 } { , } } m } { \group_begin: \IfNoValueF { #1 } { \keys_set:nn { chemmacros / newman } { #1 } } \IfNoValueTF { #2 } { \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 { #2 } } \chemmacros_newman_atoms:nnnnnn #3 \group_end: } } % place atoms: \cs_new:Npn \chemmacros_newman_atoms:nnnnnn #1#2#3#4#5#6 { \chemmacros_tikz_picture:xn { scale = \fp_to_tl:N \l__chemmacros_newman_scale_fp , chemmacros_newman_atom_front / .style = { inner~sep=0, outer~sep=0, \tl_use:N \l__chemmacros_newman_tikz_front_tl }, chemmacros_newman_atom_back / .style = { inner~sep=0, outer~sep=0, \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 } (0,0) circle (\fp_to_dim:N \l__chemmacros_newman_scale_fp * 15) ; \chemmacros_newman_back_node:nf { 30 } { \IfNoValueF { #5 } { #5 } } \chemmacros_newman_back_node:nf { 150 } { \IfNoValueF { #6 } { #6 } } \chemmacros_newman_back_node:nf { 270 } { \IfNoValueF { #4 } { #4 } } \chemmacros_newman_front_node:nf { 90 } { \IfNoValueF { #1 } { #1 } } \chemmacros_newman_front_node:nf { 210 } { \IfNoValueF { #2 } { #2 } } \chemmacros_newman_front_node:nf { 330 } { \IfNoValueF { #3 } { #3 } } } } % provide cartesian coordiantes from polar coordinates % #1: fp variable for x % #2: fp variable for y % #3: angle % #4: radius \cs_new: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: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: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 } (0,0) -- ++ ( 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[]{} % 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: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:Npn \chemmacros_orbital_s_draw:n #1 { \IfNoValueF { #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 } (0,0) circle (\l__chemmacros_orbital_s_scale_tl * .6em) ; } } % --------------------------------------------------------------------------- % % p-orbitals \cs_new: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:Npn \chemmacros_orbital_p_draw:n #1 { \IfNoValueF { #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 } (0,0) .. 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 ) .. (0,0); \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 } (0,0) .. 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 ) .. (0,0); } } } % --------------------------------------------------------------------------- % % sp-orbitals \cs_new: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:Npn \chemmacros_orbital_sp_draw:n #1 { \IfNoValueF { #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 } (0,0) .. 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 ) .. (0,0); \chemmacros_tikz_shadedraw:f { draw = \l__chemmacros_orbital_sp_mphase_color_tl , ball~color = \l__chemmacros_orbital_sp_mphase_color_tl } (0,0) .. 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 ) .. (0,0); } } % --------------------------------------------------------------------------- % % sp2-orbitals \cs_new: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:Npn \chemmacros_orbital_sptwo_draw:n #1 { \IfNoValueF { #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 } (0,0) .. 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 ) .. (0,0); \chemmacros_tikz_shadedraw:f { draw = \l__chemmacros_orbital_sptwo_mphase_color_tl , ball~color = \l__chemmacros_orbital_sptwo_mphase_color_tl } (0,0) .. 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 ) .. (0,0); } } % --------------------------------------------------------------------------- % % sp3-orbitals \cs_new: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:Npn \chemmacros_orbital_spthree_draw:n #1 { \IfNoValueF { #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 } (0,0) .. 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 ) .. (0,0); \chemmacros_tikz_shadedraw:f { draw = \l__chemmacros_orbital_spthree_mphase_color_tl , ball~color = \l__chemmacros_orbital_spthree_mphase_color_tl } (0,0) .. 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 ) .. (0,0); } } % --------------------------------------------------------------------------- % % 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: } } % TODO separate document and module level \NewDocumentCommand \orbital { o m } { \group_begin: \keys_set:nn { chemmacros / orbital / type } { #2 } \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 } } \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 } } { \keys_set:nn { chemmacros / #1 } { #2 } } \ignorespaces } % --------------------------------------------------------------------------- % % load old definitions: \bool_if:NT \l__chemmacros_version_one_bool { \file_input:n { chemmacros-version1 . cfg } } % --------------------------------------------------------------------------- % % hyperref support % ?? unsure about adding IUPAC commands \AfterPackage* { hyperref } { \pdfstringdefDisableCommands { \cs_set:Npn \- { - }% myabe not a good idea... \cs_set:Npn \| { } \cs_set:Npn \iupac #1 { #1 } \cs_set:Npn \pH { pH } \cs_set:Npn \pOH { pOH } } } \tex_endinput:D % --------------------------------------------------------------------------- % Version history 2011/05/15 - version 1.0 - CTAN release 2011/06/22 - version 1.1 - "LaTeXified" whole package for safer usage - less user work required (like loading package after another) - more particle macros - latin phrases - extra units - acid/base commands - \mech - \NMR - \mhName, \setmhName, \newreaction, phases - \renewstate, \setstatesubscript - improved orbitals - simpler package options, option german, bpchem - bug fixes 2011/10/28 - version 2.0 - rewritten in expl3 - customization via \chemsetup - new commands \p, \fplus, \fminus, \fpch, \fmch, \fscrp, \fsrcm, \fdelp, \fdelm, \orbital, \chemsetup - various commands have a new syntax - removed: \setmhName, \setredoxdist, \setstatesubscript, \porb, \phorb, \pxorb, \pyorb, \pzorb, \setorbheight, \solid, \liquid - reaction environments work with hyperref and varioref 2011/11/03 - version 2.0a - minor bug fixes - new feature for \Nu - new command \ba 2012/01/28 - version 3.0 - bundled with packages `formula' and `ghs' - new commands \Ka, \Kb, \Kw - commands can detect if font series is bold - new package option "detect-bold" - new package option "method" => choose between `mhchem' and `formula' for internal uses. - new package option "ghs" => load `ghs' or don't - new package option "synchronize" - new package option "strict" - new command \iupac - new command \listofreactions, reaction environments with optional argument - \cis, \trans, \tert without \xspace 2012/01/30 - version 3.0a - bugfix in formula.sty - renamed formula => chemformula and ghs => ghsystem to make the names unique (following a request by Karl Berry for TeXlive) 2012/02/03 - version 3.0b - new command \DeclareChemParticle, updated documentation 2012/02/05 - version 3.0c - renamed pictogram files (following a request by Karl Berry for TeXlive) - new package option "Nu" 2012/02/10 - version 3.0d - several bugfixes in chemformula - bugfixes with \DeclareChemParticle - new command \RenewChemParticle - new option phases / pos - new commands \DeclareChemPhase, \RenewChemPhase, \phase - changed default behaviour of phases - removed optional argument from \sld and \lqd - new arrow type <> 2012/02/19 - version 3.1 - new commands \DeclareChemIUPAC and \RenewChemIUPAC - new option "option/iupac" - deprecated option: "option/EZ" - deprecated commands: \newreaction => \DeclareChemReaction \setnewstate => \DeclareChemState \renewstate => \RenewChemState \Rcip => \R \Scip => \S \Dfi => \D \Lfi => \L - new arrow types -/>, - new commands \DeclareChemArrow, \RenewChemArrow and \ShowChemArrow 2012/02/26 - version 3.1a - "operator" p rewritten to follow IUPAC recommendations - new option "acid-base/p-style" - deprecated option: "option/detect-bold" 2012/03/03 - version 3.1b - arrow types are stored in a sequence to automate the search and replace in the right order - new arrow type == - IUPAC compliance for stoichiometric factors - new handling of super- and subscripts to correct various flaws: clear distinction between isotope and formula - new option charge-vshift - IUPAC compliance for \Delta and \ox 2012/03/14 - version 3.1c - compatibility with KOMA's global option "version = " - bugfix in the list of reactions - improved arrow labels 2012/03/20 - version 3.2 - new: option input via @{} - improved list of reactions: resetting the "reaction" counter now doesn't cause errors any more - \AddRxnDesc added which allows to add descriptions to each reaction in the "reactions" environment 2012/05/07 - version 3.3 - new environment `experimental' that allows some formatting for the for displaying of measurement results - more greek letters for the \iupac command - \ch now bypasses \ref{}, \label{}, and \intertext{} - small adjustments of the iupac commands \| and \- - bug fix: option `upgreek' is now working and was renamed to `greek' - proper language support 2012/05/13 - version 3.3a - Italian translations of the H, EUH and P statements - \hapto and \bridge 2012/05/18 - version 3.3b - compatibility with MiKTeX 2012/05/18 - version 3.3c - fix in the `ghsystem/language' option 2012/07/24 - version 3.3d - additional picture file type `pdf' - default bond length set to 1.1667ex - bug fix in the bonds - added kerning to cip commands, new option `iupac/cip-kern' - bug fix: messages needed to be defined before the options 2012/08/21 - version 3.3e - new option ox/align=center|right - a new option to \NMR and to \J 2012/09/11 - version 3.4 - cleaned a little, minor bug fixes - switched to internal scratch variables - new command \bond, more bond types - new commands \DeclareChemBond, \DeclareChemBondAlias, \RenewChemBond and \ShowChemBond - radical point thicker, new options `radical-style' and `radical-radius' 2012/10/03 - version 3.4a - bug fix in coupling constant \J 2013/01/04 - version 3.4b - bug fix in the sub- and superscript handling 2013/01/28 - version 3.5 - disallow breaks at bonds - allow breaks after arrows - made some spaces in chemformulas stretch- and shrinkable - various internal code improvements - changed defaults for horizontal spaces that have in set in ex into corresponding values in em. - improvements to the placement of sub- and superscripts % --------------------------------------------------------------------------- % % TODO: - ox-option xfrac vs math? - drop option `bpchem' - add d-orbitals - add kpfonts to `greek' option so \Chemalpha and kin use \alphaup ... of kpfonts package