diff options
author | Karl Berry <karl@freefriends.org> | 2015-09-12 21:23:52 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2015-09-12 21:23:52 +0000 |
commit | af6faae1a8553e2c55f7980152d84d8cf4ac5a96 (patch) | |
tree | c0e8e756f5e5118331df38ec867e51d67a8d0f5d /Master/texmf-dist/tex/latex/chemmacros/chemmacros.sty | |
parent | b8a8a5629c2e03bdf95ebe04a220c4568a1dad14 (diff) |
chemmacros (12sep15)
git-svn-id: svn://tug.org/texlive/trunk@38359 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/chemmacros/chemmacros.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/chemmacros/chemmacros.sty | 4150 |
1 files changed, 113 insertions, 4037 deletions
diff --git a/Master/texmf-dist/tex/latex/chemmacros/chemmacros.sty b/Master/texmf-dist/tex/latex/chemmacros/chemmacros.sty index d6d1a07b195..27fcc7a93cd 100644 --- a/Master/texmf-dist/tex/latex/chemmacros/chemmacros.sty +++ b/Master/texmf-dist/tex/latex/chemmacros/chemmacros.sty @@ -1,7 +1,7 @@ % -------------------------------------------------------------------------- % the CHEMMACROS package % -% loads of little helpers for chemists +% comprehensive support for typesetting chemistry documents % % -------------------------------------------------------------------------- % Clemens Niederberger @@ -26,4089 +26,162 @@ % % The Current Maintainer of this work is Clemens Niederberger. % -------------------------------------------------------------------------- -\RequirePackage{ expl3 , xparse , l3keys2e } -\def\chemmacros@version{4.7} -\def\chemmacros@date{2015/02/08} - -\ProvidesExplPackage - {chemmacros} - {\chemmacros@date} - {\chemmacros@version} - {loads of little helpers for chemists (CN)} - -% -------------------------------------------------------------------------- -% check expl3 version: -\@ifpackagelater { expl3 } { 2013/12/14 } - { } - { - \PackageError { chemmacros } { Support~package~expl3~too~old } - { - You~need~to~update~your~installation~of~the~bundles~'l3kernel'~and~ - 'l3packages'.\MessageBreak - Loading~chemmacros~will~abort! - } - \tex_endinput:D - } - -% -------------------------------------------------------------------------- -% variants of kernel commands: -\cs_generate_variant:Nn \prop_if_in:NnTF { NV , Nx } -\cs_generate_variant:Nn \prop_put:Nnn { NV , NVV , NVx } -\cs_generate_variant:Nn \prop_get:NnNTF { NV } -\cs_generate_variant:Nn \tl_set_rescan:Nnn { NnV } -\cs_generate_variant:Nn \tl_if_eq:nnTF { V } -\cs_generate_variant:Nn \tl_const:cn { cV } -\cs_generate_variant:Nn \tl_to_lowercase:n { f } - -% -------------------------------------------------------------------------- -% load required packages -% the technical ones: -\RequirePackage { environ , scrlfile , etoolbox , translations } -% related to other topics like mathematics or graphics: -\RequirePackage { xfrac , siunitx , tikz, mathtools , bm } -% other packages of this bundle -- ghsystem is not loaded here but at the end -% of the preamble depending on a package option: -\RequirePackage { chemformula , chemgreek } -% TikZ libraries (the don't like expl3 syntax): -\ExplSyntaxOff -\usetikzlibrary{calc,arrows} +\RequirePackage{expl3,xparse,l3keys2e} \ExplSyntaxOn % -------------------------------------------------------------------------- -% boolean variables for the package options -\bool_new:N \l__chemmacros_xspace_bool -\bool_set_true:N \l__chemmacros_xspace_bool - -\bool_new:N \l__chemmacros_circled_bool -\bool_set_true:N \l__chemmacros_circled_bool -\bool_new:N \l__chemmacros_circled_formal_bool -\bool_set_true:N \l__chemmacros_circled_formal_bool -\bool_new:N \l__chemmacros_circled_chem_bool -\bool_set_true:N \l__chemmacros_circled_chem_bool - -\bool_new:N \l__chemmacros_EZ_cool_bool -\bool_new:N \l__chemmacros_Nu_mathspec_bool -\bool_new:N \l__chemmacros_chemstyle_bool -\bool_new:N \l__chemmacros_hyperref_bool -\bool_new:N \l__chemmacros_varioref_bool -\bool_new:N \l__chemmacros_chemfig_bool -\bool_new:N \l__chemmacros_ghsystem_bool -% \bool_set_true:N \l__chemmacros_ghsystem_bool - -\bool_new:N \l__chemmacros_iupac_restricted_bool -\bool_new:N \l__chemmacros_iupac_strict_bool -\bool_new:N \l__chemmacros_in_document_bool +% package information: +\tl_const:Nn \c_chemmacros_date_tl {2015/09/11} +\tl_const:Nn \c_chemmacros_version_major_number_tl {5} +\tl_const:Nn \c_chemmacros_version_minor_number_tl {0} +\tl_const:Nn \c_chemmacros_version_subrelease_tl {} +\tl_const:Nx \c_chemmacros_version_number_tl + {\c_chemmacros_version_major_number_tl.\c_chemmacros_version_minor_number_tl} +\tl_const:Nx \c_chemmacros_version_tl + { \c_chemmacros_version_number_tl \c_chemmacros_version_subrelease_tl } +\tl_const:Nn \c_chemmacros_info_tl + {comprehensive~ support~ for~ typesetting~ chemistry~ documents} -\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 } - } +\ProvidesExplPackage + {chemmacros} + {\c_chemmacros_date_tl} + {\c_chemmacros_version_tl} + {\c_chemmacros_info_tl \c_space_tl (CN)} % -------------------------------------------------------------------------- -% warning / error messages -\msg_new:nnnn { chemmacros } { language-not-defined } - { The~ language~ `#1'~ is~ not~ defined~ by~ chemmacros. } - { - You~ chose~ the~ language~ `#1'~ which~ is~ not~ defined~ by~ chemmacros.~ - `english'~ is~ used~ instead.~ If~ you~ just~ mistyped~ try~ again!~ - Otherwise~ contact~ the~ author~ and~ he'll~ probably~ add~ your~ language. - } - -\msg_new:nnnn { chemmacros } { already-defined } - { The~ command~ #1~ is~ already~ defined. } - { - The~ command~ #1~ has~ already~ been~ otherwise.~ chemmacros~ also~ tries~ - to~ define~ it~ and~ fails.~ - } - -\msg_new:nnnn { chemmacros } { not-defined } - { The~ command~ #1~ is~ not~ defined,~ yet. } - { - The~ command~ #1~ is~ not~ defined,~ yet.~ chemmacros~ tries~ to~ - redefine~ it~ and~ fails.~ - } - -\msg_new:nnnn { chemmacros } { option-deprecated } - { The~ option~ `#1'~ is~ deprecated.~ I~ will~ ignore~ it. } - { - The~ package~ option~ `#1'~ is~ deprecated~ and~ not~ used~ by~ - chemmacros~ any~ more.~ It~ will~ therefore~ simply~ be~ ignored. - } - -\msg_new:nnnn { chemmacros } { command-deprecated } - { - The~ command~ \token_to_str:N #1 \c_space_tl is~ deprecated.~ Use~ - \token_to_str:N #2 \c_space_tl instead. - } - { - The~ command~ \token_to_str:N #1 \c_space_tl is~ deprecated.~ Use~ - \token_to_str:N #2 \c_space_tl instead. - } - -\msg_new:nnnn { chemmacros } { command-dropped } - { - The~ command~ \token_to_str:N #1 \c_space_tl has~ been~ dropped.~ I'm~ - sorry. - } - { - The~ command~ \token_to_str:N #1 \c_space_tl has~ been~ dropped.~ I'm~ - sorry. - } - -\msg_new:nnnn { chemmacros } { new-particle } - { - The~ command~ sequence~ \token_to_str:N #1 \c_space_tl is~ already~ - defined. - } - { - You've~ tried~ to~ define~ a~ particle~ with~ \token_to_str:N - \NewChemParticle ,~ but~ the~ command~ sequence~ \token_to_str:N #1 - \c_space_tl already~ exists.~ Please~ choose~ another~ name. - } - -\msg_new:nnnn { chemmacros } { renew-particle } - { The~ particle~ \token_to_str:N #1 \c_space_tl is~ not~ defined. } - { - You've~ tried~ to~ renew~ the~ particle~ \token_to_str:N #1 ,~ but~ it~ - doesn't~ exist. - } - -\msg_new:nnnn { chemmacros } { new-latin } - { - The~ command~ sequence~ \token_to_str:N #1 \c_space_tl is~ already~ - defined. - } - { - You've~ tried~ to~ define~ a~ latin~ phrase~ with~\token_to_str:N - \NewChemLatin ,~ but~ the~ command~ sequence~ \token_to_str:N #1 - \c_space_tl already~ exists.~ Please~ choose~ another~ name. - } - -\msg_new:nnnn { chemmacros } { renew-latin } - { The~ latin~ phrase \token_to_str:N #1 \c_space_tl is~ not~ defined. } - { - You've~ tried~ to~ renew~ the~ latin~ phrase~ \token_to_str:N #1 ,~ but~ - it~ doesn't~ exist. - } - -\msg_new:nnnn { chemmacros } { new-nmr } - { - The~ command~ sequence~ \token_to_str:N #1 \c_space_tl is~ already~ - defined. - } - { - You've~ tried~ to~ define~ a~ NMR~ command~ with~\token_to_str:N - \NewChemParticle ,~ but~ the~ command~ sequence~ \token_to_str:N #1 - \c_space_tl already~ exists.~ Please~ choose~ another~ name. - } - -\msg_new:nnnn { chemmacros } { renew-nmr } - { The~ NMR~ command~ \token_to_str:N #1 \c_space_tl is~ not~ defined. } +% messages: +\msg_new:nnn {chemmacros} {too-low-compatibility} { - You've~ tried~ to~ renew~ the~ NMR~ command~ \token_to_str:N #1 ,~ but~ - it~ doesn't~ exist. + Compatibility~ for~ versions~ below~ v4.7~ is~ not~ supported!~ You~ + requested~ version~ v #1.~ Loading~ v4.7~ instead. } -\msg_new:nnnn { chemmacros } { new-phase } +\msg_new:nnn {chemmacros} {low-compatibility} { - The~ command~ sequence~ \token_to_str:N #1 \c_space_tl is~ already~ - defined. - } - { - You've~ tried~ to~ define~ a~ phase~ with~ \token_to_str:N - \NewChemPhase ,~ but~ the~ command~ sequence~ \token_to_str:N #1 - \c_space_tl already~ exists.~ Please~ choose~ another~ name. - } - -\msg_new:nnnn { chemmacros } { renew-phase } - { The~ phase~ \token_to_str:N #1 \c_space_tl is~ not~ defined. } - { - You've~ tried~ to~ renew~ the~ phase~ \token_to_str:N #1 ,~ but~ it~ - doesn't~ exist. - } - -\msg_new:nnnn { chemmacros } { new-iupac } - { - The~ iupac~ naming~ command~ \token_to_str:N #1 \c_space_tl is~ already~ - defined. - } - { - You've~ tried~ to~ define~ a~ iupac~ naming~ command~ with~ - \token_to_str:N \NewChemIUPAC ,~ but~ the~ iupac~ command~ - \token_to_str:N #1 \c_space_tl already~ exists.~ Choose~ another~ name~ - or~ use~ \token_to_str:N \RenewChemIUPAC . - } - -\msg_new:nnnn { chemmacros } { renew-iupac } - { - The~ iupac~ naming~ command~ \token_to_str:N #1 \c_space_tl is~ not~ - defined. - } - { - You've~ tried~ to~ renew~ the~ iupac~ command~ \token_to_str:N #1 ,~ but~ - it~ doesn't~ exist.~ Use~ \token_to_str:N \NewChemIUPAC \c_space_tl - instead. - } - -\msg_new:nnnn { chemmacros } { let-iupac } - { - The~ iupac~ naming~ command~ \token_to_str:N #2 \c_space_tl is~ not~ - defined. - } - { - You've~ tried~ to~ let~ the~ iupac~ command~ \token_to_str:N #1 ~ to~ the~ - iupac~ command~ \token_to_str:N #2 ,~ but~ the~ latter~ doesn't~ exist.~ - Use~ \token_to_str:N \NewChemIUPAC \c_space_tl instead~ or~declare~ - \token_to_str:N #2 \c_space_tl first. - } - -\msg_new:nnnn { chemmacros } { ox } - { \token_to_str:N \ox \c_space_tl : ~ #1 ~ \msg_line_context: . } - { \token_to_str:N \ox \c_space_tl : ~ #1 ~ \msg_line_context: . } - -\msg_new:nnnn { chemmacros } { OX } - { \token_to_str:N \OX \c_space_tl : ~ #1 ~ \msg_line_context: . } - { \token_to_str:N \OX \c_space_tl : ~ #1 ~ \msg_line_context: . } - -\msg_new:nnnn { chemmacros } { redox } - { \token_to_str:N \redox \c_space_tl : ~ #1 ~ \msg_line_context: . } - { \token_to_str:N \redox \c_space_tl : ~ #1 ~ \msg_line_context: . } - -\msg_new:nnnn { chemmacros } { chemfig } - { - You~ need~ to~ load~ the~ `chemfig'~ package~ in~ order~ to~ make~ - \exp_after:wN \token_to_str:N \cs:w #1 \cs_end: \c_space_tl work~ - properly~ \msg_line_context: . - } - { - You~ need~ to~ load~ the~ `chemfig'~ package~ in~ order~ to~ make~ - \exp_after:wN \token_to_str:N \cs:w #1 \cs_end: \c_space_tl work~ - properly~ \msg_line_context: . + You~ requested~ compatibility~ mode~ v #1~ while~ the~ current~ version~ + of~ chemmacros~ is~ v \c_chemmacros_version_number_tl .~ Not~ all~ features~ + will~ be~ available! } -\msg_new:nnnn { chemmacros } { new-state } - { - The~ state~ \exp_after:wN \token_to_str:N \cs:w #1 \cs_end: \c_space_tl - already~ exists.~ You~ need~ to~ use~ \token_to_str:N \RenewChemState - \c_space_tl to~ alter~ it~ \msg_line_context: . - } - { - The~ state~ \exp_after:wN \token_to_str:N \cs:w #1 \cs_end: \c_space_tl - already~ exists.~ You~ need~ to~ use~ \token_to_str:N \RenewChemState - \c_space_tl to~ alter~ it~ \msg_line_context: . - } - -\msg_new:nnnn { chemmacros } { renew-state } - { - The~ state~ \exp_after:wN \token_to_str:N \cs:w #1 \cs_end: \c_space_tl - isn't~ set~ up~ yet.~ You~ need~ to~ use~ \token_to_str:N - \NewChemState \c_space_tl to~ create~ it~ \msg_line_context: . - } - { - The~ state~ \exp_after:wN \token_to_str:N \cs:w #1 \cs_end: \c_space_tl - isn't~ set~ up~ yet.~ You~ need~ to~ use~ \token_to_str:N - \NewChemState \c_space_tl to~ create ~it~ \msg_line_context: . - } - -\msg_new:nnn { chemmacros } { state-syntax } - { - You're~ using~ a~ no~ longer~ recommended~ syntax~ to~ (re-)define~ a~ - state~ variable~ \msg_line_context: .~ This~ syntax~ may~ deprecate~ and~ - be~ removed~ in~ the~ future. - } - -% declare an option as deprecated: -\cs_new_protected:Npn \chemmacros_option_deprecated:n #1 - { \msg_warning:nnn { chemmacros } { option-deprecated } { #1 } } - -% define a deprecated command with hints to the corresponding new one: -\cs_new_protected:Npn \chemmacros_define_deprecated:NN #1#2 - { - \cs_set_protected:Npn #1 - { - \msg_warning:nnxx { chemmacros } { command-deprecated } - { #1 } { #2 } - #2 - } - } - -\NewDocumentCommand \DeclareChemDeprecated { mm } - { \chemmacros_define_deprecated:NN #1 #2 } - -% define a command as dropped! -\cs_new_protected:Npn \chemmacros_define_dropped:N #1 - { - \cs_set_protected:Npn #1 - { \msg_error:nnn { chemmacros } { command-dropped } { #1 } } - } - -\NewDocumentCommand \DeclareChemDropped { m } - { \chemmacros_define_dropped:N #1 } - % -------------------------------------------------------------------------- -% temporary variables -\tl_new:N \l__chemmacros_tmpa_tl -\tl_new:N \l__chemmacros_tmpb_tl -\int_new:N \l__chemmacros_tmpa_int -\box_new:N \l__chemmacros_tmpa_box +% compatibility +\fp_new:N \l__chemmacros_compatibility_version_fp +\fp_set:Nn \l__chemmacros_compatibility_version_fp {\c_chemmacros_version_number_tl} -% -------------------------------------------------------------------------- -% language settings: -\bool_new:N \l__chemmacros_language_auto_bool -\bool_set_true:N \l__chemmacros_language_auto_bool -% this token list will hold the chosen language for chemmacros; since the -% language is either chosen automatically or by option it is only available at -% begin document -\tl_new:N \l_chemmacros_language_tl -\tl_set:Nn \l_chemmacros_language_tl { english } -\tl_new:N \l__chemmacros_current_language_tl - -% translate the key #1 -\cs_new:Npn \chemmacros_translate:n #1 +\keys_define:nn {chemmacros/compatibility} { - \bool_if:NTF \l__chemmacros_language_auto_bool - { \GetTranslation{#1} } - { \GetTranslationFor{\l_chemmacros_language_tl}{#1} } + compatibility .fp_set:N = \l__chemmacros_compatibility_version_fp , + unknown .code:n = + \PassOptionsToPackage{\CurrentOption}{chemmacros4} + \PassOptionsToPackage{\CurrentOption}{chemmacros5} } -\AtBeginDocument{ - \bool_if:NTF \l__chemmacros_language_auto_bool - { - \tl_set:Nx \l_chemmacros_language_tl - { \@trnslt@language{\@trnslt@current@language} } - } - { - \tl_set_eq:NN - \l_chemmacros_language_tl - \l__chemmacros_current_language_tl - } -} +\ProcessKeysPackageOptions {chemmacros/compatibility} % -------------------------------------------------------------------------- -% package options -% circled => circle charges -% detect-bold => behaviour when font series bold -% EZ => cool or chemmacros version of \E -% german => change pKA => pKS etc -% iupac => behaviour of nomenclature commands -% ngerman => an alias :) -% ghsystem => load ghsystem or don't -% method => use `chemformula' or `mhchem' -% strict => errors or warnings -% synchronize => let particles et.al. adapt chemformula's font selection -% ugreek => behaviour of \chemDelta, \chemalpha, ... -% version=1 => compatibility for documents set with v1.* -% xspace => add an \xspace after a whole bunch of macros - -% this boolean has to be public since the other packages of the bundle may -% want to know its value - -\bool_new:N \l__chemmacros_detect_bold_bool -\bool_set_true:N \l__chemmacros_detect_bold_bool - -\bool_new:N \l__chemmacros_option_greek_set_bool -\bool_new:N \l__chemmacros_use_upgreek_bool -\bool_new:N \l__chemmacros_use_textgreek_bool -\bool_new:N \l__chemmacros_use_kpfonts_bool -\bool_new:N \l__chemmacros_use_newtx_bool - -\cs_new:Npn \chemmacros_inner_font: {} - -\keys_define:nn { chemmacros / option } +% compare version numbers +% #1: number +% #2: relation +% #3: number +% #4: true +% #5: false +\prg_new_conditional:Npnn \chemmacros_if_version:nnn #1#2#3 {p,T,F,TF} { - bpchem .code:n = \chemmacros_option_deprecated:n { bpchem } , - circletype .choice: , - circletype / math .code:n = - { \bool_set_false:N \l__chemmacros_circled_chem_bool } , - circletype / chem .code:n = - { \bool_set_true:N \l__chemmacros_circled_chem_bool } , - circletype .default:n = chem , - circled .choice: , - circled / none .code:n = - { - \bool_set_false:N \l__chemmacros_circled_bool - \bool_set_false:N \l__chemmacros_circled_formal_bool - } , - circled / formal .code:n = + \fp_compare:nTF { floor(#1) = floor(#3) } { - \bool_set_true:N \l__chemmacros_circled_bool - \bool_set_true:N \l__chemmacros_circled_formal_bool - } , - circled / all .code:n = - { - \bool_set_true:N \l__chemmacros_circled_bool - \bool_set_false:N \l__chemmacros_circled_formal_bool - } , - circled .default:n = all , - detect-bold .code:n = \chemmacros_option_deprecated:n { detect-bold } , - EZ .code:n = \chemmacros_option_deprecated:n { EZ } , - german .code:n = - \tl_set:Nn \l__chemmacros_current_language_tl { german } , - ngerman .code:n = - \tl_set:Nn \l__chemmacros_current_language_tl { ngerman } , - ghsystem .bool_set:N = \l__chemmacros_ghsystem_bool , - ghsystem .default:n = true , - iupac .choice: , - iupac / restricted .code:n = - \bool_set_true:N \l__chemmacros_iupac_restricted_bool - \bool_set_false:N \l__chemmacros_iupac_strict_bool , - iupac / auto .code:n = - \bool_set_false:N \l__chemmacros_iupac_restricted_bool - \bool_set_false:N \l__chemmacros_iupac_strict_bool , - iupac / strict .code:n = - \bool_set_false:N \l__chemmacros_iupac_restricted_bool - \bool_set_true:N \l__chemmacros_iupac_strict_bool , - language .code:n = - \tl_if_eq:nnTF { #1 } { auto } - { \bool_set_true:N \l__chemmacros_language_auto_bool } - { - \bool_set_false:N \l__chemmacros_language_auto_bool - \tl_set:Nn \l__chemmacros_current_language_tl { #1 } - } , - method .choice: , - method / chemformula .code:n = - \chemmacros_option_deprecated:n { method } , - method / mhchem .code:n = - \chemmacros_option_deprecated:n { method } , - Nu .choice: , - Nu / mathspec .code:n = - \bool_set_true:N \l__chemmacros_Nu_mathspec_bool , - Nu / chemmacros .code:n = - \bool_set_false:N \l__chemmacros_Nu_mathspec_bool , - strict .code:n = - \chemmacros_option_deprecated:n { strict } , - synchronize .choice: , - synchronize / true .code:n = - \cs_set_eq:NN \chemmacros_inner_font: \chemformula_font_inner: , - synchronize / false .code:n = \cs_set:Nn \chemmacros_inner_font: {} , - synchronize .default:n = true , - greek .choice: , - greek / upgreek .code:n = - \chemgreek_activate_mapping:n { upgreek } - \bool_set_true:N \l__chemmacros_option_greek_set_bool , - greek / textgreek .code:n = - \chemgreek_activate_mapping:n { textgreek } - \bool_set_true:N \l__chemmacros_option_greek_set_bool , - greek / kpfonts .code:n = - \chemgreek_activate_mapping:n { kpfonts } - \bool_set_true:N \l__chemmacros_option_greek_set_bool , - greek / newtx .code:n = - \chemgreek_activate_mapping:n { newtx } - \bool_set_true:N \l__chemmacros_option_greek_set_bool , - greek / mathdesign .code:n = - \chemgreek_activate_mapping:n { mathdesign } - \bool_set_true:N \l__chemmacros_option_greek_set_bool , - greek / fourier .code:n = - \chemgreek_activate_mapping:n { fourier } - \bool_set_true:N \l__chemmacros_option_greek_set_bool , - greek / textalpha .code:n = - \chemgreek_activate_mapping:n { textalpha } - \bool_set_true:N \l__chemmacros_option_greek_set_bool , - greek / math .code:n = - \chemgreek_activate_mapping:n { default } - \bool_set_true:N \l__chemmacros_option_greek_set_bool , - greek / auto .code:n = - \bool_set_false:N \l__chemmacros_option_greek_set_bool , - greek .default:n = auto , - upgreek .code:n = \chemmacros_option_deprecated:n { upgreek } , - version .code:n = \chemmacros_option_deprecated:n { version } , - cmversion .code:n = \chemmacros_option_deprecated:n { cmversion } , - cmversion .choice: , - xspace .bool_set:N = \l__chemmacros_xspace_bool , - xspace .default:n = true - } - - - -\ProcessKeysOptions { chemmacros / option } - -% -------------------------------------------------------------------------- -% set up a few things: -% - is `ghsystem' requested? -% - do we need `xspace'? -% - what about the greek letters? - -\seq_new:N \l__chemmacros_greek_packages_seq -\prop_new:N \l__chemmacros_greek_mapping_prop - -\cs_new_protected:Npn \chemmacros_add_greek_package_mapping:nn #1#2 - { - \seq_put_right:Nn \l__chemmacros_greek_packages_seq {#1} - \prop_put:Nnn \l__chemmacros_greek_mapping_prop {#1} {#2} - } - -\cs_generate_variant:Nn \chemgreek_activate_mapping:n { V } - -\cs_new_protected:Npn \__chemmacros_select_greek_mapping:n #1 - { - \bool_if:NF \l__chemmacros_option_greek_set_bool + \fp_compare:nTF + { (\chemmacros_get_minor:f {#1}) #2 (\chemmacros_get_minor:f {#3}) } + { \prg_return_true: } + { \prg_return_false: } + } { - \@ifpackageloaded { #1 } - { - \prop_get:NnN - \l__chemmacros_greek_mapping_prop - { #1 } - \l__chemmacros_tmpa_tl - \chemgreek_activate_mapping:V \l__chemmacros_tmpa_tl - \bool_set_true:N \l__chemmacros_option_greek_set_bool - \seq_map_break: - } - { } + \fp_compare:nTF { (#1) #2 (#3) } + { \prg_return_true: } + { \prg_return_false: } } } -\chemmacros_add_greek_package_mapping:nn {upgreek} {upgreek} -\chemmacros_add_greek_package_mapping:nn {textgreek} {textgreek} -\chemmacros_add_greek_package_mapping:nn {mathdesign} {mathdesign} -\chemmacros_add_greek_package_mapping:nn {kpfonts} {kpfonts} -\chemmacros_add_greek_package_mapping:nn {newtxmath} {newtx} -\chemmacros_add_greek_package_mapping:nn {fourier} {fourier} -\chemmacros_add_greek_package_mapping:nn {textalpha} {textalpha} - -\AtEndPreamble - { - \bool_if:NT \l__chemmacros_ghsystem_bool - { \RequirePackage { ghsystem } } - \bool_if:NT \l__chemmacros_xspace_bool - { \RequirePackage { xspace } } - \seq_map_function:NN - \l__chemmacros_greek_packages_seq - \__chemmacros_select_greek_mapping:n - } - -\cs_new_protected:Npn \chemmacros_xspace: - { \bool_if:NT \l__chemmacros_xspace_bool { \xspace } } +\cs_new:Npn \__chemmacros_get_minor:w #1.#2.#3 \q_stop + { \tl_if_blank:nTF {#2} {0} {#2} } +\cs_new:Npn \chemmacros_get_minor:n #1 + { \__chemmacros_get_minor:w #1.. \q_stop } +\cs_generate_variant:Nn \chemmacros_get_minor:n {f} -% -------------------------------------------------------------------------- -% TikZ drawings - helper macros -\cs_new_protected:Npn \chemmacros_tikz_picture:nn #1#2 - { \tikzpicture[#1] #2 \endtikzpicture } -\cs_generate_variant:Nn \chemmacros_tikz_picture:nn { fn,xn } - -\cs_new_protected:Npn \chemmacros_tikz_draw:n #1 - { \draw[#1] } -\cs_generate_variant:Nn \chemmacros_tikz_draw:n { f,x } - -\cs_new_protected:Npn \chemmacros_tikz_node:n #1 - { \node[#1] } -\cs_generate_variant:Nn \chemmacros_tikz_node:n { f,x } - -\cs_new_protected:Npn \chemmacros_tikz_shade:n #1 - { \shade[#1] } -\cs_generate_variant:Nn \chemmacros_tikz_shade:n { f,x } - -\cs_new_protected:Npn \chemmacros_tikz_shadedraw:n #1 - { \shadedraw[#1] } -\cs_generate_variant:Nn \chemmacros_tikz_shadedraw:n { f,x } - -\cs_new_protected:Npn \chemmacros_tikz_node_in_draw:n #1 - { node[#1] } -\cs_generate_variant:Nn \chemmacros_tikz_node_in_draw:n { f,x } - -% -------------------------------------------------------------------------- -% a few general functions: -\cs_new_eq:NN \chemmacros_leave_vmode: \chemformula_leave_vmode: -\cs_new_eq:NN \chemmacros_ignore_spaces: \tex_ignorespaces:D -\cs_new_eq:NN \chemmacros_nobreak: \chemformula_nobreak: -\cs_new_eq:NN \chemmacros_allow_break: \chemformula_allow_break: -\cs_new_eq:NN \chemmacros_skip_nobreak:N \chemformula_skip_nobreak:N -\cs_new:Npn \chemmacros_remove_backslash:N #1 - { \exp_after:wN \use_none:n \token_to_str:N #1 } - -\prg_new_protected_conditional:Npnn \chemmacros_if_is_cs:n #1 { T,F,TF } - { - \tl_set:Nx \l__chemmacros_tmpa_tl { \token_if_cs:NTF #1 { } { x } } - \tl_if_blank:VTF \l__chemmacros_tmpa_tl - { \prg_return_true: } - { \prg_return_false: } - } - -% detection and handling of bold face: -\prg_new_protected_conditional:Npnn \chemmacros_if_bold: { T,F,TF } +% check compatibility +% #1: relation +% #2: number +% #3: true +% #4: false +\prg_new_conditional:Npnn \chemmacros_if_compatiblity:nn #1#2 {p,T,F,TF} { - \seq_if_in:NVTF \l__chemmacros_if_bf_seq \f@series + \chemmacros_if_version:nnnTF + { \fp_to_decimal:N \l__chemmacros_compatibility_version_fp } + {#1} + {#2} { \prg_return_true: } { \prg_return_false: } } +\cs_generate_variant:Nn \chemmacros_if_compatiblity:nnT {nV} -\seq_new:N \l__chemmacros_if_bf_seq - -\seq_set_split:Nnn \l__chemmacros_if_bf_seq { , } - { - b , bc , bm , bx , bux , - eb , ebc , ebx , mb , - sb , sbc , sbx , - ub , ubc , ubx - } - -\cs_new_protected:Npn \chemmacros_bm:n #1 - { - \bool_if:NTF \l__chemmacros_detect_bold_bool - { \bm { #1 } } - { #1 } - } - -\cs_new_protected:Npn \chemmacros_bf:n #1 - { - \bool_if:NTF \l__chemmacros_detect_bold_bool - { { \normalfont \bfseries #1 } } - { { \normalfont #1 } } - } - -\cs_new_protected:Npn \chemmacros_detect_bold:n #1 - { - \chemmacros_if_bold:TF - { - \mode_if_math:TF - { \chemmacros_bm:n { #1 } } - { \chemmacros_bf:n { #1 } } - } - { #1 } - } - -% --------------------------------------------------------------------------- -% transition state symbol -\cs_new_protected:Npn \__chemmacros_transition_state: - { - \text - { - \skip_horizontal:n { .1ex } - \hbox_overlap_right:n - { \rule { .6ex } { 0pt } \rule { .05ex } { 1.3ex } } - \hbox_overlap_right:n { \rule [ .4ex ] { 1.3ex } { .05ex } } - \rule [ .85ex ] { 1.3ex } { .05ex } - \skip_horizontal:n { .1ex } - } - } - -\cs_new_protected:Npn \chemmacros_transition_state: - { - \ensuremath - { - \mathchoice - { \displaystyle } - { \textstyle } - { \scriptstyle } - { \scriptscriptstyle } - \__chemmacros_transition_state: - } - } - -% \DeclareDocumentCommand? -\cs_new_eq:NN \transitionstatesymbol \chemmacros_transition_state: - -% -------------------------------------------------------------------------- -% let's make use of `chemformula' inside some of `chemmacros' commands: -\cs_new_protected:Nn \chemmacros_atom:n - { - \mode_if_math:TF - { \text { \chemmacros_inner_font: #1 } } - { \group_begin: \chemmacros_inner_font: #1 \group_end: } - } -\cs_generate_variant:Nn \chemmacros_atom:n { V } - -\cs_new_protected:Npn \chemmacros_text:n #1 - { \mode_if_math:TF { \text { #1 } } { #1 } } - -\tl_new:N \l__chemmacros_chemformula_tl - -\cs_new_protected:Npn \chemmacros_chemformula:n #1 - { - \group_begin: - \cs_set_eq:NN \chemformula_font_inner: \chemmacros_inner_font: - \chemformula_chcpd:nn {} { #1 } - \group_end: - } -\cs_generate_variant:Nn \chemmacros_chemformula:n { x,V } - -% -------------------------------------------------------------------------- -% particles, charges -\NewDocumentCommand \NewChemParticle { mm } - { - \cs_if_free:NTF #1 - { \chemmacros_define_particle:Nn #1 { #2 } } - { \msg_error:nnn { chemmacros } { new-particle } { #1 } } - } - -\NewDocumentCommand \RenewChemParticle { mm } - { - \cs_if_free:NTF #1 - { \msg_error:nnn { chemmacros } { renew-particle } { #1 } } - { \chemmacros_define_particle:Nn #1 { #2 } } - } - -\NewDocumentCommand \DeclareChemParticle { mm } - { \chemmacros_define_particle:Nn #1 { #2 } } - -\cs_new_protected:Nn \chemmacros_define_particle:Nn - { - \cs_set_protected:Npn #1 - { - \chemformula_chcpd:nn {} { #2 } - \chemmacros_xspace: - } - } - -\NewChemParticle \el { e- } -\NewChemParticle \prt { p+ } -\NewChemParticle \ntr { n^0 } - -% -------------------------------------------------------------------------- -% charges -% circled charge signs: they are defined in the `chemformula' module: -% use directly: - -\cs_new_protected:Npn \fplus { { \chemformula_fplus: } } -\cs_new_protected:Npn \fminus { { \chemformula_fminus: } } - -% change output depending on circled-option -\cs_new_eq:NN \chemmacros_plus: \chemformula_plus: -\cs_new_eq:NN \chemmacros_minus: \chemformula_minus: - -\cs_new_protected:Npn \chemmacros_formal_plus: - { - \group_begin: - \bool_set_true:N \l__chemformula_formal_charges_bool - \chemformula_plus: - \group_end: - } - -\cs_new_protected:Npn \chemmacros_formal_minus: - { - \group_begin: - \bool_set_true:N \l__chemformula_formal_charges_bool - \chemformula_minus: - \group_end: - } - -\cs_new_protected:Npn \chemmacros_charge:n #1 - { - \chemformula_superscript:n - { \chemmacros_detect_bold:n { #1 } } - } - -\keys_define:nn { chemmacros / charges } - { append .code:n = \chemmacros_option_deprecated:n { append } } - -\NewDocumentCommand \mch { o } - { - \IfNoValueTF { #1 } - { \chemmacros_charge:n { \chemmacros_minus: } } - { \chemmacros_charge:n { #1 \chemmacros_minus: } } - } - -\NewDocumentCommand \pch { o } - { - \IfNoValueTF { #1 } - { \chemmacros_charge:n { \chemmacros_plus: } } - { \chemmacros_charge:n { #1 \chemmacros_plus: } } - } - -\NewDocumentCommand \fmch { o } - { - \IfNoValueTF { #1 } - { \chemmacros_charge:n { \chemmacros_formal_minus: } } - { \chemmacros_charge:n { #1 \chemmacros_formal_minus: } } - } - -\NewDocumentCommand \fpch { o } - { - \IfNoValueTF { #1 } - { \chemmacros_charge:n { \chemmacros_formal_plus: } } - { \chemmacros_charge:n { #1 \chemmacros_formal_plus: } } - } - -\tl_new:N \l__chemmacros_partial_charge_format_tl -\tl_set:Nn \l__chemmacros_partial_charge_format_tl { \tiny } - -\cs_new_protected:Npn \delm - { - \mbox { - \l__chemmacros_partial_charge_format_tl - \c_math_toggle_token \delta \chemmacros_minus: \c_math_toggle_token - } - \chemmacros_xspace: - } -\cs_new_protected:Npn \delp - { - \mbox { - \l__chemmacros_partial_charge_format_tl - \c_math_toggle_token \delta \chemmacros_plus: \c_math_toggle_token - } - \chemmacros_xspace: - } -\cs_new_protected:Npn \fdelm - { - \mbox { - \l__chemmacros_partial_charge_format_tl - \c_math_toggle_token \delta \chemmacros_formal_minus: \c_math_toggle_token - } - \chemmacros_xspace: - } -\cs_new_protected:Npn \fdelp - { - \mbox { - \l__chemmacros_partial_charge_format_tl - \c_math_toggle_token \delta \chemmacros_formal_plus: \c_math_toggle_token - } - \chemmacros_xspace: - } - -\cs_new_protected:Npn \scrm - { \ensuremath { \scriptstyle \chemmacros_minus: } } -\cs_new_protected:Npn \scrp - { \ensuremath { \scriptstyle \chemmacros_plus: } } -\cs_new_protected:Npn \fscrm - { \ensuremath { \scriptstyle \chemmacros_formal_minus: } } -\cs_new_protected:Npn \fscrp - { \ensuremath { \scriptstyle \chemmacros_formal_plus: } } -\cs_new_protected:Npn \fsscrm - { \ensuremath { \scriptscriptstyle \chemmacros_formal_minus: } } -\cs_new_protected:Npn \fsscrp - { \ensuremath { \scriptscriptstyle \chemmacros_formal_plus: } } - -\keys_define:nn { chemmacros / charges } - { - partial-format .tl_set:N = \l__chemmacros_partial_charge_format_tl - } - -% -------------------------------------------------------------------------- -% ions, molecules -% proton, hydroxide, hydronium/oxonium, water, nucleophile, electrophile -\NewChemParticle \Hpl { H+ } -\NewChemParticle \Hyd { OH- } -\NewChemParticle \HtO { H3O+ } -\NewChemParticle \El { E+ } -\NewChemParticle \water { H2O } - -\NewDocumentCommand \chemmacros_Nu:w { o } - { - \IfNoValueF { #1 } { \keys_set:nn { chemmacros / particle } { #1 } } - \bool_if:NTF \l__chemmacros_particle_elpair_bool - { \chemmacros_elpair:n { Nu } \mch } - { \chemmacros_chemformula:n { Nu- } } - \chemmacros_xspace: - } - -\AtBeginDocument - { - \bool_if:NTF \l__chemmacros_Nu_mathspec_bool - { \cs_set_eq:NN \Nuc \chemmacros_Nu:w } - { \cs_set_eq:NN \Nu \chemmacros_Nu:w } - } - -\cs_new_protected:Npn \chemmacros_ba: - { - \bool_if:NTF \l__chemmacros_particle_elpair_bool - { \chemmacros_elpair:n { ba } \mch } - { \chemmacros_chemformula:n { ba- } } - \chemmacros_xspace: - } - -\NewDocumentCommand \ba { o } - { - \group_begin: - \IfNoValueF { #1 } { \keys_set:nn { chemmacros / particle } { #1 } } - \chemmacros_ba: - \group_end: - } - -\cs_new_protected:Npn \chemmacros_elpair:n #1 - { - \bool_if:NTF \l__chemmacros_chemfig_bool - { - \bool_if:NTF \l__chemmacros_elpair_dots_bool - { \chlewis { 0: } { #1 } } - { \chlewis { 0| } { #1 } } -% { { \chemmacros_inner_font: #1 \chlewis { 0=| } { \vphantom { #1 } } } } - } - { - \msg_error:nnn { chemmacros } { chemfig } { #1 } - \chemmacros_atom:n { #1 } - } - } +% user checks: +\NewDocumentCommand \IfChemCompatibilityTF {mm+m+m} + { \chemmacros_if_compatiblity:nnTF {#1} {#2} {#3} {#4} } -\bool_new:N \l__chemmacros_particle_elpair_bool -\bool_new:N \l__chemmacros_elpair_dots_bool +\NewDocumentCommand \IfChemCompatibilityT {mm+m} + { \chemmacros_if_compatiblity:nnT {#1} {#2} {#3} } -\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 - } +\NewDocumentCommand \IfChemCompatibilityF {mm+m} + { \chemmacros_if_compatiblity:nnF {#1} {#2} {#3} } % -------------------------------------------------------------------------- -% IUPAC -\prop_new:N \l__chemmacros_iupac_prop - -\cs_new_protected:Npn \chemmacros_new_iupac:Nn #1#2 - { - \tl_set:Nx \l__chemmacros_tmpa_tl - { \chemmacros_remove_backslash:N #1 } - \prop_if_in:NVTF \l__chemmacros_iupac_prop \l__chemmacros_tmpa_tl - { \msg_error:nnn { chemmacros } { new-iupac } { #1 } } - { - \prop_put:NVn \l__chemmacros_iupac_prop - \l__chemmacros_tmpa_tl - { #2 } - } - \chemmacros_make_iupac: - } - -\cs_new_protected:Npn \chemmacros_define_iupac:Nn #1#2 - { - \tl_set:Nx \l__chemmacros_tmpa_tl - { \chemmacros_remove_backslash:N #1 } - \prop_put:NVn \l__chemmacros_iupac_prop - \l__chemmacros_tmpa_tl - { #2 } - \chemmacros_make_iupac: - } - -\cs_new_protected:Npn \chemmacros_renew_iupac:Nn #1#2 - { - \tl_set:Nx \l__chemmacros_tmpa_tl - { \chemmacros_remove_backslash:N #1 } - \prop_if_in:NVTF \l__chemmacros_iupac_prop \l__chemmacros_tmpa_tl - { - \prop_put:NVn \l__chemmacros_iupac_prop - \l__chemmacros_tmpa_tl - { #2 } - } - { \msg_error:nnn { chemmacros } { renew-iupac } { #1 } } - \chemmacros_make_iupac: - } - -\cs_new_protected:Npn \chemmacros_let_iupac:NN #1#2 - { - \tl_set:Nx \l__chemmacros_tmpa_tl - { \chemmacros_remove_backslash:N #1 } - \tl_set:Nx \l__chemmacros_tmpb_tl - { \chemmacros_remove_backslash:N #2 } - \prop_get:NVNTF \l__chemmacros_iupac_prop - \l__chemmacros_tmpb_tl - \l__chemmacros_tmpc_tl - { - \prop_put:NVV \l__chemmacros_iupac_prop - \l__chemmacros_tmpa_tl - \l__chemmacros_tmpc_tl - } - { \msg_error:nnnn { chemmacros } { let-iupac } { #1 } { #2 } } - \chemmacros_make_iupac: - } - -\cs_new_protected:Npn \chemmacros_define_deprecated_iupac:NN #1#2 - { - \chemmacros_define_iupac:Nn #1 - { - \msg_warning:nnnn { chemmacros } { command-deprecated } - { #1 } { #2 } - #2 - } - } - - -\cs_new_protected:Npn \chemmacros_make_iupac: - { - \bool_if:NT \l__chemmacros_in_document_bool - { - \bool_if:NTF \l__chemmacros_inside_iupac_bool - { - \prop_map_inline:Nn \l__chemmacros_iupac_prop - { \cs_set_protected:cpn { ##1 } { ##2 } } - } - { - \bool_if:NF \l__chemmacros_iupac_restricted_bool - { - \bool_if:NTF \l__chemmacros_iupac_strict_bool - { - \prop_map_inline:Nn \l__chemmacros_iupac_prop - { \cs_set_protected:cpn { ##1 } { ##2 } } - } - { - \prop_map_inline:Nn \l__chemmacros_iupac_prop - { - \cs_if_exist:cF { ##1 } - { \cs_set_protected:cpn { ##1 } { ##2 } } - } - } - } - } - } - } - -\AtBeginDocument { \chemmacros_make_iupac: } - -\NewDocumentCommand \DeclareChemIUPAC { mm } - { \chemmacros_define_iupac:Nn #1 { #2 } } - -\NewDocumentCommand \NewChemIUPAC { mm } - { \chemmacros_new_iupac:Nn #1 { #2 } } - -\NewDocumentCommand \RenewChemIUPAC { mm } - { \chemmacros_renew_iupac:Nn #1 { #2 } } - -\NewDocumentCommand \LetChemIUPAC { mm } - { \chemmacros_let_iupac:NN #1 #2 } - -\NewDocumentCommand \DeprecateChemIUPAC { mm } - { \chemmacros_define_deprecated_iupac:NN #1 #2 } - -% stereo descriptors and other nomenclature commands -% Cahn-Ingold-Prelog -\dim_new:N \l__chemmacros_cip_kern_dim -\dim_set:Nn \l__chemmacros_cip_kern_dim { .075em } - -\keys_define:nn { chemmacros / iupac } - { cip-kern .dim_set:N = \l__chemmacros_cip_kern_dim } - -\NewDocumentCommand \cip { m } - { \chemmacros_cip:n { #1 } } - -\cs_new_protected:Npn \chemmacros_cip:n #1 - { ( \textit{#1} \tex_kern:D \l__chemmacros_cip_kern_dim ) } - -\DeprecateChemIUPAC \Rcip \rectus -\DeprecateChemIUPAC \Scip \sinister - -\NewChemIUPAC \rectus { \cip { R } } -\NewChemIUPAC \sinister { \cip { S } } - -\LetChemIUPAC \R \rectus -\LetChemIUPAC \S \sinister - -% TikZ needs : to be other -\ExplSyntaxOff -\protected\def\chemmacros@sconf#1% - {% - \begingroup - \tikz[baseline,text height=1.5ex,text depth=.25ex] - { - \node[anchor=base] (chemmacros@@Sconf) {#1} ; - \draw[->,thick,rotate=90] - ($(chemmacros@@Sconf.center)+(20:.8em)$) arc (20:340:.8em); - }% - \endgroup - } - -\protected\def\chemmacros@rconf#1% - {% - \begingroup - \tikz[baseline,text height=1.5ex,text depth=.25ex] - { - \node[anchor=base] (chemmacros@@Rconf) {#1} ; - \draw[<-,thick,rotate=90] - ($(chemmacros@@Rconf.center)+(20:.8em)$) arc (20:340:.8em) ; - }% - \endgroup - } -\ExplSyntaxOn - -\NewDocumentCommand \Sconf { O{S} } { \chemmacros@sconf { #1 } } -\NewDocumentCommand \Rconf { O{R} } { \chemmacros@rconf { #1 } } - -% E(ntgegen)/Z(usammen) -\NewChemIUPAC \entgegen { \cip { E } } -\NewChemIUPAC \zusammen { \cip { Z } } - -\LetChemIUPAC \E \entgegen -\LetChemIUPAC \Z \zusammen - -% cis/trans -\NewChemIUPAC \cis { \textit { cis } } -\NewChemIUPAC \trans { \textit { trans } } - -% fac/mer -\NewChemIUPAC \fac { \textit { fac } } -\NewChemIUPAC \mer { \textit { mer } } - -% tert -\NewChemIUPAC \tert { \textit { tert } } - -% Fischer -\NewChemIUPAC \dexter { \textsc { d } } -\NewChemIUPAC \laevus { \textsc { l } } - -\LetChemIUPAC \D \dexter -\LetChemIUPAC \L \laevus - -% ortho/meta/para -\NewChemIUPAC \ortho { \textit { o } } -\NewChemIUPAC \meta { \textit { m } } -\NewChemIUPAC \para { \textit { p } } - -% syn/anti -\NewChemIUPAC \syn { \textit { syn } } -\NewChemIUPAC \anti { \textit { anti } } - -% coordination chemistry -\bool_new:N \l__chemmacros_bridge_super_bool - -\keys_define:nn { chemmacros / iupac } - { - bridge-number .choice: , - bridge-number / sub .code:n = - \bool_set_false:N \l__chemmacros_bridge_super_bool , - bridge-number / super .code:n = - \bool_set_true:N \l__chemmacros_bridge_super_bool , - coord-use-hyphen .bool_set:N = \l__chemmacros_coord_use_hyphen_bool , - coord-use-hyphen .default:n = true - } - -\cs_new_protected:Npn \chemformula_hapto:n #1 - { - \chemeta \chemformula_superscript:n { #1 } - \bool_if:NT \l__chemmacros_coord_use_hyphen_bool - { \chemmacros_break_point_hyphen: } - } - -\cs_new_protected:Npn \chemformula_dento:n #1 - { - \chemkappa \chemformula_superscript:n { #1 } - \bool_if:NT \l__chemmacros_coord_use_hyphen_bool - { \chemmacros_break_point_hyphen: } - } - -\cs_new_protected:Npn \chemformula_bridge:n #1 - { - \chemmu - \tl_if_blank:nF { #1 } - { - \bool_if:NTF \l__chemmacros_bridge_super_bool - { \chemformula_superscript:n { #1 } } - { \chemformula_subscript:n { #1 } } - } - \bool_if:NT \l__chemmacros_coord_use_hyphen_bool - { \chemmacros_break_point_hyphen: } - } - -\NewChemIUPAC \hapto { \chemformula_hapto:n } -\NewChemIUPAC \dento { \chemformula_dento:n } -\NewChemIUPAC \bridge { \chemformula_bridge:n } - -% attachments to heteroatoms / added hydrogen -\NewChemIUPAC \hydrogen { \textit { H } } -\NewChemIUPAC \oxygen { \textit { O } } -\NewChemIUPAC \nitrogen { \textit { N } } -\NewChemIUPAC \sulfur { \textit { S } } -\NewChemIUPAC \phosphorus { \textit { P } } - -\LetChemIUPAC \H \hydrogen -\LetChemIUPAC \O \oxygen -\LetChemIUPAC \N \nitrogen -\LetChemIUPAC \Sf \sulfur -\LetChemIUPAC \P \phosphorus - -% language specific settings -\AtBeginDocument - { - \bool_if:NT \l__chemmacros_italian_bool - { - \NewChemIUPAC \sin { \textit { sin } } - \NewChemIUPAC \ter { \textit { ter } } - } - } - -% greek letters -\NewChemIUPAC \a { \chemalpha } -\NewChemIUPAC \b { \chembeta } -\NewChemIUPAC \g { \chemgamma } -\NewChemIUPAC \d { \chemdelta } -\NewChemIUPAC \k { \chemkappa } -\NewChemIUPAC \m { \chemmu } -\NewChemIUPAC \n { \chemeta } -\NewChemIUPAC \w { \chemomega } - -% \iupac (basically the same as bpchem's \IUPAC) -% - allows multiple breaking points as compound names can get really long and -% especially in multicolumn documents can span more than two lines -% - add a (very) little space before the hyphen and a little negative space -% after it -% - add a little space at breaking points if not broken -% - enables all naming commands regardless if they're definied otherwise or not -\cs_new_protected:Nn \chemmacros_allow_hyphens: - { - \chemmacros_nobreak: - \skip_horizontal:N \c_zero_dim - } - -\dim_new:N \l__chemmacros_iupac_hyphen_pre_dim -\dim_set:Nn \l__chemmacros_iupac_hyphen_pre_dim { .01em } -\dim_new:N \l__chemmacros_iupac_hyphen_post_dim -\dim_set:Nn \l__chemmacros_iupac_hyphen_post_dim { -.03em } -\dim_new:N \l__chemmacros_iupac_break_dim -\dim_set:Nn \l__chemmacros_iupac_break_dim { .03em } - -\keys_define:nn { chemmacros / iupac } - { - hyphen-pre-space .dim_set:N = \l__chemmacros_iupac_hyphen_pre_dim , - hyphen-post-space .dim_set:N = \l__chemmacros_iupac_hyphen_post_dim , - break-space .dim_set:N = \l__chemmacros_iupac_break_dim - } - -\cs_new_protected:Nn \chemmacros_break_point_hyphen: - { - \chemmacros_nobreak: - \tex_discretionary:D { - } { } - { - \tex_kern:D \l__chemmacros_iupac_hyphen_pre_dim - - - \tex_kern:D \l__chemmacros_iupac_hyphen_post_dim - } - \chemmacros_allow_hyphens: - } - -\cs_new_protected:Npn \chemmacros_break_point: - { - \chemmacros_nobreak: - \tex_discretionary:D { - } { } - { \tex_kern:D \l__chemmacros_iupac_break_dim } - \chemmacros_allow_hyphens: - } - -\cs_new_protected:Npn \chemmacros_superscript: - { \mode_if_math:TF { \sb } { \textsuperscript } } +% compatibility coding: +\cs_new_protected:Npn \ChemCompatibility #1#2 \EndChemCompatibility + { \chemmacros_if_compatiblity:nnT {=} {#1} {#2} } -\bool_new:N \l__chemmacros_inside_iupac_bool - -\group_begin: -\char_set_catcode_active:N \~ -\char_set_lccode:nn {`~} {`|} -\tl_to_lowercase:n { \group_end: \cs_set_eq:NN ~ } \chemmacros_break_point: - -\group_begin: -\char_set_catcode_active:N \~ -\char_set_lccode:nn {`~} {`^} -\tl_to_lowercase:n { \group_end: \cs_set_protected:Npn ~ } - { \chemmacros_superscript: } - -\group_begin: -\char_set_catcode_active:N \| -\char_set_catcode_active:N \^ - -\cs_new_protected:Npn \chemmacros_iupac:n #1 - { - \group_begin: - \bool_set_true:N \l__chemmacros_inside_iupac_bool - \chemmacros_make_iupac: - \chemmacros_ignore_spaces: - \cs_set_eq:NN \- \chemmacros_break_point_hyphen: - \chemmacros_define_deprecated:NN \| | - \chemmacros_define_deprecated:NN \^ ^ - \tl_set_rescan:Nnn \l__chemmacros_tmpa_tl - { - \char_set_catcode_active:N \| - \char_set_catcode_active:N \^ - } - {#1} - \l__chemmacros_tmpa_tl - \group_end: - } - -% \cs_new_protected:Npn \chemmacros_iupac_aux:n #1 -% { -% #1 -% \group_end: -% } -\group_end: - -% Thanks to Joseph Wright and Enrico Gregorio for the help on the curious -% redefinition of \- and the end of the compilation -% see http://tex.stackexchange.com/q/42405/5049 for reference -\cs_set_protected:Npx \| { \exp_not:o { \| } } -\cs_set_protected:Npx \- { \exp_not:o { \- } } -\cs_set_eq:NN \@dischyph \- - -\NewDocumentCommand \iupac { } - { \chemmacros_iupac:n } - -% -------------------------------------------------------------------------- -% latin phrases -\tl_new:N \l__chemmacros_latin_format_tl -\tl_set:Nn \l__chemmacros_latin_format_tl { \itshape } - -\keys_define:nn { chemmacros / latin } - { format . tl_set:N = \l__chemmacros_latin_format_tl } - -\cs_new_protected:Npn \chemmacros_latin:n #1 - { { \l__chemmacros_latin_format_tl #1 } } - -\prop_new:N \l__chemmacros_latin_prop - -\cs_new_protected:Npn \chemmacros_new_latin:Nn #1#2 - { - \cs_if_free:NTF #1 - { - \cs_new_protected:Npn #1 - { \chemmacros_latin:n { #2 } \chemmacros_xspace: } - \prop_put:Nnn \l__chemmacros_latin_prop { #1 } { #2 } - } - { \msg_error:nnn { chemmacros } { new-latin } { #1 } } - } - -\cs_new_protected:Npn \chemmacros_define_latin:Nn #1#2 - { - \cs_if_free:NTF #1 - { - \cs_new_protected:Npn #1 - { \chemmacros_latin:n { #2 } \chemmacros_xspace: } - \prop_put:Nnn \l__chemmacros_latin_prop { #1 } { #2 } - } - { - \cs_set_protected:Npn #1 - { \chemmacros_latin:n { #2 } \chemmacros_xspace: } - \prop_put:Nnn \l__chemmacros_latin_prop { #1 } { #2 } - } - } - -\cs_new_protected:Npn \chemmacros_renew_latin:Nn #1#2 - { - \prop_if_in:NnTF \l__chemmacros_latin_prop { #1 } - { \cs_set:Npn #1 { \chemmacros_latin:n { #2 } \chemmacros_xspace: } } - { \msg_error:nnn { chemmacros } { renew-latin } { #1 } } - } - -\NewDocumentCommand \NewChemLatin { mm } - { \chemmacros_new_latin:Nn #1 { #2 } } - -\NewDocumentCommand \RenewChemLatin { mm } - { \chemmacros_renew_latin:Nn #1 { #2 } } - -\NewDocumentCommand \DeclareChemLatin { mm } - { \chemmacros_define_latin:Nn #1 { #2 } } - -\AtBeginDocument - { - \bool_if:NTF \l__chemmacros_chemstyle_bool - { - \AfterPackage* { chemstyle } - { - \cs_undefine:N \invacuo - \cs_set_eq:NN \chemmacros_latin:n \cst@latin - } - } - { - \cs_new_eq:NN \latin \chemmacros_latin:n - } - \NewChemLatin \insitu { in~situ } - \NewChemLatin \abinitio { ab~initio } - \NewChemLatin \invacuo { in~vacuo } - } - -% --------------------------------------------------------------------------- % -% acid / base -\tl_new:N \l__chemmacros_k_acid_tl -\tl_new:N \l__chemmacros_k_base_tl -\tl_new:N \l__chemmacros_k_water_tl - -% \bool_new:N \l__chemmacros_subscript_lowercase_bool - -\tl_set:Nn \l__chemmacros_k_acid_tl - { \chemmacros_translate:n {K-acid} } - -\tl_set:Nn \l__chemmacros_k_base_tl - { \chemmacros_translate:n {K-base} } - -\tl_set:Nn \l__chemmacros_k_water_tl - { \chemmacros_translate:n {K-water} } - -\keys_define:nn { chemmacros / acid-base } - { - p-style .choice: , - p-style / slanted .code:n = \cs_set_eq:NN \chemmacros_p_style:n \textsl , - p-style / italics .code:n = \cs_set_eq:NN \chemmacros_p_style:n \textit , - p-style / upright .code:n = \cs_set_eq:NN \chemmacros_p_style:n \textup , - K-acid .tl_set:N = \l__chemmacros_k_acid_tl , - K-base .tl_set:N = \l__chemmacros_k_base_tl , - K-water .tl_set:N = \l__chemmacros_k_water_tl , - subscript .code:n = \chemmacros_option_deprecated:n {#1} - % subscript / lowercase .code:n = - % \bool_set_true:N \l__chemmacros_subscript_lowercase_bool , - % subscript / uppercase .code:n = - % \bool_set_false:N \l__chemmacros_subscript_lowercase_bool - } - -\cs_new_eq:NN \chemmacros_p_style:n \textup - -\cs_new_protected:Npn \Ka - { - \ensuremath - { - \chemmacros_detect_bold:n - { - K - \c_math_subscript_token - { \l__chemmacros_k_acid_tl } - } - } - \chemmacros_xspace: - } - -\cs_new_protected:Npn \Kb - { - \ensuremath - { - \chemmacros_detect_bold:n - { - K - \c_math_subscript_token - { \l__chemmacros_k_base_tl } - } - } - \chemmacros_xspace: - } - -\cs_new_protected:Npn \Kw - { - \ensuremath - { - \chemmacros_detect_bold:n - { - K - \c_math_subscript_token - { \l__chemmacros_k_water_tl } - } - } - \chemmacros_xspace: - } - -\cs_new_protected:Npn \chemmacros_p:n #1 - { - \group_begin: - \mbox - { - \chemmacros_p_style:n { p } - \ensuremath { #1 } - } - \group_end: - } - -\NewDocumentCommand \p { m } - { \chemmacros_p:n { #1 } } - -\cs_new_protected:Npn \pH - { - \chemmacros_p:n { \chemmacros_chemformula:n { H } } - \chemmacros_xspace: - } - -\cs_new_protected:Npn \pOH - { - \chemmacros_p:n { \chemmacros_chemformula:n { OH } } - \chemmacros_xspace: - } - -\NewDocumentCommand \pKa { o } - { - \chemmacros_p:n - { - \Ka \IfNoValueF { #1 } - { {} \c_math_subscript_token { \chemmacros_detect_bold:n { #1 } } } - } - \chemmacros_xspace: - } - -\NewDocumentCommand \pKb { o } - { - \chemmacros_p:n - { - \Kb \IfNoValueF { #1 } - { {} \c_math_subscript_token { \chemmacros_detect_bold:n { #1 } } } - } - \chemmacros_xspace: - } - -% -------------------------------------------------------------------------- -% units -\DeclareSIUnit { \atm } { atm } -\DeclareSIUnit { \atmosphere } { atm } -\DeclareSIUnit { \calory } { cal } -\DeclareSIUnit { \cal } { cal } - -\AtBeginDocument - { - \bool_if:NF \l__chemmacros_chemstyle_bool - { - \DeclareSIUnit { \cmc } { \cubic\centi\metre } - \DeclareSIUnit { \molar } { \mole\per\cubic\deci\metre } - \DeclareSIUnit { \Molar } { \textsc{m} } - } - } - -\DeclareSIUnit { \moLar } { \mole\per\liter } -\DeclareSIUnit { \MolMass } { \gram\per\mole } -\DeclareSIUnit { \normal } { \textsc{n} } -\DeclareSIUnit { \torr } { torr } - -% -------------------------------------------------------------------------- -% reaction mechanisms -% \mech[<type>] -% <type> - substitutions: {}, 1, 2, se, 1e, 2e, ar -% - eliminations: e, e1, e2, cb -\tl_new:N \l__chemmacros_mech_type_tl -\tl_new:N \l__chemmacros_mech_mol_tl -\tl_new:N \l__chemmacros_mech_ar_tl - -\cs_new_protected:Npn \__chemmacros_set_mech:nnn #1#2#3 - { - \tl_set:Nn \l__chemmacros_mech_type_tl { #1 } - \tl_set:Nn \l__chemmacros_mech_mol_tl { #2 } - \tl_set:Nn \l__chemmacros_mech_ar_tl { #3 } - } - -\keys_define:nn { chemmacros / mech } - { - type .choice: , - type / .code:n = - { - \__chemmacros_set_mech:nnn { S } - { - \c_math_toggle_token - \c_math_subscript_token { \text {N} } - \c_math_toggle_token - } - { } - } , - type / 1 .code:n = - { - \__chemmacros_set_mech:nnn { S } - { - \c_math_toggle_token - \c_math_subscript_token { \text {N} } - \c_math_toggle_token - 1 - } - { } - } , - type / 2 .code:n = - { - \__chemmacros_set_mech:nnn { S } - { - \c_math_toggle_token - \c_math_subscript_token { \text {N} } - \c_math_toggle_token - 2 - } - { } - } , - type / se .code:n = - { - \__chemmacros_set_mech:nnn { S } - { - \c_math_toggle_token - \c_math_subscript_token { \text {E} } - \c_math_toggle_token - } - { } - } , - type / 1e .code:n = - { - \__chemmacros_set_mech:nnn { S } - { - \c_math_toggle_token - \c_math_subscript_token { \text {E} } - \c_math_toggle_token - 1 - } - { } - } , - type / 2e .code:n = - { - \__chemmacros_set_mech:nnn { S } - { - \c_math_toggle_token - \c_math_subscript_token { \text {E} } - \c_math_toggle_token - 2 - } - { } - } , - type / ar .code:n = - { - \__chemmacros_set_mech:nnn { S } - { - \c_math_toggle_token - \c_math_subscript_token { \text {E} } - \c_math_toggle_token - } - { Ar - } - } , - type / e .code:n = - { \__chemmacros_set_mech:nnn { E } { } { } } , - type / e1 .code:n = - { \__chemmacros_set_mech:nnn { E } { 1 } { } } , - type / e2 .code:n = - { \__chemmacros_set_mech:nnn { E } { 2 } { } } , - type / cb .code:n = - { - \__chemmacros_set_mech:nnn { E } - { - 1 - \c_math_toggle_token - \c_math_subscript_token { \text {cb} } - \c_math_toggle_token - } - { } - } , - type .default:n = - } - -\cs_new_protected:Npn \chemmacros_mech:n #1 - { - \tl_if_blank:nTF { #1 } - { \keys_set:nn { chemmacros / mech } { type } } - { \keys_set:nn { chemmacros / mech } { type = #1 } } - \mbox - { - \tl_use:N \l__chemmacros_mech_ar_tl - \tl_use:N \l__chemmacros_mech_type_tl - \tl_use:N \l__chemmacros_mech_mol_tl - } - \chemmacros_xspace: - } - -\NewDocumentCommand \mech { o } - { - \IfNoValueTF { #1 } - { \chemmacros_mech:n { } } - { \chemmacros_mech:n { #1 } } - } - -% -------------------------------------------------------------------------- -% oxidation numbers -% \ox{<number>,<atom>} -\bool_new:N \l__chemmacros_ox_sign_bool -\bool_new:N \l__chemmacros_ox_integer_bool -\bool_new:N \l__chemmacros_ox_explicit_sign_bool -\bool_set_false:N \l__chemmacros_ox_explicit_sign_bool -\bool_new:N \l__chemmacros_ox_format_roman_bool -\bool_set_true:N \l__chemmacros_ox_format_roman_bool -\bool_new:N \l__chemmacros_ox_decimal_marker_comma_bool -\bool_set_false:N \l__chemmacros_ox_decimal_marker_comma_bool -\bool_new:N \l__chemmacros_ox_parse_bool -\bool_set_true:N \l__chemmacros_ox_parse_bool -\bool_new:N \l__chemmacros_ox_side_bool -\bool_new:N \l__chemmacros_ox_super_bool -\bool_new:N \l__chemmacros_ox_top_bool -\bool_set_true:N \l__chemmacros_ox_top_bool -\bool_new:N \l__chemmacros_ox_align_center_bool - -\int_new:N \l__chemmacros_ox_number_int -\fp_new:N \l__chemmacros_ox_number_fp - -\cs_new_protected:Npn \__chemmacros_ox_process_number:n #1 - { - \bool_if:NTF \l__chemmacros_ox_parse_bool - { - \tl_if_in:nnTF { #1 } { / } - { \__chemmacros_ox_fraction:w #1 \q_stop } - { - \__chemmacros_ox_sign:n { #1 } - \__chemmacros_ox_value:n { #1 } - } - } - { #1 } - } - -\DeclareInstance { xfrac } { chemmacros-ox-frac } { text } - { - scale-factor = 1.2 , - denominator-bot-sep = -.5ex , - numerator-top-sep = -.3ex , - slash-left-kern = -.2em , - slash-right-kern = -.2em , - slash-symbol-font = lmr - } - -\cs_new_protected:Npn \__chemmacros_ox_fraction:w #1/#2 \q_stop - { - \bool_set_false:N \l__chemmacros_ox_format_roman_bool - \__chemmacros_ox_sign:n { #1 } - \bool_if:NTF \l__chemmacros_ox_side_bool - { \sfrac { \__chemmacros_ox_value:n { #1 } } { #2 } } - { - \sfrac [ chemmacros-ox-frac ] - { \__chemmacros_ox_value:n { #1 } } - { #2 } - } - } - -\cs_new_protected:Npn \__chemmacros_ox_sign:n #1 - { - \fp_compare:nNnT { #1 } > { 0 } - { - \bool_if:NT \l__chemmacros_ox_explicit_sign_bool - { \c_math_toggle_token + \c_math_toggle_token } - } - \fp_compare:nNnT { #1 } = { 0 } - { - \bool_if:NT \l__chemmacros_ox_explicit_sign_bool - { \c_math_toggle_token \pm \c_math_toggle_token } - } - \fp_compare:nNnT { #1 } < { 0 } - { \c_math_toggle_token - \c_math_toggle_token } - } - -\cs_new_protected:Npn \__chemmacros_ox_value:n #1 - { - \fp_set:Nn \l__chemmacros_ox_number_fp { abs(#1) } - \__chemmacros_ox_is_integer:V \l__chemmacros_ox_number_fp - \bool_if:NTF \l__chemmacros_ox_format_roman_bool - { \__chemmacros_fp_to_Roman:V \l__chemmacros_ox_number_fp } - { - \bool_if:NTF \l__chemmacros_ox_integer_bool - { - \c_math_toggle_token - \__chemmacros_fp_to_arabic:V \l__chemmacros_ox_number_fp - \c_math_toggle_token - } - { - \c_math_toggle_token - \__chemmacros_fp_show:V \l__chemmacros_ox_number_fp - \c_math_toggle_token - } - } - } - -\cs_new_protected:Npn \__chemmacros_ox_is_integer:n #1 - { - \fp_set:Nn \l__chemmacros_tmpa_fp { round(#1 + 1 , 0 ) - 1 } - \fp_compare:nNnTF { \l__chemmacros_tmpa_fp } = { #1 } - { \bool_set_true:N \l__chemmacros_ox_integer_bool } - { - \bool_set_false:N \l__chemmacros_ox_integer_bool - \bool_set_false:N \l__chemmacros_ox_format_roman_bool - } - } -\cs_generate_variant:Nn \__chemmacros_ox_is_integer:n { V } - -\cs_new_protected:Npn \__chemmacros_fp_to_Roman:n #1 - { - \group_begin: - \fp_set:Nn \l__chemmacros_tmpa_fp { round(#1 , 0 ) } - \int_set:Nn \l__chemmacros_tmpa_int - { \fp_to_tl:N \l__chemmacros_tmpa_fp } - \int_compare:nTF { \l__chemmacros_tmpa_int = 0 } - { 0 } - { \int_to_Roman:n { \l__chemmacros_tmpa_int } } - \group_end: - } -\cs_generate_variant:Nn \__chemmacros_fp_to_Roman:n { V } - -\cs_new_protected:Npn \__chemmacros_fp_to_arabic:n #1 - { - \group_begin: - \fp_set:Nn \l__chemmacros_tmpa_tl { #1 } - \fp_to_tl:N \l__chemmacros_tmpa_tl - \group_end: - } -\cs_generate_variant:Nn \__chemmacros_fp_to_arabic:n { V } - -\cs_new_protected:Npn \__chemmacros_fp_show:n #1 - { - \group_begin: - \fp_set:Nn \l__chemmacros_tmpa_tl { #1 } - \bool_if:NTF \l__chemmacros_ox_decimal_marker_comma_bool - { - \tl_set:Nx \l__chemmacros_tmpb_tl - { \fp_to_tl:N \l__chemmacros_tmpa_tl } - \tl_replace_once:Nnn \l__chemmacros_tmpb_tl { . } { {,} } - \tl_use:N \l__chemmacros_tmpb_tl - } - { \fp_to_tl:N \l__chemmacros_tmpa_tl } - \group_end: - } -\cs_generate_variant:Nn \__chemmacros_fp_show:n { V } - -\cs_new_protected:Npn \__chemmacros_ox_write:nn #1#2 - { - \tl_if_blank:nT { #1 } - { \msg_error:nnx { chemmacros } { ox } { oxidation~number~missing } } - \tl_if_blank:nT { #2 } - { \msg_error:nnx { chemmacros } { ox } { atom~missing } } - \ensuremath - { - \bool_if:NT \l__chemmacros_ox_super_bool - { - \chemmacros_text:n - { - #2 - \c_math_toggle_token - \c_math_superscript_token - { \text { \tiny \__chemmacros_ox_process_number:n { #1 } } } - \c_math_toggle_token - } - } - \bool_if:NT \l__chemmacros_ox_side_bool - { - \chemmacros_text:n - { #2 ( \text { \__chemmacros_ox_process_number:n { #1 } } ) } - } - \bool_if:NT \l__chemmacros_ox_top_bool - { - \overset - { - \bool_if:NTF \l__chemmacros_ox_align_center_bool - { \clap } { \rlap } - { - \chemmacros_text:n - { \tiny \__chemmacros_ox_process_number:n { #1 } } - } - } - { \chemmacros_text:n { #2 } } - } - } - } - -\cs_new_protected:Npn \__chemmacros_ox_pos_top: - { - \bool_set_true:N \l__chemmacros_ox_top_bool - \bool_set_false:N \l__chemmacros_ox_super_bool - \bool_set_false:N \l__chemmacros_ox_side_bool - } - -\cs_new_protected:Npn \__chemmacros_ox_pos_super: - { - \bool_set_false:N \l__chemmacros_ox_top_bool - \bool_set_true:N \l__chemmacros_ox_super_bool - \bool_set_false:N \l__chemmacros_ox_side_bool - } - -\cs_new_protected:Npn \__chemmacros_ox_pos_side: - { - \bool_set_false:N \l__chemmacros_ox_top_bool - \bool_set_false:N \l__chemmacros_ox_super_bool - \bool_set_true:N \l__chemmacros_ox_side_bool - } - -\keys_define:nn { chemmacros / ox } - { - pos .choice: , - pos / top .code:n = \__chemmacros_ox_pos_top: , - pos / super .code:n = \__chemmacros_ox_pos_super: , - pos / side .code:n = \__chemmacros_ox_pos_side: , - roman .bool_set:N = \l__chemmacros_ox_format_roman_bool , - roman .default:n = true , - parse .bool_set:N = \l__chemmacros_ox_parse_bool , - parse .default:n = true , - explicit-sign .bool_set:N = \l__chemmacros_ox_explicit_sign_bool , - explicit-sign .default:n = true , - decimal-marker .choice: , - decimal-marker / comma .code:n = - { \bool_set_true:N \l__chemmacros_ox_decimal_marker_comma_bool } , - decimal-marker / point .code:n = - { \bool_set_false:N \l__chemmacros_ox_decimal_marker_comma_bool } , - align .choice: , - align / center .code:n = \bool_set_true:N \l__chemmacros_ox_align_center_bool , - align / right .code:n = \bool_set_false:N \l__chemmacros_ox_align_center_bool - } - -% \ox[<keyval>]{<num>,<atom>} -% \ox*[<keyval>]{<num>,<atom>} => always number on the side -\cs_new_protected:Npn \chemmacros_ox:nnnn #1#2#3#4 - { - \group_begin: - \tl_if_blank:nF { #1 } { \__chemmacros_ox_pos_super: } - \keys_set:nn { chemmacros / ox } { #2 } - \__chemmacros_ox_write:nn { #3 } { #4 } - \group_end: - } - -\NewDocumentCommand \ox { s o > { \SplitArgument { 1 } { , } } m } - { - \IfBooleanTF { #1 } - { - \IfNoValueTF { #2 } - { \chemmacros_ox:nnnn { #1 } { } #3 } - { \chemmacros_ox:nnnn { #1 } { #2 } #3 } - } - { - \IfNoValueTF { #2 } - { \chemmacros_ox:nnnn { } { } #3 } - { \chemmacros_ox:nnnn { } { #2 } #3 } - } - } - -% --------------------------------------------------------------------------- % -% - oxidation arrows -\tl_new:N \l__chemmacros_redox_begin_tl -\tl_new:N \l__chemmacros_redox_end_tl -\tl_new:N \l__chemmacros_redox_tikz_tl -\tl_new:N \l__chemmacros_redox_shift_tl -\tl_new:N \l__chemmacros_redox_anchor_tl -\tl_new:N \l__chemmacros_redox_side_tl - -\fp_new:N \l__chemmacros_redox_shift_fp - -\dim_new:N \l__chemmacros_redox_sep_dim -\dim_new:N \l__chemmacros_redox_sep_default_dim -\dim_set:Nn \l__chemmacros_redox_sep_default_dim { .2em } -\dim_new:N \l__chemmacros_redox_dist_dim -\dim_set:Nn \l__chemmacros_redox_dist_dim {.6em} - -% place and name nodes: -% \OX{<name>,<atom>} -\NewDocumentCommand \OX { > { \SplitArgument { 1 } { , } } m } - { \chemmacros_redox_partner:nn #1 } - -\cs_new_protected:Npn \chemmacros_redox_partner:nn #1#2 - { - \chemformula_latex_if:nTF { measuring@ } - { - \group_begin: - \tikz[baseline=(#1.base)] - { \node [inner~sep=0pt] (#1) { #2 } ; } - \group_end: - } - { - \tl_if_blank:nT { #1 } - { \msg_error:nnx { chemmacros } { OX } { node~name~missing } } - \tl_if_blank:nT { #2 } - { \msg_error:nnx { chemmacros } { OX } { atom~missing } } - \tikz[baseline=(#1.base),remember~picture] - { \node [inner~sep=0pt] (#1) { #2 } ; } - } - } - -\cs_new_protected:Npn \__chemmacros_redox_coordinates:nn #1#2 - { - \tl_set:Nn \l__chemmacros_redox_begin_tl { #1 } - \tl_set:Nn \l__chemmacros_redox_end_tl { #2 } - } - -\cs_new_protected:Npn \chemmacros_redox:nnnnn #1#2#3#4#5 - { - \tl_clear:N \l__chemmacros_redox_begin_tl - \tl_clear:N \l__chemmacros_redox_end_tl - \tl_clear:N \l__chemmacros_redox_tikz_tl - \__chemmacros_redox_coordinates:nn { #1 } { #2 } - \tl_if_blank:nF { #3 } - { \tl_set:Nn \l__chemmacros_redox_tikz_tl { #3 } } - \tl_if_blank:nTF { #4 } - { - \fp_set:Nn \l__chemmacros_redox_shift_fp { 1 } - \tl_set:Nn \l__chemmacros_redox_anchor_tl { above } - \tl_set:Nn \l__chemmacros_redox_side_tl { north } - \dim_set_eq:NN - \l__chemmacros_redox_sep_dim - \l__chemmacros_redox_sep_default_dim - } - { - \fp_compare:nNnTF { #4 } < { 0 } - { - \tl_set:Nn \l__chemmacros_redox_anchor_tl { below } - \tl_set:Nn \l__chemmacros_redox_side_tl { south } - \exp_args:NNo \dim_set:Nn \l__chemmacros_redox_sep_dim - { - \l__chemmacros_redox_sep_default_dim } - } - { - \tl_set:Nn \l__chemmacros_redox_anchor_tl { above } - \tl_set:Nn \l__chemmacros_redox_side_tl { north } - \dim_set_eq:NN - \l__chemmacros_redox_sep_dim - \l__chemmacros_redox_sep_default_dim - } - \fp_set:Nn \l__chemmacros_redox_shift_fp { #4 } - } - \tl_set:Nn \l__chemmacros_redox_shift_tl - { \fp_to_tl:N \l__chemmacros_redox_shift_fp } - \tikz[remember~picture,overlay] - { - \chemmacros_tikz_draw:f { \tl_use:N \l__chemmacros_redox_tikz_tl } - ($ - (\l__chemmacros_redox_begin_tl . - \l__chemmacros_redox_side_tl)+(0,\l__chemmacros_redox_sep_dim) - $) - -- - ++(0,\l__chemmacros_redox_shift_tl * \l__chemmacros_redox_dist_dim) -| - node [pos=.25,\l__chemmacros_redox_anchor_tl] { { #5 } } - ($ - (\l__chemmacros_redox_end_tl . - \l__chemmacros_redox_side_tl)+(0,\l__chemmacros_redox_sep_dim) - $) ; - } - } - -\NewDocumentCommand \redox { > { \SplitArgument { 1 } { , } } r() o o G{} } - { - \IfNoValueT { #1 } - { - \msg_error:nnx { chemmacros } { redox } - { You~need~to~specify~coordinates } - } - \IfNoValueTF { #2 } - { \chemmacros_redox:nnnnn #1 { } { } { #4 } } - { - \IfNoValueTF { #3 } - { \chemmacros_redox:nnnnn #1 { #2 } { } { #4 } } - { \chemmacros_redox:nnnnn #1 { #2 } { #3 } { #4 } } - } - } - -% redox-keys -\keys_define:nn { chemmacros / redox } - { - dist .dim_set:N = \l__chemmacros_redox_dist_dim , - dist .default:n = { .6em } , - sep .dim_set:N = \l__chemmacros_redox_sep_default_dim , - sep .default:n = { .2em } - } - -% --------------------------------------------------------------------------- % -% spectroscopy -\tl_new:N \g__chemmacros_nmr_isotope_tl -\tl_new:N \l__chemmacros_nmr_isotope_default_tl -\tl_set:Nn \l__chemmacros_nmr_isotope_default_tl { 1 } -\tl_new:N \l__chemmacros_nmr_coupling_nuclei_tl -\tl_new:N \l__chemmacros_nmr_coupling_nuclei_pre_tl -\tl_set:Nn \l__chemmacros_nmr_coupling_nuclei_pre_tl { ( } -\tl_new:N \l__chemmacros_nmr_coupling_nuclei_post_tl -\tl_set:Nn \l__chemmacros_nmr_coupling_nuclei_post_tl { ) } -\tl_new:N \l__chemmacros_nmr_coupling_bonds_tl -\tl_new:N \l__chemmacros_nmr_coupling_bonds_pre_tl -\tl_set:Nn \l__chemmacros_nmr_coupling_bonds_pre_tl { } -\tl_set:Nn \l__chemmacros_nmr_coupling_bonds_post_tl { \! } -\tl_new:N \l__chemmacros_nmr_coupling_symbol_tl -\tl_set:Nn \l__chemmacros_nmr_coupling_symbol_tl { J } -\tl_new:N \g__chemmacros_nmr_element_coupled_tl -\tl_new:N \g__chemmacros_nmr_element_tl -\tl_new:N \l__chemmacros_nmr_element_default_tl -\tl_set:Nn \l__chemmacros_nmr_element_default_tl { H } -\tl_new:N \l__chemmacros_nmr_format_tl -\tl_new:N \l__chemmacros_nmr_delta_tl -\tl_new:N \l__chemmacros_nmr_coupling_unit_tl -\tl_set:Nn \l__chemmacros_nmr_coupling_unit_tl { \hertz } -\tl_new:N \l__chemmacros_nmr_unit_tl -\tl_set:Nn \l__chemmacros_nmr_unit_tl { \mega\hertz } -\tl_new:N \l__chemmacros_nmr_list_setup_tl -\tl_set:Nn \l__chemmacros_nmr_list_setup_tl - { - \topsep\z@skip \partopsep\z@skip - \itemsep\z@ \parsep\z@ \itemindent\z@ - \leftmargin\z@ - } -\tl_new:N \l__chemmacros_nmr_position_tl -\tl_new:N \l__chemmacros_nmr_element_method_connector_tl -\tl_set:Nn \l__chemmacros_nmr_element_method_connector_tl {-} -\tl_new:N \l__chemmacros_nmr_method_tl -\tl_set:Nn \l__chemmacros_nmr_method_tl {NMR} - -\bool_new:N \l__chemmacros_nmr_coupling_nuclei_sub_bool -\bool_new:N \l__chemmacros_nmr_frequency_bool -\bool_new:N \l__chemmacros_nmr_solvent_bool -\bool_new:N \l__chemmacros_nmr_delimiters_bool -\bool_new:N \l__chemmacros_nmr_comma_bool -\bool_new:N \l__chemmacros_nmr_inner_bool -\bool_new:N \l__chemmacros_nmr_position_side_bool -\bool_new:N \l__chemmacros_nmr_parse_bool -\bool_set_true:N \l__chemmacros_nmr_parse_bool -\bool_new:N \l__chemmacros_nmr_list_bool -\bool_new:N \l__chemmacros_nmr_use_equal_bool -\bool_new:N \l__chemmacros_nmr_custom_command_active_bool -\bool_new:N \l__chemmacros_nmr_custom_command_used_bool - -\cs_new_protected:Npn \__chemmacros_nmr_nucleus:nn #1#2 - { - \tl_gset:Nn \g__chemmacros_nmr_isotope_tl { #1 } - \tl_if_in:nnTF { #2 } { [ } - { \__chemmacros_nmr_element:w #2 \q_stop } - { - \tl_gset:No \g__chemmacros_nmr_element_tl { #2 } - \tl_gclear:N \g__chemmacros_nmr_element_coupled_tl - } - } -\cs_generate_variant:Nn \__chemmacros_nmr_nucleus:nn { VV } - -\cs_new_protected:Npn \__chemmacros_nmr_nucleus:w #1,#2 \q_stop - { - \tl_gset:Nn \g__chemmacros_nmr_isotope_tl { #1 } - \tl_if_in:nnTF { #2 } { [ } - { \__chemmacros_nmr_element:w #2 \q_stop } - { - \tl_gset:No \g__chemmacros_nmr_element_tl { #2 } - \tl_gclear:N \g__chemmacros_nmr_element_coupled_tl - } - } - -\cs_new_protected:Npn \__chemmacros_nmr_element:w #1[#2] \q_stop - { - \tl_gset:Nn \g__chemmacros_nmr_element_tl { #1 } - \tl_gset:Nn \g__chemmacros_nmr_element_coupled_tl { #2 } - } - -\cs_new_protected:Npn \__chemmacros_nmr_default_nucleus:w #1,#2 \q_stop - { - \tl_set:Nn \l__chemmacros_nmr_isotope_default_tl { #1 } - \tl_set:Nn \l__chemmacros_nmr_element_default_tl { #2 } - } - -\cs_new_protected:Npn \__chemmacros_nmr_base:nn #1#2 - { - \tl_if_blank:VF \g__chemmacros_nmr_element_coupled_tl - { - \tl_put_left:Nn \g__chemmacros_nmr_element_coupled_tl { \{ } - \tl_put_right:Nn \g__chemmacros_nmr_element_coupled_tl { \} } - } - \tl_put_left:Nn \g__chemmacros_nmr_element_coupled_tl { #2 } - \iupac { ^ { #1 } } - \bool_if:NTF \l__chemmacros_nmr_parse_bool - { \chemformula_ch:nV {} \g__chemmacros_nmr_element_coupled_tl } - { \chemmacros_atom:V \g__chemmacros_nmr_element_coupled_tl } - \tl_use:N \l__chemmacros_nmr_element_method_connector_tl - \tl_use:N \l__chemmacros_nmr_method_tl - } -\cs_generate_variant:Nn \__chemmacros_nmr_base:nn { VV } - -\cs_new_protected:Npn \__chemmacros_nmr_frequency:n #1 - { - \tl_if_in:nnTF { #1 } { , } - { \__chemmacros_nmr_frequency_aux_i:w #1 \q_stop } - { \__chemmacros_nmr_frequency_aux_ii:n { #1 } } - } - -\cs_new_protected:Npn \__chemmacros_nmr_frequency_aux_i:w #1,#2 \q_stop - { \SI { #1 } { #2 } } - -\cs_new_protected:Npn \__chemmacros_nmr_frequency_aux_ii:n #1 - { \SI { #1 } { \tl_use:N \l__chemmacros_nmr_unit_tl } } - -\cs_new_eq:NN \__chemmacros_nmr_number:n \use:n -\cs_new_eq:NN \__chemmacros_nmr_position:n \use:n - -\keys_define:nn { chemmacros / nmr } - { - unit .tl_set:N = \l__chemmacros_nmr_unit_tl , - unit .default:n = \mega\hertz , - nucleus .code:n = - { \__chemmacros_nmr_default_nucleus:w #1 \q_stop } , - nucleus .default:n = { 1,H } , - format .tl_set:N = \l__chemmacros_nmr_format_tl , - method .tl_set:N = \l__chemmacros_nmr_method_tl , - connector .tl_set:N = \l__chemmacros_nmr_element_method_connector_tl , - pos-number .choice: , - pos-number / sub .code:n = - \tl_set:Nn \l__chemmacros_nmr_position_tl { _ } - \bool_set_false:N \l__chemmacros_nmr_position_side_bool , - pos-number / super .code:n = - \tl_set:Nn \l__chemmacros_nmr_position_tl { ^ } - \bool_set_false:N \l__chemmacros_nmr_position_side_bool , - pos-number / side .code:n = - \tl_set:Nn \l__chemmacros_nmr_position_tl { - } - \bool_set_true:N \l__chemmacros_nmr_position_side_bool , - coupling-unit .tl_set:N = \l__chemmacros_nmr_coupling_unit_tl , - coupling-pos .choice: , - coupling-pos / sub .code:n = - \bool_set_true:N \l__chemmacros_nmr_coupling_nuclei_sub_bool , - coupling-pos / side .code:n = - \bool_set_false:N \l__chemmacros_nmr_coupling_nuclei_sub_bool , - coupling-nuclei-pre .tl_set:N = - \l__chemmacros_nmr_coupling_nuclei_pre_tl , - coupling-nuclei-post .tl_set:N = - \l__chemmacros_nmr_coupling_nuclei_post_tl , - coupling-bonds-pre .tl_set:N = - \l__chemmacros_nmr_coupling_bonds_pre_tl , - coupling-bonds-post .tl_set:N = - \l__chemmacros_nmr_coupling_bonds_post_tl , - coupling-symbol .tl_set:N = - \l__chemmacros_nmr_coupling_symbol_tl , - atom-number-cs .code:n = - \cs_set_eq:NN \__chemmacros_nmr_number:n #1 , - coupling-pos-cs .code:n = - \cs_set_eq:NN \__chemmacros_nmr_position:n #1 , - parse .bool_set:N = \l__chemmacros_nmr_parse_bool , - delta .code:n = - \tl_set:Nn \l__chemmacros_nmr_delta_tl { \, #1 } , - list .bool_set:N = \l__chemmacros_nmr_list_bool , - list .default:n = true , - list-setup .tl_set:N = \l__chemmacros_nmr_list_setup_tl , - use-equal .bool_set:N = \l__chemmacros_nmr_use_equal_bool , - use-equal .default:n = true - } - -\prop_new:N \l__chemmacros_nmr_prop - -\cs_new_protected:Npn \chemmacros_new_nmr:Nn #1#2 - { - \bool_if:nTF - { - \prop_if_in_p:Nn \l__chemmacros_nmr_prop { #1 } - || - \cs_if_exist_p:N #1 - } - { \msg_error:nnn { chemmacros } { new-nmr } { #1 } } - { - \prop_put:Nnn \l__chemmacros_nmr_prop { #1 } { #2 } - \NewDocumentCommand #1 { s } - { \IfBooleanTF {##1} { \NMR*{#2} } { \NMR{#2} } } - } - } - -\cs_new_protected:Npn \chemmacros_define_nmr:Nn #1#2 - { - \prop_put:Nnn \l__chemmacros_nmr_prop { #1 } { #2 } - \cs_if_exist:NTF #1 - { - \RenewDocumentCommand #1 { s } - { \IfBooleanTF {##1} { \NMR*{#2} } { \NMR{#2} } } - } - { - \NewDocumentCommand #1 { s } - { \IfBooleanTF {##1} { \NMR*{#2} } { \NMR{#2} } } - } - } - -\cs_new_protected:Npn \chemmacros_renew_nmr:Nn #1#2 - { - \bool_if:nTF - { - \prop_if_in_p:Nn \l__chemmacros_nmr_prop { #1 } - && - \cs_if_exist_p:N #1 - } - { - \prop_put:Nnn \l__chemmacros_nmr_prop { #1 } { #2 } - \RenewDocumentCommand #1 { s } - { \IfBooleanTF {##1} { \NMR*{#2} } { \NMR{#2} } } - } - { \msg_error:nnn { chemmacros } { renew-nmr } { #1 } } - } - -\NewDocumentCommand \NewChemNMR { mm } - { \chemmacros_new_nmr:Nn #1 { #2 } } - -\NewDocumentCommand \RenewChemNMR { mm } - { \chemmacros_renew_nmr:Nn #1 { #2 } } - -\NewDocumentCommand \DeclareChemNMR { mm } - { \chemmacros_define_nmr:Nn #1 { #2 } } - -\NewDocumentCommand \NMR { s G{} D(){} O{} } - { - \IfBooleanTF { #1 } - { \chemmacros_nmr:nnnn { * } { #2 } { #3 } { #4 } } - { \chemmacros_nmr:nnnn { } { #2 } { #3 } { #4 } } - } - -\AtBeginDocument - { - % \NMR{<num>,<elem>}(<num>,<unit>)[<solvent>] ALL arguments are optional - % \NMR* same but without ": $\delta$" at end - \cs_new_protected:Npn \chemmacros_nmr:nnnn #1#2#3#4 - { - \bool_if:NT \l__chemmacros_nmr_list_bool { \item \scan_stop: } - \group_begin: - \chemmacros_leave_vmode: - \bool_set_false:N \l__chemmacros_nmr_frequency_bool - \bool_set_false:N \l__chemmacros_nmr_solvent_bool - \tl_if_empty:nF { #3 } - { \bool_set_true:N \l__chemmacros_nmr_frequency_bool } - \tl_if_empty:nF { #4 } - { \bool_set_true:N \l__chemmacros_nmr_solvent_bool } - \bool_if:nT - { - \l__chemmacros_nmr_frequency_bool - || - \l__chemmacros_nmr_solvent_bool - } - { \bool_set_true:N \l__chemmacros_nmr_delimiters_bool } - \bool_if:nT - { - \l__chemmacros_nmr_frequency_bool - && - \l__chemmacros_nmr_solvent_bool - } - { \bool_set_true:N \l__chemmacros_nmr_comma_bool } - \tl_if_empty:nTF { #2 } - { - \__chemmacros_nmr_nucleus:VV - \l__chemmacros_nmr_isotope_default_tl - \l__chemmacros_nmr_element_default_tl - } - { \__chemmacros_nmr_nucleus:w #2 \q_stop } - \mode_if_math:TF - { - \text - { - \group_begin: - \tl_use:N \l__chemmacros_nmr_format_tl - \__chemmacros_nmr_base:VV - \g__chemmacros_nmr_isotope_tl - \g__chemmacros_nmr_element_tl - \bool_if:NT \l__chemmacros_nmr_delimiters_bool - { ~ ( } - \bool_if:NT \l__chemmacros_nmr_frequency_bool - { \__chemmacros_nmr_frequency:n { #3 } } - \bool_if:NT \l__chemmacros_nmr_comma_bool - { , ~ } - \bool_if:NT \l__chemmacros_nmr_solvent_bool - { \chemmacros_atom:n { #4 } } - \bool_if:NT \l__chemmacros_nmr_delimiters_bool - { ) } - \tl_if_blank:nT { #1 } { : ~ } - \group_end: - } - \tl_if_blank:nT { #1 } - { - \delta - \text { \l__chemmacros_nmr_delta_tl } - \bool_if:NT \l__chemmacros_nmr_use_equal_bool { = } - } - } - { - \group_begin: - \tl_use:N \l__chemmacros_nmr_format_tl - \__chemmacros_nmr_base:VV - \g__chemmacros_nmr_isotope_tl - \g__chemmacros_nmr_element_tl - \bool_if:NT \l__chemmacros_nmr_delimiters_bool - { ~ ( } - \bool_if:NT \l__chemmacros_nmr_frequency_bool - { \__chemmacros_nmr_frequency:n { #3 } } - \bool_if:NT \l__chemmacros_nmr_comma_bool - { , ~ } - \bool_if:NT \l__chemmacros_nmr_solvent_bool - { - \bool_if:NTF \l__chemmacros_nmr_parse_bool - { \chemformula_ch:nn { } { #4 } } - { #4 } - } - \bool_if:NT \l__chemmacros_nmr_delimiters_bool - { ) } - \tl_if_blank:nT { #1 } { : } - \group_end: - \tl_if_blank:nT { #1 } - { - \tl_use:N \c_space_tl - \c_math_toggle_token - \delta - \c_math_toggle_token - \l__chemmacros_nmr_delta_tl - \bool_if:NT \l__chemmacros_nmr_use_equal_bool { ~ = } - } - \bool_if:NF \l__chemmacros_nmr_comma_bool - { \tl_if_blank:nT { #1 } { \chemmacros_xspace: } } - } - \group_end: - } - } - -\NewDocumentCommand \chemmacros_data:w { smo } - { - \bool_if:NT \l__chemmacros_nmr_list_bool { \item } - { - \tl_use:N \l__chemmacros_nmr_format_tl #2 - \IfNoValueF { #3 } { ~ ( #3 ) } - \IfBooleanT { #1 } { \bool_if:NT \l__chemmacros_nmr_use_equal_bool { : } } - } - \IfBooleanF { #1 } { \bool_if:NT \l__chemmacros_nmr_use_equal_bool { ~ = } } - } - -\cs_new_protected:Npn \chemmacros_val:n #1 - { - \tl_if_in:nnTF { #1 } { -- } - { \chemmacros_val_aux:w #1 \q_nil } - { \num { #1 } } - } - -\cs_new_protected:Npn \chemmacros_val_aux:w #1--#2 \q_nil - { \numrange { #1 } { #2 } } - -\NewDocumentEnvironment { experimental } { o } - { - \group_begin: - \IfNoValueF { #1 } { \keys_set:nn { chemmacros / nmr } { #1 } } - \bool_set_true:N \l__chemmacros_nmr_inner_bool - \cs_set_eq:NN \# \chemmacros_nmr_number:n - \cs_set_eq:NN \pos \chemmacros_nmr_position:n - \cs_set_eq:NN \J \chemmacros_nmr_coupling:w - \cs_set_eq:NN \data \chemmacros_data:w - \cs_set_eq:NN \val \chemmacros_val:n - \bool_if:NT \l__chemmacros_nmr_list_bool - { \list {} { \l__chemmacros_nmr_list_setup_tl } } - } - { - \bool_if:NT \l__chemmacros_nmr_list_bool - { \endlist } - \group_end: - \chemmacros_ignore_spaces: - } - -\cs_new_protected:Npn \chemmacros_nmr_number:n #1 - { - \__chemmacros_nmr_number:n { #1 } \, - \chemmacros_atom:V \g__chemmacros_nmr_element_tl - } - -\cs_new_protected:Npn \chemmacros_nmr_position:n #1 - { - \chemmacros_chemformula:x - { - \exp_not:V \g__chemmacros_nmr_element_tl - \bool_if:NF \l__chemmacros_nmr_position_side_bool - { - \exp_not:V \l__chemmacros_nmr_position_tl - \exp_not:n { {#1} } - } - } - \bool_if:NT \l__chemmacros_nmr_position_side_bool - { - \tl_use:N \l__chemmacros_nmr_position_tl - \__chemmacros_nmr_position:n { #1 } - } - } - -\cs_new_protected:Npn \chemmacros_nmr_coupling:w - { - \tl_clear:N \l__chemmacros_nmr_coupling_nuclei_tl - \tl_clear:N \l__chemmacros_nmr_coupling_bonds_tl - \peek_meaning:NTF ( - { \__chemmacros_nmr_coupling:w } - { \__chemmacros_nmr_coupling_aux_i:w } - } - -\cs_new_protected:Npn \__chemmacros_nmr_coupling:w (#1;#2) - { - \tl_set:Nn \l__chemmacros_nmr_coupling_bonds_tl - { - \l__chemmacros_nmr_coupling_bonds_pre_tl - #1 - \l__chemmacros_nmr_coupling_bonds_post_tl - } - \bool_if:NTF \l__chemmacros_nmr_coupling_nuclei_sub_bool - { - \tl_set:Nn \l__chemmacros_nmr_coupling_nuclei_tl - { - \c_math_subscript_token - { \chemmacros_chemformula:n {#2} } - } - } - { - \tl_set:Nn \l__chemmacros_nmr_coupling_nuclei_tl - { - \l__chemmacros_nmr_coupling_nuclei_pre_tl - \chemmacros_chemformula:n {#2} - \l__chemmacros_nmr_coupling_nuclei_post_tl - } - } - \__chemmacros_nmr_coupling_aux_i:w - } - -\cs_new_protected:Npn \__chemmacros_nmr_coupling_aux_i:w - { - \peek_meaning:NTF [ - { \__chemmacros_nmr_coupling_aux_ii:w } - { \__chemmacros_nmr_coupling_aux_iii:n } - } - -\cs_new_protected:Npn \__chemmacros_nmr_coupling_aux_ii:w [#1]#2 - { - \group_begin: - \sisetup - { - list-final-separator={,~}, - list-pair-separator={,~}, - list-units=single - } - \c_math_toggle_token - ^{ \l__chemmacros_nmr_coupling_bonds_tl } - \l__chemmacros_nmr_coupling_symbol_tl - \l__chemmacros_nmr_coupling_nuclei_tl = \SIlist{#2}{#1} - \c_math_toggle_token - \group_end: - } - -\cs_new_protected:Npn \__chemmacros_nmr_coupling_aux_iii:n #1 - { - \group_begin: - \sisetup - { - list-final-separator={,~}, - list-pair-separator={,~}, - list-units=single - } - \c_math_toggle_token - ^{ \l__chemmacros_nmr_coupling_bonds_tl } - \l__chemmacros_nmr_coupling_symbol_tl - \l__chemmacros_nmr_coupling_nuclei_tl - = \exp_args:Nno \SIlist { #1 } { \l__chemmacros_nmr_coupling_unit_tl } - \c_math_toggle_token - \group_end: - } - -% -------------------------------------------------------------------------- -% deprecated mhName: -\keys_define:nn { chemmacros } - { mhName .code:n = \chemmacros_option_deprecated:n { mhName } } - -% --------------------------------------------------------------------------- % -% - phases -\bool_new:N \l__chemmacros_phases_sub_bool -\dim_new:N \l__chemmacros_phases_space_dim -\dim_set:Nn \l__chemmacros_phases_space_dim { .1333 em } -\prop_new:N \l__chemmacros_phases_prop -\prop_new:N \l__chemmacros_phases_german_prop - -\keys_define:nn { chemmacros / phases } - { - pos .choice: , - pos / sub .code:n = \bool_set_true:N \l__chemmacros_phases_sub_bool , - pos / side .code:n = \bool_set_false:N \l__chemmacros_phases_sub_bool , - space .dim_set:N = \l__chemmacros_phases_space_dim - } - -\cs_new_protected:Npn \chemmacros_new_phase:Nn #1#2 - { - \tl_set:Nx \l__chemmacros_tmpa_tl - { \chemmacros_remove_backslash:N #1 } - \cs_if_free:NF #1 - { \msg_error:nnn {chemmacros} {new-phase} {#1} } - \exp_args:Nx \@trnslt@declare@translation - { phase-\l__chemmacros_tmpa_tl } {fallback} {#2} - \__chemmacros_define_phase:Nx #1 - { - \exp_not:N \chemmacros_translate:n - { phase-\l__chemmacros_tmpa_tl } - } - } - -\cs_new_protected:Npn \chemmacros_define_phase:Nn #1#2 - { - \tl_set:Nx \l__chemmacros_tmpa_tl - { \chemmacros_remove_backslash:N #1 } - \exp_args:Nx \@trnslt@declare@translation - { phase-\l__chemmacros_tmpa_tl } {fallback} {#2} - \__chemmacros_define_phase:Nx #1 - { - \exp_not:N \chemmacros_translate:n - { phase-\l__chemmacros_tmpa_tl } - } - } - -\cs_new_protected:Npn \chemmacros_renew_phase:Nn #1#2 - { - \tl_set:Nx \l__chemmacros_tmpa_tl - { \chemmacros_remove_backslash:N #1 } - \cs_if_exist:NF #1 - { \msg_error:nnn {chemmacros} {renew-phase} {#1} } - \exp_args:Nx \@trnslt@declare@translation - { phase-\l__chemmacros_tmpa_tl } {fallback} {#2} - \__chemmacros_define_phase:Nx #1 - { - \exp_not:N \chemmacros_translate:n - { phase-\l__chemmacros_tmpa_tl } - } - } - -\NewDocumentCommand \NewChemPhase { mom } - { \chemmacros_new_phase:Nn #1 {#3} } - -\NewDocumentCommand \DeclareChemPhase { mom } - { \chemmacros_define_phase:Nn #1 {#3} } - -\NewDocumentCommand \RenewChemPhase { mom } - { \chemmacros_renew_phase:Nn #1 {#3} } - -\cs_new_protected:Npn \__chemmacros_define_phase:Nn #1#2 - { - \cs_if_exist:NF #1 { \cs_new:Npn #1 {} } - \DeclareDocumentCommand #1 { o } - { - \bool_if:NTF \l__chemmacros_phases_sub_bool - { - \bool_if:NTF \l_chemformula_inside_ch_bool - { \chemformula_subscript:n { ( #2 \IfNoValueF {##1} {,~##1} ) } } - { - \ensuremath - { - \c_math_subscript_token - { \text { ( #2 \IfNoValueF {##1} {,~##1} ) } } - } - } - } - { - \ensuremath - { - \skip_horizontal:N \l__chemmacros_phases_space_dim - \text { ( #2 \IfNoValueF {##1} {,~##1} ) } - } - } - } - } -\cs_generate_variant:Nn \__chemmacros_define_phase:Nn { Nx } - -\NewChemPhase \sld {s} -\NewChemPhase \lqd {l} -\NewChemPhase \gas {g} -\NewChemPhase \aq {aq} - -\cs_new_protected:Npn \chemmacros_phase:n #1 - { - \bool_if:NTF \l__chemmacros_phases_sub_bool - { \ensuremath { \c_math_subscript_token { \text { (#1) } } } } - { - \ensuremath - { - \skip_horizontal:N \l__chemmacros_phases_space_dim - \text { (#1) } - } - } - } - -\NewDocumentCommand \phase { m } - { \chemmacros_phase:n {#1} } - -% -------------------------------------------------------------------------- -% reaction environments -\cs_new_protected:Npn \__chemmacros_record_for_lor:nnnnn #1#2#3#4#5 - { - \tl_if_eq:nnT { #1 } { reaction } - { - \group_begin: - % we need to prevent \Hy@make@anchor from being written to the lor - % file: - \bool_if:NT \l__chemmacros_hyperref_bool - { \cs_set:Npn \Hy@make@anchor {} } - \addcontentsline { lor } { reaction } - { - \tl_use:N \l__chemmacros_reaction_lorname_tl - \tl_use:N \c_space_tl - #2 #3 #4 #5 - \tl_use:N \g__chemmacros_reaction_description_tl - } - \tl_gclear:N \g__chemmacros_reaction_description_tl - \group_end: - } - } - -% redefine mathtools' command \MT_define_tagform:nwnn to ensure we add an -% entry to the list of reactions even if the user redefines the reaction tag -% this should probably be done via patching... -\AfterPackage* { mathtools } - { - \cs_set_protected:Npn \MT_define_tagform:nwnn #1[#2]#3#4 - { - \@namedef{MT_tagform_#1:n}##1 - { - % this is the original part: - \maketag@@@{#3\ignorespaces#2{##1}\unskip\@@italiccorr#4} - % this is added => this disturbs hyperref: - \__chemmacros_record_for_lor:nnnnn - { #1 } { #3 } { #2 } { ##1 } { #4 } - } - } - } - -\tl_new:N \g__chemmacros_reaction_description_tl - -\cs_new_protected:Npn \chemmacros_add_reaction_description:n #1 - { - \tl_if_blank:nF { #1 } - { \tl_gset:Nn \g__chemmacros_reaction_description_tl { : ~ #1 } } - } - -\NewDocumentCommand \AddRxnDesc { m } - { \chemmacros_add_reaction_description:n { #1 } } - -% define \listofreactions -\tl_new:N \l__chemmacros_reaction_lorname_tl -\tl_new:N \reactionlistname -\tl_new:N \l__chemmacros_reaction_heading_tl - -\cs_new:Npn \__chemmacros_reaction_heading:n #1 - { \l__chemmacros_reaction_heading_tl { #1 } } -\cs_generate_variant:Nn \__chemmacros_reaction_heading:n { V } - -\cs_new_protected:Npn \listofreactions - { - \__chemmacros_reaction_heading:V \reactionlistname - \@starttoc { lor } - } - -\cs_new_protected:Npn \l@reaction #1#2 - { \@dottedtocline { 1 } { 1.5em } { 2.3em } { #1 } { #2 } } - -% create tagform -\newtagform { reaction } { \{ } { \} } -\newcounter { chemmacros_save_reaction } -\newcounter { reaction } - -% switch to reaction tags -\cs_new_protected:Npn \__chemmacros_begin_reaction: - { - % create individual names for `hyperref': - \bool_if:NT \l__chemmacros_hyperref_bool - { - \cs_set:Npn \theHequation - { R . \theHsection . \arabic { reaction } } - } - % enable labelformat `reaction': - \bool_if:NT \l__chemmacros_varioref_bool - { \cs_set_eq:NN \p@equation \p@reaction } - \setcounter { chemmacros_save_reaction } { \value { equation } } - \setcounter { equation } { \value { reaction } } - \usetagform { reaction } - } - -% switch back to equation tags -\cs_new_protected:Npn \__chemmacros_end_reaction: - { - \setcounter { reaction } { \value { equation } } - \setcounter { equation } { \value { chemmacros_save_reaction } } - } - -% --------------------------------------------------------------------------- % -\bool_new:N \l__chemmacros_reactions_star_bool -\bool_new:N \l__chemmacros_reactions_args_bool - -\keys_define:nn { chemmacros / reaction } - { - star .bool_set:N = \l__chemmacros_reactions_star_bool , - star .default:n = true , - arg .bool_set:N = \l__chemmacros_reactions_args_bool , - arg .default:n = true , - list-name .tl_set:N = \reactionlistname , - list-entry .code:n = - \tl_set:Nn \l__chemmacros_reaction_lorname_tl { #1 } , - list-heading .tl_set:N = \l__chemmacros_reaction_heading_tl - } - -% \DeclareChemReaction[<keyval>]{<name>}{<type>} -\cs_new_protected:Npn \__chemmacros_define_reaction:Nnnn #1#2#3#4 - { - \bool_set_false:N \l__chemmacros_reactions_star_bool - \bool_set_false:N \l__chemmacros_reactions_args_bool - \keys_set:nn { chemmacros / reaction } { #2 } - \bool_if:NTF \l__chemmacros_reactions_args_bool - { - #1 { #3 } [ 2 ] [] - { - \__chemmacros_begin_reaction: - \AddRxnDesc { ##1 } - \begin { #4 } { ##2 } - \chemmacros_equation_chemformula:V \BODY - \end{ #4 } - \__chemmacros_end_reaction: - } - \bool_if:NT \l__chemmacros_reactions_star_bool - { - #1 { #3* } [ 1 ] - { - \begin { #4* } { ##1 } - \chemmacros_equation_chemformula:V \BODY - \end { #4* } - } - } - } - { - #1 { #3 } [ 1 ] [] - { - \__chemmacros_begin_reaction: - \AddRxnDesc { ##1 } - \begin { #4 } - \chemmacros_equation_chemformula:V \BODY - \end { #4 } - \__chemmacros_end_reaction: - } - \bool_if:NT \l__chemmacros_reactions_star_bool - { - #1 { #3* } - { - \begin { #4* } - \chemmacros_equation_chemformula:V \BODY - \end { #4* } - } - } - } - \ignorespaces - } - -\cs_new_protected:Npn \chemmacros_define_reaction:nnn #1#2#3 - { - \cs_if_exist:cTF { #2 } - { \__chemmacros_define_reaction:Nnnn \RenewEnviron { #1 } { #2 } { #3 } } - { \__chemmacros_define_reaction:Nnnn \NewEnviron { #1 } { #2 } { #3 } } - } - -\cs_new_protected:Npn \chemmacros_new_reaction:nnn #1#2#3 - { - \cs_if_exist:cTF { #2 } - { \msg_error:nnx { chemmacros } { already-defined } { #2 } } - { \__chemmacros_define_reaction:Nnnn \NewEnviron { #1 } { #2 } { #3 } } - } - -\cs_new_protected:Npn \chemmacros_renew_reaction:nnn #1#2#3 - { - \cs_if_exist:cTF { #2 } - { \__chemmacros_define_reaction:Nnnn \RenewEnviron { #1 } { #2 } { #3 } } - { \msg_error:nnx { chemmacros } { not-defined } { #2 } } - } - -\NewDocumentCommand \NewChemReaction { O{} m m } - { \chemmacros_new_reaction:nnn { #1 } { #2 } { #3 } } -\NewDocumentCommand \RenewChemReaction { O{} m m } - { \chemmacros_renew_reaction:nnn { #1 } { #2 } { #3 } } -\NewDocumentCommand \DeclareChemReaction { O{} m m } - { \chemmacros_declare_reaction:nnn { #1 } { #2 } { #3 } } -\DeclareChemDeprecated \newreaction \NewChemReaction - -\cs_new_protected:Npn \chemmacros_equation_chemformula:n #1 - { \chemformula_ch:nn { } { #1 } } -\cs_generate_variant:Nn \chemmacros_equation_chemformula:n { V } - -% predefined: -\NewChemReaction [ star ] { reaction } { equation } -\NewChemReaction [ star ] { reactions } { align } - -% -------------------------------------------------------------------------- -% thermodynamics et.al. -% \standardstate as defined by the chemstyle package. Thanks to Joseph Wright -% the `chemstyle' provides it with \providecommand so it doesn't matter which -% package defines it first -\ProvideDocumentCommand \standardstate {} - { { \ensuremath { \chemmacros_standardstate: } } } - -\cs_new_protected:Npn \chemmacros_standardstate: - { \mathpalette \chemmacros_standardstate_aux: \circ } - -\cs_new_protected:Npn \chemmacros_standardstate_aux: #1#2 - { - \ooalign - { - \tex_hfil:D - \c_math_toggle_token #1- \c_math_toggle_token - \tex_hfil:D - \tex_cr:D - \tex_hfil:D - \c_math_toggle_token #1#2 \c_math_toggle_token - \tex_hfil:D - \tex_cr:D - } - } - -\cs_new_protected:Npn \changestate - { \mathop{} \! \chemDelta } - -% -------------------------------------------------------------------------- -% \State -\tl_new:N \l__chemmacros_State_delta_tl -\tl_set:Nn \l__chemmacros_State_delta_tl { \changestate } -\tl_new:N \l__chemmacros_State_exponent_tl -\tl_set:Nn \l__chemmacros_State_exponent_tl { \standardstate } - -\bool_new:N \l__chemmacros_State_delta_bool -\bool_set_true:N \l__chemmacros_State_delta_bool -\bool_new:N \l__chemmacros_State_subscript_left_bool -\bool_set_true:N \l__chemmacros_State_subscript_left_bool -\bool_new:N \l__chemmacros_State_exponent_bool -\bool_set_true:N \l__chemmacros_State_exponent_bool - -\keys_define:nn { chemmacros / state } - { - delta .code:n = - { - \exp_args:Nf \tl_if_eq:nnTF { #1 } { false } - { \bool_set_false:N \l__chemmacros_State_delta_bool } - { - \bool_set_true:N \l__chemmacros_State_delta_bool - \tl_set:Nn \l__chemmacros_State_delta_tl { #1 } - } - } , - subscript-left .bool_set:N = \l__chemmacros_State_subscript_left_bool , - subscript-left .default:n = true , - exponent .code:n = - { - \exp_args:Nf \tl_if_eq:nnTF { #1 } { false } - { \bool_set_false:N \l__chemmacros_State_exponent_bool } - { - \bool_set_true:N \l__chemmacros_State_exponent_bool - \tl_set:Nn \l__chemmacros_State_exponent_tl { #1 } - } - } , - exponent .default:n = \standardstate - } - -% old syntax (v1.1): -% \State[<exp>,<Delta>,<subscript pos>]{<Symbol>}{<subscript>} -% old syntax (v2.0): -% \State[<keyval>]{<Symbol>}{<subscript>} -% {<subscript>} is an optional argument! -\cs_new_protected:Npn \chemmacros_state:nnn #1#2#3 - { - \group_begin: - \keys_set:nn { chemmacros / state } { #1 } - \ensuremath - { - \bool_if:NT \l__chemmacros_State_delta_bool - { \tl_use:N \l__chemmacros_State_delta_tl } - \bool_if:NT \l__chemmacros_State_subscript_left_bool - { \c_math_subscript_token { \text { #3 } } } - #2 - \bool_if:NF \l__chemmacros_State_subscript_left_bool - { \c_math_subscript_token { \text { #3 } } } - \bool_if:NT \l__chemmacros_State_exponent_bool - { ^ { \tl_use:N \l__chemmacros_State_exponent_tl } } - } - \group_end: - } -\cs_generate_variant:Nn \chemmacros_state:nnn { xnV } - -\NewDocumentCommand \State { s O{} m G{} } - { - \group_begin: - \IfBooleanT { #1 } - { - \keys_set:nn { chemmacros / state } - { subscript-left = false , exponent = } - } - \chemmacros_state:nnn { #2 } { #3 } { #4 } - \group_end: - } - -% -------------------------------------------------------------------------- -\tl_new:N \l__chemmacros_thermod_subscript_left_tl -\tl_new:N \l__chemmacros_thermod_subscript_left_default_tl -\tl_new:N \l__chemmacros_thermod_subscript_tl -\tl_new:N \l__chemmacros_thermod_subscript_default_tl -\tl_new:N \l__chemmacros_thermod_unit_tl -\tl_new:N \l__chemmacros_thermod_exponent_tl -\tl_new:N \l__chemmacros_thermod_exponent_default_tl -\tl_set:Nn \l__chemmacros_thermod_exponent_default_tl { \standardstate } -\tl_new:N \l__chemmacros_thermod_delta_tl -\tl_new:N \l__chemmacros_thermod_delta_default_tl -\tl_set:Nn \l__chemmacros_thermod_delta_default_tl { \changestate } - -\bool_new:N \l__chemmacros_renewstate_bool -\bool_new:N \l__chemmacros_state_overwrite_error_bool - -\keys_define:nn { chemmacros } - { - State / subscript .choice: , - State / subscript / left .code:n = - { \tl_set:Nn \l__chemmacros_thermod_subscript_left_tl { true } } , - State / subscript / right .code:n = - { \tl_set:Nn \l__chemmacros_thermod_subscript_left_tl { false } } , - State / exponent .tl_set:N = - \l__chemmacros_thermod_exponent_tl , - State / delta .tl_set:N = - \l__chemmacros_thermod_delta_tl , - State / unit .tl_set:N = - \l__chemmacros_thermod_unit_tl , - setnewstate / subscript-left .tl_set:N = - \l__chemmacros_thermod_subscript_left_default_tl , - setnewstate / subscript .tl_set:N = - \l__chemmacros_thermod_subscript_default_tl , - setnewstate / exponent .tl_set:N = - \l__chemmacros_thermod_exponent_default_tl , - setnewstate / delta .tl_set:N = - \l__chemmacros_thermod_delta_default_tl - } - -% \NewChemState{<name>}[<keyval>]{<symbol>}{<unit>} -\NewDocumentCommand \NewChemState { omO{}mm } - { - \bool_set_false:N \l__chemmacros_renewstate_bool - \bool_set_true:N \l__chemmacros_state_overwrite_error_bool - \__chemmacros_setnewstate_reset: - \IfNoValueTF { #1 } - { \chemmacros_define_state:nnnn { #3 } { #2 } { #4 } { #5 } } - { - \msg_warning:nn { chemmacros } { state-syntax } - \chemmacros_define_state:nnnn { #1#3 } { #2 } { #4 } { #5 } - } - } -% \DeclareChemState{<name>}[<keyval>]{<symbol>}{<unit>} -\NewDocumentCommand \DeclareChemState { omO{}mm } - { - \bool_set_false:N \l__chemmacros_renewstate_bool - \bool_set_false:N \l__chemmacros_state_overwrite_error_bool - \__chemmacros_setnewstate_reset: - \IfNoValueTF { #1 } - { \chemmacros_define_state:nnnn { #3 } { #2 } { #4 } { #5 } } - { - \msg_warning:nn { chemmacros } { state-syntax } - \chemmacros_define_state:nnnn { #1#3 } { #2 } { #4 } { #5 } - } - } -% \RenewChemState{<name>}[<keyval>]{<symbol>}{<unit>} -\NewDocumentCommand \RenewChemState { omO{}mm } - { - \bool_set_true:N \l__chemmacros_renewstate_bool - \bool_set_true:N \l__chemmacros_state_overwrite_error_bool - \__chemmacros_setnewstate_reset: - \IfNoValueTF { #1 } - { \chemmacros_define_state:nnnn { #3 } { #2 } { #4 } { #5 } } - { - \msg_warning:nn { chemmacros } { state-syntax } - \chemmacros_define_state:nnnn { #1#3 } { #2 } { #4 } { #5 } - } - } -% TODO -\cs_set_protected:Npn \setnewstate - { - \msg_warning:nnnn { chemmacros } { command-deprecated } - { \setnewstate } { \NewChemState } - \NewChemState - } -\cs_set_protected:Npn \renewstate - { - \msg_warning:nnnn { chemmacros } { command-deprecated } - { \renewstate } { \RenewChemState } - \RenewChemState - } - -\cs_new_protected:Npn \__chemmacros_setnewstate_reset: - { - \tl_set:Nn \l__chemmacros_thermod_subscript_left_default_tl { true } - \tl_clear:N \l__chemmacros_thermod_subscript_default_tl - \tl_set:Nn \l__chemmacros_thermod_exponent_default_tl { \standardstate } - \tl_set:Nn \l__chemmacros_thermod_delta_default_tl { \changestate } - } - -\cs_new_protected:Npn \chemmacros_define_state:nnnn #1#2#3#4 - { - \keys_set:nn { chemmacros / setnewstate } { #1 } - \chemmacros_if_is_cs:nTF { #2 } - { \__chemmacros_set_state:xnn { \cs_to_str:N #2 } { #3 } { #4 } } - { - \msg_warning:nn { chemmacros } { state-syntax } - \__chemmacros_set_state:nnn { #2 } { #3 } { #4 } - } - } - -\cs_new_protected:Npn \__chemmacros_set_state:nnn #1#2#3 - { - \bool_if:NT \l__chemmacros_state_overwrite_error_bool - { - \bool_if:NTF \l__chemmacros_renewstate_bool - { - \cs_if_exist:cF { #1 } - { \msg_error:nnx { chemmacros } { nenew-state } { #1 } } - } - { - \cs_if_exist:cT { #1 } - { \msg_error:nnx { chemmacros } { new-state } { #1 } } - } - } - \cs_undefine:c { chemmacros_ #1 _reset: } - \cs_undefine:c { c__chemmacros_ #1 _subscript_tl } - \cs_undefine:c { c__chemmacros_ #1 _exponent_tl } - \cs_undefine:c { c__chemmacros_ #1 _delta_tl } - \cs_undefine:c { c__chemmacros_ #1 _left_tl } - \cs_undefine:c { c__chemmacros_ #1 _unit_tl } - \cs_undefine:c { #1 } - \cs_undefine:c { #1 _aux_i:n } - \cs_undefine:c { #1 _aux_ii:n } - \cs_undefine:c { #1 _aux_iii:n } - \group_begin: - \tl_const:cV - { c__chemmacros_ #1 _subscript_tl } - \l__chemmacros_thermod_subscript_default_tl - \tl_const:cV - { c__chemmacros_ #1 _exponent_tl } - \l__chemmacros_thermod_exponent_default_tl - \tl_const:cV - { c__chemmacros_ #1 _delta_tl } - \l__chemmacros_thermod_delta_default_tl - \tl_const:cV - { c__chemmacros_ #1 _left_tl } - \l__chemmacros_thermod_subscript_left_default_tl - \tl_const:cn - { c__chemmacros_ #1 _unit_tl } - { #3 } - \cs_new_protected:cpn {chemmacros_ #1 _reset: } - { - \tl_set_eq:Nc - \l__chemmacros_thermod_subscript_tl - { c__chemmacros_ #1 _subscript_tl } - \tl_set_eq:Nc - \l__chemmacros_thermod_exponent_tl - { c__chemmacros_ #1 _exponent_tl } - \tl_set_eq:Nc - \l__chemmacros_thermod_delta_tl - { c__chemmacros_ #1 _delta_tl } - \tl_set_eq:Nc - \l__chemmacros_thermod_subscript_left_tl - { c__chemmacros_ #1 _left_tl } - \tl_set_eq:Nc - \l__chemmacros_thermod_unit_tl - { c__chemmacros_ #1 _unit_tl } - } - \cs_new_protected:cpn { #1 } - { - \use:c {chemmacros_ #1 _reset: } - \peek_meaning:NTF [ - { \tl_use:c { #1 _aux_i:n } } - { - \peek_meaning:NTF ( - { \tl_use:c { #1 _aux_ii:n } } - { \tl_use:c { #1 _aux_iii:n } } - } - } - \cs_new_protected:cpn { #1 _aux_i:n } [##1] - { - \keys_set:nn { chemmacros / State } { ##1 } - \peek_meaning:NTF ( - { \tl_use:c { #1 _aux_ii:n } } - { \tl_use:c { #1 _aux_iii:n } } - } - \cs_new_protected:cpn { #1 _aux_ii:n } (##1) - { - \tl_set:Nn \l__chemmacros_thermod_subscript_tl { ##1 } - \tl_use:c { #1 _aux_iii:n } - } - \cs_new_protected:cpn { #1 _aux_iii:n } ##1 - { - \ensuremath - { - \tl_if_eq:VnTF - \l__chemmacros_thermod_subscript_left_tl { true } - { - \chemmacros_state:xnV - { - subscript-left = true , - exponent = - { \exp_not:V \l__chemmacros_thermod_exponent_tl } , - delta = - { \exp_not:V \l__chemmacros_thermod_delta_tl } - } - { #2 } - } - { - \chemmacros_state:xnV - { - subscript-left = false , - exponent = - { \exp_not:V \l__chemmacros_thermod_exponent_tl } , - delta = - { \exp_not:V \l__chemmacros_thermod_delta_tl } - } - { #2 } - } - \l__chemmacros_thermod_subscript_tl - = - \exp_args:NnV \SI { ##1 } \l__chemmacros_thermod_unit_tl - } - } - \group_end: - \ignorespaces - } -\cs_generate_variant:Nn \__chemmacros_set_state:nnn { x } - -% predefined: -\NewChemState \Enthalpy {H} {\kilo\joule\per\mole} -\NewChemState \Entropy [ delta=false, subscript-left=false ] - {S} {\joule\per\kelvin\per\mole} -\NewChemState \Gibbs {G} {\kilo\joule\per\mole} - -% -------------------------------------------------------------------------- -% Newman projections -\fp_new:N \l__chemmacros_newman_rel_angle_fp -\fp_zero:N \l__chemmacros_newman_rel_angle_fp -\fp_new:N \l__chemmacros_newman_tmp_angle_fp -\fp_new:N \l__chemmacros_newman_abs_angle_fp -\fp_zero:N \l__chemmacros_newman_abs_angle_fp -\fp_new:N \l__chemmacros_newman_scale_fp -\fp_set:Nn \l__chemmacros_newman_scale_fp { 1 } -\fp_new:N \l__chemmacros_newman_x_fp -\fp_new:N \l__chemmacros_newman_y_fp - -\tl_new:N \l__chemmacros_newman_tikz_ring_tl -\tl_new:N \l__chemmacros_newman_tikz_front_tl -\tl_new:N \l__chemmacros_newman_tikz_back_tl - -\bool_new:N \l__chemmacros_newman_tikz_back_bool - -\keys_define:nn { chemmacros / newman } - { - ring .tl_set:N = \l__chemmacros_newman_tikz_ring_tl , - atoms .tl_set:N = \l__chemmacros_newman_tikz_front_tl , - back-atoms .code:n = - { - \bool_set_true:N \l__chemmacros_newman_tikz_back_bool - \tl_set:Nn \l__chemmacros_newman_tikz_back_tl { #1 } - } , - scale .fp_set:N = \l__chemmacros_newman_scale_fp , - scale .default:n = 1 , - angle .fp_set:N = \l__chemmacros_newman_abs_angle_fp , - angle .default:n = 0 - } - -% \newman[<keyval>](<angle>){<1>,<2>,<3>,<4>,<5>,<6>} -\NewDocumentCommand \newman { o d() > { \SplitArgument { 5 } { , } } m } - { - \group_begin: - \IfNoValueF { #1 } { \keys_set:nn { chemmacros / newman } { #1 } } - \IfNoValueTF { #2 } - { \chemmacros_newman_atoms:nnnnnnn { } #3 } - { \chemmacros_newman_atoms:nnnnnnn { #2 } #3 } - \group_end: - } - -% place atoms: -% #1: angle -% #2 - #7: atoms -\cs_new_protected:Npn \chemmacros_newman_atoms:nnnnnnn #1#2#3#4#5#6#7 - { - \tl_if_blank:nTF { #1 } - { - \fp_set_eq:NN - \l__chemmacros_newman_rel_angle_fp - \l__chemmacros_newman_abs_angle_fp - } - { \fp_set:Nn \l__chemmacros_newman_rel_angle_fp { #1 } } - \chemmacros_tikz_picture:xn - { - scale = \fp_to_tl:N \l__chemmacros_newman_scale_fp , - chemmacros_newman_atom_front / .style = - { - inner~sep=0pt, - outer~sep=0pt, - \tl_use:N \l__chemmacros_newman_tikz_front_tl - }, - chemmacros_newman_atom_back / .style = - { - inner~sep=0pt, - outer~sep=0pt, - \bool_if:NTF \l__chemmacros_newman_tikz_back_bool - { \tl_use:N \l__chemmacros_newman_tikz_back_tl } - { \tl_use:N \l__chemmacros_newman_tikz_front_tl } - } - } - { - \chemmacros_tikz_draw:f - { \tl_use:N \l__chemmacros_newman_tikz_ring_tl } - (0pt,0pt) circle (\fp_to_dim:N \l__chemmacros_newman_scale_fp * 15) ; - \chemmacros_newman_back_node:nn - { 30 } - { \IfNoValueF { #6 } { #6 } } - \chemmacros_newman_back_node:nf - { 150 } - { \IfNoValueF { #7 } { #7 } } - \chemmacros_newman_back_node:nf - { 270 } - { \IfNoValueF { #5 } { #5 } } - \chemmacros_newman_front_node:nf - { 90 } - { \IfNoValueF { #2 } { #2 } } - \chemmacros_newman_front_node:nf - { 210 } - { \IfNoValueF { #3 } { #3 } } - \chemmacros_newman_front_node:nf - { 330 } - { \IfNoValueF { #4 } { #4 } } - } - } - -% provide cartesian coordiantes from polar coordinates -% #1: fp variable for x -% #2: fp variable for y -% #3: angle -% #4: radius -\cs_new_protected:Npn \chemmacros_polar_to_cartesian:NNnn #1#2#3#4 - { - \fp_set:Nn #1 { #4 * cos( #3 / 180 * pi ) }% x - \fp_set:Nn #2 { #4 * sin( #3 / 180 * pi ) }% y - } - -% place back nodes -\cs_new_protected:Npn \chemmacros_newman_back_node:nn #1#2 - { - \group_begin: - \fp_add:Nn \l__chemmacros_newman_rel_angle_fp { #1 } - \chemmacros_polar_to_cartesian:NNnn - \l__chemmacros_newman_x_fp - \l__chemmacros_newman_y_fp - { \l__chemmacros_newman_rel_angle_fp } - { \l__chemmacros_newman_scale_fp } - \chemmacros_tikz_draw:f - { \tl_use:N \l__chemmacros_newman_tikz_ring_tl } - ( - 15 * \fp_to_dim:N \l__chemmacros_newman_x_fp , - 15 * \fp_to_dim:N \l__chemmacros_newman_y_fp - ) - -- - ( - 30 * \fp_to_dim:N \l__chemmacros_newman_x_fp , - 30 * \fp_to_dim:N \l__chemmacros_newman_y_fp - ) ; - \chemmacros_polar_to_cartesian:NNnn - \l__chemmacros_newman_x_fp - \l__chemmacros_newman_y_fp - { \l__chemmacros_newman_rel_angle_fp } - { \l__chemmacros_newman_scale_fp } - \chemmacros_tikz_node:f - { - chemmacros_newman_atom_back, - anchor = -180 + \fp_to_int:N \l__chemmacros_newman_rel_angle_fp - } - at - ( - 31 * \fp_to_dim:N \l__chemmacros_newman_x_fp , - 31 * \fp_to_dim:N \l__chemmacros_newman_y_fp - ) - { #2 } ; - \group_end: - } -\cs_generate_variant:Nn \chemmacros_newman_back_node:nn { nf } - -% place front nodes: -\cs_new_protected:Npn \chemmacros_newman_front_node:nn #1#2 - { - \chemmacros_polar_to_cartesian:NNnn - \l__chemmacros_newman_x_fp - \l__chemmacros_newman_y_fp - { #1 } - { \l__chemmacros_newman_scale_fp } - \chemmacros_tikz_draw:f - { \tl_use:N \l__chemmacros_newman_tikz_ring_tl } - (0pt,0pt) -- ++ - ( - 30 * \fp_to_dim:N \l__chemmacros_newman_x_fp , - 30 * \fp_to_dim:N \l__chemmacros_newman_y_fp - ) ; - \chemmacros_polar_to_cartesian:NNnn - \l__chemmacros_newman_x_fp - \l__chemmacros_newman_y_fp - { #1 } - { \l__chemmacros_newman_scale_fp } - \chemmacros_tikz_node:f - { chemmacros_newman_atom_front, anchor = -180 + #1 } - at - ( - 31 * \fp_to_dim:N \l__chemmacros_newman_x_fp , - 31 * \fp_to_dim:N \l__chemmacros_newman_y_fp - ) - { #2 } ; - } -\cs_generate_variant:Nn \chemmacros_newman_front_node:nn { nf } - -% -------------------------------------------------------------------------- -% \orbital[<keyval>]{<type>} -% variables: -\bool_new:N \l__chemmacros_orbital_type_s_bool -\bool_new:N \l__chemmacros_orbital_type_p_bool -\bool_new:N \l__chemmacros_orbital_type_sp_bool -\bool_new:N \l__chemmacros_orbital_type_sptwo_bool -\bool_new:N \l__chemmacros_orbital_type_spthree_bool -\bool_new:N \l__chemmacros_orbital_s_phase_bool -\bool_set_true:N \l__chemmacros_orbital_s_phase_bool -\bool_new:N \l__chemmacros_orbital_p_phase_bool -\bool_set_true:N \l__chemmacros_orbital_p_phase_bool -\bool_new:N \l__chemmacros_orbital_sp_phase_bool -\bool_set_true:N \l__chemmacros_orbital_sp_phase_bool -\bool_new:N \l__chemmacros_orbital_sptwo_phase_bool -\bool_set_true:N \l__chemmacros_orbital_sptwo_phase_bool -\bool_new:N \l__chemmacros_orbital_spthree_phase_bool -\bool_set_true:N \l__chemmacros_orbital_spthree_phase_bool -\bool_new:N \l__chemmacros_orbital_p_half_bool -\bool_new:N \l__chemmacros_orbital_overlay_bool -\bool_new:N \l__chemmacros_orbital_opacity_bool - -\tl_new:N \l__chemmacros_orbital_s_color_tl -\tl_set:Nn \l__chemmacros_orbital_s_color_tl { black } -\tl_new:N \l__chemmacros_orbital_s_phase_color_tl -\tl_new:N \l__chemmacros_orbital_p_color_tl -\tl_set:Nn \l__chemmacros_orbital_p_color_tl { black } -\tl_new:N \l__chemmacros_orbital_p_pphase_color_tl -\tl_new:N \l__chemmacros_orbital_p_mphase_color_tl -\tl_new:N \l__chemmacros_orbital_sp_color_tl -\tl_set:Nn \l__chemmacros_orbital_sp_color_tl { black } -\tl_new:N \l__chemmacros_orbital_sp_pphase_color_tl -\tl_new:N \l__chemmacros_orbital_sp_mphase_color_tl -\tl_new:N \l__chemmacros_orbital_sptwo_color_tl -\tl_set:Nn \l__chemmacros_orbital_sptwo_color_tl { black } -\tl_new:N \l__chemmacros_orbital_sptwo_pphase_color_tl -\tl_new:N \l__chemmacros_orbital_sptwo_mphase_color_tl -\tl_new:N \l__chemmacros_orbital_spthree_color_tl -\tl_set:Nn \l__chemmacros_orbital_spthree_color_tl { black } -\tl_new:N \l__chemmacros_orbital_spthree_pphase_color_tl -\tl_new:N \l__chemmacros_orbital_spthree_mphase_color_tl -\tl_new:N \l__chemmacros_orbital_s_scale_tl -\tl_set:Nn \l__chemmacros_orbital_s_scale_tl { 1 } -\tl_new:N \l__chemmacros_orbital_p_scale_tl -\tl_set:Nn \l__chemmacros_orbital_p_scale_tl { 1 } -\tl_new:N \l__chemmacros_orbital_sp_scale_tl -\tl_set:Nn \l__chemmacros_orbital_sp_scale_tl { 1 } -\tl_new:N \l__chemmacros_orbital_sptwo_scale_tl -\tl_set:Nn \l__chemmacros_orbital_sptwo_scale_tl { 1 } -\tl_new:N \l__chemmacros_orbital_spthree_scale_tl -\tl_set:Nn \l__chemmacros_orbital_spthree_scale_tl { 1 } - -\fp_new:N \l__chemmacros_orbital_angle_fp -\fp_set:Nn \l__chemmacros_orbital_angle_fp { 90 } -\fp_new:N \l__chemmacros_orbital_opacity_fp -\fp_set:Nn \l__chemmacros_orbital_opacity_fp { 0.5 } - -\cs_new:Npn \__chemmacros_orbital_options: - { - \__chemmacros_orbital_overlay: , \__chemmacros_orbital_opacity: , - inner~sep=0 , outer~sep=0 , line~width=.2pt , - rotate = { \fp_use:N \l__chemmacros_orbital_angle_fp - 90 } , - baseline , - minimum~size = 0 - } - -\cs_new:Npn \__chemmacros_orbital_overlay: - { \bool_if:NT \l__chemmacros_orbital_overlay_bool { overlay } } - -\cs_new:Npn \__chemmacros_orbital_opacity: - { - \bool_if:NT \l__chemmacros_orbital_opacity_bool - { opacity = { \fp_use:N \l__chemmacros_orbital_opacity_fp } } - } - -% -------------------------------------------------------------------------- -% s-orbitals -\cs_new_protected:Npn \__chemmacros_orbital_type_s: - { - \bool_set_true:N \l__chemmacros_orbital_type_s_bool - \bool_set_false:N \l__chemmacros_orbital_type_p_bool - \bool_set_false:N \l__chemmacros_orbital_type_sp_bool - \bool_set_false:N \l__chemmacros_orbital_type_sptwo_bool - \bool_set_false:N \l__chemmacros_orbital_type_spthree_bool - } - -\keys_define:nn { chemmacros / orbital / s } - { - phase .choice: , - phase / + .code:n = - { \bool_set_true:N \l__chemmacros_orbital_s_phase_bool } , - phase / - .code:n = - { \bool_set_false:N \l__chemmacros_orbital_s_phase_bool } , - scale .tl_set:N = \l__chemmacros_orbital_s_scale_tl , - color .tl_set:N = \l__chemmacros_orbital_s_color_tl - } - -\cs_new_protected:Npn \__chemmacros_orbital_s_draw:n #1 - { - \keys_set:nn { chemmacros / orbital / s } { #1 } - \bool_if:NTF \l__chemmacros_orbital_s_phase_bool - { - \tl_if_in:NnTF \l__chemmacros_orbital_s_color_tl { ! } - { - \tl_set:Nn \l__chemmacros_orbital_s_phase_color_tl - { \tl_use:N \l__chemmacros_orbital_s_color_tl } - } - { - \tl_set:Nn \l__chemmacros_orbital_s_phase_color_tl - { \tl_use:N \l__chemmacros_orbital_s_color_tl ! 90 } - } - } - { - \tl_set:Nn \l__chemmacros_orbital_s_phase_color_tl - { black ! 5 } - } - \chemmacros_tikz_picture:xn{ \__chemmacros_orbital_options: } - { - \chemmacros_tikz_shade:f - { ball~color = \l__chemmacros_orbital_s_phase_color_tl } - (0pt,0pt) circle (\l__chemmacros_orbital_s_scale_tl * .6em) ; - } - } - -% -------------------------------------------------------------------------- -% p-orbitals -\cs_new_protected:Npn \__chemmacros_orbital_type_p: - { - \bool_set_false:N \l__chemmacros_orbital_type_s_bool - \bool_set_true:N \l__chemmacros_orbital_type_p_bool - \bool_set_false:N \l__chemmacros_orbital_type_sp_bool - \bool_set_false:N \l__chemmacros_orbital_type_sptwo_bool - \bool_set_false:N \l__chemmacros_orbital_type_spthree_bool - } - -\keys_define:nn { chemmacros / orbital / p } - { - phase .choice: , - phase / + .code:n = - { \bool_set_true:N \l__chemmacros_orbital_p_phase_bool } , - phase / - .code:n = - { \bool_set_false:N \l__chemmacros_orbital_p_phase_bool } , - scale .tl_set:N = \l__chemmacros_orbital_p_scale_tl , - angle .fp_set:N = \l__chemmacros_orbital_angle_fp , - color .tl_set:N = \l__chemmacros_orbital_p_color_tl , - half .bool_set:N = \l__chemmacros_orbital_p_half_bool , - half .default:n = true - } - -\cs_new_protected:Npn \__chemmacros_orbital_p_draw:n #1 - { - \keys_set:nn { chemmacros / orbital / p } { #1 } - \bool_if:NTF \l__chemmacros_orbital_p_phase_bool - { - \tl_if_in:NnTF \l__chemmacros_orbital_p_color_tl { ! } - { - \tl_set:Nn \l__chemmacros_orbital_p_pphase_color_tl - { \tl_use:N \l__chemmacros_orbital_p_color_tl } - } - { - \tl_set:Nn \l__chemmacros_orbital_p_pphase_color_tl - { \tl_use:N \l__chemmacros_orbital_p_color_tl ! 90 } - } - \tl_set:Nn \l__chemmacros_orbital_p_mphase_color_tl - { black ! 5 } - - } - { - \tl_if_in:NnTF \l__chemmacros_orbital_p_color_tl { ! } - { - \tl_set:Nn \l__chemmacros_orbital_p_mphase_color_tl - { \tl_use:N \l__chemmacros_orbital_p_color_tl } - } - { - \tl_set:Nn \l__chemmacros_orbital_p_mphase_color_tl - { \tl_use:N \l__chemmacros_orbital_p_color_tl ! 90 } - } - \tl_set:Nn \l__chemmacros_orbital_p_pphase_color_tl - { black ! 5 } - } - \chemmacros_tikz_picture:xn { \__chemmacros_orbital_options: } - { - \chemmacros_tikz_shadedraw:f - { - draw = \l__chemmacros_orbital_p_pphase_color_tl , - ball~color = \l__chemmacros_orbital_p_pphase_color_tl - } - (0pt,0pt) .. controls ++ - ( - - \l__chemmacros_orbital_p_scale_tl * 2em , - \l__chemmacros_orbital_p_scale_tl * 2em - ) - and ++ - ( - \l__chemmacros_orbital_p_scale_tl * 2em , - \l__chemmacros_orbital_p_scale_tl * 2em - ) - .. (0pt,0pt); - \bool_if:NF \l__chemmacros_orbital_p_half_bool - { - \chemmacros_tikz_shadedraw:f - { - draw = \l__chemmacros_orbital_p_mphase_color_tl , - ball~color = \l__chemmacros_orbital_p_mphase_color_tl - } - (0pt,0pt) .. controls ++ - ( - - \l__chemmacros_orbital_p_scale_tl * 2em , - - \l__chemmacros_orbital_p_scale_tl * 2em - ) - and ++ - ( - \l__chemmacros_orbital_p_scale_tl * 2em , - - \l__chemmacros_orbital_p_scale_tl * 2em - ) - .. (0pt,0pt); - } - } - } - -% -------------------------------------------------------------------------- -% sp-orbitals -\cs_new_protected:Npn \__chemmacros_orbital_type_sp: - { - \bool_set_false:N \l__chemmacros_orbital_type_s_bool - \bool_set_false:N \l__chemmacros_orbital_type_p_bool - \bool_set_true:N \l__chemmacros_orbital_type_sp_bool - \bool_set_false:N \l__chemmacros_orbital_type_sptwo_bool - \bool_set_false:N \l__chemmacros_orbital_type_spthree_bool - } - -\keys_define:nn { chemmacros / orbital / sp } - { - phase .choice: , - phase / + .code:n = - { \bool_set_true:N \l__chemmacros_orbital_sp_phase_bool } , - phase / - .code:n = - { \bool_set_false:N \l__chemmacros_orbital_sp_phase_bool } , - scale .tl_set:N = \l__chemmacros_orbital_sp_scale_tl , - angle .fp_set:N = \l__chemmacros_orbital_angle_fp , - color .tl_set:N = \l__chemmacros_orbital_sp_color_tl - } - -\cs_new_protected:Npn \__chemmacros_orbital_sp_draw:n #1 - { - \keys_set:nn { chemmacros / orbital / sp } { #1 } - \bool_if:NTF \l__chemmacros_orbital_sp_phase_bool - { - \tl_if_in:NnTF \l__chemmacros_orbital_sp_color_tl { ! } - { - \tl_set:Nn \l__chemmacros_orbital_sp_pphase_color_tl - { \tl_use:N \l__chemmacros_orbital_sp_color_tl } - } - { - \tl_set:Nn \l__chemmacros_orbital_sp_pphase_color_tl - { \tl_use:N \l__chemmacros_orbital_sp_color_tl ! 90 } - } - \tl_set:Nn \l__chemmacros_orbital_sp_mphase_color_tl - { black ! 5 } - - } - { - \tl_if_in:NnTF \l__chemmacros_orbital_sp_color_tl { ! } - { - \tl_set:Nn \l__chemmacros_orbital_sp_mphase_color_tl - { \tl_use:N \l__chemmacros_orbital_sp_color_tl } - } - { - \tl_set:Nn \l__chemmacros_orbital_sp_mphase_color_tl - { \tl_use:N \l__chemmacros_orbital_sp_color_tl ! 90 } - } - \tl_set:Nn \l__chemmacros_orbital_sp_pphase_color_tl - { black ! 5 } - } - \chemmacros_tikz_picture:xn { \__chemmacros_orbital_options: } - { - \chemmacros_tikz_shadedraw:f - { - draw = \l__chemmacros_orbital_sp_pphase_color_tl , - ball~color = \l__chemmacros_orbital_sp_pphase_color_tl - } - (0pt,0pt) .. controls ++ - ( - - \l__chemmacros_orbital_sp_scale_tl * 2em , - \l__chemmacros_orbital_sp_scale_tl * 2em - ) - and ++ - ( - \l__chemmacros_orbital_sp_scale_tl * 2em , - \l__chemmacros_orbital_sp_scale_tl * 2em - ) - .. (0pt,0pt); - \chemmacros_tikz_shadedraw:f - { - draw = \l__chemmacros_orbital_sp_mphase_color_tl , - ball~color = \l__chemmacros_orbital_sp_mphase_color_tl - } - (0pt,0pt) .. controls ++ - ( - - \l__chemmacros_orbital_sp_scale_tl * .6em , - - \l__chemmacros_orbital_sp_scale_tl * .6em - ) - and ++ - ( - \l__chemmacros_orbital_sp_scale_tl * .6em , - - \l__chemmacros_orbital_sp_scale_tl * .6em - ) - .. (0pt,0pt); - } - } - -% -------------------------------------------------------------------------- -% sp2-orbitals -\cs_new_protected:Npn \__chemmacros_orbital_type_sptwo: - { - \bool_set_false:N \l__chemmacros_orbital_type_s_bool - \bool_set_false:N \l__chemmacros_orbital_type_p_bool - \bool_set_false:N \l__chemmacros_orbital_type_sp_bool - \bool_set_true:N \l__chemmacros_orbital_type_sptwo_bool - \bool_set_false:N \l__chemmacros_orbital_type_spthree_bool - } - -\keys_define:nn { chemmacros / orbital / sp2 } - { - phase .choice: , - phase / + .code:n = - { \bool_set_true:N \l__chemmacros_orbital_sptwo_phase_bool } , - phase / - .code:n = - { \bool_set_false:N \l__chemmacros_orbital_sptwo_phase_bool } , - scale .tl_set:N = \l__chemmacros_orbital_sptwo_scale_tl , - angle .fp_set:N = \l__chemmacros_orbital_angle_fp , - color .tl_set:N = \l__chemmacros_orbital_sptwo_color_tl - } - -\cs_new_protected:Npn \__chemmacros_orbital_sptwo_draw:n #1 - { - \keys_set:nn { chemmacros / orbital / sp2 } { #1 } - \bool_if:NTF \l__chemmacros_orbital_sptwo_phase_bool - { - \tl_if_in:NnTF \l__chemmacros_orbital_sptwo_color_tl { ! } - { - \tl_set:Nn \l__chemmacros_orbital_sptwo_pphase_color_tl - { \tl_use:N \l__chemmacros_orbital_sptwo_color_tl } - } - { - \tl_set:Nn \l__chemmacros_orbital_sptwo_pphase_color_tl - { \tl_use:N \l__chemmacros_orbital_sptwo_color_tl ! 90 } - } - \tl_set:Nn \l__chemmacros_orbital_sptwo_mphase_color_tl - { black ! 5 } - - } - { - \tl_if_in:NnTF \l__chemmacros_orbital_sptwo_color_tl { ! } - { - \tl_set:Nn \l__chemmacros_orbital_sptwo_mphase_color_tl - { \tl_use:N \l__chemmacros_orbital_sptwo_color_tl } - } - { - \tl_set:Nn \l__chemmacros_orbital_sptwo_mphase_color_tl - { \tl_use:N \l__chemmacros_orbital_sptwo_color_tl ! 90 } - } - \tl_set:Nn \l__chemmacros_orbital_sptwo_pphase_color_tl - { black ! 5 } - } - \chemmacros_tikz_picture:xn { \__chemmacros_orbital_options: } - { - \chemmacros_tikz_shadedraw:f - { - draw = \l__chemmacros_orbital_sptwo_pphase_color_tl , - ball~color = \l__chemmacros_orbital_sptwo_pphase_color_tl - } - (0pt,0pt) .. controls ++ - ( - - \l__chemmacros_orbital_sptwo_scale_tl * 2em , - \l__chemmacros_orbital_sptwo_scale_tl * 2em - ) - and ++ - ( - \l__chemmacros_orbital_sptwo_scale_tl * 2em , - \l__chemmacros_orbital_sptwo_scale_tl * 2em - ) - .. (0pt,0pt); - \chemmacros_tikz_shadedraw:f - { - draw = \l__chemmacros_orbital_sptwo_mphase_color_tl , - ball~color = \l__chemmacros_orbital_sptwo_mphase_color_tl - } - (0pt,0pt) .. controls ++ - ( - - \l__chemmacros_orbital_sptwo_scale_tl * .8em , - - \l__chemmacros_orbital_sptwo_scale_tl * .8em - ) - and ++ - ( - \l__chemmacros_orbital_sptwo_scale_tl * .8em , - - \l__chemmacros_orbital_sptwo_scale_tl * .8em - ) - .. (0pt,0pt); - } - } - -% -------------------------------------------------------------------------- -% sp3-orbitals -\cs_new_protected:Npn \__chemmacros_orbital_type_spthree: - { - \bool_set_false:N \l__chemmacros_orbital_type_s_bool - \bool_set_false:N \l__chemmacros_orbital_type_p_bool - \bool_set_false:N \l__chemmacros_orbital_type_sp_bool - \bool_set_false:N \l__chemmacros_orbital_type_sptwo_bool - \bool_set_true:N \l__chemmacros_orbital_type_spthree_bool - } - -\keys_define:nn { chemmacros / orbital / sp3 } - { - phase .choice: , - phase / + .code:n = - { \bool_set_true:N \l__chemmacros_orbital_spthree_phase_bool } , - phase / - .code:n = - { \bool_set_false:N \l__chemmacros_orbital_spthree_phase_bool } , - scale .tl_set:N = \l__chemmacros_orbital_spthree_scale_tl , - angle .fp_set:N = \l__chemmacros_orbital_angle_fp , - color .tl_set:N = \l__chemmacros_orbital_spthree_color_tl - } +\cs_new_protected:Npn \ChemCompatibilityFrom #1#2 \EndChemCompatibility + { \chemmacros_if_compatiblity:nnT {>=} {#1} {#2} } -\cs_new_protected:Npn \__chemmacros_orbital_spthree_draw:n #1 - { - \keys_set:nn { chemmacros / orbital / sp3 } { #1 } - \bool_if:NTF \l__chemmacros_orbital_spthree_phase_bool - { - \tl_if_in:NnTF \l__chemmacros_orbital_spthree_color_tl { ! } - { - \tl_set:Nn \l__chemmacros_orbital_spthree_pphase_color_tl - { \tl_use:N \l__chemmacros_orbital_spthree_color_tl } - } - { - \tl_set:Nn \l__chemmacros_orbital_spthree_pphase_color_tl - { \tl_use:N \l__chemmacros_orbital_spthree_color_tl ! 90 } - } - \tl_set:Nn \l__chemmacros_orbital_spthree_mphase_color_tl - { black ! 5 } - - } - { - \tl_if_in:NnTF \l__chemmacros_orbital_spthree_color_tl { ! } - { - \tl_set:Nn \l__chemmacros_orbital_spthree_mphase_color_tl - { \tl_use:N \l__chemmacros_orbital_spthree_color_tl } - } - { - \tl_set:Nn \l__chemmacros_orbital_spthree_mphase_color_tl - { \tl_use:N \l__chemmacros_orbital_spthree_color_tl ! 90 } - } - \tl_set:Nn \l__chemmacros_orbital_spthree_pphase_color_tl - { black ! 5 } - } - \chemmacros_tikz_picture:xn { \__chemmacros_orbital_options: } - { - \chemmacros_tikz_shadedraw:f - { - draw = \l__chemmacros_orbital_spthree_pphase_color_tl , - ball~color = \l__chemmacros_orbital_spthree_pphase_color_tl - } - (0pt,0pt) .. controls ++ - ( - - \l__chemmacros_orbital_spthree_scale_tl * 2em , - \l__chemmacros_orbital_spthree_scale_tl * 2em - ) - and ++ - ( - \l__chemmacros_orbital_spthree_scale_tl * 2em , - \l__chemmacros_orbital_spthree_scale_tl * 2em - ) - .. (0pt,0pt); - \chemmacros_tikz_shadedraw:f - { - draw = \l__chemmacros_orbital_spthree_mphase_color_tl , - ball~color = \l__chemmacros_orbital_spthree_mphase_color_tl - } - (0pt,0pt) .. controls ++ - ( - - \l__chemmacros_orbital_spthree_scale_tl * 1em , - - \l__chemmacros_orbital_spthree_scale_tl * 1em - ) - and ++ - ( - \l__chemmacros_orbital_spthree_scale_tl * 1em , - - \l__chemmacros_orbital_spthree_scale_tl * 1em - ) - .. (0pt,0pt); - } - } +\cs_new_protected:Npn \ChemCompatibilityTo #1#2 \EndChemCompatibility + { \chemmacros_if_compatiblity:nnT {<=} {#1} {#2} } -% -------------------------------------------------------------------------- -% main command -\keys_define:nn { chemmacros / orbital } +\cs_new_protected:Npn \ChemCompatibilityBetween #1#2#3 \EndChemCompatibility { - overlay .bool_set:N = \l__chemmacros_orbital_overlay_bool , - overlay .default:n = true , - opacity .code:n = + \bool_if:nT { - \fp_compare:nTF { #1 = 1 } - { \bool_set_false:N \l__chemmacros_orbital_opacity_bool } - { \bool_set_true:N \l__chemmacros_orbital_opacity_bool } - \fp_set:Nn \l__chemmacros_orbital_opacity_fp { #1 } + \chemmacros_if_compatiblity_p:nn {>=} {#1} && + \chemmacros_if_compatiblity_p:nn {<=} {#2} } + {#3} } -\keys_define:nn { chemmacros / orbital / type } - { - s .code:n = { \__chemmacros_orbital_type_s: } , - p .code:n = { \__chemmacros_orbital_type_p: } , - sp .code:n = { \__chemmacros_orbital_type_sp: } , - sp2 .code:n = { \__chemmacros_orbital_type_sptwo: } , - sp3 .code:n = { \__chemmacros_orbital_type_spthree: } - } - -\cs_new_protected:Npn \chemmacros_orbital:n #1 - { - \bool_if:NT \l__chemmacros_orbital_type_s_bool - { \__chemmacros_orbital_s_draw:n { #1 } } - \bool_if:NT \l__chemmacros_orbital_type_p_bool - { \__chemmacros_orbital_p_draw:n { #1 } } - \bool_if:NT \l__chemmacros_orbital_type_sp_bool - { \__chemmacros_orbital_sp_draw:n { #1 } } - \bool_if:NT \l__chemmacros_orbital_type_sptwo_bool - { \__chemmacros_orbital_sptwo_draw:n { #1 } } - \bool_if:NT \l__chemmacros_orbital_type_spthree_bool - { \__chemmacros_orbital_spthree_draw:n { #1 } } - } - -\NewDocumentCommand \orbital { o m } +% let's see that the max number is the newest (=current) version +\chemmacros_if_compatiblity:nnT {>} { \c_chemmacros_version_number_tl } { - \group_begin: - \keys_set:nn { chemmacros / orbital / type } { #2 } - \IfNoValueTF { #1 } - { \chemmacros_orbital:n { } } - { \chemmacros_orbital:n { #1 } } - \group_end: + \fp_set:Nn \l__chemmacros_compatibility_version_fp + { \c_chemmacros_version_number_tl } } % -------------------------------------------------------------------------- -% 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 } - } +% compatibility too low: +\chemmacros_if_compatiblity:nnT {<} {4.7} { - \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 + \msg_warning:nnx {chemmacros} {too-low-compatibility} + { \fp_to_tl:N \l__chemmacros_compatibility_version_fp } } -% half tip on the left -\pgfarrowsdeclare { left~el } { left~el } +% not the newest version: +\chemmacros_if_compatiblity:nnT {<} { \c_chemmacros_version_number_tl } { - \dim_set:Nn \l__chemmacros_el_length_dim - { 2.5pt + 2.5\pgflinewidth } - \pgfarrowsleftextend { -\l__chemmacros_el_length_dim } - \pgfarrowsrightextend { .5\pgflinewidth } + \msg_warning:nnx {chemmacros} {low-compatibility} + { \fp_to_tl:N \l__chemmacros_compatibility_version_fp } } - { - \dim_set:Nn \l__chemmacros_el_length_dim - { 2.5pt + 2.5\pgflinewidth } - \pgfsetdash {} { 0pt } - \pgfsetroundjoin - \pgfsetroundcap - \pgfpathmoveto { \pgfpoint { 0pt } { 0pt } } - \pgfpathlineto - { - \pgfpoint - { -\l__chemmacros_el_length_dim } - { .3\l__chemmacros_el_length_dim } - } - \pgfpathlineto { \pgfpoint { -.5\l__chemmacros_el_length_dim } { 0pt } } - \pgfpathlineto { \pgfpoint { 0pt } { 0pt } } - \pgfusepathqfillstroke - } - -% half tip in the right -\pgfarrowsdeclare { right~el } { right~el } - { - \dim_set:Nn \l__chemmacros_el_length_dim - { 2.5pt + 2.5\pgflinewidth } - \pgfarrowsleftextend { -\l__chemmacros_el_length_dim } - \pgfarrowsrightextend { .5\pgflinewidth } - } - { - \dim_set:Nn \l__chemmacros_el_length_dim - { 2.5pt + 2.5\pgflinewidth } - \pgfsetdash {} { 0pt } - \pgfsetroundjoin - \pgfsetroundcap - \pgfpathmoveto { \pgfpoint { 0pt } { 0pt } } - \pgfpathlineto - { - \pgfpoint - { -\l__chemmacros_el_length_dim } - { -.3\l__chemmacros_el_length_dim } - } - \pgfpathlineto { \pgfpoint { -.5\l__chemmacros_el_length_dim } { 0pt } } - \pgfpathlineto { \pgfpoint { 0pt } { 0pt } } - \pgfusepathqfillstroke - } - -% -------------------------------------------------------------------------- -% setup -\NewDocumentCommand \chemsetup { o m } - { - \IfNoValueTF { #1 } - { \keys_set:nn { chemmacros } { #2 } } - { - \tl_if_eq:nnTF { #1 } { chemformula } - { \setchemformula { #2 } } - { \keys_set:nn { chemmacros / #1 } { #2 } } - } - \ignorespaces - } - - + % -------------------------------------------------------------------------- -% hyperref support -% ?? unsure about adding IUPAC commands -\AfterPackage* { hyperref } - { - \pdfstringdefDisableCommands - { - % \cs_set:Npn \- { - } % maybe not a good idea... - \cs_set:Npn \| { } - \cs_set:Npn \pH { pH } - \cs_set:Npn \pOH { pOH } - \cs_set:Npn \iupac #1 { #1 } - \cs_set:Npn \cip #1 { (#1) } - \cs_set:Npn \cis { cis } - \cs_set:Npn \trans { trans } - \cs_set:Npn \tert { tert } - \cs_set:Npn \ortho { o } - \cs_set:Npn \meta { m } - \cs_set:Npn \para { p } - \cs_set:Npn \syn { syn } - \cs_set:Npn \anti { anti } - } - } +\chemmacros_if_compatiblity:nnTF {<} {5.0} + { \RequirePackage{chemmacros4} } + { \RequirePackage{chemmacros5} } % -------------------------------------------------------------------------- -% language support -- provided through `translations' -% equilibrium constants: -\DeclareTranslationFallback {K-acid} {\mathrm{a}} -\DeclareTranslation{German} {K-acid} {\mathrm{s}} -\DeclareTranslation{Dutch} {K-acid} {\mathrm{z}} - -\DeclareTranslationFallback {K-base} {\mathrm{b}} - -\DeclareTranslationFallback {K-water} {\mathrm{w}} - -% phases: -\DeclareTranslation{German}{phase-sld}{ f } -\DeclareTranslation{German}{phase-lqd}{ f{}l } -% list of reactions: -\DeclareTranslationFallback {list-of-reactions} { List~ of~ reactions } -\DeclareTranslation{English} {list-of-reactions} { List~ of~ reactions } -\DeclareTranslation{German} {list-of-reactions} { Reaktionsverzeichnis } -\DeclareTranslation{Italian} {list-of-reactions} { Elenco~ delle~ reazioni } -\DeclareTranslation{French} {list-of-reactions} { Table~ des~ r\'eactions } -\DeclareTranslation{Dutch} {list-of-reactions} { Lijst~ van~ reacties } -% -\DeclareTranslationFallback {reaction} { Reaction } -\DeclareTranslation{English} {reaction} { Reaction } -\DeclareTranslation{German} {reaction} { Reaktion } -\DeclareTranslation{Italian} {reaction} { Reazione } -\DeclareTranslation{French} {reaction} { R\'eaction } -\DeclareTranslation{Dutch} {reaction} { Reactie } - -\tl_set:Nn \l__chemmacros_reaction_lorname_tl - { \chemmacros_translate:n {reaction} } -\tl_set:Nn \reactionlistname - { \chemmacros_translate:n {list-of-reactions} } - \tex_endinput:D % -------------------------------------------------------------------------- @@ -4284,7 +357,7 @@ Version history the new package in the family: `chemgreek' - \OX and \redox now work in `amsmath's environment by ignoring the measuring phase - - language management with the halp of the + - language management with the help of the `translations' package => recognize document language automatically and use it if it a) is known to `chemmacros' and b) has @@ -4374,10 +447,13 @@ Version history - allow \NewChemPhase and friends after \begin{document} - new optional argument to phase commands - new options `nmr/method' and `nmr/connector' - -% --------------------------------------------------------------------------- % -% TODO: -- add d-orbitals -- make electron movement arrow tips (`el', `left el' and `right el') public -- phase commands with arguments (see http://texwelt.de/wissen/fragen/9264) - +2015/09/11 - version 5.0 - the former chemmacros.sty is now chemmacros4.sty + and can be loaded through the `compatibility' + option + - chemmacros is now organized in separate modules + which either are preloaded or can be loaded by the + user with \usechemmodule + - various changes, see + http://www.mychemistry.eu/2015/06/chemmacros-development/ + and the manual section 3.4. Upgrading from version < 5.0 + for details |