From 1a536214c99cadbd376fd416f36a8babec9d7a36 Mon Sep 17 00:00:00 2001
From: Karl Berry <karl@freefriends.org>
Date: Thu, 9 Jun 2016 22:52:04 +0000
Subject: chemformula (8jun16)

git-svn-id: svn://tug.org/texlive/trunk@41326 c570f23f-e606-0410-a88d-b1316a301751
---
 .../tex/latex/chemformula/chemformula.sty          | 207 ++++++++++++---------
 1 file changed, 119 insertions(+), 88 deletions(-)

(limited to 'Master/texmf-dist/tex/latex/chemformula/chemformula.sty')

diff --git a/Master/texmf-dist/tex/latex/chemformula/chemformula.sty b/Master/texmf-dist/tex/latex/chemformula/chemformula.sty
index c74a25b021f..1fc2bed226d 100644
--- a/Master/texmf-dist/tex/latex/chemformula/chemformula.sty
+++ b/Master/texmf-dist/tex/latex/chemformula/chemformula.sty
@@ -26,13 +26,13 @@
 %
 % The Current Maintainer of this work is Clemens Niederberger.
 % --------------------------------------------------------------------------
-\RequirePackage{expl3,xparse,l3keys2e,tikz,amstext,xfrac,nicefrac,scrlfile}
+\RequirePackage{expl3,xparse,l3keys2e,tikz,amsmath,xfrac,nicefrac,scrlfile}
 \usetikzlibrary{arrows.meta}
 
 \ExplSyntaxOn
-\tl_const:Nn \c_chemformula_date_tl {2016/05/11}
+\tl_const:Nn \c_chemformula_date_tl {2016/06/08}
 \tl_const:Nn \c_chemformula_version_number_tl {4.15}
-\tl_const:Nn \c_chemformula_version_suffix_tl {}
+\tl_const:Nn \c_chemformula_version_suffix_tl {a}
 \tl_const:Nx \c_chemformula_version_tl
   { \c_chemformula_version_number_tl \c_chemformula_version_suffix_tl }
 \tl_const:Nn \c_chemformula_info_tl
@@ -149,14 +149,18 @@
 \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 \tl_if_eq:nnT        { V, x }
+\cs_generate_variant:Nn \tl_if_eq:nnTF       { o }
 \cs_generate_variant:Nn \tl_set:Nn           { cV }
 \cs_generate_variant:Nn \tl_replace_all:Nnn  { NV }
 \cs_generate_variant:Nn \tl_replace_once:Nnn { Nxx }
 \cs_generate_variant:Nn \tl_set_rescan:Nnn   { NnV }
 \cs_generate_variant:Nn \prop_item:Nn        { NV }
+\cs_generate_variant:Nn \prop_if_in:NnT      { Nx }
 \cs_generate_variant:Nn \dim_set:Nn          { NV }
 \cs_generate_variant:Nn \skip_set:Nn         { cV }
 \cs_generate_variant:Nn \str_if_eq:nnT       { V }
+\cs_generate_variant:Nn \prop_if_in:NnT      { x }
 
 % --------------------------------------------------------------------------
 % VARIABLES
@@ -340,7 +344,7 @@
 
 % property lists:
 \prop_new:N \l__chemformula_arrows_code_prop
-\prop_new:N \l__chemformula_cmpd_prop
+\prop_new:N \l__chemformula_compound_prop
 \prop_new:N \l__chemformula_bonds_prop
 \prop_new:N \l__chemformula_stoich_prop
 \prop_new:N \l__chemformula_charge_prop
