diff options
author | Karl Berry <karl@freefriends.org> | 2017-06-06 21:53:26 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2017-06-06 21:53:26 +0000 |
commit | af4a841a3ac56bc89bf08019c254921b327d2af7 (patch) | |
tree | af2e36895b67aca097b7227d1e145f1822463c1c /Master/texmf-dist/source/latex/mathtools/mathtools.dtx | |
parent | d036e1b1dc4d59e9ce15b37af93ae0b55a50520c (diff) |
mathtools (24may17)
git-svn-id: svn://tug.org/texlive/trunk@44504 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/mathtools/mathtools.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/mathtools/mathtools.dtx | 842 |
1 files changed, 537 insertions, 305 deletions
diff --git a/Master/texmf-dist/source/latex/mathtools/mathtools.dtx b/Master/texmf-dist/source/latex/mathtools/mathtools.dtx index 2405eba3b23..2aece4d7e72 100644 --- a/Master/texmf-dist/source/latex/mathtools/mathtools.dtx +++ b/Master/texmf-dist/source/latex/mathtools/mathtools.dtx @@ -68,7 +68,7 @@ \input docstrip.tex \Msg{************************************************************************} \Msg{* Installation} -\Msg{* Package: mathtools 2015/11/12 v1.18} +\Msg{* Package: mathtools 2017/05/24 v1.19} \Msg{************************************************************************} \keepsilent @@ -131,7 +131,7 @@ and the derived files %<*driver> \NeedsTeXFormat{LaTeX2e} \ProvidesFile{mathtools.drv}% - [2015/11/12 v1.18 mathematical typesetting tools] + [2017/05/24 v1.19 mathematical typesetting tools] \documentclass{ltxdoc} \IfFileExists{fourier.sty}{\usepackage{fourier}}{} \addtolength\marginparwidth{-25pt} @@ -267,7 +267,9 @@ and the derived files \let\MTtheindex\theindex \def\theindex{\MTtheindex\MakePrivateLetters} -\usepackage[final,hyperindex=false]{hyperref} +\usepackage[final, +hyperindex=false, +]{hyperref} \renewcommand*\usage[1]{\textit{\hyperpage{#1}}} \OnlyDescription @@ -277,11 +279,13 @@ and the derived files %</driver> % \fi % +% \changes{v1.19}{2017/03/31}{Updated to match some macro renaming in +% \pkg{mhsetup}} % \changes{v1.0}{2004/07/26}{Initial release} % % \GetFileInfo{mathtools.drv} % -% \CheckSum{3174} +% \CheckSum{3146} % % \title{The \pkg{mathtools} package\thanks{This file has version number % \fileversion, last revised \filedate.}} @@ -292,10 +296,10 @@ and the derived files % \maketitle % % \begin{abstract} -% The \pkg{mathtools} package is an extension package to +% \noindent The \pkg{mathtools} package is an extension package to % \pkg{amsmath}. There are two things on \pkg{mathtools}' agenda: -% 1)~correct various bugs/defeciencies in \pkg{amsmath} until -% these are fixed by the \AmS{} and 2)~provide useful tools +% (1)~correct various bugs/defeciencies in \pkg{amsmath} until +% these are fixed by the \AmS{} and (2)~provide useful tools % for mathematical typesetting, be it a small macro for % typesetting a prescript or an underbracket, or entirely new % display math constructs such as a \env{multlined} environment. @@ -1357,6 +1361,11 @@ and the derived files % } % \end{verbatim} % +% \medskip\noindent +% \textbf{Caveat:} +% \CommentAdded{2017/05/22} +% \cs{shoveleft} and \cs{shoveright} does not work as expected if +% used as the last line in \env{multlined}. % % % \subsubsection{More \env{cases}-like environments} @@ -1606,7 +1615,7 @@ and the derived files % \end{alignat*} % % -% \subsubsection{Centered \cs{vdots}} +% \subsubsection{Centered \texorpdfstring{\cs{vdots}}{\textbackslash vdots}} % % If one want to mark a vertical continuation, there is % the \verb?\vdots? command, but combine this with an alignment and @@ -1774,6 +1783,7 @@ and the derived files % \textbf{Tip:} \cs{intertext} and \cs{shortintertext} also works % within \env{gather}. % +% % \subsection{Paired delimiters} % % @@ -2012,7 +2022,7 @@ and the derived files % \end{verbatim} % Thus giving support for \verb|\Prob{A \given B}|. % -% \medskip\noindent\textbf{Note:} As the number of arguments increase +% \medskip\noindent\textbf{Note 1:} As the number of arguments increase % the \cs{DeclarePairedDelimiter...} macros become hard for users to % understand. A key-value interface would be better. This is planed % for a future release. In @@ -2025,6 +2035,12 @@ and the derived files % obvious how to get \pkg{xparse} to support \verb|[3]| for the number % of arguments. We will consider this for a future release. % +% \medskip\noindent\textbf{Note 2:} If you want to define your own +% manual scaler macros, it is importent that you besides \cs{foo} also +% defines \cs{fool} and \cs{foor}. When a scaler is specified, in say +% \cs{abs[\cs{big}]}\marg{arg}, we actually use \cs{bigl} and \cs{bigr}. +% +% % \subsubsection{Expert use} % % Within the starred version of \cs{DeclarePairedDelimiter} and @@ -2035,26 +2051,44 @@ and the derived files % '$\sin$' and '('. In some special cases it may be useful to be % able to tinker with the behavior. % \begin{codesyntax} -% \SpecialUsageIndex{\reDeclarePairedDelimiterInnerWrapper}\cs{reDeclarePairedDelimiterInnerWrapper}\marg{macro name}\marg{\textnormal{\texttt{star}} or \textnormal{\texttt{nostar}}}\marg{code} +% \SpecialUsageIndex{\reDeclarePairedDelimiterInnerWrapper}\cs{reDeclarePairedDelimiterInnerWrapper}\marg{macro name}\marg{\textnormal{\texttt{star}} or \textnormal{\texttt{nostarnonscaled}} or \textnormal{\texttt{nostarscaled}}}\marg{code} % \end{codesyntax} -% Internally several macros are created, including two call backs +% Internally several macros are created, including three call backs % that take care of the formatting. There is one internal macro for -% the starred version, labeled \texttt{star}, the other one is -% labeled \texttt{nostar}. Within \meta{code}, \texttt{\#1} will be -% replaced by the scaled left fence, \texttt{\#3} the corresponding -% scaled right fence, and \texttt{\#2} the stuff in between. For -% example, here is how one might turn the content into \cs{mathinner}: +% the starred version, labeled \texttt{star}, the other two are +% labeled \texttt{nostarnonscaled} and \texttt{nostarscaled}. Within +% \meta{code}, \texttt{\#1} will be replaced by the (scaled) left +% fence, \texttt{\#3} the corresponding (scaled) right fence, and +% \texttt{\#2} the stuff in between. For example, here is how one +% might turn the content into \cs{mathinner}: % \begin{verbatim} % \DeclarePairedDelimiter\abs\lvert\rvert % \reDeclarePairedDelimiterInnerWrapper\abs{star}{#1#2#3} -% \reDeclarePairedDelimiterInnerWrapper\abs{nostar}{\mathinner{#1#2#3}} +% \reDeclarePairedDelimiterInnerWrapper\abs{nostarnonscaled}{\mathinner{#1#2#3}} +% \reDeclarePairedDelimiterInnerWrapper\abs{nostarscaled}{\mathinner{#1#2#3}} % \end{verbatim} % The default values for the call backs corresponds to % \begin{verbatim} -% star: \mathopen{}\mathclose\bgroup #1#2\aftergroup\egroup #3 -% nostar: \mathopen{#1}#2\mathclose{#3} +% star: \mathopen{}\mathclose\bgroup #1#2\aftergroup\egroup #3 +% nostarnonscaled: \mathopen#1#2\mathclose#3 +% nostarscaled: \mathopen{#1}#2\mathclose{#3} % \end{verbatim} -% +% The two \texttt{nostar...} versions look the same, but they are +% not. In most (math) fonts, the first item in this list will be +% different from the rest (the superscript sits +% higher).\footnote{Interestingly it dod not show up in the font of +% this manual, which uses the \pkg{fourier} font set.} +% \begin{verbatim} +% \mathclose{\rvert}^2\mathclose\rvert^2\rvert^2 +% \end{verbatim} +% +% +% \bigskip\noindent \textbf{Breaking change:} Prior to May 2017, we +% used two wrappers, the other named \texttt{nostar}. As of May 2017 +% \texttt{nostar} has been split into \texttt{nostarnonscaled} and +% \texttt{nostarscaled} and \texttt{nostar} alone is no longer +% supported (will give an error). +% % \bigskip\noindent \textbf{Note:} Since we are using macros to add % the \verb|\left...\right| constructions around some body, it % \emph{is} (in principle) possible to make such a construction @@ -2679,13 +2713,13 @@ and the derived files % \begin{macrocode} %<*package> \ProvidesPackage{mathtools}% - [2015/11/12 v1.18 mathematical typesetting tools] + [2017/05/24 v1.19 mathematical typesetting tools] % \end{macrocode} % \changes{v1.10}{2011/02/12}{Might as well make sure that we need the % latest version of \texttt{mhsetup}} % \begin{macrocode} \RequirePackage{keyval,calc} -\RequirePackage{mhsetup}[2010/01/21] +\RequirePackage{mhsetup}[2017/03/31] \MHInternalSyntaxOn % \end{macrocode} % \changes{v1.13}{2013/02/11}{Robustifying \cs{(}\cs{)}\cs{[}\cs{]}} @@ -2811,7 +2845,7 @@ and the derived files % We have to turn off the new syntax when \pkg{amstext} is loaded. % \begin{macrocode} \MHInternalSyntaxOff -\RequirePackage{amsmath}[2000/07/18] +\RequirePackage{amsmath}[2016/11/05] \MHInternalSyntaxOn \AtEndOfPackage{\MHInternalSyntaxOff} % \end{macrocode} @@ -2968,14 +3002,15 @@ and the derived files % so do not let the tag have width zero. Rememeber % \cs{@safe@activestrue/false} in order to handle active chars in labels. % \changes{v1.12}{2012/04/24}{Added \cs{@safe@activestrue/false}} +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} - \if_meaning:NN \df@label\@empty + \MH_if_meaning:NN \df@label\@empty \MH_if_boolean:nTF {manual_tag}% this was \MH_if_boolean:nT before { \MH_if_boolean:nTF {show_manual_tags} { \MT_prev_tagform:n {#1} } { \stepcounter{equation} } }{\kern1sp}% this last {\kern1sp} is new. - \else: + \MH_else: \MH_if_boolean:nTF {manual_tag} { \MH_if_boolean:nTF {show_manual_tags} { \MT_prev_tagform:n {#1} } @@ -2988,6 +3023,7 @@ and the derived files % referred to. % \changes{v1.12}{2011/06/08}{Added the falsification of manual tag % when show manual tags is off and maual tag is not referred to} +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} { \global\MH_set_boolean_F:n {manual_tag} } { \MT_prev_tagform:n {#1} } @@ -3001,7 +3037,7 @@ and the derived files { \refstepcounter{equation}\MT_prev_tagform:n {#1} } \@safe@activesfalse } - \fi: + \MH_fi: \global\MH_set_boolean_T:n {raw_maketag} } % \end{macrocode} @@ -3009,11 +3045,12 @@ and the derived files % \begin{macro}{\MT_extended_maketag:n} % The extended version of \cs{maketag@@@}. % \changes{v1.12}{2012/04/24}{Added \cs{@safe@activestrue/false}} +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} \def\MT_extended_maketag:n #1{ \ifx\df@label\@empty \MT_maketag:n {#1} - \else: + \MH_else: \MH_if_boolean:nTF {raw_maketag} { \MH_if_boolean:nTF {show_manual_tags} @@ -3026,7 +3063,7 @@ and the derived files } } { \MT_maketag:n {#1} } - \fi: + \MH_fi: % \end{macrocode} % As this function is always called we let it set the marker for a manual % tag false when exiting (well actually not true, see above). @@ -3084,15 +3121,16 @@ and the derived files \newcommand*\MT@newlabel[1]{ \global\@namedef{MT_r_#1}{} } % \end{macrocode} % \end{macro} +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} \MH_new_boolean:n {show_only_refs} \MH_new_boolean:n {show_manual_tags} \define@key{\MT_options_name:}{showmanualtags}[true]{ - \@ifundefined{boolean_show_manual_tags_#1:} + \@ifundefined{MH_boolean_show_manual_tags_#1:} { \MT_true_false_error: - \@nameuse{boolean_show_manual_tags_false:} + \@nameuse{MH_boolean_show_manual_tags_false:} } - { \@nameuse{boolean_show_manual_tags_#1:} } + { \@nameuse{MH_boolean_show_manual_tags_#1:} } } % \end{macrocode} % \begin{macro}{\MT_showonlyrefs_true:} @@ -3158,17 +3196,19 @@ and the derived files % equation number where we don't want it. This is probably not needed % since \cs{nonumber} is unnecessary when \key{showonlyrefs} is in % effect, but now you can use it with old documents as well. +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} \renewcommand\nonumber{ \if@eqnsw - \if_meaning:NN \incr@eqnum\@empty + \MH_if_meaning:NN \incr@eqnum\@empty % \end{macrocode} % Only subtract the number if |show_only_refs| is false. +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} \MH_if_boolean:nF {show_only_refs} {\addtocounter{equation}\m@ne} - \fi: - \fi: + \MH_fi: + \MH_fi: \MH_let:NwN \print@eqnum\@empty \MH_let:NwN \incr@eqnum\@empty \global\@eqnswfalse } @@ -3186,7 +3226,7 @@ and the derived files % to \cs{nocite}. % \begin{macrocode} \MHInternalSyntaxOff -\newcommand\noeqref[1]{\@bsphack +\newcommand\noeqref[1]{\@bsphack% \@for\@tempa:=#1\do{% \@safe@activestrue% \edef\@tempa{\expandafter\@firstofone\@tempa}% @@ -3197,7 +3237,7 @@ and the derived files }{}% \if@filesw\protected@write\@auxout{}% {\string\MT@newlabel{\@tempa}}\fi% - \@safe@activesfalse} + \@safe@activesfalse}% \@esphack} % \end{macrocode} @@ -3585,25 +3625,26 @@ and the derived files % \begin{macro}{\MT_test_for_tcb_other:nnnnn} % This tests if the token(s) is/are equal to either t, c, or~b, or % something entirely different. +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} \newcommand*\MT_test_for_tcb_other:nnnnn [1]{ - \if:w t#1\relax + \MH_if:w t#1\relax \expandafter\MH_use_choice_i:nnnn - \else: - \if:w c#1\relax + \MH_else: + \MH_if:w c#1\relax \expandafter\expandafter\expandafter\MH_use_choice_ii:nnnn - \else: - \if:w b#1\relax + \MH_else: + \MH_if:w b#1\relax \expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter \MH_use_choice_iii:nnnn - \else: + \MH_else: \expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter \MH_use_choice_iv:nnnn - \fi: - \fi: - \fi: + \MH_fi: + \MH_fi: + \MH_fi: } % \end{macrocode} % \end{macro} @@ -3612,20 +3653,23 @@ and the derived files % \textbf{BUG:} \cs{baselineskip} is zero inside an array or matrix, % thus in those cases the line is \emph{not} invisible. % \changes{v1.14}{2014/05/21}{Added -\cs{jot}} +% \changes{v1.19}{2017/05/24}{Removed -\cs{jot} again, do not +% remember why we added it in the first place} % \begin{macrocode} \def\MT_mult_invisible_line: { \crcr \global\MH_set_boolean_F:n {mult_firstline} \hbox to \l_MT_multwidth_dim{}\crcr - \noalign{\vskip-\baselineskip \vskip-\jot \vskip-\normallineskip} + \noalign{\vskip-\baselineskip \vskip-\normallineskip} } % \end{macrocode} % \end{macro} % \begin{macro}{\MT_mult_mathcr_atat:w} % The normal \cs{math@cr@@} with our hooks. +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} \def\MT_mult_mathcr_atat:w [#1]{% - \if_num:w 0=`{\fi: \iffalse}\fi: + \MH_if_num:w 0=`{\MH_fi: \iffalse}\MH_fi: \MH_if_boolean:nT {mult_firstline}{ \kern\l_MT_mult_left_fdim \MT_mult_invisible_line: @@ -3633,9 +3677,9 @@ and the derived files \crcr \noalign{\vskip#1\relax} \global\advance\g_MT_multlinerow_int\@ne - \if_num:w \g_MT_multlinerow_int=\l_MT_multline_lastline_fint + \MH_if_num:w \g_MT_multlinerow_int=\l_MT_multline_lastline_fint \MH_let:NwN \math@cr@@\MT_mult_last_mathcr:w - \fi: + \MH_fi: } % \end{macrocode} % \end{macro} @@ -3643,9 +3687,10 @@ and the derived files % The special case where there is a two-line \env{multlined}. We % insert the first kern, then the invisible line of the desired % width, the optional vertical space and then the last kern. +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} \def\MT_mult_firstandlast_mathcr:w [#1]{% - \if_num:w 0=`{\fi: \iffalse}\fi: + \MH_if_num:w 0=`{\MH_fi: \iffalse}\MH_fi: \kern\l_MT_mult_left_fdim \MT_mult_invisible_line: \noalign{\vskip#1\relax} @@ -3655,9 +3700,10 @@ and the derived files % \end{macro} % \begin{macro}{\MT_mult_last_mathcr:w} % The normal last \cs{math@cr@@} which inserts the last kern. +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} \def\MT_mult_last_mathcr:w [#1]{ - \if_num:w 0=`{\fi: \iffalse}\fi:\math@cr@@@ + \MH_if_num:w 0=`{\MH_fi: \iffalse}\MH_fi:\math@cr@@@ \noalign{\vskip#1\relax} \kern\l_MT_mult_right_fdim} % \end{macrocode} @@ -3700,9 +3746,11 @@ and the derived files % \begin{macro}{\MT_mult_internal:n} % \changes{v1.01a}{2004/10/10}{Added Ord atom to beginning of each line} % The real internal \env{multlined}. +% \changes{v1.19}{2017/05/22}{Added \cs{alignedspace@left} instead of +% \cs{null}\cs{,}} % \begin{macrocode} \newcommand*\MT_mult_internal:n [1]{ - \MH_if_boolean:nF {outer_mult}{\null\,} + \MH_if_boolean:nF {outer_mult}{\alignedspace@left} %<-- requires amsmath 2016/11/05 \MT_next: \bgroup % \end{macrocode} @@ -3727,18 +3775,20 @@ and the derived files \MT_measure_mult:n {#1} % \end{macrocode} % Make sure the box is wide enough. +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} - \if_dim:w \l_MT_multwidth_dim<\l_MT_multline_measure_fdim + \MH_if_dim:w \l_MT_multwidth_dim<\l_MT_multline_measure_fdim \MH_setlength:dn \l_MT_multwidth_dim{\l_MT_multline_measure_fdim} \fi \MH_set_boolean_T:n {mult_firstline} % \end{macrocode} % Tricky bit: If we only encountered one \cmd{\\} then use a very % special \cs{math@cr@@} that inserts everything needed. +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} - \if_num:w \l_MT_multline_lastline_fint=\@ne + \MH_if_num:w \l_MT_multline_lastline_fint=\@ne \MH_let:NwN \math@cr@@ \MT_mult_firstandlast_mathcr:w - \fi: + \MH_fi: % \end{macrocode} % Do the typesetting. % \begin{macrocode} @@ -3779,6 +3829,7 @@ and the derived files % \end{macro} % \begin{macro}{\MT_multlined_second_arg:w} % Scan for a second optional argument. +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} \MaybeMHPrecedingSpacesOff \newcommand*\MT_multlined_second_arg:w [1][\@empty]{ @@ -3787,10 +3838,10 @@ and the derived files {\def\MT_mult_default_pos:{#1}} {\def\MT_mult_default_pos:{#1}} { - \if_meaning:NN \@empty#1\@empty - \else: + \MH_if_meaning:NN \@empty#1\@empty + \MH_else: \setlength \l_MT_multwidth_dim{#1} - \fi: + \MH_fi: } \MT_start_mult:N \MT_mult_default_pos: } @@ -3812,7 +3863,7 @@ and the derived files \renewenvironment{subarray}[1]{% \vcenter\bgroup \Let@ \restore@math@cr \default@tag - \let\math@cr@@\AMS@math@cr@@ + \let\math@cr@@\AMS@math@cr@@ % <--- the fix \baselineskip\fontdimen10 \scriptfont\tw@ \advance\baselineskip\fontdimen12 \scriptfont\tw@ \lineskip\thr@@\fontdimen8 \scriptfont\thr@@ @@ -3830,6 +3881,7 @@ and the derived files % \begin{environment}{multlined} % The user environment. Scan for an optional argument. % \changes{v1.18}{2015/11/12}{Added \cs{MultlinedHook}} +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} \newenvironment{multlined}[1][] {\MH_group_align_safe_begin: @@ -3839,10 +3891,10 @@ and the derived files {\def\MT_mult_default_pos:{#1}} {\def\MT_mult_default_pos:{#1}} { - \if_meaning:NN \@empty#1\@empty - \else: + \MH_if_meaning:NN \@empty#1\@empty + \MH_else: \setlength \l_MT_multwidth_dim{#1} - \fi: + \MH_fi: } \MT_multlined_second_arg:w } @@ -3897,30 +3949,81 @@ and the derived files \@namedef{MT_delim_\MH_cs_to_str:N #1 _star_wrapper:nnn}##1##2##3{ \mathopen{}\mathclose\bgroup ##1 ##2 \aftergroup\egroup ##3 } - \@namedef{MT_delim_\MH_cs_to_str:N #1 _nostar_wrapper:nnn}##1##2##3{ +% \end{macrocode} +% Turns out that there is a difference between \verb|\mathclose{)}| +% and \verb|\mathclose)| (placement of for example superscript), so instead of two wrappers, we need three. +% \changes{v1.19}{2017/05/22}{added \cs{...nostarnonscaled..} wrapper} +% \changes{v1.19}{2017/05/22}{renamed \cs{...nostar..} to \cs{...nostarscaled..} } +% \begin{macrocode} + \@namedef{MT_delim_\MH_cs_to_str:N #1 _nostarscaled_wrapper:nnn}##1##2##3{ \mathopen{##1}##2\mathclose{##3} } + \@namedef{MT_delim_\MH_cs_to_str:N #1 _nostarnonscaled_wrapper:nnn}##1##2##3{ + \mathopen##1##2\mathclose##3 + } } % \end{macrocode} % \end{macro} % % \begin{macro}{\reDeclarePairedDelimiterInnerWrapper} -% Macro enabling the user to alter an existing call back. Note that -% currently no checks are performed. First argument is the name of -% the macro we are altering (as defined via \cs{DeclarePaired...}), -% the second is \texttt{star} or \texttt{nostar}. In the last +% Macro enabling the user to alter an existing call back. First +% argument is the name of the macro we are altering (as defined via +% \cs{DeclarePaired...}), the second is \texttt{star}, +% \texttt{nostarnonscaled} or \texttt{nostarscaled}. In the last % argument \texttt{\#1} and \texttt{\#3} respectively refer to the -% scaled fences and \texttt{\#3} refer to whatever come between. +% scaled fences and \texttt{\#2} refer to whatever come between. +% \changes{v1.19}{2017/05/23}{Added a test and error} % \begin{macrocode} \newcommand\reDeclarePairedDelimiterInnerWrapper[3]{ - \@namedef{MT_delim_\MH_cs_to_str:N #1 _ #2 _wrapper:nnn}##1##2##3{ - #3 + \@ifundefined{MT_delim_\MH_cs_to_str:N #1 _ #2 _wrapper:nnn}{ + \PackageError{mathtools}{ + Wrapper~not~found~for~\string#1~and~option~'#2'.\MessageBreak + Either~\string#1~is~ not~ defined,~or~ you~ are~using~ the~ + \MessageBreak + 'nostar'~ option,~which~ is~ no~ longer~ supported.~ + \MessageBreak + Please~ use~ 'nostarnonscaled'~ or~ 'nostarscaled~ + \MessageBreak instead.~ + }{See the manual} + }{ + \@namedef{MT_delim_\MH_cs_to_str:N #1 _ #2 _wrapper:nnn}##1##2##3{ + #3 + } } } % \end{macrocode} % +% \begin{macro}{\MT_etb_ifdefempty_x:nnn} +% \begin{macro}{\MT_etb_ifblank:nnn} +% \changes{v1.19}{2017/05/23}{Added so we can test for empty args} +% This is a copy of \cs{etb@ifdefempty} (it is \emph{not} the same +% as \cs{ifdefempty}) and \cs{ifblank} from \pkg{etoolbox}, +% currently we do not want to make \pkg{etoolbox} a requirement, +% that may change in the future. We need a reliable method to check +% whether a macro is blank or not (including spaces). +% \begin{macrocode} +\def\MT_etb_ifdefempty_x:nnn #1{ + \expandafter\expandafter\expandafter + \MT_etb_ifblank:nnn + \expandafter\expandafter\expandafter{% + \expandafter\strip@prefix\meaning#1} +} +\def\MT_etb_ifblank:nnn #1{ + \expandafter\ifx\expandafter\relax\detokenize\expandafter{\@gobble#1?}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi +} + + +% \end{macrocode} +% \end{macro} +% \end{macro} +% % +% % \end{macro} % \begin{macro}{\DeclarePairedDelimiter} % \changes{v1.06}{2008/08/01}{Made user command robust} @@ -3934,12 +4037,11 @@ and the derived files % before the delimiters, wrapped in a callback function. % \changes{1.08e}{2010/09/02}{`Fixed' \cs{left}\dots\cs{right} bad spacing} % \changes{1.08e}{2010/09/14}{redid the \cs{left}\dots\cs{right} fix, -% see \cs{DeclarePairedDelimiterX} for details.} +% see \cs{DeclarePairedDelimiterXPP} for details.} % \changes{v1.13}{2012/05/10}{Using call back instead} % \begin{macrocode} - \MT_delim_default_inner_wrappers:n{#1} + \MT_delim_default_inner_wrappers:n{#1} % define the wrappers \@namedef{MT_delim_\MH_cs_to_str:N #1 _star:}##1 - %{\mathopen{}\mathclose\bgroup\left#2 ##1 \aftergroup\egroup\right #3}% { \@nameuse{MT_delim_\MH_cs_to_str:N #1 _star_wrapper:nnn}% {\left#2}{##1}{\right#3} }% % \end{macrocode} @@ -3955,13 +4057,39 @@ and the derived files % With the default optional argument we wind up with \cs{relax}, % else we get \cs{biggr} and \cs{biggl} etc. % \changes{v1.13}{2012/05/10}{Using call back instead} -% \begin{macrocode} - %\mathopen{\@nameuse {\MH_cs_to_str:N ##1 l} #2} ##2 - %\mathclose{\@nameuse {\MH_cs_to_str:N ##1 r} #3}} - \@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostar_wrapper:nnn}% - {\@nameuse {\MH_cs_to_str:N ##1 l} #2} - {##2} - {\@nameuse {\MH_cs_to_str:N ##1 r} #3} +% \changes{v1.19}{2017/05/23}{Split the wrappers in two, so know +% \cs{}\cs{@gobble} is now only used to check if the optional +% argument is empty.} +% \begin{macrocode} + \def\@tempa{\\@gobble} + \def\@tempb{##1} + \ifx\@tempa\@tempb +% \end{macrocode} +% As of May 2017, we now run explicit wrapper in the nonscaled +% version, so we can remove the feature to to add l and r version of +% the scaler (as there is none). +% \begin{macrocode} + \@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostarnonscaled_wrapper:nnn}% + {#2} + {##2} + {#3} + \else +% \end{macrocode} +% Next we need to check whether \texttt{\#\#1} is blank as that +% should not be scaled +% \begin{macrocode} + \MT_etb_ifblank:nnn {##1}{ + \@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostarnonscaled_wrapper:nnn}% + {#2} + {##2} + {#3} + }{ + \@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostarscaled_wrapper:nnn}% + {\@nameuse {\MH_cs_to_str:N ##1 l} #2} + {##2} + {\@nameuse {\MH_cs_to_str:N ##1 r} #3} + } + \fi } % \end{macrocode} % The user command comes here. Just check for the star and choose @@ -3977,24 +4105,159 @@ and the derived files % \end{macrocode} % \end{macro} % -% \begin{macro}{\DeclarePairedDelimiterX} -% \changes{v1.08}{2010/06/10}{Added \cs{DeclarePairedDelimiterX}} -% It has turned out that it is convenient to have a more general -% version of \cs{DeclarePairedDelimiter}. In this version the user -% can specify the number of arguments the created macro has, and they -% can specify the code for the inner part of the macro. Other than -% that the code is fairly similar to \cs{DeclarePairedDelimiter} -% \changes{v1.08e}{2010/09/02}{Provided better implementation of -% \cs{DeclarePairedDelimiterX}} +% \begin{macro}{\MT_paired_delimx_arg_test:n} +% This tests the \oarg{num args} part of +% \cs{DeclarePairedDelimiterX} and \cs{DeclarePairedDelimiterXPP} +% (code reuse), and complains if it is not 1,\dots,9. +% \changes{v1.14}{2014/05/20}{Added} % \begin{macrocode} -\def\MHempty{} -\def\DeclarePairedDelimiterX#1[#2]#3#4#5{% +\def\MT_paired_delimx_arg_test:n #1{ + \ifnum#1>9\relax + \PackageError{mathtools}{No~ more~ than~ 9~ arguments}{} + \else + \ifnum#1<1\relax + \PackageError{mathtools}{Macro~ need~ 1~ or~ more~ + arguments.\MessageBreak Please~ change~ [#1]~ to~ [1]~ ... [9]}{} + \fi + \fi + } + +% \end{macrocode} +% \end{macro} +% \begin{macro}{\MT_delim_inner_generator:n..n} +% \changes{v1.19}{2017/05/14}{Macro added, changes notes in the +% implementation are taken from when this code was not factored out} +% This generates the internal macro from +% \cs{DeclarePairedDelimiterX} and \cs{DeclarePairedDelimiterXPP} +% that handles the non-starred part of the generated macro. The +% macro takes 7 arguments mimicing the arguments of +% \cs{DeclarePairedDelimiterXPP}: +% \begin{enumerate}\setlength\itemsep{0pt} +% \item external macro name +% \item number of arguments, 1-9, already checked at this stage +% \item predata +% \item left scaler +% \item right scaler +% \item postdata +% \item body +% \end{enumerate} +% +% \begin{macrocode} +\def\@MHempty{} +\newcommand\MT_delim_inner_generator:nnnnnnn [7]{ +% \end{macrocode} +% In order for the starred and non-starred version of +% \cs{DeclarePairedDelimiterX(PP)} to have the same arguments, we need +% to introduce an extra macro to catch the optional argument (this +% means that the non-starred version can actually support ten +% arguments!). Here we do things a little differently than with +% \cs{DeclarePairedDelimiter}. The optional argument have +% \cs{@MHempty} as the default. This was earlier locally redefined to +% eat l/r additions to the scaler when there were no scaler. In this +% implementation, we just look for that macro to see if no scaler has +% been given at all. +% \begin{macrocode} + \@xp\@xp\@xp + \newcommand + \@xp\csname MT_delim_\MH_cs_to_str:N #1 _nostar_inner:\endcsname + [#2] + { +% \end{macrocode} +% Add the (possibly empty) precode: +% \begin{macrocode} + #3 +% \end{macrocode} +% Next we provide the inner workhorse. We need a bit of expansion +% magic to get \cs{delimsize} to work. +% \changes{v1.13}{2012/05/10}{Using call backs for \cs{mathopen} and +% \cs{mathclose} additions} +% \changes{v1.19}{2017/04/27}{Added resetting code for \cs{@MHempty}, +% cannot rely on groups here. 2017/05/23 removed because of reimplementation} +% +% May 2017: Due to \verb+\mathclose{|}^2+ generally not being equal to +% \verb+\mathclose|^2+ we needed to split the wrapper macro into +% separate nonscaled and scaled versions. This also have the benefit +% of completely eliminating the need to gobble any chars. There is now +% the nonscaled version, which we do not add any scalers to and the +% manually scaled version where we \emph{know} there is a scaler. The +% complication is now that we need to be able to check for blank +% input, thus the including of a few macros from \pkg{etoolbox}. +% \changes{v1.19}{2017/05/23}{Split into two wrappers and some tests} +% First we need to look at \cs{delimsize} to see if it is equal to +% \cs{@MHempty}. If it is run the nonscaled version. +% \begin{macrocode} + \def\@tempa{\@MHempty} + \@xp\def\@xp\@tempb\@xp{\delimsize} + \ifx\@tempa\@tempb + \@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostarnonscaled_wrapper:nnn} + {#4}{#7}{#5} + \else +% \end{macrocode} +% Next we use a copy of a macro from \pkg{etoolbox} to determine +% whether \cs{delimsize} is empty or not. This is to be sure that +% \verb|\abs[]| and similar still end up in the unscaled branch. +% \begin{macrocode} + \MT_etb_ifdefempty_x:nnn {\delimsize}{ + \@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostarnonscaled_wrapper:nnn} + {#4}{#7}{#5} + }{ +% \end{macrocode} +% In the scaled version we add features to convert til scaler to its +% l/r versions. +% \begin{macrocode} + \@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostarscaled_wrapper:nnn} + { + \@xp\@xp\@xp\csname\@xp\MH_cs_to_str:N \delimsize l\endcsname #4 + } + {#7} + { + \@xp\@xp\@xp\csname\@xp\MH_cs_to_str:N \delimsize r\endcsname #5 + } + } + \fi +% \end{macrocode} +% Add the (possibly empty) post code +% \begin{macrocode} + #6 + \endgroup + } +} + +% \end{macrocode} +% +% \end{macro} +% \begin{macro}{\DeclarePairedDelimiterXPP} +% \changes{v1.19}{2017/05/24}{Rewritten as we might as well +% implement ...X via ...XPP} It turns out it is useful to have a +% more general version of \cs{DeclarePairedDelimiter} where we can +% access the body and perhaps even add stuff on the outside of the +% fences. Historically, we added \cs{DeclarePairedDelimiterX} first, +% giving access to the body and the most general +% \cs{DeclarePairedDelimiterXPP} was requested after that, thus +% ending up with two macros so not to break existing document. As of +% May 2017, since \cs{DeclarePairedDelimiterX} is just +% \cs{DeclarePairedDelimiterXPP} with no pre- or postcode, we will +% use this update to just define \cs{DeclarePairedDelimiterXPP} and +% define \cs{DeclarePairedDelimiterX} from that. +% +% The arguments for \cs{DeclarePairedDelimiterXPP} are interpreted +% as +% \begin{center} +% \marg{macroname}\oarg{num~args}\allowbreak\marg{pre~code}\allowbreak\marg{left +% delim}\goodbreak \marg{right delim}\marg{post code}\marg{body} +% \end{center} +% Inside \marg{body} \cs{delimsize} +% refers to the current size of the scaler (\cs{middle} in the starred version). +% \begin{macrocode} +\def\DeclarePairedDelimiterXPP#1[#2]#3#4#5#6#7{% \@ifdefinable{#1}{ % \end{macrocode} % The constructor takes five arguments, the name of the macro, the % number of arguments (1-9), the left and right delimiter, the inner % code for the two macros. First we verify that the number of arguments fit. -% \changes{v1.14}{2014/05/20}{Factored out in separate macro for reuse} +% \changes{v1.14}{2014/05/20}{Factored out in separate macro +% (\cs{MT_paired_delimx_arg_test:n}) for reuse. Comment refers back to +% old \cs{DeclarePairedDelimiterX} implementation.} % \begin{macrocode} \MT_paired_delimx_arg_test:n{#2} % \end{macrocode} @@ -4004,7 +4267,7 @@ and the derived files \MT_delim_default_inner_wrappers:n{#1} % \end{macrocode} % We make sure to store the delimiter size in the local variable -% \cs{delimsize}. Then users can refer to the size in the fifth +% \cs{delimsize}. Then users can refer to the size in the \marg{body} % argument. In the starred version it will refer to \cs{middle} and in % the normal version it will hold the provided optional argument. % \begin{macrocode} @@ -4016,6 +4279,10 @@ and the derived files \begingroup \def\delimsize{\middle} % \end{macrocode} +% Adding the \marg{precode} (possibly empty) +% \begin{macrocode} + #3 +% \end{macrocode} % This is slightly controversial, \cs{left}\dots\cs{right} are known % to produce an inner atom, thus may cause different spacing than % normal delimiters. We `fix' this by introducing \cs{mathopen} and @@ -4025,63 +4292,42 @@ and the derived files % started 2010-08-12.} % \changes{v1.13}{2012/05/10}{Using call back instead} % \begin{macrocode} - %\mathopen{}\mathclose\bgroup\left#3 #5 \aftergroup\egroup\right#4 \@nameuse{MT_delim_\MH_cs_to_str:N #1 _star_wrapper:nnn} - {\left#3}{#5}{\right#4} + {\left#4}{#7}{\right#5} + #6 \endgroup } % \end{macrocode} % In order for the starred and non-starred version to have the same % arguments, we need to introduce an extra macro to catch the optional % argument (this means that the non-starred version can actually -% support ten arguments!). -% Here we do things a little differently than with -% \cs{DeclarePairedDelimiter}. The optional argument have \cs{MHempty} -% as the default. This is locally changed when we scale the -% delimiters, such that it can eat the l/r if needed. +% support ten arguments!). % \begin{macrocode} \@xp\@xp\@xp \newcommand \@xp\csname MT_delim_\MH_cs_to_str:N #1 _nostar:\endcsname - [1][\MHempty] + [1][\@MHempty] { % \end{macrocode} % We need to introduce a local group in order to support nesting. It -% is ended inside \verb|\MT_delim_\MH_cs_to_str:N #1 _nostar_inner:| +% is ended inside \verb|\MT_delim_\MH_cs_to_str:N #1 _nostar_inner:|, +% here we also stores the scaler in \cs{delimsize}. % \begin{macrocode} \begingroup \def\delimsize{##1} \@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostar_inner:} - } + } % \end{macrocode} -% Next we provide the inner workhorse. We need a bit of expansion -% magic to get \cs{delimsize} to work. -% \changes{v1.13}{2012/05/10}{Using call back instead} +% To make the code easier to work with we factored the next macro +% out. Since \cs{DeclarePairedDelimiterX} is now implemented via +% \cs{DeclarePairedDelimiterXPP} we did not need to. But it makes the +% code a bit simpler. \cs{MT_delim_inner_generator:nnnnnnn} just +% takes care of generating the appropriate \cs{..._nostar_inner:} macro. +% \begin{macrocode} + \MT_delim_inner_generator:nnnnnnn {#1}{#2}{#3}{#4}{#5}{#6}{#7} +% \end{macrocode} +% At the end, generate the actual user command. % \begin{macrocode} - \@xp\@xp\@xp - \newcommand - \@xp\csname MT_delim_\MH_cs_to_str:N #1 _nostar_inner:\endcsname - [#2] - { - %\mathopen{% - % \let\MHempty\@gobble - % \@xp\@xp\@xp\csname\@xp\MH_cs_to_str:N \delimsize l\endcsname #3} - %#5 - %\mathclose{% - % \let\MHempty\@gobble - % \@xp\@xp\@xp\csname\@xp\MH_cs_to_str:N \delimsize r\endcsname #4} - \@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostar_wrapper:nnn} - { - \let\MHempty\@gobble - \@xp\@xp\@xp\csname\@xp\MH_cs_to_str:N \delimsize l\endcsname #3 - } - {#5} - { - \let\MHempty\@gobble - \@xp\@xp\@xp\csname\@xp\MH_cs_to_str:N \delimsize r\endcsname #4 - } - \endgroup - } \DeclareRobustCommand{#1}{ \@ifstar {\@nameuse{MT_delim_\MH_cs_to_str:N #1 _star:}} @@ -4089,90 +4335,24 @@ and the derived files } } } -% \end{macrocode} -% \end{macro} -% \begin{macro}{\MT_paired_delimx_arg_test:n} -% This tests the \oarg{num args} part of -% \cs{DeclarePairedDelimiterX} and \cs{DeclarePairedDelimiterXPP} -% (code reuse), and complains if it is not 1,\dots,9. -% \changes{v1.14}{2014/05/20}{Added} -% \begin{macrocode} -\def\MT_paired_delimx_arg_test:n #1{ - \ifnum#1>9\relax - \PackageError{mathtools}{No~ more~ than~ 9~ arguments}{} - \else - \ifnum#1<1\relax - \PackageError{mathtools}{Macro~ need~ 1~ or~ more~ - arguments.\MessageBreak Please~ change~ [#1]~ to~ [1]~ ... [9]}{} - \fi - \fi - } % \end{macrocode} % \end{macro} -% \begin{macro}{\DeclarePairedDelimiterXPP} -% \changes{v1.14}{2014/05/20}{Added} -% Similar to \cs{DeclarePairedDelimiterX}, but we can add \meta{pre} -% and \meta{pre} code before and after the delimiters. Arguments are -% interpreted as -% \marg{macro}\oarg{num}\marg{pre code}\marg{left delim}\marg{right -% delim}\marg{post code}\marg{body} +% \begin{macro}{\DeclarePairedDelimiterX} +% \changes{v1.08}{2010/06/10}{Added +% \cs{DeclarePairedDelimiterX}. 2017/05/24: old comment, kept for +% historic reasons.} +% \changes{v1.08e}{2010/09/02}{Provided better implementation of +% \cs{DeclarePairedDelimiterX}. 2017/05/24: old comment, kept for +% historic reasons.} +% As of May 2017, this is now just a call to \cs{DeclarePairedDelimiterXPP}. % \begin{macrocode} -\def\DeclarePairedDelimiterXPP#1[#2]#3#4#5#6#7{% - \@ifdefinable{#1}{ - \MT_paired_delimx_arg_test:n{#2} - \MT_delim_default_inner_wrappers:n{#1} - \@xp\@xp\@xp - \newcommand - \@xp\csname MT_delim_\MH_cs_to_str:N #1 _star:\endcsname - [#2] - { - \begingroup - \def\delimsize{\middle} - #3 - \@nameuse{MT_delim_\MH_cs_to_str:N #1 _star_wrapper:nnn} - {\left#4}{#7}{\right#5} - #6 - \endgroup - } - \@xp\@xp\@xp - \newcommand - \@xp\csname MT_delim_\MH_cs_to_str:N #1 _nostar:\endcsname - [1][\MHempty] - { - \begingroup - \def\delimsize{##1} - \@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostar_inner:} - } - \@xp\@xp\@xp - \newcommand - \@xp\csname MT_delim_\MH_cs_to_str:N #1 _nostar_inner:\endcsname - [#2] - { - #3 - \@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostar_wrapper:nnn} - { - \let\MHempty\@gobble - \@xp\@xp\@xp\csname\@xp\MH_cs_to_str:N \delimsize l\endcsname #4 - } - {#7} - { - \let\MHempty\@gobble - \@xp\@xp\@xp\csname\@xp\MH_cs_to_str:N \delimsize r\endcsname #5 - } - #6 - \endgroup - } - \DeclareRobustCommand{#1}{ - \@ifstar - {\@nameuse{MT_delim_\MH_cs_to_str:N #1 _star:}} - {\@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostar:}} - } - } +\def\DeclarePairedDelimiterX#1[#2]#3#4#5{ + \DeclarePairedDelimiterXPP{#1}[#2]{}{#3}{#4}{}{#5} } - % \end{macrocode} % \end{macro} +% % @@ -4485,88 +4665,94 @@ and the derived files % \end{macrocode} % Check if A is \cs{mathop}. If it is, we know that B is the argument % of the \cs{mathop}. +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} - \if_meaning:NN \MT_smop_arg_A: \MT_smop_mathop:n + \MH_if_meaning:NN \MT_smop_arg_A: \MT_smop_mathop:n % \end{macrocode} % If A was \cs{mathop} we check if C is \cs{limits} +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} - \if_meaning:NN \MT_smop_arg_C:\MT_smop_limits: + \MH_if_meaning:NN \MT_smop_arg_C:\MT_smop_limits: \def\MT_smop_final_arg_A:{#1{#2}}% % \end{macrocode} % Now we have something like \verb|\mathop{TTT}\limits|. Then check % if D is \cs{@nil}. +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} - \if_meaning:NN \MT_smop_arg_D: \@nnil - \else: + \MH_if_meaning:NN \MT_smop_arg_D: \@nnil + \MH_else: \MH_set_boolean_T:n {smop_one} \MH_let:NwN \MT_smop_final_arg_B: \MT_smop_arg_D: \MH_let:NwN \MT_smop_final_arg_C: \MT_smop_arg_E: - \if_meaning:NN \MT_smop_arg_F: \@nnil - \else: + \MH_if_meaning:NN \MT_smop_arg_F: \@nnil + \MH_else: \MH_set_boolean_T:n {smop_two} \MH_let:NwN \MT_smop_final_arg_D: \MT_smop_arg_F: \edef\MT_smop_final_arg_E: {\expandafter\MT_smop_remove_nil_vi:N \MT_smop_arg_G: } - \fi: - \fi: - \else: + \MH_fi: + \MH_fi: + \MH_else: % \end{macrocode} % Here we have something like \verb|\mathop{TTT}|. Still check % if D is \cs{@nil}. +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} \def\MT_smop_final_arg_A:{#1{#2}}% - \if_meaning:NN \MT_smop_arg_D: \@nnil - \else: + \MH_if_meaning:NN \MT_smop_arg_D: \@nnil + \MH_else: \MH_set_boolean_T:n {smop_one} \MH_let:NwN \MT_smop_final_arg_B: \MT_smop_arg_C: \MH_let:NwN \MT_smop_final_arg_C: \MT_smop_arg_D: - \if_meaning:NN \MT_smop_arg_F: \@nnil - \else: + \MH_if_meaning:NN \MT_smop_arg_F: \@nnil + \MH_else: \MH_set_boolean_T:n {smop_two} \MH_let:NwN \MT_smop_final_arg_D: \MT_smop_arg_E: \MH_let:NwN \MT_smop_final_arg_E: \MT_smop_arg_F: - \fi: - \fi: - \fi: + \MH_fi: + \MH_fi: + \MH_fi: % \end{macrocode} % If A was not \cs{mathop}, it is an operator in itself, so we check % if B is \cs{limits} +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} - \else: - \if_meaning:NN \MT_smop_arg_B:\MT_smop_limits: + \MH_else: + \MH_if_meaning:NN \MT_smop_arg_B:\MT_smop_limits: \def\MT_smop_final_arg_A:{#1}% - \if_meaning:NN \MT_smop_arg_D: \@nnil - \else: + \MH_if_meaning:NN \MT_smop_arg_D: \@nnil + \MH_else: \MH_set_boolean_T:n {smop_one} \MH_let:NwN \MT_smop_final_arg_B: \MT_smop_arg_C: \MH_let:NwN \MT_smop_final_arg_C: \MT_smop_arg_D: - \if_meaning:NN \MT_smop_arg_F: \@nnil - \else: + \MH_if_meaning:NN \MT_smop_arg_F: \@nnil + \MH_else: \MH_set_boolean_T:n {smop_two} \MH_let:NwN \MT_smop_final_arg_D: \MT_smop_arg_E: \MH_let:NwN \MT_smop_final_arg_E: \MT_smop_arg_F: - \fi: - \fi: - \else: + \MH_fi: + \MH_fi: + \MH_else: % \end{macrocode} % No \cs{limits} was found, so we already have the right input. Just % forget about the last two arguments. +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} \def\MT_smop_final_arg_A:{#1}% - \if_meaning:NN \MT_smop_arg_C: \@nnil - \else: + \MH_if_meaning:NN \MT_smop_arg_C: \@nnil + \MH_else: \MH_set_boolean_T:n {smop_one} \MH_let:NwN \MT_smop_final_arg_B: \MT_smop_arg_B: \MH_let:NwN \MT_smop_final_arg_C: \MT_smop_arg_C: - \if_meaning:NN \MT_smop_arg_D: \@nnil - \else: + \MH_if_meaning:NN \MT_smop_arg_D: \@nnil + \MH_else: \MH_set_boolean_T:n {smop_two} \MH_let:NwN \MT_smop_final_arg_D: \MT_smop_arg_D: \MH_let:NwN \MT_smop_final_arg_E: \MT_smop_arg_E: - \fi: - \fi: - \fi: - \fi: + \MH_fi: + \MH_fi: + \MH_fi: + \MH_fi: % \end{macrocode} % No reason to measure if there's no sub or sup. % \begin{macrocode} @@ -4680,10 +4866,11 @@ and the derived files % as we have no need for the combination % $(\cs{displaystyle},\cs{textstyle})$ etc. Only % $(\cs{scriptstyle},\cs{scriptstyle})$ is useful. +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} - \if_dim:w \@tempdima>\z@ + \MH_if_dim:w \@tempdima>\z@ \mathop{#1}\limits#2{#3} - \else: + \MH_else: \mathop{#1\MT_vphantom:Nn \displaystyle{#4}}\limits #2{ \def\finsm@sh{\ht\z@\z@ \box\z@} @@ -4691,8 +4878,8 @@ and the derived files \MT_vphantom:Nn \scriptstyle {\MT_cramped_internal:Nn \scriptstyle{#6}} } - \fi: - \if_dim:w \@tempdima>\z@ + \MH_fi: + \MH_if_dim:w \@tempdima>\z@ \mathop{#4\MT_vphantom:Nn \displaystyle{#1}}\limits #5 { @@ -4701,9 +4888,9 @@ and the derived files \def\finsm@sh{\ht\z@\z@ \box\z@} \mathsm@sh\scriptstyle{\MT_cramped_internal:Nn \scriptstyle{#6}} } - \else: + \MH_else: \mathop{#4}\limits#5{#6} - \fi: + \MH_fi: } % \end{macrocode} % \end{macro} @@ -5068,6 +5255,8 @@ and the derived files % test not only \cs{linewidth} against \cs{columnwidth} but also if % \cs{@totalleftmargin} is not zero. The implementation used is due to % David Carlisle. +% \changes{v1.19}{2016/05/26}{Added \cs{ignorespaces} after +% \cs{noindent}, bug inherited from \pkg{amsmath}} % \begin{macrocode} \ifdim \ifdim\@totalleftmargin=\z@ @@ -5078,17 +5267,32 @@ and the derived files =\columnwidth \else \parshape\@ne \@totalleftmargin \linewidth \fi - \noindent##1\par}% + \noindent\ignorespaces##1\par}% \penalty\predisplaypenalty\vskip\abovedisplayskip% \vskip-\lineskiplimit % CCS \vskip\normallineskiplimit % CCS \vskip\l_MT_above_intertext_sep }% -}} + }% % \end{macrocode} -% And provide a key to switch +% We might as well hook on to this and only activate +% \cs{shortintertext} whenever \cs{intertext} is active. This allows +% us to get the same error messages as \cs{intertext}. +% \changes{v1.19}{2017/03/31}{Added} % \begin{macrocode} -\def\MT_orig_intertext_true: { \MH_let:NwN \intertext@ \MT_orig_intertext: } + \MH_let:NwN \shortintertext \shortintertext@ +} +% \end{macrocode} +% And provide a key to switch +% \changes{v1.19}{2017/03/31}{Changed \cs{MT_orig_intertext_true:}} +% Changed \cs{MT_orig_intertext_true:} to also activate +% \cs{shortintertext}, because when this is active, our change to +% \cs{intertext@} is not active. +% \begin{macrocode} +\def\MT_orig_intertext_true: { + \MH_let:NwN \intertext@ \MT_orig_intertext: + \MH_let:NwN \shortintertext \shortintertext@ +} \def\MT_orig_intertext_false: { \MH_let:NwN \intertext@ \MT_intertext: } \define@key{\MT_options_name:}{original-intertext}[true]{ \@nameuse{MT_orig_intertext_#1:} @@ -5124,18 +5328,21 @@ and the derived files % \end{macrocode} % \changes{v1.17}{2015/06/17}{Added extra `in list' check} % Same comment as for \cs{intertext} above. +% \changes{v1.19}{2016/05/26}{Added \cs{ignorespaces} after +% \cs{noindent}, bug inherited from \pkg{amsmath}} +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} - \if_dim:w - \if_dim:w \@totalleftmargin=\z@ + \MH_if_dim:w + \MH_if_dim:w \@totalleftmargin=\z@ \linewidth - \else: + \MH_else: -\maxdimen - \fi: + \MH_fi: =\columnwidth - \else: + \MH_else: \parshape\@ne \@totalleftmargin \linewidth - \fi: - \noindent#1\par}% + \MH_fi: + \noindent\ignorespaces#1\par}% \penalty\predisplaypenalty\vskip\abovedisplayshortskip% }% } @@ -5189,29 +5396,43 @@ and the derived files % \end{macrocode} % \changes{v1.17}{2015/06/17}{Added extra `in list' check} % Same comment as for \cs{intertext} above. +% \changes{v1.19}{2016/05/26}{Added \cs{ignorespaces} after +% \cs{noindent}, bug inherited from \pkg{amsmath}} +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} - \if_dim:w - \if_dim:w \@totalleftmargin=\z@ + \MH_if_dim:w + \MH_if_dim:w \@totalleftmargin=\z@ \linewidth - \else: + \MH_else: -\maxdimen - \fi: + \MH_fi: =\columnwidth - \else: + \MH_else: \parshape\@ne \@totalleftmargin \linewidth - \fi: - \noindent#1\par}% + \MH_fi: + \noindent\ignorespaces#1\par}% \penalty\predisplaypenalty\vskip\abovedisplayshortskip% \vskip-\lineskiplimit \vskip\normallineskiplimit \vskip\l_MT_below_shortintertext_sep }% -} +} % \end{macrocode} % Next we need to be able to switch. +% \changes{v1.19}{2017/03/31}{Changed \cs{shortintertext} to be +% internal here.} +% \begin{macrocode} +\def\MT_orig_shortintertext_true: { \MH_let:NwN \shortintertext@ \MT_orig_shortintertext:n } +\def\MT_orig_shortintertext_false: { \MH_let:NwN \shortintertext@ \MT_shortintertext:n } +% \end{macrocode} +% Next make \cs{shortintertext} a no-go everywhere. Thus \cs{shortintertext} is only +% available when \cs{intertext} is, or when +% \verb+original-intertext=true+ is used. +% \changes{v1.19}{2017/03/31}{Added} +% \begin{macrocode} +\newcommand{\shortintertext}{\@amsmath@err{\Invalid@@\shortintertext}\@eha} +% \end{macrocode} % \begin{macrocode} -\def\MT_orig_shortintertext_true: { \MH_let:NwN \shortintertext \MT_orig_shortintertext:n } -\def\MT_orig_shortintertext_false: { \MH_let:NwN \shortintertext \MT_shortintertext:n } \define@key{\MT_options_name:}{original-shortintertext}[true]{ \@nameuse{MT_orig_shortintertext_#1:} } @@ -5466,14 +5687,15 @@ and the derived files \newcommand{\MT_prescript_inner:}[4]{ % \end{macrocode} % Put the sup in box 0 and the sub in box 2. +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} \@mathmeasure\z@#4{\MT_prescript_sup:{#1}} \@mathmeasure\tw@#4{\MT_prescript_sub:{#2}} - \if_dim:w \wd\tw@>\wd\z@ + \MH_if_dim:w \wd\tw@>\wd\z@ \setbox\z@\hbox to\wd\tw@{\hfil\unhbox\z@} - \else: + \MH_else: \setbox\tw@\hbox to\wd\z@{\hfil\unhbox\tw@} - \fi: + \MH_fi: % \end{macrocode} % Do not let a preceding mathord symbol approach without any % intervening space. @@ -5532,13 +5754,14 @@ and the derived files % only provide the fix for older kernels. % \changes{v1.18}{2015/11/12}{This was now moved into the kernel, thus % we only provide it for older kernels} +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} \ifx\e@alloc\@undefined% kernel thus older than 2015 \def\@DeclareMathSizes #1#2#3#4#5{% \@defaultunits\dimen@ #2pt\relax\@nnil - \if:w $#3$% + \MH_if:w $#3$% \MH_let:cN {S@\strip@pt\dimen@}\math@fontsfalse - \else: + \MH_else: \@defaultunits\dimen@ii #3pt\relax\@nnil \@defaultunits\@tempdima #4pt\relax\@nnil \@defaultunits\@tempdimb #5pt\relax\@nnil @@ -5549,7 +5772,7 @@ and the derived files \gdef\noexpand\ssf@size{\strip@pt\@tempdimb}% \the\toks@ }% - \fi: + \MH_fi: } \fi % \end{macrocode} @@ -5572,6 +5795,7 @@ and the derived files % Save the original meaning if you need to go back (note that this % does not save the robust part of the macro, we fix this later on by % rerobustifying). +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} \MH_if_boolean:nTF {robustify}{ \MH_let:NwN \MT_mathic_redeffer: \DeclareRobustCommand @@ -5583,37 +5807,40 @@ and the derived files \MT_mathic_redeffer:*\({ \relax\ifmmode\@badmath\else \ifhmode - \if_dim:w \fontdimen\@ne\font>\z@ + \MH_if_dim:w \fontdimen\@ne\font>\z@ % \end{macrocode} % We have a small problem here, if the user use >>\verb|text~\(|<< then % the italic correction is lost due to the penalty (see \cite{TBT}, % section 4.3.3). However, we \emph{know} what \verb|~| does, a % (positive) penalty and a skip. +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} - \if_dim:w \lastskip>\z@ + \MH_if_dim:w \lastskip>\z@ \skip@\lastskip\unskip % \end{macrocode} % \changes{v1.15}{2014/07/16}{Added penalty workaround} % Here is the fix. +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} - \if_num:w \lastpenalty>\z@ + \MH_if_num:w \lastpenalty>\z@ \count@\lastpenalty\unpenalty - \fi: + \MH_fi: \@@italiccorr % \end{macrocode} % \changes{v1.15}{2014/07/16}{Added penalty workaround} % And here it is inserted again. +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} - \if_num:w \count@>\z@ + \MH_if_num:w \count@>\z@ \penalty\count@ - \fi: + \MH_fi: \hskip\skip@ - \else: + \MH_else: \@@italiccorr - \fi: - \fi: - \fi: - $\fi: + \MH_fi: + \MH_fi: + \MH_fi: + $\MH_fi: } } } @@ -5767,29 +5994,31 @@ and the derived files % supported/described in the documentation anymore so new users % won't know about it and b)~it forbids the use of \cs{tag} % anyway. +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} \if@fleqn - \if_num:w \xatlevel@=\tw@ + \MH_if_num:w \xatlevel@=\tw@ \kern-\@mathmargin - \fi: - \fi: + \MH_fi: + \MH_fi: % \end{macrocode} % End of additions. +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} - \if:w 1\shift@tag\row@\relax + \MH_if:w 1\shift@tag\row@\relax \rlap{\vbox{% \normalbaselines \boxz@ \vbox to\lineht@{}% \raise@tag }}% - \else: + \MH_else: \rlap{\boxz@}% - \fi: + \MH_fi: \kern\displaywidth@ - \else: + \MH_else: \kern-\tagshift@ - \if:w 1\shift@tag\row@\relax + \MH_if:w 1\shift@tag\row@\relax \llap{\vtop{% \raise@tag \normalbaselines @@ -5798,10 +6027,10 @@ and the derived files \box\@ne \boxz@ }}% - \else: + \MH_else: \llap{\boxz@}% - \fi: - \fi: + \MH_fi: + \MH_fi: } % \end{macrocode} % \end{macro} @@ -5816,31 +6045,34 @@ and the derived files % <recently read> \@tempcntb % \end{verbatim} % when in \mode{fleqn,leqno} mode. Not very comprehensible for the user. +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} \def\x@calc@shift@lf{% - \if_dim:w \eqnshift@=\z@ + \MH_if_dim:w \eqnshift@=\z@ \global\eqnshift@\@mathmargin\relax \alignsep@\displaywidth \advance\alignsep@-\totwidth@ % \end{macrocode} % The addition: If \cs{@tempcntb} is zero we avoid division. +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} - \if_num:w \@tempcntb=0 - \else: + \MH_if_num:w \@tempcntb=0 + \MH_else: \global\divide\alignsep@\@tempcntb % original line - \fi: + \MH_fi: % \end{macrocode} % Addition end. +% \changes{v1.19}{2017/03/31}{Added MH\_ prefix} % \begin{macrocode} - \if_dim:w \alignsep@<\minalignsep\relax + \MH_if_dim:w \alignsep@<\minalignsep\relax \global\alignsep@\minalignsep\relax - \fi: - \fi: - \if_dim:w \tag@width\row@>\@tempdima + \MH_fi: + \MH_fi: + \MH_if_dim:w \tag@width\row@>\@tempdima \saveshift@1% - \else: + \MH_else: \saveshift@0% - \fi:}% + \MH_fi:}% % \end{macrocode} % \end{macro} % \begin{macrocode} |