From a5e307fda7603294be920676f6214104743fbea4 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Tue, 9 Aug 2016 22:39:41 +0000 Subject: mhchem (9aug16) git-svn-id: svn://tug.org/texlive/trunk@41829 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/latex/mhchem/README | 4 +- Master/texmf-dist/doc/latex/mhchem/mhchem.pdf | Bin 420336 -> 439182 bytes Master/texmf-dist/doc/latex/mhchem/mhchem.tex | 28 +- Master/texmf-dist/tex/latex/mhchem/mhchem.sty | 384 ++++++++++++++++---------- 4 files changed, 253 insertions(+), 163 deletions(-) (limited to 'Master/texmf-dist') diff --git a/Master/texmf-dist/doc/latex/mhchem/README b/Master/texmf-dist/doc/latex/mhchem/README index 52466398541..2d1b59ee88f 100644 --- a/Master/texmf-dist/doc/latex/mhchem/README +++ b/Master/texmf-dist/doc/latex/mhchem/README @@ -1,7 +1,7 @@ -The mhchem Bundle 2016-02-09 +The mhchem Bundle 2016-08-08 containing -- mhchem v4.04 +- mhchem v4.05 - hpstatement v1.02 - rsphrase v3.11 diff --git a/Master/texmf-dist/doc/latex/mhchem/mhchem.pdf b/Master/texmf-dist/doc/latex/mhchem/mhchem.pdf index 92a486c4403..274bf479488 100644 Binary files a/Master/texmf-dist/doc/latex/mhchem/mhchem.pdf and b/Master/texmf-dist/doc/latex/mhchem/mhchem.pdf differ diff --git a/Master/texmf-dist/doc/latex/mhchem/mhchem.tex b/Master/texmf-dist/doc/latex/mhchem/mhchem.tex index 432ce388b24..acb79daef52 100644 --- a/Master/texmf-dist/doc/latex/mhchem/mhchem.tex +++ b/Master/texmf-dist/doc/latex/mhchem/mhchem.tex @@ -67,7 +67,7 @@ The mhchem Bundle\\[0.3em] \Large\textmd{% Documentation for the \LaTeX{} Packages\\ - mhchem v4.04,\\% check + mhchem v4.05,\\% check hpstatement v1.02 and\\ rsphrase v3.11}% } @@ -76,7 +76,7 @@ mhchem\makebox[0pt][l]{\textcolor{white}{NOSPAM}}@MartinHensel\makebox[1pt][l]{\textcolor{white}{.}}.de% } \date{% - 2016-02-09% check + 2016-08-08% check } \maketitle @@ -268,7 +268,7 @@ Small parenthesis etc. work in both, text mode and math mode. Large parenthesis Both, \macro{left} and \macro{right} macros, need to be in the same math environment, so you might have to put \macro{ce} into \verb|$| into \macro{ce}, but that's fine. $\displaystyle\ce{CH4 + 2 $\left( \ce{O2 + 79/21 N2} \right)$}$\par -{\raggedleft\verb|\[\ce{CH4 + 2 $\left( \ce{O2 + 79/21 N2} \right)$}\]|\par} +{\raggedleft\verb|\ce{CH4 + 2 $\left( \ce{O2 + 79/21 N2} \right)$}|\par} \section{States of Aggregation} @@ -303,7 +303,7 @@ This superscript-only feature works in text mode and math mode. A math bullet is \section {Variables like x, n, 2n+1} -Typographical conventions say that variables are typeset in italic font, while othes (like chemical element) are typeset in an upright font. +Typographical conventions say that variables are typeset in italic font, while other entities (like chemical elements) are typeset in an upright font. mhchem tries to recognize common patterns and use the correct (italic) font, like the $x$ and $2n$ in the following examples. @@ -325,9 +325,9 @@ If a more complex term is not properly recognized, you can switch to math mode ( Just write \macro{alpha} etc. This works in text mode and math mode. -Typographical conventions say that variables are typeset in italic font, while othes (like chemical element) are typeset in an upright font. +Typographical conventions say that variables are typeset in italic font, while other entities (like chemical elements) are typeset in an upright font. -Here, the Greek character is \emph{not} a variable that stands for a number, therefore an unright-font is used. +Here, the Greek character is \emph{not} a variable that stands for a number, therefore an upright font is used. \begin{SideBySideExample}[xrightmargin=4cm] \ce{\mu-Cl} @@ -359,7 +359,6 @@ By using \verb|$...$|, you can esacpe to `font-corrected math mode'. \end{SideBySideExample} In font-corrected math mode, mhchem regonizes some common patterns and prints them font-corrected (e.\,g. for use in headings). Otherwise, it will fall back to `full math mode'. -It is a full math mode. \begin{SideBySideExample}[xrightmargin=4cm] $\ce{NO_$x$}$ \sffamily\bfseries \ce{NO_$x$} @@ -430,7 +429,7 @@ The centered dot is taken from math font. \ce{A-B=C#D} \end{SideBySideExample} -mhchem tries to differentiate if \verb|\ce{-}| should be a bond, a charge or even a hyphen. +mhchem tries to differentiate whether \verb|\ce{-}| should be a bond, a charge or a hyphen. The \verb|#| bond might not work if you pass it through other commands. In this case, use \verb|\bond{3}| instead. @@ -470,8 +469,9 @@ If you switch to another font, the sidebearing of the minus sign may vary, which \makebox[3cm][l]{\ce{A -> B}}\verb|\ce{A -> B}|\\ \makebox[3cm][l]{\ce{A <- B}}\verb|\ce{A <- B}|\\ -\makebox[3cm][l]{\ce{A <-> B}}\verb|\ce{A <-> B}% should not be used according to IUPAC|\\ % Green Book p.52 +\makebox[3cm][l]{\ce{A <-> B}}\verb|\ce{A <-> B}% not to be used according to IUPAC|\\ % Green Book p.52 \makebox[3cm][l]{\ce{A <--> B}}\verb|\ce{A <--> B}|\\ +\makebox[3cm][l]{\ce{A <=> B}}\verb|\ce{A <=> B}|\\ \makebox[3cm][l]{\ce{A <=>> B}}\verb|\ce{A <=>> B}|\\ \makebox[3cm][l]{\ce{A <<=> B}}\verb|\ce{A <<=> B}| @@ -871,7 +871,7 @@ You can select other pre-defined PGF arrows (see PGF manual) or even define your \begin{SideBySideExample}[xrightmargin=3cm] \mhchemoptions{layout=stacked} - \ce{CrO4^2-}% not according to IUPAC + \ce{CrO4^2-}% not IUPAC-conform \end{SideBySideExample} @@ -899,6 +899,14 @@ Meaning and usage of \macro{bond} changed. \section{Most Recent Changes}% check +\minisec{2016-08-07 mhchem v4.05} +\begin{compactitem} +\item extended variable recognition -- single lower-case letters in superscripts/subscripts are typeset in an italic font +\item improved bond/charge/hyphen distinction +\item fixed error handling for nonstopmode +\end{compactitem} + + \minisec{2016-02-07 mhchem v4.04} \begin{compactitem} \item support for negative subscripts, \verb|\ce{^0_-1n-}| diff --git a/Master/texmf-dist/tex/latex/mhchem/mhchem.sty b/Master/texmf-dist/tex/latex/mhchem/mhchem.sty index 8a1879aafc0..0c9c343ea37 100644 --- a/Master/texmf-dist/tex/latex/mhchem/mhchem.sty +++ b/Master/texmf-dist/tex/latex/mhchem/mhchem.sty @@ -27,13 +27,13 @@ % This work consists of all files listed in manifest.txt. % % -\ProvidesPackage{mhchem}[2016/02/07 v4.04 for typesetting chemical formulae] +\ProvidesPackage{mhchem}[2016/08/07 v4.05 for typesetting chemical formulae] \RequirePackage{expl3} \RequirePackage{l3keys2e} \RequirePackage{l3regex} \RequirePackage{calc}[1998/07/07] \RequirePackage{amsmath} -\RequirePackage{chemgreek}[2015/04/09] +\RequirePackage{chemgreek}[2016/02/10] \RequirePackage{graphics} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -47,22 +47,16 @@ %%%%%%%%%% global helpers %%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\def\mhchem@appendToks#1#2{% - #1=\expandafter{\the#1#2}% -} - \ExplSyntaxOn \cs_generate_variant:Nn \str_if_eq:nnTF { Vn } \cs_generate_variant:Nn \str_case:nnF { VnF } -\cs_generate_variant:Nn \regex_match:nnTF { nV } -\cs_generate_variant:Nn \regex_match:nnTF { no } \cs_generate_variant:Nn \regex_match:NnTF { NV } \cs_generate_variant:Nn \regex_match:NnTF { No } \cs_new_protected:Npn \__mhchem_regex_peek_compile:Nn #1#2 { \regex_const:Nn #1 { \A the\ (character|letter)\ (#2) \Z } -} + } \cs_new_protected:Npn \__mhchem_regex_peek:NTF #1#2#3 { @@ -75,43 +69,48 @@ } } -\regex_const:Nn \l__mhchem_regex_digitCommaDigit_regex { \d\,\d } -\regex_const:Nn \l__mhchem_regex_oneLetter_regex { [nmptx] } +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% RegExp helpers %%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\regex_const:Nn \l__mhchem_regex_oneLowercaseLetter_regex { [a-z] } \regex_const:Nn \l__mhchem_regex_hyphen_regex { - } \regex_const:Nn \l__mhchem_regex_letters_regex { [a-zA-Z]+ } \regex_const:Nn \l__mhchem_regex_spaces_regex { [\ ]+ } \regex_const:Nn \l__mhchem_regex_digits_fregex { \A [0-9]+ \Z} -\regex_const:Nn \l__mhchem_regex_oneToThreeLetters_fregex { \A (.+) (\([a-z]{1,3}\)) \Z } -\regex_const:Nn \l__mhchem_regex_oneLetter_fregex { \A [nmptx] \Z } -\regex_const:Nn \l__mhchem_regex_oneLetterPlus_fregex - { \A ([nmptx]|\c{eta|mu|kappa}|\c{__mhchem_cg_withinMathTokens:n}\cB.[nmptx]\cE.|[0-9]+|[0-9]+\/[0-9]+) \Z } +\regex_const:Nn \l__mhchem_regex_stateOfAggregationAtEnd_fregex { \A (.+) (\([a-z]{1,3}\)) \Z } +\regex_const:Nn \l__mhchem_regex_oneLowercaseLetter_fregex { \A [a-z] \Z } +\regex_const:Nn \l__mhchem_regex_oneLowercaseLetterPlus_fregex + { \A ( (\c{__mhchem_cg_withinMathTokens:n}\cB.)? ([a-z]|\c{alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega}) (\cE.)? | \(?[0-9]+ | \(?[0-9]+\/[0-9]+ ) \Z } \regex_const:Nn \l__mhchem_regex_romanNumeral_fregex { \A [IVX]+ \Z } \regex_const:Nn \l__mhchem_regex_bracedGroup_fregex { \A \cB. [^\cE.]* \cE. \Z } \regex_const:Nn \l__mhchem_regex_oneGreekLetter_fregex { \A \c{alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Alpha|Beta|Gamma|Delta|Epsilon|Zeta|Eta|Theta|Iota|Kappa|Lambda|Mu|Nu|Xi|Omicron|Pi|Rho|Sigma|Tau|Upsilon|Phi|Chi|Psi|Omega} \Z } \regex_const:Nn \l__mhchem_regex_digitOrLetterOrGreek_fregex { \A [1-9a-zA-Z\ \~\+\-\,\.\(\)\c{alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Alpha|Beta|Gamma|Delta|Epsilon|Zeta|Eta|Theta|Iota|Kappa|Lambda|Mu|Nu|Xi|Omicron|Pi|Rho|Sigma|Tau|Upsilon|Phi|Chi|Psi|Omega}]+ \Z } +\regex_const:Nn \l__mhchem_regex_nonFormula_fregex { \A \( [a-z]+ \) \Z } \regex_const:Nn \l__mhchem_regex_formula_fregex - { \A ([0-9\ \+\-\,\.\(\)]* [nmptx] [0-9\ \+\-\,\.\(\)]*)+ \Z } + { \A ( [a-z] | ([0-9\ \+\-\,\.\(\)]+ [a-z])+ [0-9\ \+\-\,\.\(\)]* | ([a-z][0-9\ \+\-\,\.\(\)]+)+[a-z]? ) \Z } \regex_const:Nn \l__mhchem_regex_formulaAmount_fregex - { \A \c{__mhchem_cg_withinMathTokens:n}\cB. (([0-9nmptx]+ [\+\-])? [nmptx] ([\+\-] [0-9nmptx]+)?) \cE. \Z } + { \A \c{__mhchem_cg_withinMathTokens:n}\cB. (([0-9]*[a-z]? [\+\-])? [a-z] ([\+\-] [0-9]+[a-z]?)?) \cE. \Z } \regex_const:Nn \l__mhchem_regex_fraction_fregex { \A ([0-9]+)\/([0-9]+) \Z } \regex_const:Nn \l__mhchem_regex_fracMacro_fregex { \A \c{frac} \Z } - -\__mhchem_regex_peek_compile:Nn \l__mhchem_regex_digit_pregex { [ 0-9 ] } -\__mhchem_regex_peek_compile:Nn \l__mhchem_regex_digitOrPlus_pregex { [ 0-9 \+ ] } -\__mhchem_regex_peek_compile:Nn \l__mhchem_regex_digitOrMinus_pregex { [ 0-9 \-] } -\__mhchem_regex_peek_compile:Nn \l__mhchem_regex_digitOrDot_pregex { [ 0-9 . ] } -\__mhchem_regex_peek_compile:Nn \l__mhchem_regex_digitOrSlash_pregex { [ 0-9 \/ ] } -\__mhchem_regex_peek_compile:Nn \l__mhchem_regex_digitOrDotPlus_pregex { [ 0-9 \) \. \/ ] } -\__mhchem_regex_peek_compile:Nn \l__mhchem_regex_dotOrAsterisk_pregex { [ \. \* ] } -\__mhchem_regex_peek_compile:Nn \l__mhchem_regex_letter_pregex { [ a-zA-Z ] } -\__mhchem_regex_peek_compile:Nn \l__mhchem_regex_uppercaseLetterOrParenthesis_pregex { [ A-Z( ] } +\regex_const:Nn \l__mhchem_regex_ceOperator_fregex { \A ( \+ | - | = | \c{pm} | \$\c{pm}\$ | \(v\) | v | \(\^\) | \^ | \. | \* ) \Z } + +\__mhchem_regex_peek_compile:Nn \l__mhchem_regex_digit_pregex { [0-9] } +\__mhchem_regex_peek_compile:Nn \l__mhchem_regex_digitOrPlus_pregex { [0-9 \+] } +\__mhchem_regex_peek_compile:Nn \l__mhchem_regex_digitOrMinus_pregex { [0-9 \-] } +\__mhchem_regex_peek_compile:Nn \l__mhchem_regex_digitOrDot_pregex { [0-9 .] } +\__mhchem_regex_peek_compile:Nn \l__mhchem_regex_digitOrSlash_pregex { [0-9 \/] } +\__mhchem_regex_peek_compile:Nn \l__mhchem_regex_digitOrDotPlus_pregex { [0-9 \) \. \/] } +\__mhchem_regex_peek_compile:Nn \l__mhchem_regex_dotOrAsterisk_pregex { [\. \*] } +\__mhchem_regex_peek_compile:Nn \l__mhchem_regex_letter_pregex { [a-zA-Z] } +\__mhchem_regex_peek_compile:Nn \l__mhchem_regex_uppercaseLetterOrParenthesis_pregex { [ A-Z \( \[ ] } \__mhchem_regex_peek_compile:Nn \l__mhchem_regex_openingBracket_pregex { [ \( \[ ] } \__mhchem_regex_peek_compile:Nn \l__mhchem_regex_closingBracket_pregex { [ \) \] \/ ] } -\__mhchem_regex_peek_compile:Nn \l__mhchem_regex_oneLetter_pregex { [ nmptx ] } +\__mhchem_regex_peek_compile:Nn \l__mhchem_regex_oneLowercaseLetter_pregex { [a-z] } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%% loop helpers %%%%%%%%%% @@ -172,6 +171,9 @@ \cs_new_protected:Npn \__mhchem_loopHelper_ignoreNextToken:Nn #1#2 { #1 } +\cs_new_protected:Npn \__mhchem_loopHelper_breakLoop:w #1#2\q_recursion_stop + { #1 } + \ExplSyntaxOff %%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -232,7 +234,7 @@ \bool_new:N \l__mhchem_cesplit_odd_bool \tl_new:N \l__mhchem_cesplit_tmpa_tl -\newcommand\cesplit[2] +\newcommand*\cesplit[2] { \bool_set_true:N \l__mhchem_cesplit_odd_bool \tl_set:Nn \l__mhchem_cesplit_tmpa_tl { \__mhchem_ce:n {#2} } @@ -260,12 +262,7 @@ %%%%%%%%%% \cee %%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\newcommand*\mhchem@cee[1]{ - \__mhchem_cee:n {#1} -} - -\ExplSyntaxOn -\cs_new_protected:Npn \__mhchem_cee:n #1 +\cs_new_protected:Npn \mhchem@cee #1 % \__mhchem_cee:n { \cesplit { @@ -295,8 +292,6 @@ \tl_new:N \l__mhchem_ce_arrowTextOne_tl \tl_new:N \l__mhchem_ce_arrowTypeTwo_tl \tl_new:N \l__mhchem_ce_arrowTextTwo_tl -\bool_new:N \l__mhchem_ce_potentialSpacing_bool -\bool_new:N \l__mhchem_ce_potentialSpacingAllowed_bool \cs_new_protected:Npn \__mhchem_ce:n #1 { @@ -407,9 +402,8 @@ \tl_clear:N \l__mhchem_ce_result_tl \tl_clear:N \l__mhchem_ce_part_tl \tl_set:Nn \l__mhchem_ce_state_tl { c } - \bool_set_false:N \l__mhchem_ce_potentialSpacing_bool \int_set:Nn \l__mhchem_ce_distanceFromLastComma_int { 9 } - \tl_clear:N \l__mhchem_cf_lastElement_tl + \tl_clear:N \l__mhchem_cf_lastNonIsotopeElement_tl \__mhchem_ce_loop: #1 \q_recursion_stop \int_compare:nTF { \l__mhchem_option_version_int > 1 } { \tl_use:N \l__mhchem_ce_result_tl } @@ -427,19 +421,9 @@ \str_case:VnF \l__mhchem_ce_part_tl { { + } - { - \tl_put_right:Nn \l__mhchem_ce_result_tl - { \__mhchem_output_operatorPlus: } - \tl_clear:N \l__mhchem_ce_part_tl - \tl_set:Nn \l__mhchem_ce_state_tl { a-end } - } + { \__mhchem_ce_output:nn { 0 } { 0 } } { \pm } - { - \tl_put_right:Nn \l__mhchem_ce_result_tl - { \__mhchem_output_operatorPlusMinus: } - \tl_clear:N \l__mhchem_ce_part_tl - \tl_set:Nn \l__mhchem_ce_state_tl { a-end } - } + { \__mhchem_ce_output:nn { 0 } { 0 } } { -> } { \tl_set:Nn \l__mhchem_ce_arrowName_tl { yields } @@ -482,7 +466,7 @@ {} \peek_meaning_remove:NTF \q_recursion_stop { - \__mhchem_ce_output: + \__mhchem_ce_output:nn { 1 } { 0 } }{ \str_case:VnF \l__mhchem_ce_state_tl { @@ -512,14 +496,10 @@ { \int_compare:nTF { \l__mhchem_ce_distanceFromLastComma_int = 1 } { - \__mhchem_ce_output: - \bool_set_false:N \l__mhchem_ce_potentialSpacing_bool + \__mhchem_ce_output:nn { 1 } { 0 } } { - \__mhchem_ce_output: - \bool_if:NTF \l__mhchem_ce_potentialSpacingAllowed_bool - { \bool_set_true:N \l__mhchem_ce_potentialSpacing_bool } - { \bool_set_false:N \l__mhchem_ce_potentialSpacing_bool } + \__mhchem_ce_output:nn { 1 } { 1 } } \__mhchem_ce_loop: }{ @@ -542,7 +522,7 @@ { \peek_charcode_remove:NTF \c_space_token { - \__mhchem_ce_output: + \__mhchem_ce_output:nn { 0 } { 0 } \__mhchem_ce_loop: }{ \peek_charcode:NTF T @@ -595,7 +575,7 @@ } % else { - \__mhchem_ce_output: + \__mhchem_ce_output:nn { 0 } { 0 } \tl_set:Nn \l__mhchem_ce_state_tl { a-end } \__mhchem_ce_loop: } @@ -613,7 +593,7 @@ } % else { - \__mhchem_ce_output: + \__mhchem_ce_output:nn { 0 } { 0 } \tl_set:Nn \l__mhchem_ce_state_tl { a-end } \__mhchem_ce_loop: } @@ -621,7 +601,7 @@ } % else { - \__mhchem_ce_output: + \__mhchem_ce_output:nn { 0 } { 0 } \tl_set:Nn \l__mhchem_ce_state_tl { a-end } \__mhchem_ce_loop: } @@ -637,7 +617,7 @@ } % else { - \__mhchem_ce_output: + \__mhchem_ce_output:nn { 0 } { 0 } \tl_set:Nn \l__mhchem_ce_state_tl { a-end } \__mhchem_ce_loop: } @@ -678,7 +658,7 @@ { \peek_charcode_remove:NTF \c_space_token { - \__mhchem_ce_output: + \__mhchem_ce_output:nn { 0 } { 0 } \__mhchem_ce_loop: }{ \peek_charcode:NTF T @@ -709,7 +689,7 @@ } % else { - \__mhchem_ce_output: + \__mhchem_ce_output:nn { 0 } { 0 } \tl_set:Nn \l__mhchem_ce_state_tl { a-end } \__mhchem_ce_loop: } @@ -724,7 +704,7 @@ } % else { - \__mhchem_ce_output: + \__mhchem_ce_output:nn { 0 } { 0 } \tl_set:Nn \l__mhchem_ce_state_tl { a-end } \__mhchem_ce_loop: } @@ -750,7 +730,7 @@ }{ \peek_charcode:NTF ] { - \__mhchem_ce_output: + \__mhchem_ce_output:nn { 0 } { 0 } \tl_set:Nn \l__mhchem_ce_state_tl { a-end } \__mhchem_loopHelper_ignoreNextToken:Nn \__mhchem_ce_loop: } @@ -764,7 +744,6 @@ } { a-end } { - \bool_set_false:N \l__mhchem_ce_potentialSpacing_bool \tl_set:Nn \l__mhchem_ce_state_tl { c } \peek_charcode_remove:NTF \c_space_token { @@ -785,68 +764,110 @@ } } } -\cs_new_protected:Npn \__mhchem_ce_output: +\tl_new:N \l__mhchem_ce_output_cache_part_tl +\tl_new:N \l__mhchem_ce_output_cache_state_tl +\cs_new_protected:Npn \__mhchem_ce_output:nn #1#2 % #1 0/1 can be connected with previous to a cf phrase, #2 0/1 can be connected with following to a cf phrase { - \bool_set_true:N \l__mhchem_ce_potentialSpacingAllowed_bool - \str_case:VnF \l__mhchem_ce_state_tl + \regex_match:NVTF \l__mhchem_regex_ceOperator_fregex \l__mhchem_ce_part_tl + { + \__mhchem_ce_output_cache: + \tl_set:NV \l__mhchem_ce_output_cache_state_tl \l__mhchem_ce_state_tl + \tl_set:NV \l__mhchem_ce_output_cache_part_tl \l__mhchem_ce_part_tl + \__mhchem_ce_output_cache: + } + { + \bool_if:nTF + { + \str_if_eq_p:nn { #1 } { 0 } || + ( ! \tl_if_empty_p:N \l__mhchem_ce_output_cache_state_tl && + ! \str_if_eq_p:VV \l__mhchem_ce_output_cache_state_tl \l__mhchem_ce_state_tl ) + } + { + \__mhchem_ce_output_cache: + \tl_set:NV \l__mhchem_ce_output_cache_state_tl \l__mhchem_ce_state_tl + \tl_set:NV \l__mhchem_ce_output_cache_part_tl \l__mhchem_ce_part_tl + \str_if_eq:nnT { #2 } { 0 } + { + \__mhchem_ce_output_cache: + } + } + { + \tl_if_empty:NF \l__mhchem_ce_output_cache_part_tl + { + \tl_if_empty:NF \l__mhchem_ce_part_tl + { \tl_put_right:Nn \l__mhchem_ce_output_cache_part_tl { ~ } } + } + \tl_put_right:NV \l__mhchem_ce_output_cache_part_tl \l__mhchem_ce_part_tl + \tl_set:NV \l__mhchem_ce_output_cache_state_tl \l__mhchem_ce_state_tl + \str_if_eq:nnT { #2 } { 0 } + { \__mhchem_ce_output_cache: } + } + } + \tl_clear:N \l__mhchem_ce_part_tl + \tl_set:Nn \l__mhchem_ce_state_tl { c } + } +\cs_new_protected:Npn \__mhchem_ce_output_cache: + { + \str_case:VnF \l__mhchem_ce_output_cache_state_tl { { c } { - \str_case:VnF \l__mhchem_ce_part_tl + \str_case:VnF \l__mhchem_ce_output_cache_part_tl { + { + } + { + \tl_put_right:Nn \l__mhchem_ce_result_tl + { \__mhchem_output_operatorPlus: } + } { - } { \tl_put_right:Nn \l__mhchem_ce_result_tl { \__mhchem_output_operatorMinus: } - \bool_set_false:N \l__mhchem_ce_potentialSpacingAllowed_bool } { = } { \tl_put_right:Nn \l__mhchem_ce_result_tl { \__mhchem_output_operatorEquals: } - \bool_set_false:N \l__mhchem_ce_potentialSpacingAllowed_bool + } + { \pm } + { + \tl_put_right:Nn \l__mhchem_ce_result_tl + { \__mhchem_output_operatorPlusMinus: } } { $\pm$ } { \tl_put_right:Nn \l__mhchem_ce_result_tl { \__mhchem_output_operatorPlusMinus: } - \bool_set_false:N \l__mhchem_ce_potentialSpacingAllowed_bool } { (v) } { \tl_put_right:Nn \l__mhchem_ce_result_tl { \ensuremath{{}\mathop{\downarrow}{}} } - \bool_set_false:N \l__mhchem_ce_potentialSpacingAllowed_bool } { v } { \tl_put_right:Nn \l__mhchem_ce_result_tl { \ensuremath{{}\mathop{\downarrow}{}} } - \bool_set_false:N \l__mhchem_ce_potentialSpacingAllowed_bool } { (^) } { \tl_put_right:Nn \l__mhchem_ce_result_tl { \ensuremath{{}\mathop{\uparrow}{}} } - \bool_set_false:N \l__mhchem_ce_potentialSpacingAllowed_bool } { ^ } { \tl_put_right:Nn \l__mhchem_ce_result_tl { \ensuremath{{}\mathop{\uparrow}{}} } - \bool_set_false:N \l__mhchem_ce_potentialSpacingAllowed_bool } { . } { \tl_put_right:Nn \l__mhchem_ce_result_tl { \__mhchem_output_additionCompound: } - \bool_set_false:N \l__mhchem_ce_potentialSpacingAllowed_bool } { * } { \tl_put_right:Nn \l__mhchem_ce_result_tl { \__mhchem_output_additionCompound: } - \bool_set_false:N \l__mhchem_ce_potentialSpacingAllowed_bool } { } { @@ -856,29 +877,27 @@ { \int_compare:nTF { \l__mhchem_option_version_int > 3 } { - \bool_if:NT \l__mhchem_ce_potentialSpacing_bool - { \tl_put_right:Nn \l__mhchem_ce_result_tl { \__mhchem_output_skipAfterAmount: } } \regex_match:NVTF - \l__mhchem_regex_oneToThreeLetters_fregex - \l__mhchem_ce_part_tl + \l__mhchem_regex_stateOfAggregationAtEnd_fregex + \l__mhchem_ce_output_cache_part_tl { \regex_replace_once:NnN - \l__mhchem_regex_oneToThreeLetters_fregex + \l__mhchem_regex_stateOfAggregationAtEnd_fregex { \c{__mhchem_cf:nn}\cB[\cE]\cB[ \1 \cE] \c{__mhchem_output_skipBeforeStateOfAggregation:} \c{__mhchem_cf:nn}\cB[\cE]\cB[ \2 \cE] } - \l__mhchem_ce_part_tl + \l__mhchem_ce_output_cache_part_tl \tl_put_right:Nx \l__mhchem_ce_result_tl - { \exp_not:V \l__mhchem_ce_part_tl } + { \exp_not:V \l__mhchem_ce_output_cache_part_tl } } { \tl_put_right:Nx \l__mhchem_ce_result_tl { \exp_not:N \__mhchem_cf:nn {} - { \exp_not:V \l__mhchem_ce_part_tl } + { \exp_not:V \l__mhchem_ce_output_cache_part_tl } } } } @@ -887,7 +906,7 @@ { \exp_not:N \__mhchem_cf:nn {} - { \exp_not:V \l__mhchem_ce_part_tl } + { \exp_not:V \l__mhchem_ce_output_cache_part_tl } } } } @@ -909,10 +928,9 @@ {} {} {} - \tl_set:NV \l__mhchem_ce_part_tl \l__mhchem_ce_arrowTypeOne_tl - \tl_set:Nn \l__mhchem_ce_state_tl { c } - \bool_set_false:N \l__mhchem_ce_potentialSpacing_bool - \__mhchem_ce_output: + \tl_set:NV \l__mhchem_ce_output_cache_part_tl \l__mhchem_ce_arrowTypeOne_tl + \tl_set:Nn \l__mhchem_ce_output_cache_state_tl { c } + \__mhchem_ce_output_cache: } { a-]1 } { @@ -940,10 +958,9 @@ { \l__mhchem_ce_arrowTextOne_tl } {} {} - \tl_set:NV \l__mhchem_ce_part_tl \l__mhchem_ce_arrowTypeTwo_tl - \tl_set:Nn \l__mhchem_ce_state_tl { c } - \bool_set_false:N \l__mhchem_ce_potentialSpacing_bool - \__mhchem_ce_output: + \tl_set:NV \l__mhchem_ce_output_cache_part_tl \l__mhchem_ce_arrowTypeTwo_tl + \tl_set:Nn \l__mhchem_ce_output_cache_state_tl { c } + \__mhchem_ce_output_cache: } { a-]2 } { @@ -956,9 +973,8 @@ } } {} - \tl_clear:N \l__mhchem_ce_part_tl - \tl_set:Nn \l__mhchem_ce_state_tl { c } - \bool_set_false:N \l__mhchem_ce_potentialSpacing_bool + \tl_clear:N \l__mhchem_ce_output_cache_state_tl + \tl_clear:N \l__mhchem_ce_output_cache_part_tl } \cs_new_protected:Npn \__mhchem_ce_outputArrow:nnnnn #1#2#3#4#5 { @@ -1357,7 +1373,7 @@ \tl_new:N \l__mhchem_cf_sup_tl \tl_new:N \l__mhchem_cf_supState_tl \tl_new:N \l__mhchem_cf_subState_tl -\tl_new:N \l__mhchem_cf_lastElement_tl +\tl_new:N \l__mhchem_cf_lastNonIsotopeElement_tl \bool_new:N \g__mhchem_cf_lastElementWithScript_bool \cs_new_protected:Npn \__mhchem_cf_resetOutput: { @@ -1399,19 +1415,11 @@ \tl_set:Nn \l__mhchem_cf_state_tl { s } \bool_set_false:N \l__mhchem_cf_startedWithBond_bool \__mhchem_cf_resetOutput: - \tl_set:Nn \l__mhchem_cf_result_tl {#2} - \regex_replace_once:NnNTF - \l__mhchem_regex_oneLetter_fregex - { \c{__mhchem_output_withFont:n}\cB[ \c{__mhchem_cg_itshape:n}\cB[ \0 \cE]\cE] } - \l__mhchem_cf_result_tl - {} - { - \tl_clear:N \l__mhchem_cf_result_tl - \__mhchem_cf_loop: #2 \q_recursion_stop - } - \tl_if_empty:nTF {#1} - { \ensuremath{\tl_use:N \l__mhchem_cf_result_tl} } - { \ensuremath{\overset{#1}{\tl_use:N \l__mhchem_cf_result_tl}} } + \tl_clear:N \l__mhchem_cf_result_tl + \__mhchem_cf_loop: #2 \q_recursion_stop + \tl_if_empty:nTF {#1} + { \ensuremath{\tl_use:N \l__mhchem_cf_result_tl} } + { \ensuremath{\overset{#1}{\tl_use:N \l__mhchem_cf_result_tl}} } \group_end: } \tl_new:N \l__mhchem_cf_loop_tmpa_l @@ -1438,6 +1446,46 @@ {} \__mhchem_cf_outputAndReset: }{ + \peek_charcode_remove:NTF \c_space_token + { + \str_case:VnF \l__mhchem_cf_state_tl + { + { - } + { + \bool_if:NTF \l__mhchem_cf_startedWithBond_bool + { \__mhchem_cf_outputRaw:n { \__mhchem_output_bond_single: } } + { \tl_put_right:Nn \l__mhchem_cf_sup_tl { - } } + } + { 1 } + { \tl_set:Nn \l__mhchem_cf_state_tl {9} } + { frac2 } + { \__mhchem_cf_outputRawElementAndReset: } + { a } + { + \bool_if:nT + { + \tl_if_empty_p:N \l__mhchem_cf_presup_tl && + \tl_if_empty_p:N \l__mhchem_cf_presub_tl && + \tl_if_empty_p:N \l__mhchem_cf_sub_tl && + \tl_if_empty_p:N \l__mhchem_cf_sup_tl + } + { + \regex_replace_once:NnNTF + \l__mhchem_regex_oneLowercaseLetter_fregex + { \c{__mhchem_output_withFont:n}\cB[ \c{__mhchem_cg_itshape:n}\cB[ \0 \cE]\cE] } + \l__mhchem_cf_element_tl + {} + {} + } + } + } + {} + \__mhchem_cf_outputAndReset: + \int_compare:nT { \l__mhchem_option_version_int > 3 } + { \__mhchem_cf_outputRaw:n { \__mhchem_output_skipAfterAmount: } } + \tl_set:Nn \l__mhchem_cf_state_tl { s } + \__mhchem_cf_loop: + }{ \peek_meaning:NTF \relax { \__mhchem_loopHelper_ignoreNextToken:Nn \__mhchem_cf_loop: }{ \peek_meaning:NTF \protect @@ -1447,16 +1495,18 @@ { - } { \__mhchem_cf_outputAndReset: - \regex_match:NVTF - \l__mhchem_regex_oneLetterPlus_fregex - \l__mhchem_cf_lastElement_tl - { - \__mhchem_cf_outputRaw:n - { \__mhchem_cg_escapeFromMathToTextOrFaketext:n { - } } - } + \int_compare:nTF { \l__mhchem_option_version_int > 3 } { - \__mhchem_cf_outputRaw:n { \__mhchem_output_bond_single: } + \regex_match:NVTF + \l__mhchem_regex_oneLowercaseLetterPlus_fregex + \l__mhchem_cf_lastNonIsotopeElement_tl + { + \__mhchem_cf_outputRaw:n + { \__mhchem_cg_escapeFromMathToTextOrFaketext:n { - } } + } + { \__mhchem_cf_outputRaw:n { \__mhchem_output_bond_single: } } } + { \__mhchem_cf_outputRaw:n { \__mhchem_output_bond_single: } } \tl_set:Nn \l__mhchem_cf_state_tl { s } \__mhchem_cf_loop: } @@ -1478,13 +1528,13 @@ } { ps } { - \__mhchem_cf_outputAndReset: \__mhchem_regex_peek:NTF \l__mhchem_regex_uppercaseLetterOrParenthesis_pregex { \regex_match:NVTF \l__mhchem_regex_formulaAmount_fregex - \l__mhchem_cf_lastElement_tl + \l__mhchem_cf_element_tl { + \__mhchem_cf_outputAndReset: \tl_put_right:Nn \l__mhchem_cf_result_tl { \__mhchem_output_skipAfterAmount: } @@ -1675,7 +1725,10 @@ \__mhchem_cf_loop: } % else - { \msg_error:nnn { mhchem } { cf / unexpected-input } } + { + \__mhchem_loopHelper_breakLoop:w + { \msg_error:nnn { mhchem } { cf / unexpected-input } } + } }}}}}}}}}}}}}}}}} } { c } @@ -1973,7 +2026,7 @@ \peek_charcode:NTF - { \regex_match:NVTF - \l__mhchem_regex_oneLetterPlus_fregex + \l__mhchem_regex_oneLowercaseLetterPlus_fregex \l__mhchem_cf_element_tl { \tl_set:Nn \l__mhchem_cf_state_tl { - } @@ -2118,7 +2171,7 @@ \l__mhchem_cf_result_tl \__mhchem_cf_loop: } - }}} + }}}} } \cs_new_protected:Npn \__mhchem_cf_output: @@ -2134,7 +2187,13 @@ { } { - \tl_set:NV \l__mhchem_cf_lastElement_tl \l__mhchem_cf_element_tl + \bool_if:nT + { + \tl_if_empty_p:N \l__mhchem_cf_presup_tl && + \tl_if_empty_p:N \l__mhchem_cf_presub_tl + } + { \tl_set:NV \l__mhchem_cf_lastNonIsotopeElement_tl \l__mhchem_cf_element_tl } + { \tl_clear:N \l__mhchem_cf_lastNonIsotopeElement_tl } \bool_gset:Nn \g__mhchem_cf_lastElementWithScript_bool { ! \tl_if_empty_p:N \l__mhchem_cf_sub_tl || @@ -2240,7 +2299,7 @@ } \cs_new_protected:Npn \__mhchem_cf_outputRawElement: { - \tl_set:NV \l__mhchem_cf_lastElement_tl \l__mhchem_cf_element_tl + \tl_set:NV \l__mhchem_cf_lastNonIsotopeElement_tl \l__mhchem_cf_element_tl \tl_put_right:Nx \l__mhchem_cf_result_tl { \exp_not:V \l__mhchem_cf_element_tl } } \cs_new_protected:Npn \__mhchem_cf_outputAndReset: @@ -2413,28 +2472,35 @@ \int_compare:nTF { \l__mhchem_option_version_int > 3} { \regex_match:NVTF - \l__mhchem_regex_formula_fregex + \l__mhchem_regex_nonFormula_fregex #1 - { - \regex_replace_all:NnN - \l__mhchem_regex_oneLetter_regex - { \c{__mhchem_output_withFont:n}\cB[ \c{__mhchem_cg_itshape:n}\cB[ \0 \cE]\cE] } - #1 - \regex_replace_all:NnN - \l__mhchem_regex_hyphen_regex - { \c{__mhchem_output_minus:} } - #1 - \regex_replace_all:NnN - \l__mhchem_regex_digitCommaDigit_regex - { \c{__mhchem_output_commaDecimal:} } - #1 - } { \tl_clear:N \l__mhchem_cg_replaceForSubscript_result_tl \tl_set:Nn \l__mhchem_cg_replaceForSubscript_state_tl { s } \exp_after:wN \__mhchem_cg_replaceForSubscript_loop: #1 \q_recursion_stop \tl_set:NV #1 \l__mhchem_cg_replaceForSubscript_result_tl } + { + \regex_match:NVTF + \l__mhchem_regex_formula_fregex + #1 + { + \regex_replace_all:NnN + \l__mhchem_regex_oneLowercaseLetter_regex + { \c{__mhchem_output_withFont:n}\cB[ \c{__mhchem_cg_itshape:n}\cB[ \0 \cE]\cE] } + #1 + \regex_replace_all:NnN + \l__mhchem_regex_hyphen_regex + { \c{__mhchem_output_minus:} } + #1 + } + { + \tl_clear:N \l__mhchem_cg_replaceForSubscript_result_tl + \tl_set:Nn \l__mhchem_cg_replaceForSubscript_state_tl { s } + \exp_after:wN \__mhchem_cg_replaceForSubscript_loop: #1 \q_recursion_stop + \tl_set:NV #1 \l__mhchem_cg_replaceForSubscript_result_tl + } + } } % else { @@ -2510,8 +2576,14 @@ \tl_new:N \l__mhchem_cg_replaceForSuperscript_result_tl \tl_new:N \l__mhchem_cg_replaceForSuperscript_state_tl +\bool_new:N \l__mhchem_cg_replaceForSuperscript_isFormula_bool \cs_new_protected:Npn \__mhchem_cg_replaceForSuperscript:N #1 { + \regex_match:NVTF + \l__mhchem_regex_formula_fregex + #1 + { \bool_set_true:N \l__mhchem_cg_replaceForSuperscript_isFormula_bool } + { \bool_set_false:N \l__mhchem_cg_replaceForSuperscript_isFormula_bool } \tl_clear:N \l__mhchem_cg_replaceForSuperscript_result_tl \tl_set:Nn \l__mhchem_cg_replaceForSuperscript_state_tl { s } \exp_after:wN \__mhchem_cg_replaceForSuperscript_loop: #1 \q_recursion_stop @@ -2583,7 +2655,7 @@ } \__mhchem_cg_replaceForSuperscript_loop: }{ - \__mhchem_regex_peek:NTF \l__mhchem_regex_oneLetter_pregex + \__mhchem_regex_peek:NTF \l__mhchem_regex_oneLowercaseLetter_pregex { \str_if_eq:VnT \l__mhchem_cg_replaceForSuperscript_state_tl { 9. } { @@ -2591,11 +2663,20 @@ { \__mhchem_output_electronDot: } } \tl_set:Nn \l__mhchem_cg_replaceForSuperscript_state_tl { s } - \tl_put_right:Nn \l__mhchem_cg_replaceForSuperscript_result_tl - { \__mhchem_cg_itshape:n } - \__mhchem_loopHelper_appendNextGroup:NNn - \l__mhchem_cg_replaceForSuperscript_result_tl - \__mhchem_cg_replaceForSuperscript_loop: + \bool_if:NTF + \l__mhchem_cg_replaceForSuperscript_isFormula_bool + { + \tl_put_right:Nn \l__mhchem_cg_replaceForSuperscript_result_tl + { \__mhchem_cg_itshape:n } + \__mhchem_loopHelper_appendNextGroup:NNn + \l__mhchem_cg_replaceForSuperscript_result_tl + \__mhchem_cg_replaceForSuperscript_loop: + } + { + \__mhchem_loopHelper_appendNextToken:NNn + \l__mhchem_cg_replaceForSuperscript_result_tl + \__mhchem_cg_replaceForSuperscript_loop: + } }{ \__mhchem_regex_peek:NTF \l__mhchem_regex_digit_pregex { @@ -3350,3 +3431,4 @@ \DeclareRobustCommand\cf[2][]{\mhchem@cf[#1]{#2}} \DeclareRobustCommand\cee[1]{\mhchem@cee{#1}} } + -- cgit v1.2.3