@@ -1062,6 +1066,7 @@
           \tl_set:Nn \l__chemmacros_tmpa_tl {#1}
           \tl_trim_spaces:N \l__chemmacros_tmpa_tl
           \seq_set_split:NnV \l__chemformula_input_seq {~} \l__chemmacros_tmpa_tl
+          % \seq_show:N \l__chemformula_input_seq
           % remove empty items in order to avoid unnecessary processing:
           \seq_remove_all:Nn \l__chemformula_input_seq {}
           % disable \xspace:
@@ -1212,7 +1217,7 @@
           \__chemformula_sanitize:Nn
             \l__chemformula_chemformula_tmpa_tl
             {#2}
-          \__chemformula_input_cmpd_no_check:NV
+          \__chemformula_input_compound_no_check:NV
             \l__chemformula_compound_tl
             \l__chemformula_chemformula_tmpa_tl
           \__chemformula_prepare_output:N \l__chemformula_compound_tl
@@ -1228,6 +1233,7 @@
 % arrow generation & detection
 \cs_new_protected:Npn \__chemformula_generate_arrows:Nn #1#2
   {
+    % TODO: is the rescan necessary? Can't we use strings?
     \tl_set_rescan:Nnn \l__chemformula_tmpa_tl
       {
         \char_set_catcode_other:N \>
@@ -1295,7 +1301,7 @@
 
 % --------------------------------------------------------------------------
 % compound names
-\cs_new_protected:Npn \__chemformula_name_cmpd:w
+\cs_new_protected:Npn \__chemformula_name_compound:w
   { \peek_meaning:NTF ( { \chname } { ! } }
 
 \NewDocumentCommand \chname { R(){}R(){} }
@@ -1343,7 +1349,7 @@
       {
         \tl_replace_all:Nnn \l__chemformula_tmpa_tl
           { ! }
-          { \__chemformula_name_cmpd:w }
+          { \__chemformula_name_compound:w }
       }
     \tl_set:NV #1 \l__chemformula_tmpa_tl
   }
@@ -1362,26 +1368,26 @@
 % compounds:
 \cs_new_protected:Npn \chemformula_new_compound_property:nn #1#2
   {
-    \prop_if_in:NnTF \l__chemformula_cmpd_prop {#1}
+    \prop_if_in:NnTF \l__chemformula_compound_prop {#1}
       { \msg_error:nnn {chemformula} {new-compound-property} {#1} }
-      { \prop_put:Nnn \l__chemformula_cmpd_prop {#1} {#2} }
+      { \prop_put:Nnn \l__chemformula_compound_prop {#1} {#2} }
   }
   
 \cs_new_protected:Npn \chemformula_renew_compound_property:nn #1#2
   {
-    \prop_if_in:NnTF \l__chemformula_cmpd_prop {#1}
-      { \prop_put:Nnn \l__chemformula_cmpd_prop {#1} {#2} }
+    \prop_if_in:NnTF \l__chemformula_compound_prop {#1}
+      { \prop_put:Nnn \l__chemformula_compound_prop {#1} {#2} }
       { \msg_error:nnn {chemformula} {renew-compound-property} {#1} }
   }
 
 \cs_new_protected:Npn \chemformula_provide_compound_property:nn #1#2
-  { \prop_put_if_new:Nnn \l__chemformula_cmpd_prop {#1} {#2} }
+  { \prop_put_if_new:Nnn \l__chemformula_compound_prop {#1} {#2} }
   
 \cs_new_protected:Npn \chemformula_declare_compound_property:nn #1#2
-  { \prop_put:Nnn \l__chemformula_cmpd_prop {#1} {#2} }
+  { \prop_put:Nnn \l__chemformula_compound_prop {#1} {#2} }
 
 \cs_new_protected:Npn \chemformula_remove_compound_property:n #1
-  { \prop_remove:Nn \l__chemformula_cmpd_prop {#1} }
+  { \prop_remove:Nn \l__chemformula_compound_prop {#1} }
 
 \NewDocumentCommand \NewChemCompoundProperty { mm }
   { \chemformula_new_compound_property:nn {#1} {#2} }
@@ -1702,10 +1708,10 @@
 \cs_new_protected:Npn \chemformula_subscript:n #1
   {
     \chemformula_nobreak:
-    \tl_if_eq:nnTF {#1}{ \chemformula_superscript:n }
+    \tl_if_eq:nnTF {#1} { \chemformula_superscript:n }
       { \__chemformula_subscript:n }
       {
-        \tl_if_eq:nnTF {#1}{ \chemformula_subscript:n }
+        \tl_if_eq:nnTF {#1} { \chemformula_subscript:n }
           { \__chemformula_subscript:n }
           {
             \tl_set:Nn \l__chemformula_tmpc_tl {#1}
@@ -1933,7 +1939,7 @@
   {
     \group_begin:
     % No shift for excited state
-    \exp_args:No \tl_if_eq:nnT { \l__chemformula_superscript_tl } { * }
+    \tl_if_eq:VnT \l__chemformula_superscript_tl {*}
       {
         \bool_set_false:N \l__chemformula_charge_full_shift_bool
         \dim_zero:N \l__chemformula_charge_shift_dim
@@ -2035,7 +2041,7 @@
     \__chemformula_input_escape_math:n {#1}
     \__chemformula_input_stoich:n {#1}
     \__chemformula_clean_chemmacros:V \l__chemformula_chemformula_tmpa_tl
-    \__chemformula_input_cmpd:NV
+    \__chemformula_input_compound:NV
       \l__chemformula_input_tl
       \l__chemformula_chemformula_tmpa_tl
     \__chemformula_input_arrow:n {#1}
@@ -2218,7 +2224,7 @@
 
 % --------------------------------------------------------------------------
 % input compounds
-\cs_new_protected:Npn \__chemformula_input_cmpd:Nn #1#2
+\cs_new_protected:Npn \__chemformula_input_compound:Nn #1#2
   {
     % \tl_show:n {#1}
     \tl_if_blank:VTF \l__chemformula_stoich_tl
@@ -2251,7 +2257,7 @@
             !\l__chemformula_first_last_math_bool
           }
           {
-            \__chemformula_input_cmpd_no_check:Nn #1 {#2}
+            \__chemformula_input_compound_no_check:Nn #1 {#2}
             \bool_if:NT \l__chemformula_options_bool
               {
                 \tl_put_right:Nn #1
@@ -2270,24 +2276,24 @@
         \tl_clear:N \l__chemformula_stoich_tl
       }
   }
-\cs_generate_variant:Nn \__chemformula_input_cmpd:Nn { NV }
+\cs_generate_variant:Nn \__chemformula_input_compound:Nn { NV }
 
 % TODO: this is redundant at the moment
-\bool_new:N \g__chemformula_cmpd_group_open_bool
+\bool_new:N \g__chemformula_compound_group_open_bool
 \cs_new_protected:Npn \chemformula_group_begin:
   {
-    \bool_if:NF \g__chemformula_cmpd_group_open_bool
+    \bool_if:NF \g__chemformula_compound_group_open_bool
       {
         % \group_begin:
-        \bool_gset_true:N \g__chemformula_cmpd_group_open_bool
+        \bool_gset_true:N \g__chemformula_compound_group_open_bool
       }
   }
 \cs_new_protected:Npn \chemformula_group_end:
   {
-    \bool_if:NT \g__chemformula_cmpd_group_open_bool
+    \bool_if:NT \g__chemformula_compound_group_open_bool
       {
         % \group_end:
-        \bool_gset_false:N \g__chemformula_cmpd_group_open_bool
+        \bool_gset_false:N \g__chemformula_compound_group_open_bool
       }
   }
 
@@ -2306,7 +2312,7 @@
     \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 }
+    \tl_if_eq:onTF { \f@series } {bx}
       { \cs_set_eq:NN \chemformula_bm:n \bm }
       { \cs_set:Nn \chemformula_bm:n {##1} }
   }
@@ -2402,88 +2408,108 @@
       { \prg_return_false: }
   }
 
+% if the compound starts with a number or a sub- or superscript then it is an
+% isotope:
+\cs_new_protected:Npn \__chemformula_check_for_isotope:N #1
+  {
+    \tl_if_eq:xnT { \tl_head:V #1 } {^}
+      {
+        \tl_put_left:Nn #1
+          { \bool_set_true:N \l__chemformula_is_isotope_bool }
+      }
+    \tl_if_eq:xnT { \tl_head:V #1 } {_}
+      {
+        \tl_put_left:Nn #1
+          { \bool_set_true:N \l__chemformula_is_isotope_bool }
+      }
+    \prop_if_in:NxT \l__chemformula_numbers_prop
+      { \tl_head:V #1 }
+      {
+        \tl_put_left:Nn #1
+          { \bool_set_true:N \l__chemformula_is_isotope_bool }
+      }
+  }
+
+\cs_new_protected:Npn \__chemformula_prepare_sub_and_superscripts:N #1
+  {
+    \tl_if_in:VnT #1 {^}
+      { \tl_replace_all:Nnn #1 {^} { \chemformula_superscript:n } }
+    \tl_if_in:VnT #1 {_}
+      { \tl_replace_all:Nnn #1 {_} { \chemformula_subscript:n } }
+  }
+
+% #1: tl that holds compound
+% #2: code for each token
+\cs_new_protected:Npn \__chemformula_compound_map_inline:Nn #1#2
+  {
+    % ##1: token
+    % ##2: plus case
+    % ##3: minus case
+    % ##4: else case
+    \cs_set_protected:Npn \__chemformula_if_last_token_charge:nnnF ##1##2##3##4
+      {
+        \int_compare:nTF
+          { \l__chemformula_count_tokens_int = \tl_count:N #1 }
+          {
+            \tl_if_eq:nnTF {##1} {+}
+              {##2}
+              {
+                \tl_if_eq:nnTF {##1} {-}
+                  {##3}
+                  {##4}
+              }
+          }
+          {##4}
+      }
+    \int_zero:N \l__chemformula_count_tokens_int
+    \tl_map_inline:Nn #1
+      {
+        \int_incr:N \l__chemformula_count_tokens_int
+        % do we end with a charge?
+        #2
+      }
+  }
+
 % this is the chemical formula:
 % #1: tl var to safe processed formula in
 % #2: formula
-\cs_new_protected:Npn \__chemformula_input_cmpd_no_check:Nn #1#2
+\cs_new_protected:Npn \__chemformula_input_compound_no_check:Nn #1#2
   {
     \__chemformula_if_only_parens:nTF {#2}
       { \tl_put_right:Nn #1 {#2} }
       {
-        \__chemformula_sanitize:Nn \l__chemformula_tmpa_tl {#2}
-        % let's see if the compound starts with a sub- or superscript - if yes
-        % this is an isotope:
-        \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 }
-          }
-        % do we start with a number?
-        \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 }
-          }
-        % preparations for sub- and superscripting:
-        \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 }
-          }
-        % start formula
-        \tl_put_left:Nn \l__chemformula_tmpa_tl
+        % start with formatting:
+        \tl_put_right:Nn #1
           {
             \group_begin:
               \l__chemformula_atom_format_tl
           }
-        \int_zero:N \l__chemformula_count_tokens_int
-        \tl_map_inline:Nn \l__chemformula_tmpa_tl
+        \__chemformula_sanitize:Nn \l__chemformula_tmpa_tl {#2}
+        % let's see if the compound starts with a sub- or superscript - if yes
+        % this is an isotope:
+        \__chemformula_check_for_isotope:N \l__chemformula_tmpa_tl
+        % preparations for sub- and superscripting:
+        \__chemformula_prepare_sub_and_superscripts:N \l__chemformula_tmpa_tl
+        \__chemformula_compound_map_inline:Nn \l__chemformula_tmpa_tl
           {
-            \int_incr:N \l__chemformula_count_tokens_int
             % do we end with a charge?
-            \int_compare:nTF
-              { \l__chemformula_count_tokens_int = \tl_count:N \l__chemformula_tmpa_tl }
+            \__chemformula_if_last_token_charge:nnnF {##1}
               {
-                \tl_if_eq:nnTF {##1} {+}
-                  {
-                    \tl_put_right:Nn #1
-                      { \chemformula_superscript:n { \chemformula_plus: } }
-                  }
-                  {
-                    \tl_if_eq:nnTF {##1} {-}
-                      {
-                        \tl_put_right:Nn #1
-                          { \chemformula_superscript:n { \chemformula_minus: } }
-                      }
-                      {
-                        \prop_get:NnNTF \l__chemformula_cmpd_prop
-                          {##1}
-                          \l__chemformula_tmpb_tl
-                          { \tl_put_right:NV #1 \l__chemformula_tmpb_tl }
-                          { \tl_put_right:Nn #1 {##1} }
-                      }
-                  }
+                \tl_put_right:Nn #1
+                  { \chemformula_superscript:n { \chemformula_plus: } }
               }
               {
-                \prop_get:NnNTF \l__chemformula_cmpd_prop
+                \tl_put_right:Nn #1
+                  { \chemformula_superscript:n { \chemformula_minus: } }
+              }
+              {
+                \prop_get:NnNTF \l__chemformula_compound_prop
                   {##1}
                   \l__chemformula_tmpb_tl
                   { \tl_put_right:NV #1 \l__chemformula_tmpb_tl }
                   { \tl_put_right:Nn #1 {##1} }
               }
           }
-        \tl_put_right:Nn #1 { \group_end: }
         % if Kroeger-Vink notation is active:
         \bool_if:NT \l__chemformula_kroegervink_bool
           {
@@ -2491,10 +2517,12 @@
               { \chemformula_prime: }
               { \chemformula_superscript:n { \chemformula_prime: } }
           }
+        % finish formatting:
+        \tl_put_right:Nn #1 { \group_end: }
       }
      \tl_clear:N \l__chemformula_tmpa_tl
   }
-\cs_generate_variant:Nn \__chemformula_input_cmpd_no_check:Nn { NV }
+\cs_generate_variant:Nn \__chemformula_input_compound_no_check:Nn { NV }
 
 % --------------------------------------------------------------------------
 % clean up chemmacros commands:
@@ -3456,6 +3484,9 @@ VERSION HISTORY
                            - bug fix in \RenewChemArrow
                            - meaningful error if \charrow if used with an
                              unknown arrow type
+2016/06/08 - version 4.15a - change requirement amstext -> amsmath; \chname
+                             uses \underset which needs amsmath
+2016/06/08 - version 4.15b - add missing variant of kernel function
 
 % --------------------------------------------------------------------------
 % TODO
-- 
cgit v1.2.3

