diff options
author | Karl Berry <karl@freefriends.org> | 2014-08-10 22:26:33 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2014-08-10 22:26:33 +0000 |
commit | 42bcd08cc7a71e0192916020b1ace6838c3c21cb (patch) | |
tree | fcfe4de6272df848a5a89e00052a7a525c3b88a9 /Master/texmf-dist/tex/latex/chemmacros/chemformula.sty | |
parent | 118ad5fd40d58a85598d9e7227466ebf8ad1a946 (diff) |
chemmacros (9aug14)
git-svn-id: svn://tug.org/texlive/trunk@34897 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/chemmacros/chemformula.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/chemmacros/chemformula.sty | 3110 |
1 files changed, 0 insertions, 3110 deletions
diff --git a/Master/texmf-dist/tex/latex/chemmacros/chemformula.sty b/Master/texmf-dist/tex/latex/chemmacros/chemformula.sty deleted file mode 100644 index 08fc18604f9..00000000000 --- a/Master/texmf-dist/tex/latex/chemmacros/chemformula.sty +++ /dev/null @@ -1,3110 +0,0 @@ -% -------------------------------------------------------------------------- -% the CHEMMACROS bundle -% chemformula.sty -% macros and commands for chemists -% -------------------------------------------------------------------------- -% Clemens Niederberger -% -------------------------------------------------------------------------- -% https://bitbucket.org/cgnieder/chemmacros/ -% contact@mychemistry.eu -% -------------------------------------------------------------------------- -% If you have any ideas, questions, suggestions or bugs to report, please -% feel free to contact me. -% -------------------------------------------------------------------------- -% Copyright 2011-2014 Clemens Niederberger -% -% This work may be distributed and/or modified under the -% conditions of the LaTeX Project Public License, either version 1.3 -% of this license or (at your option) any later version. -% The latest version of this license is in -% http://www.latex-project.org/lppl.txt -% and version 1.3 or later is part of all distributions of LaTeX -% version 2005/12/01 or later. -% -% This work has the LPPL maintenance status `maintained'. -% -% The Current Maintainer of this work is Clemens Niederberger. -% -------------------------------------------------------------------------- -\RequirePackage{ expl3 , xparse , l3keys2e , tikz , amsmath , xfrac , nicefrac , scrlfile } -\usetikzlibrary{arrows.meta} -\def\chemformula@version{4.7} -\def\chemformula@date{2014/08/04} - -\ProvidesExplPackage - {chemformula} - {\chemformula@date} - {\chemformula@version} - {typeset chemical compounds and reactions} - -% -------------------------------------------------------------------------- -% check expl3 version: -\@ifpackagelater { expl3 } { 2012/11/21 } - { } - { - \PackageError { chemformula } { Support~package~expl3~too~old } - { - You~need~to~update~your~installation~of~the~bundles~'l3kernel'~and~ - 'l3packages'.\MessageBreak - Loading~chemformula~will~abort! - } - \tex_endinput:D - } - -% -------------------------------------------------------------------------- -% warning and error messages: -\msg_new:nnnn { chemformula } { missing-argument } - { Wrong~name~input~ \msg_line_context: . } - { - Maybe~you've~forgotten~to~add~the~second~argument~to~name~syntax?~ - "!(<name>)(<chemformula>)".\\ - Or~you~have~forgotten~to~add~a~group~between~an~exclamation~mark~and~ - the~following~parenthesis?~"!~{}()"\\ - Either~way~-~I~don't~know~what~to~do~ \msg_line_context: . - } - -\msg_new:nnnn { chemformula } { new-arrow } - { The~arrow~type~ \tl_to_str:n { #1 } \c_space_tl is~already~defined. } - { - You've~tried~to~define~the~arrow~type~\tl_to_str:n { #1 } \c_space_tl with - ~\token_to_str:N \NewChemArrow \c_space_tl but~it~already~exists. - ~Choose~another~name. - } - -\msg_new:nnnn { chemformula } { renew-arrow } - { The~arrow~type~ \tl_to_str:n { #1 } \c_space_tl is~not~defined. } - { - You've~tried~to~renew~the~arrow~type~\tl_to_str:n { #1 } ~but~it~doesn't~ - exist. - } - -\msg_new:nnnn { chemformula } { new-bond } - { The~bond~type~ \tl_to_str:n { #1 } \c_space_tl is~already~defined. } - { - You've~tried~to~define~the~bond~type~\tl_to_str:n { #1 } \c_space_tl with - ~\token_to_str:N \NewChemBond \c_space_tl but~it~already~exists. - ~Choose~another~name. - } - -\msg_new:nnnn { chemformula } { renew-bond } - { The~bond~type~ \tl_to_str:n { #1 } \c_space_tl is~not~defined. } - { - You've~tried~to~renew~the~bond~type~\tl_to_str:n { #1 } ~but~it~doesn't~ - exist. - } - -\msg_new:nnnn { chemformula } { stand-alone } - { - You're~using~`chemformula'~as~a~stand-alone~package~or~have~loaded~it~ - before~you've~loaded~`chemmacros',~too.~Some~features~might~not~be~ - provided!~Espacially~you~cannot~use~\token_to_str:N \chemsetup \c_space_tl - to~setup~your~formulae. - } - { - You're~using~`chemformula'~as~a~stand-alone~package~or~have~loaded~it~ - before~you've~loaded~`chemmacros',~too.~Some~features~might~not~be~ - provided!~Espacially~you~cannot~use~\token_to_str:N \chemsetup \c_space_tl - to~setup~your~formulae. - } - -\msg_new:nnnn { chemformula } { command-deprecated } - { - The~command~\token_to_str:N #1 \c_space_tl is~deprecated.~Use~ - \token_to_str:N #2 \c_space_tl instead. - } - { - The~command~\token_to_str:N #1 \c_space_tl is~deprecated.~Use~ - \token_to_str:N #2 \c_space_tl instead. - } - -\cs_new_protected:Npn \chemformula_define_deprecated:NNn #1#2#3 - { - \cs_new_protected:Npn #1 - { - \msg_warning:nnnn { chemformula } { command-deprecated } - { #1 } { #2 } - #3 - } - } - -\NewDocumentCommand \DeprecatedFormulaCommand { mmm } - { \chemformula_define_deprecated:NNn #1 #2 { #3 } } - -% -------------------------------------------------------------------------- -% variants of kernel functions: -\cs_generate_variant:Nn \keys_set:nn { nV } -\cs_generate_variant:Nn \tl_if_blank:nF { V } -\cs_generate_variant:Nn \tl_if_in:nnT { x , nV } -\cs_generate_variant:Nn \prop_get:Nn { NV } -\cs_generate_variant:Nn \tl_set_rescan:Nnn { NnV } -\cs_generate_variant:Nn \dim_set:Nn { NV } - -% -------------------------------------------------------------------------- -% package options: -\bool_new:N \l__chemformula_strict_bool -\keys_define:nn { chemmacros / chemformula } - { - strict .bool_set:N = \l__chemformula_strict_bool , - strict .default:n = true - } - -\ProcessKeysOptions{ chemmacros / chemformula } - -\AtBeginDocument - { - \@ifpackageloaded{ chemmacros } - { - \bool_if:NT \l_chemmacros_strict_bool - { \bool_set_true:N \l__chemformula_strict_bool } - } - {} - } - -% -------------------------------------------------------------------------- -% VARIABLES -% temporary variables: -\tl_new:N \l__chemformula_tmpa_tl -\tl_new:N \l__chemformula_tmpb_tl -\tl_new:N \l__chemformula_tmpc_tl - -\dim_new:N \l__chemformula_tmpa_dim -\dim_new:N \l__chemformula_tmpb_dim - -\int_new:N \l__chemformula_tmpa_int -\int_new:N \l__chemformula_tmpb_int - -\box_new:N \l__chemformula_tmpa_box -\box_new:N \l__chemformula_tmpb_box - -\seq_new:N \l__chemformula_tmpa_seq - -% booleans: -% this one is officially used to detect wether we're in \ch or not: -\bool_new:N \l_chemformula_inside_ch_bool -% those are private: -\bool_new:N \l__chemformula_formal_charges_bool -\bool_new:N \l__chemformula_formal_chem_bool -\bool_set_true:N \l__chemformula_formal_chem_bool -\bool_new:N \l__chemformula_options_bool -\bool_new:N \l__chemformula_is_option_bool -\bool_new:N \l__chemformula_stoich_bool -\bool_new:N \l__chemformula_no_stoich_bool -\bool_new:N \l__chemformula_is_plus_bool -\bool_new:N \l__chemformula_is_up_bool -\bool_new:N \l__chemformula_is_down_bool -\bool_new:N \l__chemformula_is_arrow_bool -\bool_new:N \l__chemformula_is_name_bool -\bool_new:N \l__chemformula_stoich_is_iupac_bool -\bool_new:N \l__chemformula_stoich_parse_iupac_bool -\bool_new:N \l__chemformula_first_last_text_bool -\bool_new:N \l__chemformula_first_last_double_bool -\bool_new:N \l__chemformula_first_last_single_bool -\bool_new:N \l__chemformula_first_last_math_bool -\bool_new:N \l__chemformula_first_last_dollar_bool -\bool_new:N \l__chemformula_first_last_mathbraces_bool -\bool_new:N \l__chemformula_number_style_math_bool -\bool_new:N \l__chemformula_charge_style_math_bool -\bool_new:N \l__chemformula_sub_bool -\bool_new:N \l__chemformula_sup_bool -\bool_new:N \l__chemformula_is_isotope_bool -\bool_new:N \l__chemformula_xfrac_bool -\bool_new:N \l__chemformula_nicefrac_bool -\bool_new:N \l__chemformula_mathfrac_bool -\bool_set_true:N \l__chemformula_mathfrac_bool -\bool_new:N \l__chemformula_fss_bool -\bool_new:N \l__chemformula_fontspec_bool -\bool_new:N \l__chemformula_fss_family_bool -\bool_new:N \l__chemformula_fss_series_bool -\bool_new:N \l__chemformula_fss_shape_bool -\bool_new:N \l__chemformula_name_width_bool -\bool_new:N \l__chemformula_charge_full_shift_bool -\bool_new:N \l__chemformula_tikzexternaldisable_bool -\bool_set_true:N \l__chemformula_tikzexternaldisable_bool -\bool_new:N \l__chemformula_kroegervink_bool - -% dimensions: -\dim_new:N \l__chemformula_arrow_length_dim -\dim_new:N \l__chemformula_arrow_label_height_dim -\dim_new:N \l__chemformula_arrow_label_offset_dim -\dim_set:Nn \l__chemformula_arrow_label_offset_dim { 2pt } -\dim_new:N \l__chemformula_arrow_minimum_length_dim -\dim_new:N \l__chemformula_arrow_shortage_dim -\dim_new:N \l__chemformula_arrow_offset_dim -\dim_new:N \l__chemformula_arrow_yshift_dim -\dim_set:Nn \l__chemformula_arrow_yshift_dim { 0pt } -\dim_new:N \l__chemformula_radical_radius_dim -\dim_set:Nn \l__chemformula_radical_radius_dim { .2ex } -\dim_new:N \l__chemformula_radical_hshift_dim -\dim_set:Nn \l__chemformula_radical_hshift_dim { .15em } -\dim_new:N \l__chemformula_radical_vshift_dim -\dim_set:Nn \l__chemformula_radical_vshift_dim { .5ex } -\dim_new:N \l__chemformula_radical_space_dim -\dim_set:Nn \l__chemformula_radical_space_dim { .3em } -\dim_new:N \l__chemformula_arrow_head_dim -\dim_new:N \l__chemformula_name_dim -\dim_new:N \l__chemformula_adduct_space_dim -\dim_set:Nn \l__chemformula_adduct_space_dim { .1333em } -\dim_new:N \l__chemformula_charge_shift_dim -\dim_set:Nn \l__chemformula_charge_shift_dim { .5ex } -\dim_new:N \l__chemformula_subscript_shift_dim -\dim_new:N \l__chemformula_superscript_shift_dim -\dim_new:N \l__chemformula_subscript_dim -\dim_zero:N \l__chemformula_subscript_dim -\dim_new:N \l__chemformula_superscript_dim -\dim_zero:N \l__chemformula_superscript_dim -\dim_new:N \l__chemformula_bond_dim -\dim_set:Nn \l__chemformula_bond_dim { .5833em } -\dim_new:N \l__chemformula_bond_space_dim -\dim_set:Nn \l__chemformula_bond_space_dim { .07em } -\dim_new:N \l__chemformula_elspec_pair_distance_dim -\dim_set:Nn \l__chemformula_elspec_pair_distance_dim { 1ex } -\dim_new:N \l__chemformula_elspec_pair_line_length_dim -\dim_set:Nn \l__chemformula_elspec_pair_line_length_dim { 1.5ex } -\dim_new:N \l__chemformula_elspec_pair_width_dim -\dim_set:Nn \l__chemformula_elspec_pair_width_dim { 1pt } -\dim_new:N \l__chemformula_kroegervink_positive_radius_dim -\dim_set:Nn \l__chemformula_kroegervink_positive_radius_dim { .3ex } -\dim_new:N \l__chemformula_kroegervink_positive_hshift_dim -\dim_set:Nn \l__chemformula_kroegervink_positive_hshift_dim { .15em } -\dim_new:N \l__chemformula_kroegervink_positive_vshift_dim -\dim_set:Nn \l__chemformula_kroegervink_positive_vshift_dim { .5ex } -\dim_new:N \l__chemformula_kroegervink_positive_space_dim -\dim_set:Nn \l__chemformula_kroegervink_positive_space_dim { .4em } - -% skips: -\skip_new:N \l__chemformula_stoich_space_skip -\skip_set:Nn \l__chemformula_stoich_space_skip { .1667em plus .0333em minus .0117em } -\skip_new:N \l__chemformula_math_space_skip -\skip_set:Nn \l__chemformula_math_space_skip { .1667em plus .0333em minus .0117em } -\skip_new:N \l__chemformula_plus_space_skip -\skip_set:Nn \l__chemformula_plus_space_skip { .3em plus .1em minus .1em } - - -% integers: -\int_new:N \l__chemformula_count_tokens_int -\int_new:N \g__chemformula_lewis_int - -% token lists: -\tl_new:N \l__chemformula_compound_sep_tl -\tl_set:Nn \l__chemformula_compound_sep_tl { .5em } -\tl_new:N \l__chemformula_arrow_ratio_tl -\tl_set:Nn \l__chemformula_arrow_ratio_tl { .6 } -\tl_new:N \l__chemformula_radical_style_tl -\tl_new:N \l__chemformula_arrow_head_tl -\tl_set:Nn \l__chemformula_arrow_head_tl { cf } -\tl_new:N \l__chemformula_upper_label_tl -\tl_new:N \l__chemformula_lower_label_tl -\tl_new:N \l__chemformula_arrow_style_tl -\tl_new:N \l__chemformula_arrow_label_style_tl -\tl_set:Nn \l__chemformula_arrow_label_style_tl { \footnotesize } -\tl_new:N \l__chemformula_arrow_tmp_tl -\tl_new:N \l__chemformula_arrow_type_tl -\tl_new:N \l__chemformula_arrow_penalty_tl -\tl_set:Nn \l__chemformula_arrow_penalty_tl { 0 } -\tl_new:N \l__chemformula_arrow_offset_tl -\tl_set:Nn \l__chemformula_arrow_offset_tl { .75em } -\tl_new:N \l__chemformula_plus_penalty_tl -\tl_set:Nn \l__chemformula_plus_penalty_tl { 700 } -\tl_new:N \l__chemformula_bond_penalty_tl -\tl_set:Nn \l__chemformula_bond_penalty_tl { 10000 } -\tl_new:N \l__chemformula_name_tmp_tl -\tl_new:N \l__chemformula_chemformula_tmpa_tl -\tl_new:N \g__chemformula_options_tl -\tl_new:N \g__chemformula_output_tl -\tl_new:N \l__chemformula_input_tl -\tl_new:N \l__chemformula_stoich_tl -\tl_new:N \l__chemformula_decimal_output_tl -\tl_set:Nn \l__chemformula_decimal_output_tl { . } -\tl_new:N \l__chemformula_font_family_tl -\tl_set_eq:NN \l__chemformula_font_family_tl \f@family -\tl_new:N \l__chemformula_font_series_tl -\tl_set_eq:NN \l__chemformula_font_series_tl \f@series -\tl_new:N \l__chemformula_font_shape_tl -\tl_set_eq:NN \l__chemformula_font_shape_tl \f@shape -\tl_new:N \l__chemformula_format_tl -\tl_new:N \l__chemformula_fontspec_options_tl -\tl_new:N \l__chemformula_fontspec_argument_tl -\tl_new:N \l__chemformula_name_format_tl -\tl_set:Nn \l__chemformula_name_format_tl { \scriptsize\centering } -\tl_new:N \l_chemormula_sup_super_factor_tl -\tl_new:N \l__chemformula_subscript_shift_additional_tl -\tl_set:Nn \l__chemformula_subscript_shift_additional_tl { 0pt } -\tl_new:N \l__chemformula_superscript_shift_additional_tl -\tl_set:Nn \l__chemformula_superscript_shift_additional_tl { 0pt } -\tl_new:N \l__chemformula_subscript_tl -\tl_new:N \l__chemformula_superscript_tl -\tl_new:N \g__chemformula_input_up_tl -\tl_new:N \l__chemformula_elspec_angle_tl -\tl_new:N \l__chemformula_elspec_radius_tl -\tl_set:Nn \l__chemformula_elspec_radius_tl { .5ex } -\tl_new:N \l__chemformula_elspec_default_type_tl -\tl_set:Nn \l__chemformula_elspec_default_type_tl { pair } -\tl_const:Nx \c_chemformula_colon_tl { \token_to_str:N : } -\tl_new:N \l__chemformula_kroegervink_positive_style_tl -\tl_new:N \l__chemformula_kroegervink_neutral_tl -\tl_set:Nn \l__chemformula_kroegervink_neutral_tl { $\times$ } - -% property lists: -\prop_new:N \l__chemformula_arrows_code_prop -\prop_new:N \l__chemformula_cmpd_prop -\prop_new:N \l__chemformula_bonds_prop -\prop_new:N \l__chemformula_stoich_prop -\prop_new:N \l__chemformula_charge_prop -\prop_new:N \l__chemformula_numbers_prop -\prop_new:N \l__chemformula_no_stoich_prop -\prop_new:N \l__chemformula_lewis_elspec_types_prop -\prop_new:N \l__chemformula_kroegervink_prop - -% sequences: -\seq_new:N \l__chemformula_arrows_type_seq -\seq_new:N \l__chemformula_input_seq - -% boxes: -\box_new:N \l__chemformula_arrow_arg_i_box -\box_new:N \l__chemformula_arrow_arg_ii_box -\box_new:N \l__chemformula_superscript_box -\box_new:N \l__chemformula_subscript_box - -% -------------------------------------------------------------------------- -% general and helper functions: -\cs_new:Npn \chemformula_tikz:nn #1#2 - { \tikz [ #1 ] { #2 } } -\cs_generate_variant:Nn \chemformula_tikz:nn { xn,nf } - -\cs_new:Npn \chemformula_draw:nn #1#2 - { \draw [ #1 ] #2 ; } -\cs_generate_variant:Nn \chemformula_draw:nn { xn,nx,xx,xf,Vn } - -\cs_new:Npn \chemformula_node:nn #1#2 - { \node [ #1 ] { #2 } ; } -\cs_generate_variant:Nn \chemformula_node:nn { x } - -\cs_new:Npn \chemformula_node:nnn #1#2#3 - { \node [ #1 ] ( #2 ) { #3 } ; } -\cs_generate_variant:Nn \chemformula_node:nnn { nx } - -\cs_new:Npn \chemformula_allow_break: - { \tex_penalty:D \c_zero } - -\cs_new_protected:Npn \chemformula_leave_vmode: - { \hbox_unpack:N \c_empty_box } - -\cs_new:Npn \chemformula_nobreak: - { \tex_penalty:D \c_ten_thousand } - -\cs_new:Npn \chemformula_skip_nobreak:N #1 - { - \chemformula_nobreak: - \skip_horizontal:N #1 - \chemformula_nobreak: - } - -\cs_new_protected:Npn \chemformula_skip_nobreak_penalty:Nn #1#2 - { - \chemformula_nobreak: - \skip_horizontal:N #1 - \tex_penalty:D #2 \scan_stop: - } -% \binoppenalty=\maxdimen -% \relpenalty=\maxdimen - -\cs_new_protected:Npn \chemformula_dim_to_width:Nn #1#2 - { - \hbox_set:Nn \l__chemformula_tmpa_box { #2 } - \dim_set:Nn #1 { \box_wd:N \l__chemformula_tmpa_box } - \box_clear:N \l__chemformula_tmpa_box - } - -% an l3 conditional that can test 2e's conditionals that go like -% \iffoo ... \else ... \fi -% see http://tex.stackexchange.com/a/119806/5049 -\prg_new_conditional:Npnn \chemformula_latex_if:n #1 {p,T,F,TF} - { \use:c { if #1 } \prg_return_true: \else: \prg_return_false: \fi: } - -% -------------------------------------------------------------------------- -% prevent externalisation of tikz parts of the formulae: -\AtBeginDocument { \providecommand \tikzexternaldisable {} } - -\keys_define:nn { chemmacros / chemformula } - { - tikz-external-disable .bool_set:N = - \l__chemformula_tikzexternaldisable_bool - } - -\cs_new_protected:Npn \chemformula_tikzexternaldisable: - { - \bool_if:NT \l__chemformula_tikzexternaldisable_bool - { \tikzexternaldisable } - } - -% -------------------------------------------------------------------------- -% circled charge signs: -\cs_new_protected:Npn \chemformula_fplus: - { \ensuremath { \__chemformula_fplus: } } - -\cs_new:Npn \__chemformula_fplus: - { \mathpalette \__chemformula_fplus_aux: \bigcirc } - -\cs_new:Npn \__chemformula_fplus_aux: #1#2 - { - \ooalign - { - \tex_hfil:D - \c_math_toggle_token - #1 - \chemformula_plain_plus: - \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 \chemformula_fminus: - { \ensuremath { \__chemformula_fminus: } } - -\cs_new:Npn \__chemformula_fminus: - { \mathpalette \__chemformula_fminus_aux_aux: \bigcirc } - -\cs_new:Npn \__chemformula_fminus_aux_aux: #1#2 - { - \ooalign - { - \tex_hfil:D - \c_math_toggle_token - #1 - \chemformula_plain_minus: - \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 - } - } - -\AtBeginDocument{ - \@ifpackageloaded { chemmacros } - { - \bool_if:nT - { \l__chemmacros_circled_bool && !\l__chemmacros_circled_formal_bool } - { \bool_set_true:N \l__chemformula_formal_charges_bool } - \bool_if:NF \l__chemmacros_circled_chem_bool - { \bool_set_false:N \l__chemformula_formal_chem_bool } - \keys_define:nn { chemmacros / option } - { - circletype .choice: , - circletype / math .code:n = - { - \bool_set_false:N \l__chemmacros_circled_chem_bool - \bool_set_false:N \l__chemformula_formal_chem_bool - } , - circletype / chem .code:n = - { - \bool_set_true:N \l__chemmacros_circled_chem_bool - \bool_set_true:N \l__chemformula_formal_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 - \bool_set_false:N \l__chemformula_formal_charges_bool - } , - circled / formal .code:n = - { - \bool_set_true:N \l__chemmacros_circled_bool - \bool_set_true:N \l__chemmacros_circled_formal_bool - \bool_set_false:N \l__chemformula_formal_charges_bool - } , - circled / all .code:n = - { - \bool_set_true:N \l__chemmacros_circled_bool - \bool_set_false:N \l__chemmacros_circled_formal_bool - \bool_set_true:N \l__chemformula_formal_charges_bool - } , - circled .default:n = all - } - } - { } -} - -\cs_new_protected:Npn \chemformula_plain_plus: - { - \bool_if:NTF \l__chemformula_charge_style_math_bool - { \ensuremath { + } } - { \mode_if_math:TF { \text { + } } { + } } - } - -\cs_new_protected:Npn \chemformula_plus: - { - \bool_if:NTF \l__chemformula_formal_charges_bool - { - \bool_if:NTF \l__chemformula_formal_chem_bool - { \chemformula_fplus: } - { - \mode_if_math:TF - { \oplus } - { \c_math_toggle_token \oplus \c_math_toggle_token } - } - } - { \chemformula_plain_plus: } - } - -\cs_new_protected:Npn \chemformula_plain_minus: - { - \bool_if:NTF \l__chemformula_charge_style_math_bool - { \ensuremath { - } } - { \mode_if_math:TF { \text { \textendash } } { \textendash } } - } - -\cs_new_protected:Npn \chemformula_minus: - { - \bool_if:NTF \l__chemformula_formal_charges_bool - { - \bool_if:NTF \l__chemformula_formal_chem_bool - { \chemformula_fminus: } - { - \mode_if_math:TF - { \ominus } - { \c_math_toggle_token \ominus \c_math_toggle_token } - } - } - { \chemformula_plain_minus: } - } - -% -------------------------------------------------------------------------- -% Some basic internal commands: - -\cs_new_protected:Npn \chemformula_radical_or_decimal: - { - \peek_meaning:NTF \c_group_begin_token - { \chemformula_decimal: } - { \chemformula_radical: } - } - -\cs_new_protected:Npn \chemformula_radical: - { - \hbox_overlap_right:n - { - \chemformula_tikz:xn - { - \l__chemformula_radical_style_tl , - baseline , - minimum~ height = 0pt , - minimum~ width = 0pt , - inner~ sep = 0pt , - outer~ sep = 0pt , - overlay - } - { - \fill (0,0) - ++( - \l__chemformula_radical_hshift_dim , - \l__chemformula_radical_vshift_dim - ) - circle (\l__chemformula_radical_radius_dim) ; - } - } - \skip_horizontal:N \l__chemformula_radical_space_dim - } - -\keys_define:nn { chemmacros / chemformula } - { - % TikZ style: - radical-style .tl_set:N = \l__chemformula_radical_style_tl , - radical-radius .dim_set:N = \l__chemformula_radical_radius_dim , - % shift before: - radical-hshift .dim_set:N = \l__chemformula_radical_hshift_dim , - radical-vshift .dim_set:N = \l__chemformula_radical_vshift_dim , - % space after: - radical-space .dim_set:N = \l__chemformula_radical_space_dim - } - -\cs_new:Npn \chemformula_adduct: - { - \skip_horizontal:N \l__chemformula_adduct_space_dim - \textperiodcentered - \skip_horizontal:N \l__chemformula_adduct_space_dim - } -\cs_new_eq:NN \chemformula_star_adduct: \chemformula_adduct: - -% -------------------------------------------------------------------------- -% Kroeger-Vink notation -\cs_new_protected:Npn \chemformula_kroegervink_negative: - { \ensuremath { \prime } } - -\cs_new_protected:Npn \chemformula_kroegervink_neutral: - { \ensuremath { \text {\l__chemformula_kroegervink_neutral_tl } } } - -\cs_new_protected:Npn \chemformula_kroegervink_positive: - { - \hbox_overlap_right:n - { - \chemformula_tikz:xn - { - \l__chemformula_kroegervink_positive_style_tl , - baseline , - minimum~ height = 0pt , - minimum~ width = 0pt , - inner~ sep = 0pt , - outer~ sep = 0pt , - overlay - } - { - \fill (0,0) - ++( - \l__chemformula_kroegervink_positive_hshift_dim , - \l__chemformula_kroegervink_positive_vshift_dim - ) - circle (\l__chemformula_kroegervink_positive_radius_dim) ; - } - } - \skip_horizontal:N \l__chemformula_kroegervink_positive_space_dim - } - -\cs_new:Npn \chemformula_prime: - { - \bool_if:NTF \l__chemformula_kroegervink_bool - { \chemformula_kroegervink_negative: } - { ' } - } - -\keys_define:nn { chemmacros / chemformula } - { - kroeger-vink .bool_set:N = - \l__chemformula_kroegervink_bool , - % TikZ style: - kv-positive-style .tl_set:N = - \l__chemformula_kroegervink_positive_style_tl , - kv-positive-radius .dim_set:N = - \l__chemformula_kroegervink_positive_radius_dim , - % spacing: - kv-positive-hshift .dim_set:N = - \l__chemformula_kroegervink_positive_hshift_dim , - kv-positive-vshift .dim_set:N = - \l__chemformula_kroegervink_positive_vshift_dim , - kv-positive-offset .dim_set:N = - \l__chemformula_kroegervink_positive_space_dim , - % symbol: - kv-neutral-symbol .tl_set:N = - \l__chemformula_kroegervink_neutral_tl - } - -% -------------------------------------------------------------------------- -% ARROW DEFINITION -% arrow heads: - -% full tip for pairs -\pgfarrowsdeclare { cf~internal } { cf~internal } - { - \dim_set:Nn \l__chemformula_arrow_head_dim - { 2.5pt + 2.5\pgflinewidth } - \pgfarrowsleftextend { -\l__chemformula_arrow_head_dim } - \pgfarrowsrightextend { .5\pgflinewidth } - } - { - \dim_set:Nn \l__chemformula_arrow_head_dim - { 2.5pt + 2.5\pgflinewidth } - \pgfsetdash {} { 0pt } - \pgfsetroundjoin - \pgfsetroundcap - \pgfpathmoveto { \pgfpoint { 0pt } { 0pt } } - \pgfpathlineto - { - \pgfpoint - { -\l__chemformula_arrow_head_dim } - { .3\l__chemformula_arrow_head_dim } - } - \pgfpathlineto - { \pgfpoint { -.5\l__chemformula_arrow_head_dim } { 0pt } } - \pgfpathlineto - { - \pgfpoint - { -\l__chemformula_arrow_head_dim } - { -.3\l__chemformula_arrow_head_dim } - } - \pgfpathlineto { \pgfpoint { 0pt } { 0pt } } - \pgfusepathqfillstroke - } - -% half tip on the left -\pgfarrowsdeclare { left~cf~internal } { left~cf~internal } - { - \dim_set:Nn \l__chemformula_arrow_head_dim - { 2.5pt + 2.5\pgflinewidth } - \pgfarrowsleftextend { -\l__chemformula_arrow_head_dim } - \pgfarrowsrightextend { .5\pgflinewidth } - } - { - \dim_set:Nn \l__chemformula_arrow_head_dim - { 2.5pt + 2.5\pgflinewidth } - \pgfsetdash {} { 0pt } - \pgfsetroundjoin - \pgfsetroundcap - \pgfpathmoveto { \pgfpoint { 0pt } { 0pt } } - \pgfpathlineto - { - \pgfpoint - { -\l__chemformula_arrow_head_dim } - { .3\l__chemformula_arrow_head_dim } - } - \pgfpathlineto { \pgfpoint { -.5\l__chemformula_arrow_head_dim } { 0pt } } - \pgfpathlineto { \pgfpoint { 0pt } { 0pt } } - \pgfusepathqfillstroke - } - -% half tip in the right -\pgfarrowsdeclare { right~cf~internal } { right~cf~internal } - { - \dim_set:Nn \l__chemformula_arrow_head_dim - { 2.5pt + 2.5\pgflinewidth } - \pgfarrowsleftextend { -\l__chemformula_arrow_head_dim } - \pgfarrowsrightextend { .5\pgflinewidth } - } - { - \dim_set:Nn \l__chemformula_arrow_head_dim - { 2.5pt + 2.5\pgflinewidth } - \pgfsetdash {} { 0pt } - \pgfsetroundjoin - \pgfsetroundcap - \pgfpathmoveto { \pgfpoint { 0pt } { 0pt } } - \pgfpathlineto - { - \pgfpoint - { -\l__chemformula_arrow_head_dim } - { -.3\l__chemformula_arrow_head_dim } - } - \pgfpathlineto { \pgfpoint { -.5\l__chemformula_arrow_head_dim } { 0pt } } - \pgfpathlineto { \pgfpoint { 0pt } { 0pt } } - \pgfusepathqfillstroke - } - -\pgfkeys{ - cf~ /.tip = {cf~internal} , - left~cf~ /.tip = {left~cf~internal} , - right~cf~ /.tip = {right~cf~internal} -} - -% -------------------------------------------------------------------------- -% determine length in dependency of labels -\cs_new_protected:Npn \__chemformula_determine_arrow_length:NN #1#2 - { - \dim_set:NV \l__chemformula_arrow_offset_dim \l__chemformula_arrow_offset_tl - \box_set_eq:NN \l__chemformula_tmpa_box #1 - \dim_set:Nn \l__chemformula_tmpa_dim { \box_wd:N \l__chemformula_tmpa_box } - \box_set_eq:NN \l__chemformula_tmpa_box #2 - \dim_set:Nn \l__chemformula_tmpb_dim { \box_wd:N \l__chemformula_tmpa_box } - \box_clear:N \l__chemformula_tmpa_box - \dim_compare:nTF { \l__chemformula_tmpa_dim >= \l__chemformula_tmpb_dim } - { \dim_set_eq:NN \l__chemformula_arrow_length_dim \l__chemformula_tmpa_dim } - { \dim_set_eq:NN \l__chemformula_arrow_length_dim \l__chemformula_tmpb_dim } - \dim_add:Nn \l__chemformula_arrow_length_dim - { 2\l__chemformula_arrow_offset_dim } - \dim_compare:nF - { \l__chemformula_arrow_length_dim > \l__chemformula_arrow_minimum_length_dim } - { - \dim_set_eq:NN - \l__chemformula_arrow_length_dim - \l__chemformula_arrow_minimum_length_dim - } - \dim_set:Nn \l__chemformula_arrow_shortage_dim - { - ( - \l__chemformula_arrow_length_dim - - - \l__chemformula_arrow_length_dim * - \dim_ratio:nn { \l__chemformula_arrow_ratio_tl pt } { 1pt } - ) * 1/2 - } - \box_set_eq:NN \l__chemformula_tmpa_box #1 - \dim_set:Nn \l__chemformula_tmpa_dim - { \box_ht:N \l__chemformula_tmpa_box + \box_dp:N \l__chemformula_tmpa_box } - \box_set_eq:NN \l__chemformula_tmpa_box #2 - \dim_set:Nn \l__chemformula_tmpb_dim - { \box_ht:N \l__chemformula_tmpa_box + \box_dp:N \l__chemformula_tmpa_box } - \box_clear:N \l__chemformula_tmpa_box - \dim_compare:nTF { \l__chemformula_tmpa_dim >= \l__chemformula_tmpb_dim } - { \dim_set_eq:NN \l__chemformula_arrow_label_height_dim \l__chemformula_tmpa_dim } - { \dim_set_eq:NN \l__chemformula_arrow_label_height_dim \l__chemformula_tmpb_dim } - } - -% -------------------------------------------------------------------------- -% define arrow types - -% read arrow labels: - -\cs_new:Npn \chemformula_arrow_labels:nn #1#2 - { - \hbox_set:Nn \l__chemformula_arrow_arg_i_box - { \tl_use:N \l__chemformula_arrow_label_style_tl #1 } - \hbox_set:Nn \l__chemformula_arrow_arg_ii_box - { \tl_use:N \l__chemformula_arrow_label_style_tl #2 } - % now that we have both arguments do the actual drawing: - \prop_get:NVN \l__chemformula_arrows_code_prop - \l__chemformula_arrow_type_tl - \l__chemformula_tmpb_tl - \__chemformula_arrow_draw:V \l__chemformula_tmpb_tl - } - -% get arrows (for the use in \ch to replace the symbol) -% #1: symbol -\cs_new_protected:Npn \__chemformula_arrows_get:n #1 - { - % first clear the arguments - \box_clear:N \l__chemformula_arrow_arg_i_box - \box_clear:N \l__chemformula_arrow_arg_ii_box - % then get the arrow type - \tl_set:Nn \l__chemformula_arrow_type_tl { #1 } - } - -% this will be \arrow inside \ch -\DeclareDocumentCommand \charrow { mO{}O{} } - { - \group_begin: - \chemformula_tikzexternaldisable: - \__chemformula_arrows_get:n { #1 } - \chemformula_arrow_labels:nn { #2 } { #3 } - \group_end: - } - -% draw the arrows -\cs_new:Npn \__chemformula_arrow_draw:n #1 - { - \chemformula_nobreak: - % prepare arrow code for drawing: - \tl_set_rescan:Nnn \l__chemformula_tmpc_tl - { \char_set_catcode_letter:N \_ } { #1 } - % determine length of the arrow - \__chemformula_determine_arrow_length:NN - \l__chemformula_arrow_arg_i_box - \l__chemformula_arrow_arg_ii_box - \chemformula_tikz:nf - { inner~sep=0, baseline=(chemformula_arrow_start.base) } - { - % the coordinates - \chemformula_draw:xn - { \l__chemformula_arrow_style_tl } - { - coordinate (chemformula_arrow_start) (0pt,0pt) - ++ ( \l__chemformula_compound_sep_tl , .3432em) - ++ (0pt,\l__chemformula_arrow_yshift_dim) - coordinate (cf_arrow_start) - ++ ( .5 * \dim_use:N \l__chemformula_arrow_length_dim , 0pt) - coordinate (cf_arrow_mid) - ++ ( .5 * \dim_use:N \l__chemformula_arrow_length_dim , 0pt) - coordinate (cf_arrow_end) - ++ ( \l__chemformula_compound_sep_tl , 0pt ) - (cf_arrow_start) ++ (\l__chemformula_arrow_shortage_dim , 0pt) - coordinate (cf_arrow_mid_start) - (cf_arrow_end) ++ (-\l__chemformula_arrow_shortage_dim , 0pt) - coordinate (cf_arrow_mid_end) - } - % the arrow labels: - \draw - node - [ above=\l__chemformula_arrow_label_offset_dim ] at (cf_arrow_mid) - { \box_use:N \l__chemformula_arrow_arg_i_box } - node - [ below=\l__chemformula_arrow_label_offset_dim ] at (cf_arrow_mid) - { \box_use:N \l__chemformula_arrow_arg_ii_box } - ; - \tl_use:N \l__chemformula_tmpc_tl - } - \chemformula_skip_nobreak_penalty:Nn - \c_zero_skip - { \l__chemformula_arrow_penalty_tl } - } -\cs_generate_variant:Nn \__chemformula_arrow_draw:n { V } - -% commands to declare arrows (can also be used by users): -% #1: symbol, #2: code -\NewDocumentCommand \NewChemArrow { mm } - { - \prop_if_in:NnTF \l__chemformula_arrows_code_prop { #1 } - { \msg_error:nnn { chemformula } { new-arrow } { #1 } } - { - % store type in the sequence and code in the property list - \seq_put_right:Nn \l__chemformula_arrows_type_seq { #1 } - \prop_put:Nnn \l__chemformula_arrows_code_prop { #1 } { #2 } - } - } - -\NewDocumentCommand \DeclareChemArrow { mm } - { - \prop_if_in:NnF \l__chemformula_arrows_code_prop { #1 } - { \seq_put_right:Nn \l__chemformula_arrows_type_seq { #1 } } - % store type in the sequence and code in the property list - \prop_put:Nnn \l__chemformula_arrows_code_prop { #1 } { #2 } - } - -\NewDocumentCommand \RenewChemArrow { mm } - { - \prop_if_in:NnTF \l__chemformula_arrows_code_prop { #1 } - { \prop_put:Nnn \l__chemformula_arrows_code_prop { #1 } { #2 } } - { \msg_error:nnn { chemformula } { renew-arrow } { #1 } } - } - -\NewDocumentCommand \ShowChemArrow { m } - { - \prop_get:NnN \l__chemformula_arrows_code_prop { #1 } \l__chemformula_tmpa_tl - \tl_to_str:N \l__chemformula_tmpa_tl - } - -% declare arrows in the right order -% e.g. <-> must be declared before -> in order to search & replace it first -% resonance arrow: -\NewChemArrow { <-> } - { \draw[chemarrow,cf-cf] (cf_arrow_start) -- (cf_arrow_end) ; } -\NewChemArrow { -> } - { \draw[chemarrow,-cf] (cf_arrow_start) -- (cf_arrow_end) ; } -\NewChemArrow { <- } - { \draw[chemarrow,cf-] (cf_arrow_start) -- (cf_arrow_end) ; } -\NewChemArrow { <> } - { - \draw[chemarrow,-cf] - ([yshift=.2ex]cf_arrow_start) -- ([yshift=.2ex]cf_arrow_end) ; - \draw[chemarrow,cf-,] - ([yshift=-.2ex]cf_arrow_start) -- ([yshift=-.2ex]cf_arrow_end) ; - } -% isolobal arrow: -\NewChemArrow { <o> } - { - \draw[chemarrow,cf-cf] (cf_arrow_start) -- (cf_arrow_end) ; - \draw[chemarrow] - (cf_arrow_mid) .. controls ++(-.9ex,-1.5ex) and - ++(.9ex,-1.5ex) .. (cf_arrow_mid) ; - } -\NewChemArrow { <=>> } - { - \draw[chemarrow,-left~cf] - ([yshift=.15ex]cf_arrow_start) -- ([yshift=.15ex]cf_arrow_end) ; - \draw[chemarrow,left~cf-] - ([yshift=-.15ex]cf_arrow_mid_start) -- ([yshift=-.15ex]cf_arrow_mid_end) ; - } -\NewChemArrow { <<=> } - { - \draw[chemarrow,-left~cf] - ([yshift=.15ex]cf_arrow_mid_start) -- ([yshift=.15ex]cf_arrow_mid_end) ; - \draw[chemarrow,left~cf-] - ([yshift=-.15ex]cf_arrow_start) -- ([yshift=-.15ex]cf_arrow_end) ; - } -\NewChemArrow { <=> } - { - \draw[chemarrow,-left~cf] - ([yshift=.15ex]cf_arrow_start) -- ([yshift=.15ex]cf_arrow_end) ; - \draw[chemarrow,left~cf-] - ([yshift=-.15ex]cf_arrow_start) -- ([yshift=-.15ex]cf_arrow_end) ; - } -\NewChemArrow { >>=< } - { - \draw[chemarrow,right~cf-] - ([yshift=.15ex]cf_arrow_start) -- ([yshift=.15ex]cf_arrow_end) ; - \draw[chemarrow,-right~cf] - ([yshift=-.15ex]cf_arrow_mid_start) -- ([yshift=-.15ex]cf_arrow_mid_end) ; - } -\NewChemArrow { >=<< } - { - \draw[chemarrow,right~cf-] - ([yshift=.15ex]cf_arrow_mid_start) -- ([yshift=.15ex]cf_arrow_mid_end) ; - \draw[chemarrow,-right~cf] - ([yshift=-.15ex]cf_arrow_start) -- ([yshift=-.15ex]cf_arrow_end) ; - } -\NewChemArrow { >=< } - { - \draw[chemarrow,right~cf-] - ([yshift=.15ex]cf_arrow_start) -- ([yshift=.15ex]cf_arrow_end) ; - \draw[chemarrow,-right~cf] - ([yshift=-.15ex]cf_arrow_start) -- ([yshift=-.15ex]cf_arrow_end) ; - } -\NewChemArrow { <==> } - { - \draw[chemarrow,double~ equal~ sign~ distance,double,Implies-Implies] - (cf_arrow_start) -- (cf_arrow_end) ; - % \node at ([yshift=-.2ex]cf_arrow_mid) { $\Leftrightarrow$ } ; - } -\NewChemArrow { -/> } - { - \draw[chemarrow,-cf] (cf_arrow_start) -- (cf_arrow_end) ; - \draw[chemarrow] (cf_arrow_mid) ++ (.2ex,.4ex) -- ++(-.4ex,-.8ex) ; - \draw[chemarrow] (cf_arrow_mid) ++ (-.2ex,.4ex) -- ++(-.4ex,-.8ex) ; - } -\NewChemArrow { </- } - { - \draw[chemarrow,cf-] (cf_arrow_start) -- (cf_arrow_end) ; - \draw[chemarrow] (cf_arrow_mid) ++ (.2ex,.4ex) -- ++(-.4ex,-.8ex) ; - \draw[chemarrow] (cf_arrow_mid) ++ (.6ex,.4ex) -- ++(-.4ex,-.8ex) ; - } -% net reaction: -\NewChemArrow { == } { \node at ([yshift=-.2ex]cf_arrow_mid) { = } ; } - -% -------------------------------------------------------------------------- -% arrow customization -\keys_define:nn { chemmacros / chemformula } - { - arrow-offset .tl_set:N = \l__chemformula_arrow_offset_tl , - arrow-min-length .dim_set:N = \l__chemformula_arrow_minimum_length_dim , - arrow-yshift .dim_set:N = \l__chemformula_arrow_yshift_dim , - arrow-ratio .tl_set:N = \l__chemformula_arrow_ratio_tl , - label-offset .dim_set:N = \l__chemformula_arrow_label_offset_dim , - compound-sep .tl_set:N = \l__chemformula_compound_sep_tl , - arrow-style .tl_set:N = \l__chemformula_arrow_style_tl , - label-style .tl_set:N = \l__chemformula_arrow_label_style_tl , - arrow-penalty .tl_set:N = \l__chemformula_arrow_penalty_tl , - arrow-style .code:n = \tikzset { chemarrow/.style={#1} } , - } - -% -------------------------------------------------------------------------- -% MAIN COMMAND -\cs_new_protected:Npn \__chemformula_ch_main:n #1 - { - \group_begin: - \seq_set_split:Nnn \l__chemformula_input_seq { ~ } { #1 } - \cs_set_eq:NN \xspace \scan_stop: - % the next two aren't necessary any more but shouldn't do harm, too: - \cs_set_nopar:Npn \[ { [ } - \cs_set_nopar:Npn \] { ] } - \bool_set_true:N \l_chemformula_inside_ch_bool - \tl_if_blank:VF \g__chemformula_options_tl - { - \keys_set:nV - { chemmacros / chemformula } - \g__chemformula_options_tl - } - \seq_map_function:NN - \l__chemformula_input_seq - \chemformula_input:n - \__chemformula_prepare_output:N \l__chemformula_input_tl - \chemformula_write:V \l__chemformula_input_tl - \group_end: - } - -\cs_new:Npn \chemformula_write:n #1 - { - \mode_if_math:TF - { - \mathchoice - { \text { \chemformula_font_inner: #1 } } - { \text { \chemformula_font_inner: #1 } } - { \text { \scriptsize \chemformula_font_inner: #1 } } - { \text { \tiny \chemformula_font_inner: #1 } } - } - { \chemformula_font_inner: #1 } - } -\cs_generate_variant:Nn \chemformula_write:n { V } - -% internal version of \ch command: -\cs_new_protected:Npn \chemformula_ch:nn #1#2 - { - \group_align_safe_begin: - \chemformula_leave_vmode: - \tl_if_blank:nTF { #1 } - { \tl_gclear:N \g__chemformula_options_tl } - { \tl_gset:Nn \g__chemformula_options_tl { #1 } } - \__chemformula_ch_newline:w #2 \\ \q_no_value \q_stop - \group_align_safe_end: - \tl_use:N \g__chemformula_output_tl - \tl_gclear:N \g__chemformula_output_tl - } -\cs_generate_variant:Nn \chemformula_ch:nn { V , nV , VV } - -% Trickery to use \ch inside align environment: -% bypass \\: -\cs_new_protected:Npn \__chemformula_ch_newline:w #1 \\ #2 \q_stop - { - \__chemformula_ch_align:w #1 & \q_no_value \q_stop - \quark_if_no_value:nF { #2 } - { - \tl_gput_right:Nn \g__chemformula_output_tl { \\ } - % look for optional argument: - \peek_meaning:NTF [ - { \__chemformula_ch_newline_skip:w } - { \__chemformula_ch_newline:w } - #2 \q_stop - } - } - -\cs_new_protected:Npn \__chemformula_ch_newline_skip:w [ #1 ] - { - \tl_gput_right:Nn \g__chemformula_output_tl { [#1] } - \__chemformula_ch_newline:w - } - -% bypass &: -\cs_new_protected:Npn \__chemformula_ch_align:w #1 & #2 \q_stop - { - \__chemformula_ch_label:w #1 \label \q_no_value \q_stop - \quark_if_no_value:nF { #2 } - { - \tl_gput_right:Nn \g__chemformula_output_tl { & } - \__chemformula_ch_align:w #2 \q_stop - } - } - -% bypass \label: -\cs_new_protected:Npn \__chemformula_ch_label:w #1 \label #2 \q_stop - { - \__chemformula_ch_tag:w #1 \tag{} \q_no_value \q_stop - \quark_if_no_value:nF { #2 } - { - \tl_gput_right:Nn \g__chemformula_output_tl { \label } - \peek_meaning:NTF [ % ] - { \__chemformula_ch_label_opt:w } - { \__chemformula_ch_label_no_opt:n } - #2 \q_stop - } - } - -\cs_new_protected:Npn \__chemformula_ch_label_opt:w [ #1 ] #2 - { - \tl_gput_right:Nn \g__chemformula_output_tl { [{#1}] {#2} } - \__chemformula_ch_label:w - } - -\cs_new_protected:Npn \__chemformula_ch_label_no_opt:n #1 - { - \tl_gput_right:Nn \g__chemformula_output_tl { {#1} } - \__chemformula_ch_label:w - } - -% here's something not working when used together with `hyperref' -% which seems to be related to \nonumber -% bypass \tag: -\cs_new_protected:Npn \__chemformula_ch_tag:w #1 \tag#2 #3 \q_stop - { - \__chemformula_ch_intertext:w #1 \intertext{} \q_no_value \q_stop - \quark_if_no_value:nF { #3 } - { - \tl_gput_right:Nn \g__chemformula_output_tl { \protect\tag { #2 } } - \__chemformula_ch_tag:w #3 \q_stop - } - } - -% bypass \intertext: -\cs_new_protected:Npn \__chemformula_ch_intertext:w #1 \intertext#2 #3 \q_stop - { - \tl_gput_right:Nn \g__chemformula_output_tl - { \__chemformula_ch_main:n { #1 } } - \quark_if_no_value:nF { #3 } - { - \tl_gput_right:Nn \g__chemformula_output_tl { \intertext { #2 } } - \__chemformula_ch_intertext:w #3 \q_stop - } - } - -% -------------------------------------------------------------------------- -% user commands: -\NewDocumentCommand \ch { O{}m } - { \chemformula_ch:nn { #1 } { #2 } } - -\tl_new:N \l__chemformula_compound_tl -\cs_new_protected:Npn \chemformula_chcpd:nn #1#2 - { - \group_begin: - \keys_set:nn { chemmacros / chemformula } { #1 } - \__chemformula_save_catcodes: - \__chemformula_sanitize:Nn - \l__chemformula_chemformula_tmpa_tl - { #2 } - \chemformula_input_cmpd:VN - \l__chemformula_chemformula_tmpa_tl - \l__chemformula_compound_tl - \__chemformula_prepare_output:N \l__chemformula_compound_tl - \chemformula_write:V \l__chemformula_compound_tl - \group_end: - } - -\NewDocumentCommand \chcpd { O{}m } - { \chemformula_chcpd:nn { #1 } { #2 } } - -% -------------------------------------------------------------------------- -% arrow generation & detection -\cs_new:Npn \__chemformula_generate_arrows:Nn #1#2 - { - \tl_set_rescan:Nnn \l__chemformula_tmpa_tl - { - \char_set_catcode_other:N \> - \char_set_catcode_other:N \< - \char_set_catcode_other:N \- - \char_set_catcode_other:N \= - } - { #2 } - \seq_map_inline:Nn \l__chemformula_arrows_type_seq - { - \tl_replace_all:Nnn \l__chemformula_tmpa_tl - { ##1 } { \charrow { ##1 } } - } - \tl_set_eq:NN #1 \l__chemformula_tmpa_tl - } -\cs_generate_variant:Nn \__chemformula_generate_arrows:Nn { NV } - -\cs_new_protected:Npn \__chemformula_detect_arrows:n #1 - { - \bool_set_false:N \l__chemformula_is_arrow_bool - \prop_map_inline:Nn \l__chemformula_arrows_code_prop - { - \__chemformula_sanitize:Nn \l__chemformula_tmpa_tl { ##1 } - \tl_if_in:nVT { #1 } \l__chemformula_tmpa_tl - { \bool_set_true:N \l__chemformula_is_arrow_bool } - } - } - -% -------------------------------------------------------------------------- -% compound names -\cs_new:Npn \__chemformula_name_cmpd:w - { \peek_meaning:NTF ( { \chname } { ! } } - -\NewDocumentCommand \chname { R(){}R(){} } - { \chemformula_chwritebelow:nn { #1 } { #2 } } - -\cs_new:Npn \chemformula_chwritebelow:nn #1#2 - { -% \group_begin: -% \__chemformula_reset:Nn \l__chemformula_tmpa_tl { #1 } - \c_math_toggle_token - \underset - { - \bool_if:NF \l__chemformula_name_width_bool - { - \chemformula_dim_to_width:Nn \l__chemformula_name_dim - { \l__chemformula_name_format_tl #1 } - } - \parbox - { \dim_use:N \l__chemformula_name_dim } - { \l__chemformula_name_format_tl #1 } - } - { \text { \strut #2 } } - \c_math_toggle_token -% \group_end: - } - -\cs_new_protected:Npn \__chemformula_generate_name:Nn #1#2 - { - \__chemformula_sanitize:Nn \l__chemformula_tmpa_tl { #2 } - \tl_if_in:VnT \l__chemformula_tmpa_tl { ! } - { - \tl_replace_all:Nnn \l__chemformula_tmpa_tl - { ! } - { \__chemformula_name_cmpd:w } - } - \tl_set_eq:NN #1 \l__chemformula_tmpa_tl - } -\cs_generate_variant:Nn \__chemformula_generate_name:Nn { NV } - -\cs_new_protected:Npn \__chemformula_detect_name:n #1 - { - \bool_set_false:N \l__chemformula_is_name_bool - \tl_set:Nn \l__chemformula_tmpa_tl { #1 } - \tl_if_in:VnT \l__chemformula_tmpa_tl { ! } - { \bool_set_true:N \l__chemformula_is_name_bool } - } - -% -------------------------------------------------------------------------- -% parsing input -\prop_put:Nnn \l__chemformula_cmpd_prop { 0 } { \chemformula_subscript:n { 0 } } -\prop_put:Nnn \l__chemformula_cmpd_prop { 1 } { \chemformula_subscript:n { 1 } } -\prop_put:Nnn \l__chemformula_cmpd_prop { 2 } { \chemformula_subscript:n { 2 } } -\prop_put:Nnn \l__chemformula_cmpd_prop { 3 } { \chemformula_subscript:n { 3 } } -\prop_put:Nnn \l__chemformula_cmpd_prop { 4 } { \chemformula_subscript:n { 4 } } -\prop_put:Nnn \l__chemformula_cmpd_prop { 5 } { \chemformula_subscript:n { 5 } } -\prop_put:Nnn \l__chemformula_cmpd_prop { 6 } { \chemformula_subscript:n { 6 } } -\prop_put:Nnn \l__chemformula_cmpd_prop { 7 } { \chemformula_subscript:n { 7 } } -\prop_put:Nnn \l__chemformula_cmpd_prop { 8 } { \chemformula_subscript:n { 8 } } -\prop_put:Nnn \l__chemformula_cmpd_prop { 9 } { \chemformula_subscript:n { 9 } } -\prop_put:Nnn \l__chemformula_cmpd_prop { * } { \chemformula_star_adduct: } -\prop_put:Nnn \l__chemformula_cmpd_prop { . } { \chemformula_adduct: } -\prop_put:Nnn \l__chemformula_cmpd_prop { - } { \chemformula_single_bond: } -\prop_put:Nnn \l__chemformula_cmpd_prop { = } { \chemformula_double_bond: } -\prop_put:Nnn \l__chemformula_cmpd_prop { + } { \chemformula_triple_bond: } -\prop_put:Nnn \l__chemformula_cmpd_prop { ' } { \chemformula_prime: } - -% numbers -\prop_put:Nnn \l__chemformula_numbers_prop { 0 } { 0 } -\prop_put:Nnn \l__chemformula_numbers_prop { 1 } { 1 } -\prop_put:Nnn \l__chemformula_numbers_prop { 2 } { 2 } -\prop_put:Nnn \l__chemformula_numbers_prop { 3 } { 3 } -\prop_put:Nnn \l__chemformula_numbers_prop { 4 } { 4 } -\prop_put:Nnn \l__chemformula_numbers_prop { 5 } { 5 } -\prop_put:Nnn \l__chemformula_numbers_prop { 6 } { 6 } -\prop_put:Nnn \l__chemformula_numbers_prop { 7 } { 7 } -\prop_put:Nnn \l__chemformula_numbers_prop { 8 } { 8 } -\prop_put:Nnn \l__chemformula_numbers_prop { 9 } { 9 } - -% behaviour in a charge -\prop_put:Nnn \l__chemformula_charge_prop { 0 } { \chemformula_charge_style:n { 0 } } -\prop_put:Nnn \l__chemformula_charge_prop { 1 } { \chemformula_charge_style:n { 1 } } -\prop_put:Nnn \l__chemformula_charge_prop { 2 } { \chemformula_charge_style:n { 2 } } -\prop_put:Nnn \l__chemformula_charge_prop { 3 } { \chemformula_charge_style:n { 3 } } -\prop_put:Nnn \l__chemformula_charge_prop { 4 } { \chemformula_charge_style:n { 4 } } -\prop_put:Nnn \l__chemformula_charge_prop { 5 } { \chemformula_charge_style:n { 5 } } -\prop_put:Nnn \l__chemformula_charge_prop { 6 } { \chemformula_charge_style:n { 6 } } -\prop_put:Nnn \l__chemformula_charge_prop { 7 } { \chemformula_charge_style:n { 7 } } -\prop_put:Nnn \l__chemformula_charge_prop { 8 } { \chemformula_charge_style:n { 8 } } -\prop_put:Nnn \l__chemformula_charge_prop { 9 } { \chemformula_charge_style:n { 9 } } -\prop_put:Nnn \l__chemformula_charge_prop { + } { \chemformula_plus: } -\prop_put:Nnn \l__chemformula_charge_prop { - } { \chemformula_minus: } -\prop_put:Nnn \l__chemformula_charge_prop { . } { \chemformula_radical_or_decimal: } -\prop_put:Nnn \l__chemformula_charge_prop { , } { \chemformula_decimal: } - -% stoichiometric factors -\prop_put:Nnn \l__chemformula_stoich_prop { 0 } { 0 } -\prop_put:Nnn \l__chemformula_stoich_prop { 1 } { 1 } -\prop_put:Nnn \l__chemformula_stoich_prop { 2 } { 2 } -\prop_put:Nnn \l__chemformula_stoich_prop { 3 } { 3 } -\prop_put:Nnn \l__chemformula_stoich_prop { 4 } { 4 } -\prop_put:Nnn \l__chemformula_stoich_prop { 5 } { 5 } -\prop_put:Nnn \l__chemformula_stoich_prop { 6 } { 6 } -\prop_put:Nnn \l__chemformula_stoich_prop { 7 } { 7 } -\prop_put:Nnn \l__chemformula_stoich_prop { 8 } { 8 } -\prop_put:Nnn \l__chemformula_stoich_prop { 9 } { 9 } -\prop_put:Nnn \l__chemformula_stoich_prop { . } { \chemformula_decimal: } -\prop_put:Nnn \l__chemformula_stoich_prop { , } { \chemformula_decimal: } -\prop_put:Nnn \l__chemformula_stoich_prop { / } { / } -\prop_put:Nnn \l__chemformula_stoich_prop { _ } { _ } -\prop_put:Nnn \l__chemformula_stoich_prop { ( } { ( } -\prop_put:Nnn \l__chemformula_stoich_prop { ) } { ) } - -\prop_put:Nnn \l__chemformula_no_stoich_prop { . } { } -\prop_put:Nnn \l__chemformula_no_stoich_prop { , } { } -\prop_put:Nnn \l__chemformula_no_stoich_prop { / } { } -\prop_put:Nnn \l__chemformula_no_stoich_prop { _ } { } -\prop_put:Nnn \l__chemformula_no_stoich_prop { ( } { } -\prop_put:Nnn \l__chemformula_no_stoich_prop { ) } { } - -\prop_put:Nnn \l__chemformula_kroegervink_prop { 0 } { \chemformula_charge_style:n { 0 } } -\prop_put:Nnn \l__chemformula_kroegervink_prop { 1 } { \chemformula_charge_style:n { 1 } } -\prop_put:Nnn \l__chemformula_kroegervink_prop { 2 } { \chemformula_charge_style:n { 2 } } -\prop_put:Nnn \l__chemformula_kroegervink_prop { 3 } { \chemformula_charge_style:n { 3 } } -\prop_put:Nnn \l__chemformula_kroegervink_prop { 4 } { \chemformula_charge_style:n { 4 } } -\prop_put:Nnn \l__chemformula_kroegervink_prop { 5 } { \chemformula_charge_style:n { 5 } } -\prop_put:Nnn \l__chemformula_kroegervink_prop { 6 } { \chemformula_charge_style:n { 6 } } -\prop_put:Nnn \l__chemformula_kroegervink_prop { 7 } { \chemformula_charge_style:n { 7 } } -\prop_put:Nnn \l__chemformula_kroegervink_prop { 8 } { \chemformula_charge_style:n { 8 } } -\prop_put:Nnn \l__chemformula_kroegervink_prop { 9 } { \chemformula_charge_style:n { 9 } } -\prop_put:Nnn \l__chemformula_kroegervink_prop { + } { \chemformula_plus: } -\prop_put:Nnn \l__chemformula_kroegervink_prop { - } { \chemformula_minus: } -\prop_put:Nnn \l__chemformula_kroegervink_prop { . } { \chemformula_radical_or_decimal: } -\prop_put:Nnn \l__chemformula_kroegervink_prop { , } { \chemformula_decimal: } -\prop_put:Nnn \l__chemformula_kroegervink_prop { ' } { \chemformula_kroegervink_negative: } -\prop_put:Nnn \l__chemformula_kroegervink_prop { x } { \chemformula_kroegervink_neutral: } -\prop_put:Nnn \l__chemformula_kroegervink_prop { * } { \chemformula_kroegervink_positive: } -\prop_put:Nnn \l__chemformula_kroegervink_prop { . } { \chemformula_kroegervink_positive: } - -% -------------------------------------------------------------------------- -% bonds: -\cs_new:Npn \chemformula@bondlength - { \l__chemformula_bond_dim } - -\cs_new:Npn \chemformula_single_bond: - { - \bool_if:NTF \l__chemformula_sup_bool - { \chemformula_minus: } - { \chemformula_bond:n { single } } - } - -\cs_new:Npn \chemformula_double_bond: - { \chemformula_bond:n { double } } - -\cs_new:Npn \chemformula_triple_bond: - { \chemformula_bond:n { triple } } - -\cs_new_protected:Npn \chemformula_bond:n #1 - { - \chemformula_skip_nobreak:N \l__chemformula_bond_space_dim - \group_begin: - \chemformula_tikzexternaldisable: - \chemformula_tikz:nn - { - inner~sep = 0pt , - outer~sep = 0pt , - text~height = 1em , - baseline = (chemformula-bond-ground.base) - } - { - \draw node[draw=none,minimum~height=1em,minimum~width=0] - (chemformula-bond-ground) at (0pt,0pt) {}; - \draw (chemformula-bond-ground) ++ (0pt,-.1716em) - coordinate (chemformula-bond-start) ; - \draw (chemformula-bond-start) ++(\l__chemformula_bond_dim ,0pt) - coordinate (chemformula-bond-end) ; - \tl_if_blank:nTF { #1 } - { \__chemformula_bond_draw:n { single } } - { \__chemformula_bond_draw:n { #1 } } - } - \group_end: - \chemformula_skip_nobreak_penalty:Nn - \l__chemformula_bond_space_dim - { \l__chemformula_bond_penalty_tl } - } - -\cs_new_protected:Npn \__chemformula_bond_draw:n #1 - { - \__chemformula_reset:Nn \l__chemformula_tmpa_tl { #1 } - % \tl_set_rescan:Nnn \l__chemformula_tmpa_tl {} { #1 } - \prop_get:NV \l__chemformula_bonds_prop - \l__chemformula_tmpa_tl - } - -\NewDocumentCommand \NewChemBond { mm } - { - \cs_if_exist:cTF { chemformula_bond_type_#1: } - { \msg_error:nnn { chemformula } { new-bond } { #1 } } - { - \cs_new:cpn { chemformula_bond_type_#1: } {} - \prop_put:Nnn \l__chemformula_bonds_prop { #1 } { #2 } - } - } - -\NewDocumentCommand \DeclareChemBond { mm } - { - \cs_if_exist:cF { chemformula_bond_type_#1: } - { \cs_new:cpn { chemformula_bond_type_#1: } {} } - \prop_put:Nnn \l__chemformula_bonds_prop { #1 } { #2 } - } - -\NewDocumentCommand \NewChemBondAlias { mm } - { - \cs_if_exist:cTF { chemformula_bond_type_#2: } - { - \cs_if_exist:cTF { chemformula_bond_type_#1: } - { \msg_error:nnn { chemformula } { new-bond } { #1 } } - { \cs_new:cpn { chemformula_bond_type_#1: } {} } - \prop_get:NnN \l__chemformula_bonds_prop { #2 } \l__chemformula_tmpa_tl - \prop_put:Nno \l__chemformula_bonds_prop { #1 } { \l__chemformula_tmpa_tl } - } - { \msg_error:nnnn { chemformula } { bond-alias } { #1 } { #2 } } - } - -\NewDocumentCommand \DeclareChemBondAlias { mm } - { - \cs_if_exist:cTF { chemformula_bond_type_#2: } - { - \cs_if_exist:cF { chemformula_bond_type_#1: } - { \cs_new:cpn { chemformula_bond_type_#1: } {} } - \prop_get:NnN \l__chemformula_bonds_prop { #2 } \l__chemformula_tmpa_tl - \prop_put:Nno \l__chemformula_bonds_prop { #1 } { \l__chemformula_tmpa_tl } - } - { \msg_error:nnnn { chemformula } { bond-alias } { #1 } { #2 } } - } - -\NewDocumentCommand \RenewChemBond { mm } - { - \cs_if_exist:cTF { chemformula_bond_type_#1: } - { \prop_put:Nnn \l__chemformula_bonds_prop { #1 } { #2 } } - { \msg_error:nnn { chemformula } { renew-bond } { #1 } } - } - -\NewDocumentCommand \ShowChemBond { m } - { - \prop_get:NnN \l__chemformula_bonds_prop { #1 } \l__chemformula_tmpa_tl - \tl_to_str:N \l__chemformula_tmpa_tl - } - -\NewDocumentCommand \bond { m } - { \chemformula_bond:n { #1 } } - -% now let's declare some default bonds: -\NewChemBond{single} - { \draw[chembond] (chemformula-bond-start) -- (chemformula-bond-end) ; } -\NewChemBondAlias{normal}{single} -\NewChemBondAlias{sb}{single} - -\NewChemBond{semisingle} - { \draw[chembond,densely~dotted] (chemformula-bond-start) -- (chemformula-bond-end) ; } -\NewChemBondAlias{dotted}{semisingle} - -\NewChemBond{double} - { - \draw (chemformula-bond-start) ++ (0pt,.0858em) coordinate (double-start-up) ; - \draw (chemformula-bond-end) ++ (0pt,.0858em) coordinate (double-end-up) ; - \draw (chemformula-bond-start) ++ (0pt,-.0858em) coordinate (double-start-down) ; - \draw (chemformula-bond-end) ++ (0pt,-.0858em) coordinate (double-end-down) ; - \draw[chembond] - (double-start-down) -- (double-end-down) - (double-start-up) -- (double-end-up) ; - } -\NewChemBondAlias{db}{double} - -\NewChemBond{semidouble} - { - \draw (chemformula-bond-start) ++ (0pt,.0858em) coordinate (double-start-up) ; - \draw (chemformula-bond-end) ++ (0pt,.0858em) coordinate (double-end-up) ; - \draw (chemformula-bond-start) ++ (0pt,-.0858em) coordinate (double-start-down) ; - \draw (chemformula-bond-end) ++ (0pt,-.0858em) coordinate (double-end-down) ; - \draw[chembond] (double-start-down) -- (double-end-down) ; - \draw[chembond,densely~dotted] (double-start-up) -- (double-end-up) ; - } - -\NewChemBondAlias{deloc}{semidouble} -% \DeclareChemBondAlias{deloc2}{semidouble} - -\NewChemBond{triple} - { - \draw (chemformula-bond-start) ++ (0pt,.1287em) coordinate (triple-start-up) ; - \draw (chemformula-bond-end) ++ (0pt,.1287em) coordinate (triple-end-up) ; - \draw (chemformula-bond-start) ++ (0pt,-.1287em) coordinate (triple-start-down) ; - \draw (chemformula-bond-end) ++ (0pt,-.1287em) coordinate (triple-end-down) ; - \draw[chembond] - (triple-start-down) -- (triple-end-down) - (chemformula-bond-start) -- (chemformula-bond-end) - (triple-start-up) -- (triple-end-up) ; - } -\NewChemBondAlias{tp}{triple} - -\NewChemBond{semitriple} - { - \draw (chemformula-bond-start) ++ (0pt,.1287em) coordinate (triple-start-up) ; - \draw (chemformula-bond-end) ++ (0pt,.1287em) coordinate (triple-end-up) ; - \draw (chemformula-bond-start) ++ (0pt,-.1287em) coordinate (triple-start-down) ; - \draw (chemformula-bond-end) ++ (0pt,-.1287em) coordinate (triple-end-down) ; - \draw[chembond] - (triple-start-down) -- (triple-end-down) - (chemformula-bond-start) -- (chemformula-bond-end) ; - \draw[chembond,densely~dotted] (triple-start-up) -- (triple-end-up) ; - } -\NewChemBondAlias{tdeloc}{semitriple} - -\NewChemBond{coordright} - { \draw[chembond,butt~cap->] (chemformula-bond-start) -- (chemformula-bond-end) ; } -\NewChemBondAlias{co>}{coordright} - -\NewChemBond{coordleft} - { \draw[chembond,<-butt~cap] (chemformula-bond-start) -- (chemformula-bond-end) ; } -\NewChemBondAlias{<co}{coordleft} - -% -------------------------------------------------------------------------- -% sub- and superscripts -\cs_new:Npn \__chemformula_number_style:n #1 - { - \bool_if:NTF \l__chemformula_number_style_math_bool - { \ensuremath { #1 } } - { \ensuremath { \text { #1 } } } - } -\cs_generate_variant:Nn \__chemformula_number_style:n { V } - -\cs_new_protected:Npn \chemformula_charge_style:n #1 - { - \bool_if:NTF \l__chemformula_charge_style_math_bool - { \ensuremath { #1 } } - { \ensuremath { \text { #1 } } } - } -\cs_generate_variant:Nn \chemformula_charge_style:n { V } - -% subscripts -% remove double or nested sub- and superscripts -\cs_new_protected:Npn \chemformula_subscript:n #1 - { - \chemformula_nobreak: - \tl_if_eq:nnTF { #1 }{ \chemformula_superscript:n } - { \__chemformula_subscript:n } - { - \tl_if_eq:nnTF { #1 }{ \chemformula_subscript:n } - { \__chemformula_subscript:n } - { - \tl_set:Nn \l__chemformula_tmpc_tl { #1 } - \tl_if_in:nnT { #1 } { \chemformula_subscript:n } - { \tl_remove_all:Nn \l__chemformula_tmpc_tl { \chemformula_subscript:n } } - \tl_if_in:nnT { #1 } { \chemformula_superscript:n } - { \tl_remove_all:Nn \l__chemformula_tmpc_tl { \chemformula_superscript:n } } - \__chemformula_subscript:V \l__chemformula_tmpc_tl - } - } - } - -% handle subscripts -\cs_new_protected:Npn \__chemformula_subscript:n #1 - { - \tl_put_right:Nn \l__chemformula_subscript_tl { #1 } - \__chemformula_clean_subscript: - % if a subscript follows just store and do nothing else - \peek_meaning:NF \chemformula_subscript:n - { - % if a superscript follows store and do nothing else - % if something else follows both sub- and superscript - \peek_meaning:NF \chemformula_superscript:n - { - \__chemformula_measure_subscript:V \l__chemformula_subscript_tl - \__chemformula_measure_superscript:V \l__chemformula_superscript_tl - \__chemformula_use_sub_and_superscript: - } - } - } -\cs_generate_variant:Nn \__chemformula_subscript:n { V } - -\cs_new_protected:Npn \__chemformula_clean_subscript: - { - \tl_replace_all:Nnn \l__chemformula_subscript_tl - { \chemformula_single_bond: } { \chemformula_minus: } - \tl_replace_all:Nnn \l__chemformula_subscript_tl - { \chemformula_triple_bond: } {\chemformula_plus: } - \tl_replace_all:Nnn \l__chemformula_subscript_tl - { \chemformula_adduct: } { . } - \tl_replace_all:Nnn \l__chemformula_subscript_tl - { \chemformula_star_adduct: } { * } - } - -\cs_new_protected:Npn \__chemformula_subscript_raise:N #1 - { - \hbox_set:Nn \l__chemformula_tmpa_box - { \c_math_toggle_token \scriptstyle Hg \c_math_toggle_token } - \hbox_set:Nn \l__chemformula_tmpb_box { Hg } - \dim_set:Nn #1 - { - - \box_ht:N \l__chemformula_tmpa_box - + .4 \box_ht:N \l__chemformula_tmpb_box - + \l__chemformula_subscript_shift_additional_tl - } - \tex_raise:D #1 - } - -\cs_new_protected:Npn \__chemformula_subscript_write:n #1 - { - \group_begin: - \tl_set_eq:NN \chemformula_subscript:n \use:n - \tl_set_eq:NN \chemformula_superscript:n \use:n - \__chemformula_subscript_raise:N \l__chemformula_subscript_shift_dim - \hbox:n - { - \c_math_toggle_token - \scriptstyle - \prop_get:NoNTF \l__chemformula_numbers_prop - { #1 } \l__chemformula_tmpa_tl - { \__chemformula_number_style:V \l__chemformula_tmpa_tl } - { \__chemformula_number_style:n { #1 } } - \c_math_toggle_token - } - \group_end: - } -\cs_generate_variant:Nn \__chemformula_subscript_write:n { V } - -\cs_new_protected:Npn \__chemformula_measure_subscript:n #1 - { - \hbox_set:Nn \l__chemformula_tmpa_box - { \__chemformula_subscript_write:n { #1 } } - \dim_set:Nn \l__chemformula_subscript_dim - { -\box_wd:N \l__chemformula_tmpa_box } - \box_clear:N \l__chemformula_tmpa_box - } -\cs_generate_variant:Nn \__chemformula_measure_subscript:n { V } - -% superscripts -% remove double or nested sub- and superscripts -\cs_new_protected:Npn \chemformula_superscript:n #1 - { - \chemformula_nobreak: - \tl_if_eq:nnTF { #1 } { \chemformula_superscript:n } - { \__chemformula_superscript:n } - { - \tl_if_eq:nnTF { #1 } { \chemformula_subscript:n } - { \__chemformula_superscript:n } - { - \tl_set:Nn \l__chemformula_tmpc_tl { #1 } - \tl_if_in:nnT { #1 } { \chemformula_subscript:n } - { \tl_remove_all:Nn \l__chemformula_tmpc_tl { \chemformula_subscript:n } } - \tl_if_in:nnT { #1 } { \chemformula_superscript:n } - { \tl_remove_all:Nn \l__chemformula_tmpc_tl { \chemformula_superscript:n } } - \__chemformula_superscript:V \l__chemformula_tmpc_tl - } - } - } - -% handle superscripts -\cs_new_protected:Npn \__chemformula_superscript:n #1 - { - \tl_put_right:Nn \l__chemformula_superscript_tl { #1 } - \__chemformula_clean_superscript: - \peek_meaning:NF \chemformula_superscript:n - { - \peek_meaning:NF \chemformula_subscript:n - { - \__chemformula_measure_subscript:V \l__chemformula_subscript_tl - \__chemformula_measure_superscript:V \l__chemformula_superscript_tl - \__chemformula_use_sub_and_superscript: - } - } - } -\cs_generate_variant:Nn \__chemformula_superscript:n { V } - -\cs_new_protected:Npn \__chemformula_clean_superscript: - { - \tl_replace_all:Nnn \l__chemformula_superscript_tl - { \chemformula_single_bond: } { \chemformula_minus: } - \tl_replace_all:Nnn \l__chemformula_superscript_tl - { - } { \chemformula_minus: } - \tl_replace_all:Nnn \l__chemformula_superscript_tl - { \chemformula_triple_bond: } { \chemformula_plus: } - \tl_replace_all:Nnn \l__chemformula_superscript_tl - { + } { \chemformula_plus: } - \tl_replace_all:Nnn \l__chemformula_superscript_tl - { \chemformula_adduct: } { \chemformula_radical_or_decimal: } - \bool_if:NTF \l__chemformula_kroegervink_bool - { - \tl_replace_all:Nnn \l__chemformula_superscript_tl - { ' } { \chemformula_kroegervink_negative: } - \tl_replace_all:Nnn \l__chemformula_superscript_tl - { \chemformula_adduct: } { . } - \tl_replace_all:Nnn \l__chemformula_superscript_tl - { \chemformula_star_adduct: } { * } - \tl_replace_all:Nnn \l__chemformula_superscript_tl - { \chemformula_radical_or_decimal: } { . } - \tl_replace_all:Nnn \l__chemformula_superscript_tl - { \chemformula_prime: } { \chemformula_kroegervink_negative: } - \tl_replace_all:Nnn \l__chemformula_superscript_tl - { * } { \chemformula_kroegervink_positive: } - \tl_replace_all:Nnn \l__chemformula_superscript_tl - { . } { \chemformula_kroegervink_positive: } - } - { - \tl_replace_all:Nnn \l__chemformula_superscript_tl - { \chemformula_star_adduct: } { * } - \tl_replace_all:Nnn \l__chemformula_superscript_tl - { . } { \chemformula_radical_or_decimal: } - \tl_replace_all:Nnn \l__chemformula_superscript_tl - { , } { \chemformula_decimal: } - } - } - -\cs_new_protected:Npn \__chemformula_superscript_raise:N #1 - { - \hbox_set:Nn \l__chemformula_tmpa_box - { \c_math_toggle_token \scriptstyle Hg \c_math_toggle_token } - \hbox_set:Nn \l__chemformula_tmpb_box { Hg } - \dim_set:Nn #1 - { - + \box_ht:N \l__chemformula_tmpb_box - - .5 \box_ht:N \l__chemformula_tmpa_box - + \l__chemformula_superscript_shift_additional_tl - } - \tex_raise:D #1 - } - -\cs_new_protected:Npn \__chemformula_superscript_write:n #1 - { - \group_begin: - \tl_set_eq:NN \chemformula_subscript:n \use:n - \tl_set_eq:NN \chemformula_superscript:n \use:n - \__chemformula_superscript_raise:N \l__chemformula_superscript_shift_dim - \hbox:n - { - \c_math_toggle_token - \scriptstyle - \bool_if:NTF \l__chemformula_kroegervink_bool - { - \prop_get:NoNTF \l__chemformula_kroegervink_prop - { #1 } \l__chemformula_tmpa_tl - { \tl_use:N \l__chemformula_tmpa_tl } - { \chemformula_charge_style:n { #1 } } - } - { - \prop_get:NoNTF \l__chemformula_charge_prop - { #1 } \l__chemformula_tmpa_tl - { \tl_use:N \l__chemformula_tmpa_tl } - { \chemformula_charge_style:n { #1 } } - } - \c_math_toggle_token - } - \group_end: - } -\cs_generate_variant:Nn \__chemformula_superscript_write:n { V } - -\cs_new_protected:Npn \__chemformula_measure_superscript:n #1 - { - \hbox_set:Nn \l__chemformula_tmpa_box - { \__chemformula_superscript_write:n { #1 } } - \dim_set:Nn \l__chemformula_superscript_dim - { -\box_wd:N \l__chemformula_tmpa_box } - \box_clear:N \l__chemformula_tmpa_box - } -\cs_generate_variant:Nn \__chemformula_measure_superscript:n { V } - -% typeset both sub- and superscripts -\cs_new_protected:Npn \__chemformula_use_sub_and_superscript: - { - \group_begin: - % No shift for excited state - \exp_args:No \tl_if_eq:nnT { \l__chemformula_superscript_tl } { * } - { - \bool_set_false:N \l__chemformula_charge_full_shift_bool - \dim_zero:N \l__chemformula_charge_shift_dim - } - % no shift for Kroeger Vink notation - \bool_if:NT \l__chemformula_kroegervink_bool - { - \bool_set_false:N \l__chemformula_charge_full_shift_bool - \dim_zero:N \l__chemformula_charge_shift_dim - } - % align to the right if isotope else to the left - \bool_if:NTF \l__chemformula_is_isotope_bool - { - \tl_if_blank:VF \l__chemformula_superscript_tl - { - \dim_compare:nT - { \l__chemformula_subscript_dim < \l__chemformula_superscript_dim } - { - \skip_horizontal:n { -\l__chemformula_subscript_dim } - \skip_horizontal:N \l__chemformula_superscript_dim - } - } - } - { - % add hshift to the superscript if there also is a subscript - \tl_if_blank:VF \l__chemformula_superscript_tl - { - \tl_if_blank:VF \l__chemformula_subscript_tl - { - \bool_if:NTF \l__chemformula_charge_full_shift_bool - { \skip_horizontal:n { -\l__chemformula_subscript_dim } } - { \skip_horizontal:N \l__chemformula_charge_shift_dim } - } - } - } - % typeset superscript - \tl_if_blank:VF \l__chemformula_superscript_tl - { - \__chemformula_superscript_write:V \l__chemformula_superscript_tl - % skip back for the subscript - \tl_if_blank:VF \l__chemformula_subscript_tl - { - \bool_if:NTF \l__chemformula_is_isotope_bool - { \skip_horizontal:N \l__chemformula_subscript_dim } - { - \skip_horizontal:N \l__chemformula_superscript_dim - \bool_if:NTF \l__chemformula_charge_full_shift_bool - { \skip_horizontal:N \l__chemformula_subscript_dim } - { - \skip_horizontal:n - { -\l__chemformula_charge_shift_dim } - } - } - } - } - % typeset subscript - \tl_if_blank:VF \l__chemformula_subscript_tl - { \__chemformula_subscript_write:V \l__chemformula_subscript_tl } - \bool_if:NF \l__chemformula_is_isotope_bool - { - \dim_zero:N \l__chemformula_tmpa_dim - \bool_if:NTF \l__chemformula_charge_full_shift_bool - { - \tl_if_blank:VF \l__chemformula_subscript_tl - { \dim_set:Nn \l__chemformula_tmpa_dim - { - \l__chemformula_superscript_dim } } - } - { - \tl_if_blank:VF \l__chemformula_superscript_tl - { - \tl_if_blank:VF \l__chemformula_subscript_tl - { - \dim_set:Nn \l__chemformula_tmpa_dim - { - \l__chemformula_charge_shift_dim - - \l__chemformula_superscript_dim - + \l__chemformula_subscript_dim - } - } - } - } - \dim_compare:nT { \l__chemformula_tmpa_dim > 0pt } - { \skip_horizontal:N \l__chemformula_tmpa_dim } - } - \group_end: - % clean up - \bool_set_false:N \l__chemformula_is_isotope_bool - \tl_clear:N \l__chemformula_subscript_tl - \tl_clear:N \l__chemformula_superscript_tl - } - -% -------------------------------------------------------------------------- -% read the input -\cs_new_protected:Npn \chemformula_input:n #1 - { - \__chemformula_save_catcodes: - \__chemformula_sanitize:Nn \l__chemformula_chemformula_tmpa_tl { #1 } - \chemformula_input_escape_text:V \l__chemformula_chemformula_tmpa_tl - \chemformula_input_escape_math:n { #1 } - \chemformula_input_stoich:n { #1 } - \__chemformula_clean_chemmacros:V \l__chemformula_chemformula_tmpa_tl - \chemformula_input_cmpd:VN - \l__chemformula_chemformula_tmpa_tl \l__chemformula_input_tl - \chemformula_input_arrow:n { #1 } - \chemformula_input_name:n { #1 } - \chemformula_input_plus:n { #1 } - \chemformula_input_up:n { #1 } - \chemformula_input_down:n { #1 } - } - -% -------------------------------------------------------------------------- -% set options for next compound: -\cs_new_protected:Npn \chemformula_input_options:n #1 - { - % \makeatother - \char_set_catcode_other:N \@ - \tl_set_rescan:Nnn \l__chemformula_tmpa_tl - { \char_set_catcode_letter:N \@ } - { #1 } - \tl_if_in:VnTF \l__chemformula_tmpa_tl { @ } - { - \bool_set_true:N \l__chemformula_options_bool - \bool_set_true:N \l__chemformula_is_option_bool - \tl_remove_all:Nn \l__chemformula_tmpa_tl { @ } - \exp_last_unbraced:Nno - \tl_set:Nn \l__chemformula_internal_options_tl - { \l__chemformula_tmpa_tl } - } - { \bool_set_false:N \l__chemformula_is_option_bool } - } - -% -------------------------------------------------------------------------- -% input stoichiometric factors -\cs_new:Npn \chemformula_decimal: { { \l__chemformula_decimal_output_tl } } - -\cs_new_protected:Npn \chemformula_input_stoich:n #1 - { - \bool_set_true:N \l__chemformula_stoich_bool - % the factor consists only of a parenthesis or a decimal marcer: - \bool_set_true:N \l__chemformula_no_stoich_bool - \tl_map_inline:nn { #1 } - { - \prop_get:NnNF \l__chemformula_no_stoich_prop { ##1 } \l__chemformula_tmpa_tl - { \bool_set_false:N \l__chemformula_no_stoich_bool } - } - \bool_if:NF \l__chemformula_no_stoich_bool - { - \tl_map_inline:nn { #1 } - { - \prop_get:NnNTF \l__chemformula_stoich_prop { ##1 } \l__chemformula_tmpa_tl - { - \bool_if:NT \l__chemformula_stoich_bool - { \tl_put_right:NV \l__chemformula_stoich_tl \l__chemformula_tmpa_tl } - } - { \bool_set_false:N \l__chemformula_stoich_bool } - } - } - \bool_if:NTF \l__chemformula_stoich_bool - { - \tl_if_blank:VF \l__chemformula_stoich_tl - { - \tl_put_left:Nn \l__chemformula_stoich_tl { \q_mark } - \__chemformula_sanitize:NV - \l__chemformula_stoich_tl - \l__chemformula_stoich_tl - \__chemformula_print_stoich:V - \l__chemformula_stoich_tl - } - } - { \tl_clear:N \l__chemformula_stoich_tl } - } - -\cs_new:Npn \chemformula_bm:n #1 { #1 } - -\cs_new:Npn \__chemformula_print_stoich:n #1 - { \chemformula_parse_stoich:n { #1 } } -\cs_generate_variant:Nn \__chemformula_print_stoich:n { V } - -\cs_new_protected:Npn \chemformula_parse_stoich:n #1 - { \__chemformula_parse_stoich:w #1 \q_nil } - -\NewDocumentCommand \chstoich { m } - { \chemformula_parse_stoich:n { #1 } } - -\cs_new:Npn \__chemformula_parse_stoich:w \q_mark #1 \q_nil - { - \__chemformula_bool_set_if_first_last:Nnnn - \l__chemformula_stoich_is_iupac_bool { #1 } { ( } { ) } - \bool_if:NTF \l__chemformula_stoich_is_iupac_bool - { \__chemformula_parse_stoich_iupac:n { #1 } } - { \__chemformula_parse_stoich_regular:n { #1 } } - } - -\DeclareInstance { xfrac } { chemformula-text-frac } { text } - { - slash-left-kern = -.15em , - numerator-top-sep = 0pt , - slash-right-kern = -.15em - } - -\cs_new:Npn \__chemformula_parse_stoich_regular:n #1 - { - \tl_if_in:nnTF { #1 } { / } - { \__chemformula_parse_stoich_frac:n { #1 } } - { \__chemformula_parse_stoich_decimal:n { #1 } } - } - -\cs_new_protected:Npn \__chemformula_parse_stoich_decimal:n #1 - { - % get head: - \tl_set:Nx \l__chemformula_tmpa_tl { \tl_head:n { #1 } } - \tl_set:Nn \l__chemformula_tmpb_tl { \chemformula_decimal: } - % check if stoich starts with decimal-marker and add leading 0 if so: - \tl_if_eq:NNTF \l__chemformula_tmpa_tl \l__chemformula_tmpb_tl - { \tl_put_right:Nn \l__chemformula_input_tl { 0#1 } } - { \tl_put_right:Nn \l__chemformula_input_tl { #1 } } - } - -\cs_new:Npn \__chemformula_parse_stoich_frac:n #1 - { - \tl_if_in:nnTF { #1 } { _ } - { \__chemformula_parse_stoich_misc_frac:w #1 \q_nil } - { \__chemformula_parse_stoich_frac:w #1 \q_nil } - } - -\cs_new_protected:Npn \__chemformula_parse_stoich_frac:w #1/#2 \q_nil - { - \tl_put_right:Nn \l__chemformula_input_tl - { \__chemformula_frac:nn { #1 } { #2 } } - } - -\cs_new_protected:Npn \__chemformula_parse_stoich_misc_frac:w #1_#2/#3 \q_nil - { - \tl_put_right:Nn \l__chemformula_input_tl - { \__chemformula_misc_frac:nnn { #1 } { #2 } { #3 } } - } - -\cs_new_protected:Npn \__chemformula_parse_stoich_iupac:n #1 - { - \bool_if:NTF \l__chemformula_stoich_parse_iupac_bool - { \__chemformula_parse_stoich_iupac:w #1 \q_nil } - { \tl_put_right:Nn \l__chemformula_input_tl { #1 } } - } - -\cs_new:Npn \__chemformula_parse_stoich_iupac:w (#1) \q_nil - { - \tl_put_right:Nn \l__chemformula_input_tl { ( } - \__chemformula_parse_stoich_regular:n { #1 } - \tl_put_right:Nn \l__chemformula_input_tl { ) } - } - -\cs_new_eq:NN \chemformula_math_frac:nn \frac - -\cs_new:Npn \__chemformula_frac:nn #1#2 - { - \bool_if:NT \l__chemformula_xfrac_bool - { \sfrac[chemformula-text-frac]{#1}{#2} } - \bool_if:NT \l__chemformula_nicefrac_bool - { \nicefrac{#1}{#2} } - \bool_if:NT \l__chemformula_mathfrac_bool - { - \c_math_toggle_token - \chemformula_math_frac:nn { \text { #1 } } { \text { #2 } } - \c_math_toggle_token - } - } - -\cs_new:Npn \__chemformula_misc_frac:nnn #1#2#3 - { - \bool_if:NT \l__chemformula_xfrac_bool - { #1\sfrac[chemformula-text-frac]{#2}{#3} } - \bool_if:NT \l__chemformula_nicefrac_bool - { #1\nicefrac{#2}{#3} } - \bool_if:NT \l__chemformula_mathfrac_bool - { - #1 - \c_math_toggle_token - \chemformula_math_frac:nn { \text { #2 } } { \text { #3 } } - \c_math_toggle_token - } - } - -% -------------------------------------------------------------------------- -% input compounds -\cs_new_protected:Npn \chemformula_input_cmpd:nN #1#2 - { - \tl_if_blank:VTF \l__chemformula_stoich_tl - { - \tl_if_eq:nnT { #1 } { + } - { \bool_set_true:N \l__chemformula_is_plus_bool } - \tl_if_eq:nnT { #1 } { - } - { \bool_set_true:N \l__chemformula_is_plus_bool } - \tl_if_eq:nnT { #1 } { v } - { \bool_set_true:N \l__chemformula_is_down_bool } - \tl_if_eq:nnT { #1 } { ^ } - { \bool_set_true:N \l__chemformula_is_up_bool } - \__chemformula_detect_arrows:n { #1 } - \__chemformula_detect_name:n { #1 } - \chemformula_input_options:n { #1 } - \bool_if:NT \l__chemformula_is_option_bool - { - \tl_put_right:Nn #2 - { - \group_begin: - \keys_set:nV - { chemmacros / chemformula } - \l__chemformula_internal_options_tl - } - } - \bool_if:nT - { - !\l__chemformula_is_option_bool && - !\l__chemformula_is_plus_bool && - !\l__chemformula_is_down_bool && - !\l__chemformula_is_up_bool && - !\l__chemformula_is_arrow_bool && - !\l__chemformula_is_name_bool && - !\l__chemformula_first_last_text_bool && - !\l__chemformula_first_last_math_bool - } - { - \__chemformula_handle_sub_and_superscripts:nN { #1 } #2 - \bool_if:NT \l__chemformula_options_bool - { - \tl_put_right:Nn #2 - { - \group_end: - \tl_clear:N \l__chemformula_internal_options_tl - } - \bool_set_false:N \l__chemformula_options_bool - } - } - } - { - \tl_put_right:Nn #2 - { \chemformula_skip_nobreak:N \l__chemformula_stoich_space_skip } - \tl_clear:N \l__chemformula_stoich_tl - } - } -\cs_generate_variant:Nn \chemformula_input_cmpd:nN { V } - -\cs_new_protected:Npn \chemformula_font_inner: - { - \bool_if:NT \l__chemformula_fss_bool - { - \bool_if:NT \l__chemformula_fss_family_bool - { \fontfamily { \l__chemformula_font_family_tl } } - \bool_if:NT \l__chemformula_fss_series_bool - { \fontseries { \l__chemformula_font_series_tl } } - \bool_if:NT \l__chemformula_fss_shape_bool - { \fontshape { \l__chemformula_font_shape_tl } } - \selectfont - } - \bool_if:NT \l__chemformula_fontspec_bool - { \chemformula_font: } - \tl_use:N \l__chemformula_format_tl - \exp_args:No \tl_if_eq:nnTF { \f@series } { bx } - { \cs_set_eq:NN \chemformula_bm:n \bm } - { \cs_set:Nn \chemformula_bm:n { ##1 } } - } - -\cs_new:Npn \chemformula_font: {} -\cs_new:Npn \__chemformula_fontspec:n #1 - { - \tl_if_in:nnTF { #1 } { [ } - { \__chemformula_fontspec_aux:w #1 \q_stop } - { \__chemformula_fontspec_aux:w [] #1 \q_stop } - } - -\cs_new:Npn \__chemformula_fontspec_aux:w [#1]#2 \q_stop - { \newfontfamily \chemformula_font: [ #1 ] { #2 } } - -\cs_new_protected:Npn \__chemformula_save_catcodes: - { - \cs_gset_protected:Npx \__chemformula_restore: - { - \char_set_catcode:nn { 95 } { \char_value_catcode:n { 95 } }% _ - \char_set_catcode:nn { 58 } { \char_value_catcode:n { 58 } }% : - \char_set_catcode:nn { 94 } { \char_value_catcode:n { 94 } }% ^ - \char_set_catcode:nn { 123 } { \char_value_catcode:n { 123 } }% { - \char_set_catcode:nn { 125 } { \char_value_catcode:n { 125 } }% } - \char_set_catcode:nn { 35 } { \char_value_catcode:n { 35 } }% # - \char_set_catcode:nn { 33 } { \char_value_catcode:n { 33 } }% ! - \char_set_catcode:nn { 34 } { \char_value_catcode:n { 34 } }% " - \char_set_catcode:nn { 60 } { \char_value_catcode:n { 60 } }% < - \char_set_catcode:nn { 62 } { \char_value_catcode:n { 62 } }% > - } - } - -\cs_new_protected:Npn \__chemformula_sanitize:Nn #1#2 - { - \tl_set_rescan:Nnn #1 - { - % expl3 catcodes: - \char_set_catcode_letter:N \_ - \char_set_catcode_letter:N \: - % I've forgotten why I put this here: - \char_set_catcode_math_superscript:N \^ - % disable some of the specials (needed for sub- and superscripts): - \char_set_catcode_letter:N \{ - \char_set_catcode_letter:N \} - % this one seems not necessary any more: - % \char_set_catcode_letter:N \\ - \char_set_catcode_letter:N \# - % make the naming work with babel languages like French that make - % ! active: - \char_set_catcode_other:N \! - % make the naming work with babel languages like Spanish that make - % < and > active: - \char_set_catcode_other:N \> - \char_set_catcode_other:N \< - % ensure " is other: - \char_set_catcode_other:N \" - } - { #2 } - } -\cs_generate_variant:Nn \__chemformula_sanitize:Nn { NV } - -\cs_new_protected:Npn \__chemformula_prepare_output:N #1 - { - \tl_set_rescan:NnV #1 - { - \__chemformula_restore: - \ExplSyntaxOn - \makeatletter - } - #1 - } - -\cs_new_protected:Npn \__chemformula_reset:Nn #1#2 - { \tl_set_rescan:Nnn #1 { \__chemformula_restore: } { #2 } } -\cs_generate_variant:Nn \__chemformula_reset:Nn { NV } - -\cs_new_protected:Npn \__chemformula_handle_sub_and_superscripts:nN #1#2 - { - \__chemformula_sanitize:Nn \l__chemformula_tmpa_tl { #1 } - % let's see if the compound starts with a sub- or superscript: - \tl_if_in:xnT { \tl_head:V \l__chemformula_tmpa_tl } { ^ } - { - \tl_put_left:Nn \l__chemformula_tmpa_tl - { \bool_set_true:N \l__chemformula_is_isotope_bool } - } - \tl_if_in:xnT { \tl_head:V \l__chemformula_tmpa_tl } { _ } - { - \tl_put_left:Nn \l__chemformula_tmpa_tl - { \bool_set_true:N \l__chemformula_is_isotope_bool } - } - \exp_args:NNx \prop_if_in:NnT \l__chemformula_numbers_prop - { \tl_head:V \l__chemformula_tmpa_tl } - { - \tl_put_left:Nn \l__chemformula_tmpa_tl - { \bool_set_true:N \l__chemformula_is_isotope_bool } - } - \tl_if_in:VnT \l__chemformula_tmpa_tl { ^ } - { - \tl_replace_all:Nnn \l__chemformula_tmpa_tl { ^ } - { \chemformula_superscript:n } - } - \tl_if_in:VnT \l__chemformula_tmpa_tl { _ } - { - \tl_replace_all:Nnn \l__chemformula_tmpa_tl { _ } - { \chemformula_subscript:n } - } - \int_zero:N \l__chemformula_count_tokens_int - \tl_map_inline:Nn \l__chemformula_tmpa_tl - { - \int_incr:N \l__chemformula_count_tokens_int - \int_compare:nTF - { \l__chemformula_count_tokens_int = \tl_count:N \l__chemformula_tmpa_tl } - { - \tl_if_eq:nnTF { ##1 } { + } - { - \tl_put_right:Nn #2 - { \chemformula_superscript:n { \chemformula_plus: } } - } - { - \tl_if_eq:nnTF { ##1 } { - } - { - \tl_put_right:Nn #2 - { \chemformula_superscript:n { \chemformula_minus: } } - } - { - \prop_get:NnNTF \l__chemformula_cmpd_prop { ##1 } \l__chemformula_tmpb_tl - { \tl_put_right:NV #2 \l__chemformula_tmpb_tl } - { \tl_put_right:Nn #2 { ##1 } } - } - } - } - { - \prop_get:NnNTF \l__chemformula_cmpd_prop { ##1 } \l__chemformula_tmpb_tl - { \tl_put_right:NV #2 \l__chemformula_tmpb_tl } - { \tl_put_right:Nn #2 { ##1 } } - } - } - \bool_if:NT \l__chemformula_kroegervink_bool - { - \tl_replace_all:Nnn #2 - { \chemformula_prime: } - { \chemformula_superscript:n { \chemformula_prime: } } - } - } - -% -------------------------------------------------------------------------- -% clean up chemmacros commands: -\cs_new_protected:Npn \__chemformula_clean_chemmacros:n #1 - { - \cs_set:Nn \chemmacros_text:n - { \mode_if_math:TF { \text { ##1 } } { ##1 } } - \cs_set:Npn \chemmacros_xspace: {} - } -\cs_generate_variant:Nn \__chemformula_clean_chemmacros:n { V } - -% -------------------------------------------------------------------------- -% input "and" sign -\cs_new_protected:Npn \chemformula_input_plus:n #1 - { - \tl_if_eq:nnT { #1 } { + } - { - \tl_put_right:Nn \l__chemformula_input_tl - { - \chemformula_skip_nobreak:N \l__chemformula_plus_space_skip - + - \chemformula_skip_nobreak_penalty:Nn - \l__chemformula_plus_space_skip - { \l__chemformula_plus_penalty_tl } - } - } - \tl_if_eq:nnT { #1 } { - } - { - \tl_put_right:Nn \l__chemformula_input_tl - { - \chemformula_skip_nobreak:N \l__chemformula_plus_space_skip - \c_math_toggle_token - \c_math_toggle_token - \chemformula_skip_nobreak_penalty:Nn - \l__chemformula_plus_space_skip - { \l__chemformula_plus_penalty_tl } - } - } - \bool_set_false:N \l__chemformula_is_plus_bool - } - -% -------------------------------------------------------------------------- -% input escaping gas -\cs_new_protected:Npn \chemformula_input_up:n #1 - { - \group_begin: - % ensure ^ has catcode 7 - % (else chemmacros wouldn't work with e.g. `breqn') - \__chemformula_sanitize:Nn \g__chemformula_input_up_tl { #1 } - \char_set_catcode_math_superscript:N \^ - \__chemformula_input_up:V \g__chemformula_input_up_tl - } - -\cs_new_protected:Npn \__chemformula_input_up:n #1 - { - \tl_gclear:N \g__chemformula_input_up_tl - \tl_if_eq:nnT { #1 } { ^ } - { - \tl_gset:Nn \g__chemformula_input_up_tl - { \c_math_toggle_token \uparrow \c_math_toggle_token } - } - \group_end: - \tl_put_right:NV \l__chemformula_input_tl \g__chemformula_input_up_tl - \bool_set_false:N \l__chemformula_is_up_bool - } -\cs_generate_variant:Nn \__chemformula_input_up:n { V } - -% -------------------------------------------------------------------------- -% input precipitate -\cs_new_protected:Npn \chemformula_input_down:n #1 - { - \tl_if_eq:nnT { #1 } { v } - { - \tl_put_right:Nn \l__chemformula_input_tl - { \c_math_toggle_token \downarrow \c_math_toggle_token } - } - \bool_set_false:N \l__chemformula_is_down_bool - } - -% -------------------------------------------------------------------------- -% input arrow -\cs_new_protected:Npn \chemformula_input_arrow:n #1 - { - \bool_if:nT - { - \l__chemformula_is_arrow_bool && - !\l__chemformula_first_last_text_bool && - !\l__chemformula_first_last_math_bool - } - { - \__chemformula_generate_arrows:Nn \l__chemformula_arrow_tmp_tl { #1 } - \tl_put_right:NV \l__chemformula_input_tl \l__chemformula_arrow_tmp_tl - } - \bool_set_false:N \l__chemformula_is_arrow_bool - } -\cs_generate_variant:Nn \chemformula_input_arrow:n { o,V } - -% -------------------------------------------------------------------------- -% input compound name -\cs_new_protected:Npn \chemformula_input_name:n #1 - { - \bool_if:nT - { - \l__chemformula_is_name_bool && - !\l__chemformula_first_last_text_bool && - !\l__chemformula_first_last_math_bool - } - { - \__chemformula_generate_name:Nn \l__chemformula_name_tmp_tl { #1 } - \tl_put_right:NV \l__chemformula_input_tl \l__chemformula_name_tmp_tl - } - \bool_set_false:N \l__chemformula_is_name_bool - } - -% -------------------------------------------------------------------------- -% input escaped text -% #1: <bool> #2: <tl> #3: <first> #4: <last> -\cs_new_protected:Npn \__chemformula_bool_set_if_first_last:Nnnn #1#2#3#4 - { - \int_zero:N \l__chemformula_tmpa_int - \int_zero:N \l__chemformula_tmpb_int - \int_set:Nn \l__chemformula_tmpa_int { \tl_count:n { #2 } } - \tl_map_inline:nn { #2 } - { - \int_incr:N \l__chemformula_tmpb_int - \int_compare:nT { \l__chemformula_tmpb_int = 1 } - { - \tl_if_eq:nnT { ##1 } { #3 } - { \bool_set_true:N #1 } - } - \int_compare:nT { \l__chemformula_tmpb_int = \l__chemformula_tmpa_int } - { - \tl_if_eq:nnF { ##1 } { #4 } - { \bool_set_false:N #1 } - } - } - } - -\cs_new_protected:Npn \chemformula_input_escape_text:n #1 - { - \__chemformula_first_last_text:n { #1 } - \bool_if:NT \l__chemformula_first_last_double_bool - { - \bool_set_true:N \l__chemformula_first_last_text_bool - \__chemformula_read_escape_double:w #1 \q_nil - } - \bool_if:NT \l__chemformula_first_last_single_bool - { - \bool_set_true:N \l__chemformula_first_last_text_bool - \__chemformula_read_escape_single:w #1 \q_nil - } - } -\cs_generate_variant:Nn \chemformula_input_escape_text:n { V } - -\cs_new_protected:Npn \__chemformula_read_escape_text:n #1 - { - \tl_set_rescan:Nnn \l__chemformula_tmpa_tl - { - \char_set_catcode_letter:N \_ - \char_set_catcode_other:N \: - - } - { #1 } - \tl_replace_all:Nnn \l__chemformula_tmpa_tl - { \_ } { chemformulaplaceholder } - \tl_replace_all:Nnn \l__chemformula_tmpa_tl - { _ } { \sb } - \tl_replace_all:Nnn \l__chemformula_tmpa_tl - { chemformulaplaceholder } { \_ } - % TODO: waum ist das auskommentiert - % \__chemformula_reset:NV \l__chemformula_tmpa_tl \l__chemformula_tmpa_tl - \tl_put_right:NV \l__chemformula_input_tl \l__chemformula_tmpa_tl - } - -\cs_new:Npn \__chemformula_read_escape_double:w "#1" \q_nil - { \__chemformula_read_escape_text:n { #1 } } - -\cs_new:Npn \__chemformula_read_escape_single:w '#1' \q_nil - { \__chemformula_read_escape_text:n { #1 } } - -\cs_new_protected:Npn \__chemformula_first_last_text:n #1 - { - \bool_set_false:N \l__chemformula_first_last_double_bool - \bool_set_false:N \l__chemformula_first_last_single_bool - \bool_set_false:N \l__chemformula_first_last_text_bool - \__chemformula_bool_set_if_first_last:Nnnn - \l__chemformula_first_last_double_bool - { #1 } - { " } { " } - \bool_if:NF \l__chemformula_first_last_double_bool - { - \__chemformula_bool_set_if_first_last:Nnnn - \l__chemformula_first_last_single_bool - { #1 } - { ' } { ' } - } - } - -% -------------------------------------------------------------------------- -% input escaped math -\cs_new_protected:Npn \chemformula_input_escape_math:n #1 - { - \__chemformula_first_last_math:n { #1 } - \bool_if:NT \l__chemformula_first_last_dollar_bool - { - \bool_set_true:N \l__chemformula_first_last_math_bool - \__chemformula_read_escape_dollar:w #1 \q_nil - } - \bool_if:NT \l__chemformula_first_last_mathbraces_bool - { - \bool_set_true:N \l__chemformula_first_last_math_bool - \__chemformula_read_escape_mathbraces:w #1 \q_nil - } - } - -\cs_new_protected:Npn \__chemformula_read_escape_math:n #1 - { - \tl_set_rescan:Nnn \l__chemformula_tmpa_tl - { - \char_set_catcode_letter:N \_ - \char_set_catcode_letter:N \: - } - { \c_math_toggle_token #1 \c_math_toggle_token } - \tl_replace_all:Nnn \l__chemformula_tmpa_tl - { \_ } { chemformulaplaceholder } - \tl_replace_all:Nnn \l__chemformula_tmpa_tl - { _ } { \sb } - \tl_replace_all:Nnn \l__chemformula_tmpa_tl - { chemformulaplaceholder } { \_ } - % \__chemformula_reset:NV \l__chemformula_tmpa_tl \l__chemformula_tmpa_tl - \tl_put_right:NV \l__chemformula_input_tl \l__chemformula_tmpa_tl - \tl_put_right:Nn \l__chemformula_input_tl - { \chemformula_skip_nobreak:N \l__chemformula_math_space_skip } - } - -\cs_new:Npn \__chemformula_read_escape_dollar:w $#1$ \q_nil - { \__chemformula_read_escape_math:n { #1 } } - -\cs_new:Npn \__chemformula_read_escape_mathbraces:w \(#1\) \q_nil - { \__chemformula_read_escape_math:n { #1 } } - -\cs_new_protected:Npn \__chemformula_first_last_math:n #1 - { - \bool_set_false:N \l__chemformula_first_last_math_bool - \bool_set_false:N \l__chemformula_first_last_dollar_bool - \bool_set_false:N \l__chemformula_first_last_mathbraces_bool - \__chemformula_bool_set_if_first_last:Nnnn - \l__chemformula_first_last_dollar_bool - { #1 } - { $ } { $ } - \bool_if:NF \l__chemformula_first_last_dollar_bool - { - \__chemformula_bool_set_if_first_last:Nnnn - \l__chemformula_first_last_mathbraces_bool - { #1 } - { \( } { \) } - } - } - -% -------------------------------------------------------------------------- -% customization of output other than arrows -\keys_define:nn { chemmacros / chemformula } - { - circled .choice: , - circled / none .code:n = - { \bool_set_false:N \l__chemformula_formal_charges_bool } , - circled / formal .code:n = - { \bool_set_false:N \l__chemformula_formal_charges_bool } , - circled / all .code:n = - { \bool_set_true:N \l__chemformula_formal_charges_bool } , - circled .default:n = all , - circletype .choice: , - circletype / math .code:n = - { \bool_set_false:N \l__chemformula_formal_chem_bool } , - circletype / chem .code:n = - { \bool_set_true:N \l__chemformula_formal_chem_bool } , - circletype .default:n = chem , - charge-hshift .code:n = - \tl_if_eq:nnTF { #1 } { full } - { \bool_set_true:N \l__chemformula_charge_full_shift_bool } - { - \bool_set_false:N \l__chemformula_charge_full_shift_bool - \dim_set:Nn \l__chemformula_charge_shift_dim { #1 } - } , - charge-hshift .default:n = .25em , - charge-vshift .tl_set:N = - \l__chemformula_superscript_shift_additional_tl , - charge-style .choice: , - charge-style / text .code:n = - \bool_set_false:N \l__chemformula_charge_style_math_bool , - charge-style / math .code:n = - \bool_set_true:N \l__chemformula_charge_style_math_bool , - subscript-vshift .tl_set:N = - \l__chemformula_subscript_shift_additional_tl , - subscript-vshift .default:n = 0pt , - subscript-style .choice: , - subscript-style / text .code:n = - \bool_set_false:N \l__chemformula_number_style_math_bool , - subscript-style / math .code:n = - \bool_set_true:N \l__chemformula_number_style_math_bool , - decimal-marker .tl_set:N = \l__chemformula_decimal_output_tl , - frac-style .choice: , - frac-style / math .code:n = - \bool_set_false:N \l__chemformula_xfrac_bool - \bool_set_false:N \l__chemformula_nicefrac_bool - \bool_set_true:N \l__chemformula_mathfrac_bool , - frac-style / xfrac .code:n = - \bool_set_true:N \l__chemformula_xfrac_bool - \bool_set_false:N \l__chemformula_nicefrac_bool - \bool_set_false:N \l__chemformula_mathfrac_bool , - frac-style / nicefrac .code:n = - \bool_set_false:N \l__chemformula_xfrac_bool - \bool_set_true:N \l__chemformula_nicefrac_bool - \bool_set_false:N \l__chemformula_mathfrac_bool , - frac-math-cmd .code:n = - { \cs_set_eq:NN \chemformula_math_frac:nn #1 } , - stoich-paren-parse .bool_set:N = \l__chemformula_stoich_parse_iupac_bool , - stoich-space .skip_set:N = \l__chemformula_stoich_space_skip , - stoich-print .code:n = - \cs_set_eq:NN \chemformula_print_stoich:n #1 , - adduct-space .dim_set:N = \l__chemformula_adduct_space_dim , - plus-space .skip_set:N = \l__chemformula_plus_space_skip , - plus-penalty .tl_set:N = \l__chemformula_plus_penalty_tl , - math-space .skip_set:N = \l__chemformula_math_space_skip , - name-format .tl_set:N = \l__chemformula_name_format_tl , - name-width .code:n = - { - \tl_if_eq:nnTF { #1 } { auto } - { \bool_set_false:N \l__chemformula_name_width_bool } - { - \bool_set_true:N \l__chemformula_name_width_bool - \dim_set:Nn \l__chemformula_name_dim { #1 } - } - } , - bond-length .dim_set:N = \l__chemformula_bond_dim , - bond-offset .dim_set:N = \l__chemformula_bond_space_dim , - bond-style .code:n = - \tikzset { chembond/.style={butt~cap-butt~cap,#1} } , - bond-penalty .tl_set:N = \l__chemformula_bond_penalty_tl , - font-family .code:n = - \bool_set_true:N \l__chemformula_fss_bool - \bool_set_false:N \l__chemformula_fontspec_bool - \bool_set_true:N \l__chemformula_fss_family_bool - \tl_set:Nn \l__chemformula_font_family_tl { #1 } , - font-series .code:n = - \bool_set_true:N \l__chemformula_fss_bool - \bool_set_false:N \l__chemformula_fontspec_bool - \bool_set_true:N \l__chemformula_fss_series_bool - \tl_set:Nn \l__chemformula_font_series_tl { #1 } , - font-shape .code:n = - \bool_set_true:N \l__chemformula_fss_bool - \bool_set_false:N \l__chemformula_fontspec_bool - \bool_set_true:N \l__chemformula_fss_shape_bool - \tl_set:Nn \l__chemformula_font_shape_tl { #1 } , - font-spec .code:n = - \bool_set_false:N \l__chemformula_fss_bool - \bool_set_true:N \l__chemformula_fontspec_bool - \__chemformula_fontspec:n { #1 } , - format .code:n = - \bool_set_false:N \l__chemformula_fss_bool - \bool_set_false:N \l__chemformula_fontspec_bool - \tl_set:Nn \l__chemformula_format_tl { #1 } - } - -% -------------------------------------------------------------------------- -% \chlewis[opions]{el spec}{atom} - -\keys_define:nn { chemmacros / chemformula } - { - lewis-default .tl_set:N = \l__chemformula_elspec_default_type_tl , - lewis-distance .dim_set:N = \l__chemformula_elspec_pair_distance_dim , - lewis-line-length .dim_set:N = \l__chemformula_elspec_pair_line_length_dim , - lewis-line-width .dim_set:N = \l__chemformula_elspec_pair_width_dim , - lewis-offset .tl_set:N = \l__chemformula_elspec_radius_tl - } - -% #1: options -% #2- el spec -% #3: atom -\cs_new_protected:Npn \chemformula_lewis:nnn #1#2#3 - { - \group_begin: - \keys_set:nn { chemmacros / chemformula } { #1 } - \int_gincr:N \g__chemformula_lewis_int - \chemformula_get_lewis_sequence:n { #2 } - \chemformula_tikz:nn { baseline } - { - \chemformula_node:nxn { anchor=base , inner~sep=0pt } - { chlewis-\int_use:N \g__chemformula_lewis_int } - { - \bool_if:NTF \l_chemformula_inside_ch_bool - { #3 } - { \chemformula_chcpd:nn {} { #3 } } - } - \seq_map_inline:Nn \l__chemformula_tmpa_seq - { \chemformula_lewis_get_angle_and_spec:n { ##1 } } - } - \group_end: - } - -\cs_new_protected:Npn \chemformula_get_lewis_sequence:n #1 - { - \tl_set:Nn \l__chemformula_tmpa_tl { #1 } - \tl_replace_all:Nnn \l__chemformula_tmpa_tl { : } { \scan_stop: : , } - \tl_replace_all:NVn \l__chemformula_tmpa_tl \c_chemformula_colon_tl - { \scan_stop: : , } - \tl_replace_all:Nnn \l__chemformula_tmpa_tl { . } { \scan_stop: . , } - \tl_replace_all:Nnn \l__chemformula_tmpa_tl { | } { \scan_stop: | , } - \tl_replace_all:Nnn \l__chemformula_tmpa_tl { o } { \scan_stop: o , } - \seq_set_split:NnV \l__chemformula_tmpa_seq { , } \l__chemformula_tmpa_tl - } -\cs_generate_variant:Nn \tl_replace_all:Nnn { NV } - -\cs_new:Npn \chemformula_lewis_get_angle_and_spec:n #1 - { \__chemformula_lewis_get_angle_and_spec:w #1 \scan_stop: \scan_stop: \q_stop } - -\cs_new_protected:Npn - \__chemformula_lewis_get_angle_and_spec:w #1 \scan_stop: #2 \scan_stop: #3 \q_stop - { - \tl_if_blank:nF { #1 } - { - \tl_set:Nn \l__chemformula_elspec_angle_tl { #1 } - \tl_if_blank:nTF { #2 } - { - \tl_set_eq:NN - \l__chemformula_elspec_type_tl - \l__chemformula_elspec_default_type_tl - } - { \tl_set:Nn \l__chemformula_elspec_type_tl { #2 } } - \__chemformula_lewis_set_elspec_type:V \l__chemformula_elspec_type_tl - } - } - -\cs_new_protected:Npn \__chemformula_lewis_set_elspec_type:n #1 - { - \prop_get:NnNT \l__chemformula_lewis_elspec_types_prop { #1 } - \l__chemformula_tmpa_tl - { \tl_use:N \l__chemformula_tmpa_tl } - } -\cs_generate_variant:Nn \__chemformula_lewis_set_elspec_type:n { V } - -\prop_put:Nnn \l__chemformula_lewis_elspec_types_prop { | } - { \__chemformula_lewis_elspec_pair_line: } -\prop_put:Nnn \l__chemformula_lewis_elspec_types_prop { : } - { \__chemformula_lewis_elspec_pair_dots: } -\prop_put:Nnn \l__chemformula_lewis_elspec_types_prop { . } - { \__chemformula_lewis_elspec_single: } -\prop_put:Nnn \l__chemformula_lewis_elspec_types_prop { o } - { \__chemformula_lewis_elspec_empty: } -\prop_put:Nnn \l__chemformula_lewis_elspec_types_prop { pair } - { \__chemformula_lewis_elspec_pair_dots: } -\prop_put:Nnn \l__chemformula_lewis_elspec_types_prop { pair~(dotted) } - { \__chemformula_lewis_elspec_pair_dots: } -\prop_put:Nnn \l__chemformula_lewis_elspec_types_prop { pair~(line) } - { \__chemformula_lewis_elspec_pair_line: } -\prop_put:Nnn \l__chemformula_lewis_elspec_types_prop { single } - { \__chemformula_lewis_elspec_single: } -\prop_put:Nnn \l__chemformula_lewis_elspec_types_prop { empty } - { \__chemformula_lewis_elspec_empty: } - -\cs_new_protected:Npn \__chemformula_lewis_elspec_pair_dots: - { - \chemformula_draw:nn - { - fill, - inner~sep=0pt, - outer~sep=0pt - } - { - (node~cs \c_chemformula_colon_tl - name = chlewis-\int_use:N \g__chemformula_lewis_int , - angle = \l__chemformula_elspec_angle_tl - ) - ++ - ( - \l__chemformula_elspec_angle_tl - \c_chemformula_colon_tl - \l__chemformula_elspec_radius_tl - ) - ++ - ( - \l__chemformula_elspec_angle_tl +90 - \c_chemformula_colon_tl - .5\l__chemformula_elspec_pair_distance_dim - ) - circle (\l__chemformula_radical_radius_dim) - ++ - ( - \l__chemformula_elspec_angle_tl -90 - \c_chemformula_colon_tl - \l__chemformula_elspec_pair_distance_dim - ) - circle (\l__chemformula_radical_radius_dim) - } - } - -\cs_new_protected:Npn \__chemformula_lewis_elspec_pair_line: - { - \chemformula_draw:nn - { line~width = \l__chemformula_elspec_pair_width_dim } - { - (node~cs \c_chemformula_colon_tl - name = chlewis-\int_use:N \g__chemformula_lewis_int , - angle = \l__chemformula_elspec_angle_tl - ) - ++ - ( - \l__chemformula_elspec_angle_tl - \c_chemformula_colon_tl - \l__chemformula_elspec_radius_tl - ) - ++ - ( - \l__chemformula_elspec_angle_tl +90 - \c_chemformula_colon_tl - .5\l__chemformula_elspec_pair_line_length_dim - ) - -- - ++ - ( - \l__chemformula_elspec_angle_tl -90 - \c_chemformula_colon_tl - \l__chemformula_elspec_pair_line_length_dim - ) - } - } - -\cs_new_protected:Npn \__chemformula_lewis_elspec_single: - { - \chemformula_draw:nn - { - fill, - inner~sep=0pt, - outer~sep=0pt - } - { - (node~cs \c_chemformula_colon_tl - name = chlewis-\int_use:N \g__chemformula_lewis_int , - angle = \l__chemformula_elspec_angle_tl - ) - ++ - ( - \l__chemformula_elspec_angle_tl - \c_chemformula_colon_tl - \l__chemformula_elspec_radius_tl - ) - circle (\l__chemformula_radical_radius_dim) - } - } - -\cs_new_protected:Npn \__chemformula_lewis_elspec_empty: - { - \chemformula_draw:nn { } - { - (node~cs \c_chemformula_colon_tl - name = chlewis-\int_use:N \g__chemformula_lewis_int , - angle = \l__chemformula_elspec_angle_tl - ) - ++ - ( - \l__chemformula_elspec_angle_tl - \c_chemformula_colon_tl - \l__chemformula_elspec_radius_tl - ) - ++ - ( - \l__chemformula_elspec_angle_tl +90 - \c_chemformula_colon_tl - .5\l__chemformula_elspec_pair_line_length_dim - ) - coordinate (chlewis-tmp1) - ++ - ( - \l__chemformula_elspec_angle_tl -90 - \c_chemformula_colon_tl - \l__chemformula_elspec_pair_line_length_dim - ) - coordinate (chlewis-tmp2) - ++ - ( - \l__chemformula_elspec_angle_tl - \c_chemformula_colon_tl - .25\l__chemformula_elspec_pair_line_length_dim - ) - coordinate (chlewis-tmp3) - ++ - ( - \l__chemformula_elspec_angle_tl +90 - \c_chemformula_colon_tl - \l__chemformula_elspec_pair_line_length_dim - ) - coordinate (chlewis-tmp4) - (chlewis-tmp1) -- (chlewis-tmp2) -- - (chlewis-tmp3) -- (chlewis-tmp4) -- - cycle - } - } - -\NewDocumentCommand\chlewis{O{}mm} - { \chemformula_lewis:nnn { #1 } { #2 } { #3 } } - -% -------------------------------------------------------------------------- - -\NewDocumentCommand \setchemformula { m } - { \keys_set:nn { chemmacros / chemformula } { #1 } } - -\setchemformula{ - bond-style = {} , - arrow-style = {} -} - -% -------------------------------------------------------------------------- -% hyperref support -\AfterPackage* { hyperref } - { - \pdfstringdefDisableCommands - { - \cs_set:Npn \chcpd #1 { #1 } - \cs_set:Npn \charrow #1 { #1 } - \cs_set:Npn \chname (#1)(#2) { #2~(#1) } - \cs_set:Npn \ch #1 { #1 } - \cs_set:Npn \chlewis #1#2 { #2 } - } - } - -\tex_endinput:D - -% -------------------------------------------------------------------------- -VERSION HISTORY -2012/01/28 - version 3.0 - bundled with packages `chemmacros' and `ghs' -2012/01/30 - version 3.0a - bugfix - - renamed formula => chemformula - (following a request by Karl Berry for TeXlive) -2012/02/03 - version 3.0b - stepped number with `chemmacros' -2012/02/05 - version 3.0c - stepped number with `chemmacros' -2012/02/10 - version 3.0d - several bugfixes - - new arrow type <> -2012/02/19 - version 3.1 - new arrow types -/>, </- and <o> - - new commands \DeclareChemArrow, \RenewChemArrow and - \ShowChemArrow -2012/02/26 - version 3.1a - stepped number with `chemmacros' -2012/03/03 - version 3.1b - arrow types are stored in a sequence to automate the - search and replace in the right order - - new arrow type == - - IUPAC compliance for stoichiometric factors - - new handling of super- and subscripts to correct - various flaws: clear distinction between isotope and - formula - - new option charge-vshift -2012/03/14 - version 3.1c - improved arrow labels -2012/03/20 - version 3.2 - new: option input via @{<options>} -2012/05/07 - version 3.3 - \ch now bypasses \ref{}, \label{}, and \intertext{} -2012/05/13 - version 3.3a - stepped number with `chemmacros' -2012/05/18 - version 3.3b - stepped number with `chemmacros' -2012/05/18 - version 3.3c - stepped number with `chemmacros' -2012/07/24 - version 3.3d - stepped number with `chemmacros' - - default bond length set to 1.1667ex - - bug fix in the bonds -2012/08/21 - version 3.3e - stepped number with `chemmacros' -2012/09/11 - version 3.4 - cleaned a little, minor bug fixes - - switched to internal scratch variables - - new command \bond, more bond types - - new commands \DeclareChemBond, \DeclareChemBondAlias, - \RenewChemBond and \ShowChemBond - - radical point thicker, new options `radical-style' - and `radical-radius' -2012/10/03 - version 3.4a - stepped number with `chemmacros' -2013/01/04 - version 3.4b - bug fix in the sub- and superscript handling -2013/01/28 - version 3.5 - disallow breaks at bonds - - allow breaks after arrows - - made some spaces in chemformulas stretch- and - shrinkable - - various internal code improvements - - changed defaults for horizontal spaces that have in - set in ex into corresponding values in em. - - improvements to the placement of sub- and superscripts -2013/02/19 - version 3.5a - stepped number with `chemmacros' -2013/02/26 - version 3.6 - support for use with the `breqn' package - - math escaping also via \(\) - - internal: clearer escaping macros - - new options: `radical-vshift', `radical-hshift' - and `radical-space' - - bug fix: `radical-...' options are now correctly set - - stoichiometric factors: add leading 0 if missing - - new option: `stoich-paren-parse' - - internal changes: be way more rigid about protected - and expandable macros - - internal changes: clearer distinction between - private macros and accessable module macros - - internal changes: clearer distinction between - document commands and module level commands - - !()() syntax now also works with babel's French -2013/02/27 - version 3.6a - bug fix: escaped text and math stays escaped, i.e. - also arrow code like `<=>' -2013/04/19 - version 3.6b - new option `arrow-min-length' - - bug fix: stoichiometric fractions correctly displayed -2013/07/06 - version 4.0 - don't need `chemmacros' package any more, - `chemformula' can be used stand-alone; - this has lead to a few definitions that previously - were done by chemmacros; chemmacros will get them - now from chemformula when needed - - bug fix: allow braces in subscripts and superscripts - by disabling superfluous \chemformula_subscript:n - and \chemformula_superscript:n in the scripts write - commands - - remove superfluous rescanning at the begin of the - formula input; this is handled by the sanitize - command later anyway - - changed internal mathshifts from $ ... $ to \( ... \) - - removed superfluous \textstyle from math-frac - definition - - new command \charrow{}[][] that allows direct - access to chemformula's arrows - - new command \chname()() that allows direct access - to chemformula's naming - - new command \chcpd[]{} that allows typesetting a - simple single formula - also not nestable with \ch - - new command \setchemformula - - package option: `strict' - - don't allow a line break before a plus - (`chem-and') - - don't allow a line break between a stoichiometric - factor and a compound - - changed formal charges to match ``plain'' charges -2013/07/26 - version 4.0a - added options `arrow-penalty' (0), `plus-penalty' - (700) and `bond-penalty' (10000) that determine if - there may be a break after an arrow, a bond or the - plus -2013/08/24 - version 4.1 - changed `0' values in TikZ coordinates into `0pt' - see http://tex.stackexchange.com/q/128792/5049 and - http://tex.stackexchange.com/q/118467/5049 for - reference - - new option `tikz-external-disable' - - new option `frac-math-cmd' -2013/10/24 - version 4.2 - \chemformula_font_inner: is only applied /once/ to - a formula, and at the beginning, fixes - https://bitbucket.org/cgnieder/chemmacros/issue/23 - - fixed wrong setting of the TikZ bond style - - new option `arrow-style' - - new command \chlewis -2013/11/04 - version 4.2a - bug fix in \chcpd, - - change sanitizing/restoring of category codes -2014/01/24 - version 4.3 - changed behaviour of \DeclareChem to match - \DeclareRobustCommand, i.e., no check if command - is defined; added a \NewChem variant to each that - /does/ check; use \NewChem instead of \DeclareChem - for definitions - - new option stoich-print - - new command \chstoich -2014/01/29 - version 4.4 - treat a single `-' as a minus sign -2014/04/07 - version 4.5 - make sure that < and > have catcode 12 when read - as parts of arrows - - new arrow types `>=<', `>=<<', `>>=<' and `<==>' - - arrow lengths and compound offset now correctly - adapts to new fontsize if relative lengths (em,ex) - are used - - allow optional arguments to \\ in equation - environments - - allow optional arguments to \label in equation - environments - (credits: http://tex.stackexchange.com/a/166661/5049) - - support for Kröger-Vink notation -2014/06/30 - version 4.6 - fix: a comma in a superscript is typeset according - to `decimal-marker' again - - fix charge type behaviour: option `circled' and - `circletype' are now obeyed if the option is - changed mid-document - - new option `chemformula/circled' similar to - `chemmacros/circled' - - new option `chemformula/circletype' similar to - `chemmacros/circletype' -2014/08/04 - version 4.7 - change dependency: pgf library `arrows.meta' - instead of `arrows' - - new arrow tip definition allows redeclaration to - other existing tips by \pgfkeys{cf/.tip=<tip>} - -% -------------------------------------------------------------------------- -% TODO -- Addukte: Zahlen nach * und . automatisch erkennen? -- make escaped text/math /truely/ escaped, i.e., behave as if it's been input - /outside/ of \ch |