%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % --------------------------------------------------------------------------- % % - chemmacros - chemmacros.sty - % % - macros and commands for chemists - % % --------------------------------------------------------------------------- % % - Clemens Niederberger - % % - 2011/11/03 - % % --------------------------------------------------------------------------- % % - http://www.mychemistry.eu/ - % % - contact@mychemistry.eu - % % --------------------------------------------------------------------------- % % - If you have any ideas, questions, suggestions or bugs to report, please - % % - feel free to contact me. - % % --------------------------------------------------------------------------- % % - Copyright 2011 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. - % % - - % % - This work consists of the files chemmacros.sty, chemmacros-version1.cfg - % % - chemmacros_doc_de.tex, chemmacros_doc_de.tex, README and the derived - % % - files chemmacros_doc_de.pdf and chemmacros_doc_en.pdf - % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \RequirePackage{ expl3 , xparse , l3keys2e , xfrac , siunitx , tikz , mathtools , cancel , environ } \usetikzlibrary{calc,arrows} \AtBeginDocument { \@ifpackageloaded{mhchem}{} { \RequirePackage[ version=3 ]{ mhchem } } } \ProvidesExplPackage {chemmacros} {2011/11/03} {2.0a} {macros and commands for chemists} \bool_new:N \l_chemmacros_version_one_bool \bool_set_false:N \l_chemmacros_version_one_bool \bool_new:N \l_chemmacros_german_bool \bool_set_false:N \l_chemmacros_german_bool \bool_new:N \l_chemmacros_xspace_bool \bool_set_true:N \l_chemmacros_xspace_bool \bool_new:N \l_chemmacros_bpchem_bool \bool_set_false: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_set_false:N \l_chemmacros_EZ_cool_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 \AtBeginDocument { \@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 } } % --------------------------------------------------------------------------- % % package options % german => change pKA => pKS etc % xspace => add an \xspace after a whole bunch of macros % bpchem => use \IUPAC inside for \NMR command % circled => circle charges % EZ => cool or chemmacros version of \E % version=1 => compatibility for documents set with v1.* \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 } , circletype .default:n = chem , circled .choice: , circled / none .code:n = { \bool_set_false:N \l_chemmacros_circled_bool \bool_set_false:N \l_chemmacros_circled_formal_bool } , circled / formal .code:n = { \bool_set_true:N \l_chemmacros_circled_bool \bool_set_true:N \l_chemmacros_circled_formal_bool } , circled / all .code:n = { \bool_set_true:N \l_chemmacros_circled_bool \bool_set_false:N \l_chemmacros_circled_formal_bool } , circled .default:n = formal , EZ .choice: , EZ / cool .code:n = { \bool_set_true:N \l_chemmacros_EZ_cool_bool } , EZ / chemmacros .code:n = { \bool_set_false:N \l_chemmacros_EZ_cool_bool } , EZ .default:n = chemmacros , german .bool_set:N = \l_chemmacros_german_bool , german .default:n = true , xspace .bool_set:N = \l_chemmacros_xspace_bool , xspace .default:n = true , version .choice: , version / 1 .code:n = { \bool_set_true:N \l_chemmacros_version_one_bool } , version / 2 .code:n = { \bool_set_false:N \l_chemmacros_version_one_bool } } \ProcessKeysOptions { chemmacros / option } \AtBeginDocument { \bool_if:NT \l_chemmacros_bpchem_bool { \RequirePackage { bpchem } } \bool_if:NT \l_chemmacros_xspace_bool { \RequirePackage { xspace } } } \cs_new_nopar:Npn \chemmacros_xspace: { \bool_if:NT \l_chemmacros_xspace_bool { \xspace } } % --------------------------------------------------------------------------- % % warning / error messages \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:nnn { chemmacros } { ox } { \token_to_str:N \ox \c_space_tl : ~ #1 ~ \msg_line_context: . } \msg_set:nnn { chemmacros } { OX } { \token_to_str:N \OX \c_space_tl : ~ #1 ~ \msg_line_context: . } \msg_set:nnn { chemmacros } { redox } { \token_to_str:N \redox \c_space_tl : ~ #1 ~ \msg_line_context: . } \msg_set:nnn { 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: . } \msg_set:nnn { chemmacros } { setnewstate } { 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 \renewstate \c_space_tl to~alter~it. } \msg_set:nnn { chemmacros } { renewstate } { 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 \setnewstate \c_space_tl to~create~it. } % --------------------------------------------------------------------------- % % TikZ drawings \cs_new_nopar:Npn \chemmacros_tikz_picture:nn #1#2 { \tikzpicture[#1] #2 \endtikzpicture } \cs_generate_variant:Nn \chemmacros_tikz_picture:nn { fn,xn } \cs_new_nopar:Npn \chemmacros_tikz_draw:n #1 { \draw[#1] } \cs_generate_variant:Nn \chemmacros_tikz_draw:n { f,x } \cs_new_nopar:Npn \chemmacros_tikz_node:n #1 { \node[#1] } \cs_generate_variant:Nn \chemmacros_tikz_node:n { f,x } \cs_new_nopar:Npn \chemmacros_tikz_shade:n #1 { \shade[#1] } \cs_generate_variant:Nn \chemmacros_tikz_shade:n { f,x } \cs_new_nopar:Npn \chemmacros_tikz_shadedraw:n #1 { \shadedraw[#1] } \cs_generate_variant:Nn \chemmacros_tikz_shadedraw:n { f,x } \cs_new_nopar:Npn \chemmacros_tikz_node_in_draw:n #1 { node[#1] } \cs_generate_variant:Nn \chemmacros_tikz_node_in_draw:n { f,x } % --------------------------------------------------------------------------- % % circled charge signs % Definition inspired by chemstyle's definition of \standarsstate % \cs_new_nopar:Npn \chemmacros_fplus_aux: % { % \raise.1ex\hbox{\scalebox{.65}{\textcircled{\lower.1ex\hbox{$+$}}}} % } % \cs_new_nopar:Npn \chemmacros_fplus: % { % \mode_if_math:TF % { \text { \chemmacros_fplus_aux: } } % { \chemmacros_fplus_aux: } % } \cs_new_nopar:Npn \chemmacros_fplus: { \ensuremath { \chemmacros_fplus_aux_i: } } \cs_new_nopar:Npn \chemmacros_fplus_aux_i: { \mathpalette \chemmacros_fplus_aux_ii: \bigcirc } \cs_new_nopar: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_nopar:Npn \chemmacros_fminus_aux: % { % \raise.1ex\hbox{\scalebox{.65}{\textcircled{\lower.1ex\hbox{$-$}}}} % } % \cs_new_nopar:Npn \chemmacros_fminus: % { % \mode_if_math:TF % { \text { \chemmacros_fminus_aux: } } % { \chemmacros_fminus_aux: } % } \cs_new_nopar:Npn \chemmacros_fminus: { \ensuremath { \chemmacros_fminus_aux_i: } } \cs_new_nopar:Npn \chemmacros_fminus_aux_i: { \mathpalette \chemmacros_fminus_aux_aux_ii: \bigcirc } \cs_new_nopar: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_nopar: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_nopar: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_nopar:Npn \chemmacros_formal_plus: { \bool_set_false:N \l_chemmacros_circled_formal_bool \chemmacros_plus: } \cs_new_nopar:Npn \chemmacros_formal_minus: { \bool_set_false:N \l_chemmacros_circled_formal_bool \chemmacros_minus: } % --------------------------------------------------------------------------- % % transition state symbol \AtBeginDocument { \cs_new_nopar:Npn \chemmacros_transitionstatesymbol: { \mode_if_math:TF { \text { \chemmacros_transitionstatesymbol_aux: } } { \chemmacros_transitionstatesymbol_aux: } } \cs_new_nopar:Npn \chemmacros_transitionstatesymbol_aux: { \tikz[inner~sep=0,outer~sep=0,minimum~size=0,space-space,line~width=.3pt] { \draw (0,0) -- node[pos=.36] (chemmacros_transitionstate_x) {} node[pos=.64] (chemmacros_transitionstate_y){} (0,.8em) ; \draw (chemmacros_transitionstate_x) ++(-.4em,0) -- ++(.8em,0) ; \draw (chemmacros_transitionstate_y) ++(-.4em,0) -- ++(.8em,0) ; } } \@ifpackageloaded{mychemistry} { \cs_set_eq:NN \transitionstatesymbol \chemmacros_transitionstatesymbol: } { \cs_new_eq:NN \transitionstatesymbol \chemmacros_transitionstatesymbol: } } \cs_new_nopar:Npn \chemmacros_atom:n #1 { \ce { #1 } } \cs_generate_variant:Nn \chemmacros_atom:n { o,f,x } % --------------------------------------------------------------------------- % % particles, charges % electron \bool_new:N \l_chemmacros_charge_append_bool \bool_set_false:N \l_chemmacros_charge_append_bool \cs_new_nopar:Npn \el { \chemmacros_atom:n { e } \mch \chemmacros_xspace: } % proton \cs_new_nopar:Npn \prt { \chemmacros_atom:n { p } \pch \chemmacros_xspace: } % neutron \cs_new_nopar:Npn \ntr { \chemmacros_atom:n { n^0 } \chemmacros_xspace: } % charges \cs_new_nopar:Npn \chemmacros_charge:n #1 { \bool_if:NTF \l_chemmacros_charge_append_bool { \mode_if_math:TF { {}^ { #1 } } { $ {}^ { #1 } $ } } { \mode_if_math:TF { ^ { #1 } } { $ ^ { #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_nopar:Npn \delm { \mbox { \tiny \( \delta \chemmacros_minus: \) } \chemmacros_xspace: } \cs_new_nopar:Npn \delp { \mbox { \tiny \( \delta \chemmacros_plus: \) } \chemmacros_xspace: } \cs_new_nopar:Npn \fdelm { \mbox { \tiny \( \delta \chemmacros_formal_minus: \) } \chemmacros_xspace: } \cs_new_nopar:Npn \fdelp { \mbox { \tiny \( \delta \chemmacros_formal_plus: \) } \chemmacros_xspace: } \cs_new_nopar:Npn \scrm { \ensuremath { \scriptstyle \chemmacros_minus: } } \cs_new_nopar:Npn \scrp { \ensuremath { \scriptstyle \chemmacros_plus: } } \cs_new_nopar:Npn \fscrm { \ensuremath { \scriptstyle \chemmacros_formal_minus: } } \cs_new_nopar:Npn \fscrp { \ensuremath { \scriptstyle \chemmacros_formal_plus: } } \cs_new_nopar:Npn \fsscrm { \ensuremath { \scriptscriptstyle \chemmacros_formal_minus: } } \cs_new_nopar:Npn \fsscrp { \ensuremath { \scriptscriptstyle \chemmacros_formal_plus: } } % --------------------------------------------------------------------------- % % ions, molecules % proton, hydroxide, hydronium/oxonium, water, nucleophile, electrophile \cs_new_nopar:Npn \Hpl { \chemmacros_atom:n { H } \pch \chemmacros_xspace: } \cs_new_nopar:Npn \Hyd { \chemmacros_atom:n { OH } \mch \chemmacros_xspace: } \cs_new_nopar:Npn \HtO { \chemmacros_atom:n { H3O } \pch \chemmacros_xspace: } \cs_new_nopar:Npn \water { \chemmacros_atom:n { H2O } \chemmacros_xspace: } \NewDocumentCommand \Nu { o } { \IfNoValueF { #1 } { \keys_set:nn { chemmacros / particle } { #1 } } \bool_if:NTF \l_chemmacros_particle_elpair_bool { \chemmacros_elpair:n { Nu } } { \chemmacros_atom:n { Nu } } \mch \chemmacros_xspace: } \cs_new_nopar:Npn \El { \chemmacros_atom:n { E } \pch \chemmacros_xspace: } \NewDocumentCommand \ba { o } { \IfNoValueF { #1 } { \keys_set:nn { chemmacros / particle } { #1 } } \bool_if:NTF \l_chemmacros_particle_elpair_bool { \chemmacros_elpair:n { ba } } { \chemmacros_atom:n { ba } } \mch \chemmacros_xspace: } \cs_new_nopar:Npn \chemmacros_elpair:n #1 { \bool_if:NTF \l_chemmacros_chemfig_bool { \bool_if:NTF \l_chemmacros_elpair_dots_bool { \Lewis { 0: , #1 } } { \Lewis { 0 , #1 } } } { \msg_warning:nnx { 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 } % --------------------------------------------------------------------------- % % stereo descriptors and sim. % Cahn-Ingold-Prelog \cs_new_nopar:Npn \Rcip { \textit { (R) } } \cs_new_nopar:Npn \Scip { \textit { (S) } } \cs_new_nopar:Npn \cip #1 { \textit { (#1) } } \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) \AtBeginDocument { \bool_if:NTF \l_chemmacros_EZ_cool_bool { \cs_new_nopar:Npn \Ent { \textit { (E) } } \cs_new_nopar:Npn \Zus { \textit { (Z) } } } { \cs_if_free:NTF \E { \cs_new_nopar:Npn \E { \textit { (E) } } } { \cs_set_nopar:Npn \E { \textit { (E) } } } \cs_new_nopar:Npn \Z { \textit { (Z) } } } } \AtBeginDocument { \cs_if_free:NTF \cis { \cs_new_nopar:Npn \cis { \textit { cis } \chemmacros_xspace: } } { \cs_set_nopar:Npn \cis { \textit { cis } \chemmacros_xspace: } } \cs_if_free:NTF \trans { \cs_new_nopar:Npn \trans { \textit { trans } \chemmacros_xspace: } } { \cs_set_nopar:Npn \trans { \textit { trans } \chemmacros_xspace: } } } \cs_new_nopar:Npn \tert { \textit { tert } \chemmacros_xspace: } % Fischer \cs_new_nopar:Npn \Dfi { \textsc { d } } \cs_new_nopar:Npn \Lfi { \textsc { l } } % ortho/meta/para \cs_new_nopar:Npn \ortho { \textsl { o } } \cs_new_nopar:Npn \meta { \textsl { m } } \cs_new_nopar:Npn \para { \textsl { p } } % latin phrases \AtBeginDocument { \bool_if:NTF \l_chemmacros_chemstyle_bool { \cs_new_nopar:Npn \insitu { \latin{in~situ} \chemmacros_xspace: } \cs_new_nopar:Npn \abinitio { \latin{ab~initio} \chemmacros_xspace: } } { \cs_new_nopar:Npn \insitu { \textit{in~situ} \chemmacros_xspace: } \cs_new_nopar:Npn \abinitio { \textit{ab~initio} \chemmacros_xspace: } } } % --------------------------------------------------------------------------- % % acid/base \cs_new_nopar:Npn \pH { \mbox { \textsl { p } H } \chemmacros_xspace: } \cs_new_nopar:Npn \pOH { \mbox { \textsl { p } OH } \chemmacros_xspace: } \NewDocumentCommand \p { m } { \mbox { \textsl { p } \ensuremath { #1 } } \chemmacros_xspace: } \char_set_catcode_math_subscript:N \@ \NewDocumentCommand \pKa { o } { \mbox { \textsl { p } \( K @ \mathrm { \bool_if:NTF \l_chemmacros_german_bool { S } { A } \IfNoValueF{ #1 } { #1 } } \) } \chemmacros_xspace: } \NewDocumentCommand \pKb { o } { \mbox { \textsl { p } \( K @ \mathrm { B \IfNoValueF{ #1 } { #1 } } \) } \chemmacros_xspace: } \char_set_catcode_letter:N \@ % --------------------------------------------------------------------------- % % substituents % \R[]{} \char_set_catcode_math_subscript:N \@ \NewDocumentCommand \R { o g } { \chemmacros_atom:n { R $ \IfNoValueF { #2 } { @ { \mathrm { #2 } } } ^ { \IfNoValueF { #1 } { \tl_if_eq:nnTF { #1 } { + } { \chemmacros_plus: } { \tl_if_eq:nnT { #1 } { - } { \chemmacros_minus: } } } } $ } } \char_set_catcode_letter:N \@ % --------------------------------------------------------------------------- % % 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_nopar: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 } } \char_set_catcode_math_subscript:N \@ \keys_define:nn { chemmacros / mech } { type .choice: , type / .code:n = { \chemmacros_set_mech:nnn { S } { $ @ \text {N} $ } {} } , type / 1 .code:n = { \chemmacros_set_mech:nnn { S } { $ @ \text {N} $ 1 } {} } , type / 2 .code:n = { \chemmacros_set_mech:nnn { S } { $ @ \text {N} $ 2 } {} } , type / se .code:n = { \chemmacros_set_mech:nnn { S } { $ @ \text {E} $ } {} } , type / 1e .code:n = { \chemmacros_set_mech:nnn { S } { $ @ \text {E} $ 1 } {} } , type / 2e .code:n = { \chemmacros_set_mech:nnn { S } { $ @ \text {E} $ 2 } {} } , type / ar .code:n = { \chemmacros_set_mech:nnn { S } { $ @ \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 $ @ \text {cb} $ } {} } , type .default:n = } \NewDocumentCommand \mech { o } { \IfNoValueTF { #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: } \char_set_catcode_letter:N \@ % --------------------------------------------------------------------------- % % 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 \int_new:N \l_chemmacros_ox_number_int \fp_new:N \l_chemmacros_ox_number_fp \bool_new:N \l_chemmacros_ox_side_bool \bool_set_false:N \l_chemmacros_ox_side_bool \bool_new:N \l_chemmacros_ox_super_bool \bool_set_false:N \l_chemmacros_ox_super_bool \bool_new:N \l_chemmacros_ox_top_bool \bool_set_true:N \l_chemmacros_ox_top_bool \cs_new_nopar: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.5 , denominator-bot-sep = -.5ex , numerator-top-sep = -.3ex , slash-left-kern = -.05em , slash-right-kern = -.05em , slash-symbol-font = ptm } \cs_new_nopar: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_nopar: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_nopar: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:N \l_chemmacros_ox_number_fp \bool_if:NTF \l_chemmacros_ox_format_roman_bool { \chemmacros_fp_to_Roman:N \l_chemmacros_ox_number_fp } { \bool_if:NTF \l_chemmacros_ox_integer_bool { \chemmacros_fp_to_arabic:N \l_chemmacros_ox_number_fp } { \chemmacros_fp_show:N \l_chemmacros_ox_number_fp } } } \cs_new_nopar:Npn \chemmacros_ox_is_integer:n #1 { \fp_set:Nn \l_tmpa_tl { #1 } \fp_add:Nn \l_tmpa_tl { 1 } \fp_round_places:Nn \l_tmpa_tl { 0 } \fp_sub:Nn \l_tmpa_tl { 1 } \fp_compare:nNnTF { \l_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 { N } \cs_new_nopar:Npn \chemmacros_fp_to_Roman:n #1 { \group_begin: \fp_set:Nn \l_tmpa_tl { #1 } \fp_round_places:Nn \l_tmpa_tl { 0 } \int_set:Nn \l_tmpa_int { \fp_to_tl:N \l_tmpa_tl } \int_compare:nTF { \l_tmpa_int = 0 } { 0 } { \int_to_Roman:n { \int_use:N \l_tmpa_int } } \group_end: } \cs_generate_variant:Nn \chemmacros_fp_to_Roman:n { N } \cs_new_nopar:Npn \chemmacros_fp_to_arabic:n #1 { \group_begin: \fp_set:Nn \l_tmpa_tl { #1 } \fp_to_tl:N \l_tmpa_tl \group_end: } \cs_generate_variant:Nn \chemmacros_fp_to_arabic:n { N } \cs_new_nopar:Npn \chemmacros_fp_show:n #1 { \group_begin: \fp_set:Nn \l_tmpa_tl { #1 } \bool_if:NTF \l_chemmacros_ox_decimal_marker_comma_bool { \tl_set:Nx \l_tmpb_tl { \fp_to_tl:N \l_tmpa_tl } \tl_replace_once:Nnn \l_tmpb_tl { . } { {,} } \tl_use:N \l_tmpb_tl } { \fp_to_tl:N \l_tmpa_tl } \group_end: } \cs_generate_variant:Nn \chemmacros_fp_show:n { N } \cs_new_nopar:Npn \chemmacros_ox: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_atom:n { #2 ^ { \text { \tiny \chemmacros_ox_process_number:n { #1 } } } } } \bool_if:NT \l_chemmacros_ox_side_bool { \chemmacros_atom:n { #2 ( \text { \chemmacros_ox_process_number:n { #1 } } ) } } \bool_if:NT \l_chemmacros_ox_top_bool { \overset { \mbox { \tiny \chemmacros_ox_process_number:n { #1 } } } { \chemmacros_atom:n { #2 } } } } } \cs_new_nopar: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_nopar: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_nopar: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 } } % \ox[]{,} % \ox*[]{,} => always number on the side \NewDocumentCommand \ox { s o > { \SplitArgument { 1 } { , } } m } { \group_begin: \IfBooleanT { #1 } { \chemmacros_ox_pos_super: } \bool_if:NTF \l_chemmacros_version_one_bool { \keys_set:nn { chemmacros / ox } { parse = false } } { \IfNoValueF { #2 } { \keys_set:nn { chemmacros / ox } { #2 } } } \chemmacros_ox:nn #3 \group_end: } % --------------------------------------------------------------------------- % % - 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 \fp_new:N \l_chemmacros_redox_shift_fp \tl_new:N \l_chemmacros_redox_shift_tl \tl_new:N \l_chemmacros_redox_anchor_tl \tl_new:N \l_chemmacros_redox_side_tl \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_nopar: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) { \chemmacros_atom:n {#2} } ; } } \cs_new_nopar: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 } } \NewDocumentCommand \redox { > { \SplitArgument { 1 } { , } } d() o o m } { \IfNoValueT { #1 } { \msg_error:nnx { chemmacros } { redox } { You~need~to~specify~coordinates } } \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 \IfNoValueF { #2 } { \tl_set:Nn \l_chemmacros_redox_tikz_tl { #2 } } \IfNoValueTF { #3 } { \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 { #3 } < { 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 { #3 } } \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] { #4 } ($(\l_chemmacros_redox_end_tl . \l_chemmacros_redox_side_tl)+(0,\l_chemmacros_redox_sep_dim)$) ; } } % 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 \l_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_element_tl \tl_new:N \l_chemmacros_nmr_element_default_tl \tl_set:Nn \l_chemmacros_nmr_element_default_tl { H } \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 \tl_new:N \l_chemmacros_nmr_unit_tl \tl_set:Nn \l_chemmacros_nmr_unit_tl { \mega\hertz } \cs_new_nopar:Npn \chemmacros_nmr_nucleus:n #1,#2 \q_stop { \tl_set:Nn \l_chemmacros_nmr_isotope_tl { #1 } \tl_set:Nn \l_chemmacros_nmr_element_tl { #2 } } \cs_new:Npn \chemmacros_nmr_default_nucleus:n #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_nopar:Npn \chemmacros_nmr_base:nn #1#2 { \bool_if:NTF \l_chemmacros_bpchem_bool { \IUPAC { \^ { #1 } #2 - NMR } } { $ ^ { #1 } $ #2 - NMR } } \cs_new_nopar:Npn \chemmacros_nmr_frequency:n #1 { \tl_if_in:nnTF { #1 } { , } { \chemmacros_nmr_frequency_aux_i:n #1 \q_stop } { \chemmacros_nmr_frequency_aux_ii:n { #1 } } } \cs_new_nopar:Npn \chemmacros_nmr_frequency_aux_i:n #1,#2 \q_stop { \SI { #1 } { #2 } } \cs_new_nopar: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:n #1 \q_stop } , nucleus .default:n = { 1,H } } \AtBeginDocument { % \NMR{,}(,)[] ALL arguments are optional % \NMR* same but without ": $\delta$" at end \NewDocumentCommand \NMR { s g d() o } { \group_begin: \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:n \l_chemmacros_nmr_isotope_default_tl , \l_chemmacros_nmr_element_default_tl \q_stop } { \chemmacros_nmr_nucleus:n #2 \q_stop } \mode_if_math:TF { \text { \chemmacros_nmr_base:nn { \tl_use:N \l_chemmacros_nmr_isotope_tl } { \tl_use:N \l_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 } { : ~ } } \IfBooleanF { #1 } { \delta } } { \chemmacros_nmr_base:nn { \tl_use:N \l_chemmacros_nmr_isotope_tl } { \tl_use:N \l_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 } { : ~ $ \delta $ } \bool_if:NF \l_chemmacros_nmr_comma_bool { \IfBooleanF { #1 } { \chemmacros_xspace: } } } \group_end: } } % --------------------------------------------------------------------------- % % placing text below atom/molecule \cs_new_nopar:Npn \dim_to_width:nn #1#2 { \settowidth { #1 } { #2 } } \cs_generate_variant:Nn \dim_to_width:nn { Nn } \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_fontattr_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 , fontattr .tl_set:N = \l_chemmacros_mhname_fontattr_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 { \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 { \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_fontattr_tl \tl_use:N \l_chemmacros_mhname_fontsize_tl #3 } } { \chemmacros_atom:n { #2 } } } \group_end: } } % --------------------------------------------------------------------------- % % - phases \char_set_catcode_math_subscript:N \@ \cs_new_nopar:Npn \sld { \peek_meaning:NTF [ { \chemmacros_sld_aux_i: } { \chemmacros_sld_aux_ii: } } \cs_new_nopar:Npn \chemmacros_sld_aux_i: [#1] { \ensuremath { @ \mathrm { ( #1 ) } } } \cs_new_nopar:Npn \chemmacros_sld_aux_ii: { \ensuremath { @ \mathrm { ( \bool_if:NTF \l_chemmacros_german_bool { f } { s } ) } } } \cs_new_nopar:Npn \lqd { \peek_meaning:NTF [ { \chemmacros_lqd_aux_i: } { \chemmacros_lqd_aux_ii: } } \cs_new_nopar:Npn \chemmacros_lqd_aux_i: [#1] { \ensuremath { @ \mathrm { ( #1 ) } } } \cs_new_nopar:Npn \chemmacros_lqd_aux_ii: { \ensuremath { @ \mathrm { ( \bool_if:NTF \l_chemmacros_german_bool { f\/l } { l } ) } } } \bool_if:NT \l_chemmacros_version_one_bool { \cs_new_eq:NN \solid \sld \cs_new_eq:NN \liquid \lqd } \cs_new_nopar:Npn \gas { \ensuremath { @ \mathrm { (g) } } } \cs_new_nopar:Npn \aq { \ensuremath { @ \mathrm { (aq) } } } \char_set_catcode_letter:N \@ % --------------------------------------------------------------------------- % \bool_if:NTF \l_chemmacros_version_one_bool { \newtagform { CMreaction } { \{ } { \} } } { \newtagform { reaction } { \{ } { \} } } \newcounter { chemmacros_save_reaction } \newcounter { reaction } \cs_new_nopar:Npn \chemmacros_begin_reaction: { \bool_if:NT \l_chemmacros_hyperref_bool % create individual names for hyperref { \cs_set_nopar:Npn \theHequation { R . \theHsection . \arabic { reaction } } } \bool_if:NT \l_chemmacros_varioref_bool % enable labelformat reaction { \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 } } } \cs_new_nopar:Npn \chemmacros_end_reaction: { \setcounter { reaction } { \value { equation } } \setcounter { equation } { \value { chemmacros_save_reaction } } } % --------------------------------------------------------------------------- % % reaction environments for mhchem \bool_new:N \l_chemmacros_reactions_star_bool \bool_new:N \l_chemmacros_reactions_args_bool \int_new:N \l_chemmacros_reactions_args_int \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 } % \newreaction[]{}{} \bool_if:NF \l_chemmacros_version_one_bool { \NewDocumentCommand \newreaction { 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 } [ 1 ] { \chemmacros_begin_reaction: \begin { #3 } { ##1 } \chemmacros_cee:f { \BODY } \end{ #3 } \chemmacros_end_reaction: } \bool_if:NT \l_chemmacros_reactions_star_bool { \NewEnviron { #2* } [ 1 ] { \begin { #3* } { ##1 } \chemmacros_cee:f { \BODY } \end { #3* } } } } { \NewEnviron { #2 } { \chemmacros_begin_reaction: \begin { #3 } \chemmacros_cee:f { \BODY } \end { #3 } \chemmacros_end_reaction: } \bool_if:NT \l_chemmacros_reactions_star_bool { \NewEnviron { #2* } { \begin { #3* } \chemmacros_cee:f { \BODY } \end { #3* } } } } } } } \cs_new:Npn \chemmacros_cee:n #1 { \cee { #1 } } \cs_generate_variant:Nn \chemmacros_cee:n { f } % predefined: \bool_if:NF \l_chemmacros_version_one_bool { \newreaction [ star ] { reaction } { equation } \newreaction [ star ] { reactions } { align } } \NewDocumentCommand \chcancel { m } { \cancel { \chemmacros_atom:f { #1 } } } % --------------------------------------------------------------------------- % % thermodynamics et.al. % \standardstate as defined by the chemstyle package. Thanks to Joseph Wright \cs_if_exist:NF \standardstate { \cs_new_nopar:Npn \standardstate { \ensuremath { \chemmacros_standardstate: } } \cs_new_nopar:Npn \chemmacros_standardstate: { \mathpalette \chemmacros_standardstate_aux: \circ } \cs_new_nopar: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 } \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 \tl_new:N \l_chemmacros_State_exponent_tl \tl_set:Nn \l_chemmacros_State_exponent_tl { \standardstate } \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! \char_set_catcode_math_subscript:N \@ \cs_new_nopar: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 { @ { \text { #3 } } } #2 \bool_if:NF \l_chemmacros_State_subscript_left_bool { @ { \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: } } \char_set_catcode_letter:N \@ % --------------------------------------------------------------------------- % \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 } % \setnewstate[]{}{}{} \bool_if:NF \l_chemmacros_version_one_bool { \cs_new:Npn \setnewstate { \bool_set_false:N \l_chemmacros_renewstate_bool \chemmacros_setnewstate_reset: \peek_meaning:NTF [ { \setnewstate_aux_i:n } { \setnewstate_aux_ii:nnn } } % \renewstate[]{}{}{} \cs_new:Npn \renewstate { \bool_set_true:N \l_chemmacros_renewstate_bool \chemmacros_setnewstate_reset: \peek_meaning:NTF [ { \setnewstate_aux_i:n } { \setnewstate_aux_ii:nnn } } } \cs_new_nopar: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_nopar: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_nopar: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_nopar: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_nopar:cpn { #1 _aux_ii:n } (##1) { \tl_set:Nn \l_chemmacros_thermod_subscript_tl { ##1 } \tl_use:c { #1 _aux_iii:n } } \cs_new_nopar: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: } % predefined: \bool_if:NF \l_chemmacros_version_one_bool { \setnewstate {Enthalpy} {H} {\kilo\joule\per\mole} \setnewstate[delta=false,subscript-left=false] {Entropy} {S} {\joule\per\kelvin\per\mole} \setnewstate {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 } \tl_new:N \l_chemmacros_newman_tikz_ring_tl \tl_clear:N \l_chemmacros_newman_tikz_ring_tl \tl_new:N \l_chemmacros_newman_tikz_front_tl \tl_clear:N \l_chemmacros_newman_tikz_front_tl \tl_new:N \l_chemmacros_newman_tikz_back_tl \tl_clear:N \l_chemmacros_newman_tikz_back_tl \bool_new:N \l_chemmacros_newman_tikz_back_bool \fp_new:N \l_chemmacros_newman_x_fp \fp_new:N \l_chemmacros_newman_y_fp \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 } % old usage (v1.1): % \newman[,,][][]{<1>,<2>,<3>,<4>,<5>,<6>} % new usage (v1.2): % \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: angle pi #2: radius \cs_new_nopar:Npn \chemmacros_newman_coordinates:nn #1#2 { \fp_set:Nn \l_chemmacros_newman_tmp_angle_fp { #1 } \fp_div:Nn \l_chemmacros_newman_tmp_angle_fp { 180 } \fp_mul:Nn \l_chemmacros_newman_tmp_angle_fp { \fp_use:N \c_pi_fp } \fp_zero:N \l_chemmacros_newman_x_fp \fp_zero:N \l_chemmacros_newman_y_fp \fp_cos:Nn \l_chemmacros_newman_x_fp { \fp_use:N \l_chemmacros_newman_tmp_angle_fp } \fp_sin:Nn \l_chemmacros_newman_y_fp { \fp_use:N \l_chemmacros_newman_tmp_angle_fp } \fp_mul:Nn \l_chemmacros_newman_x_fp { \fp_use:N #2 } \fp_mul:Nn \l_chemmacros_newman_y_fp { \fp_use:N #2 } } \cs_generate_variant:Nn \chemmacros_newman_coordinates:nn { on } % 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_newman_coordinates:on { \fp_to_int:N \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_newman_coordinates:on { \fp_to_int:N \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_newman_coordinates:nn { #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_newman_coordinates:nn { #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 \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 \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 \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 } \bool_new:N \l_chemmacros_orbital_p_half_bool \bool_set_false:N \l_chemmacros_orbital_p_half_bool \bool_new:N \l_chemmacros_orbital_overlay_bool \bool_set_false:N \l_chemmacros_orbital_overlay_bool \bool_new:N \l_chemmacros_orbital_opacity_bool \bool_set_false:N \l_chemmacros_opacity_overlay_bool \fp_new:N \l_chemmacros_orbital_opacity_fp \fp_set:Nn \l_chemmacros_orbital_opacity_fp { 0.5 } \cs_new_nopar: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_nopar:Npn \chemmacros_orbital_overlay: { \bool_if:NT \l_chemmacros_orbital_overlay_bool { overlay } } \cs_new_nopar: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_nopar: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 } , phase .default:n = + , scale .tl_set:N = \l_chemmacros_orbital_s_scale_tl , color .tl_set:N = \l_chemmacros_orbital_s_color_tl } \cs_new_nopar: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_nopar: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_nopar: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_nopar: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_nopar: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_nopar: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_nopar: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_nopar: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_nopar: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: } } \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: } % --------------------------------------------------------------------------- % % setup \NewDocumentCommand \chemsetup { o m } { \IfNoValueTF { #1 } { \keys_set:nn { chemmacros } { #2 } } { \keys_set:nn { chemmacros / #1 } { #2 } } % \tex_unskip:D } % --------------------------------------------------------------------------- % % load old definitions: \bool_if:NT \l_chemmacros_version_one_bool { \input { chemmacros-version1 . cfg } } \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 % --------------------------------------------------------------------------- %