diff options
Diffstat (limited to 'Master/texmf-dist/source/latex/mathtools/mathtools.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/mathtools/mathtools.dtx | 5751 |
1 files changed, 5751 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/mathtools/mathtools.dtx b/Master/texmf-dist/source/latex/mathtools/mathtools.dtx new file mode 100644 index 00000000000..c9a1c8d2c12 --- /dev/null +++ b/Master/texmf-dist/source/latex/mathtools/mathtools.dtx @@ -0,0 +1,5751 @@ +% \iffalse meta-comment +% +% Copyright (C) 2004-2011 by Morten Hoegholm +% Copyright (C) 2012- by Lars Madsen +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either +% version 1.3 of this license or (at your option) any later +% version. The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of +% LaTeX version 2005/12/01 or later. +% +% This work has the LPPL maintenance status "maintained". +% +% This Current Maintainer of this work is +% Lars Madsen +% +% This work consists of the main source file mathtools.dtx +% and the derived files +% mathtools.sty, mathtools.pdf, mathtools.ins, mathtools.drv. +% +% Distribution: +% CTAN:macros/latex/contrib/mh/mathtools.dtx +% CTAN:macros/latex/contrib/mh/mathtools.pdf +% +% Unpacking: +% (a) If mathtools.ins is present: +% tex mathtools.ins +% (b) Without mathtools.ins: +% tex mathtools.dtx +% (c) If you insist on using LaTeX +% latex \let\install=y\input{mathtools.dtx} +% (quote the arguments according to the demands of your shell) +% +% Documentation: +% (a) If mathtools.drv is present: +% latex mathtools.drv +% (b) Without mathtools.drv: +% latex mathtools.dtx; ... +% The class ltxdoc loads the configuration file ltxdoc.cfg +% if available. Here you can specify further options, e.g. +% use A4 as paper format: +% \PassOptionsToClass{a4paper}{article} +% +% Programm calls to get the documentation (example): +% pdflatex mathtools.dtx +% makeindex -s gind.ist mathtools.idx +% pdflatex mathtools.dtx +% makeindex -s gind.ist mathtools.idx +% pdflatex mathtools.dtx +% +% Installation: +% TDS:tex/latex/mh/mathtools.sty +% TDS:doc/latex/mh/mathtools.pdf +% TDS:source/latex/mh/mathtools.dtx +% +%<*ignore> +\begingroup + \def\x{LaTeX2e} +\expandafter\endgroup +\ifcase 0\ifx\install y1\fi\expandafter + \ifx\csname processbatchFile\endcsname\relax\else1\fi + \ifx\fmtname\x\else 1\fi\relax +\else\csname fi\endcsname +%</ignore> +%<*install> +\input docstrip.tex +\Msg{************************************************************************} +\Msg{* Installation} +\Msg{* Package: mathtools 2014/08/04 v1.15} +\Msg{************************************************************************} + +\keepsilent +\askforoverwritefalse + +\preamble + +This is a generated file. + +Copyright (C) 2002-2011 by Morten Hoegholm +Copyright (C) 2012- by Lars Madsen + + +This work may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either +version 1.3 of this license or (at your option) any later +version. The latest version of this license is in + http://www.latex-project.org/lppl.txt +and version 1.3 or later is part of all distributions of +LaTeX version 2005/12/01 or later. + +This work has the LPPL maintenance status "maintained". + +This Current Maintainer of this work is +Lars Madsen + +This work consists of the main source file mathtools.dtx +and the derived files + mathtools.sty, mathtools.pdf, mathtools.ins, mathtools.drv. + +\endpreamble + +\generate{% + \file{mathtools.ins}{\from{mathtools.dtx}{install}}% + \file{mathtools.drv}{\from{mathtools.dtx}{driver}}% + \usedir{tex/latex/mh}% + \file{mathtools.sty}{\from{mathtools.dtx}{package}}% +} + +\obeyspaces +\Msg{************************************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* file into a directory searched by TeX:} +\Msg{*} +\Msg{* mathtools.sty} +\Msg{*} +\Msg{* To produce the documentation run the file `mathtools.drv'} +\Msg{* through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing!} +\Msg{*} +\Msg{************************************************************************} + +\endbatchfile +%</install> +%<*ignore> +\fi +%</ignore> +%<*driver> +\NeedsTeXFormat{LaTeX2e} +\ProvidesFile{mathtools.drv}% + [2014/08/04 v1.15 mathematical typesetting tools] +\documentclass{ltxdoc} +\IfFileExists{fourier.sty}{\usepackage{fourier}}{} +\addtolength\marginparwidth{-25pt} +\usepackage{mathtools} + +\setcounter{IndexColumns}{2} + +\providecommand*\pkg[1]{\textsf{#1}} +\providecommand*\env[1]{\texttt{#1}} +\providecommand*\email[1]{\href{mailto:#1}{\texttt{#1}}} +\providecommand*\mode[1]{\texttt{[#1]}} +\providecommand*\file[1]{\texttt{#1}} +\usepackage{xcolor,varioref,amssymb} +\makeatletter +\newcommand*\thinfbox[2][black]{\fboxsep0pt\textcolor{#1}{\rulebox{{\normalcolor#2}}}} +\newcommand*\thinboxed[2][black]{\thinfbox[#1]{\ensuremath{\displaystyle#2}}} +\newcommand*\rulebox[1]{% + \sbox\z@{\ensuremath{\displaystyle#1}}% + \@tempdima\dp\z@ + \hbox{% + \lower\@tempdima\hbox{% + \vbox{\hrule height\fboxrule\box\z@\hrule height\fboxrule}% + }% + }% +} + +\newenvironment{codesyntax} + {\par\small\addvspace{4.5ex plus 1ex}% + \vskip -\parskip + \noindent + \begin{tabular}{|l|}\hline\ignorespaces}% + {\\\hline\end{tabular}\nobreak\par\nobreak + \vspace{2.3ex}\vskip -\parskip\noindent\ignorespacesafterend} +\makeatletter + +\newcommand*\FeatureRequest[2]{% + \hskip1sp + \marginpar{% + \parbox[b]{\marginparwidth}{\small\sffamily\raggedright + \strut Feature request by\\#1\\#2% + } + }% +} + + +\newcommand*\ProvidedBy[2]{% + \hskip1sp + \marginpar{% + \parbox[b]{\marginparwidth}{\small\sffamily\raggedright + \strut Feature provided by\\#1\\#2% + } + }% +} + +\newcommand*\cttPosting[2]{% + \hskip1sp + \marginpar{% + \parbox[b]{\marginparwidth}{\small\sffamily\raggedright + \strut Posted on \texttt{comp.text.tex} \\#1\\#2% + }% + }% +} + +\newcommand*\tsxPosting[2]{% + \hskip1sp + \marginpar{% + \parbox[b]{\marginparwidth}{\small\sffamily\raggedright + \strut Posted on \texttt{\small tex.stackexchange.com} \\#1\\#2% + }% + }% +} +\newcommand*\CommentAdded[1]{% + \hskip1sp + \marginpar{% + \parbox[b]{\marginparwidth}{\small\sffamily\raggedright + \strut Comment added\\#1% + }% + }% +} + + +\expandafter\def\expandafter\MakePrivateLetters\expandafter{% + \MakePrivateLetters \catcode`\_=11\relax +} + +\providecommand*\SpecialOptIndex[1]{% + \@bsphack + \index{#1\actualchar{\protect\ttfamily #1} + (option)\encapchar usage}% + \index{options:\levelchar#1\actualchar{\protect\ttfamily #1}\encapchar + usage}\@esphack} +\providecommand*\opt[1]{\texttt{#1}} + +\providecommand*\SpecialKeyIndex[1]{% + \@bsphack + \index{#1\actualchar{\protect\ttfamily #1} + (key)\encapchar usage}% + \index{keys:\levelchar#1\actualchar{\protect\ttfamily #1}\encapchar + usage}\@esphack} +\providecommand*\key[1]{\textsf{#1}} + +\providecommand*\eTeX{$\m@th\varepsilon$-\TeX} + +\def\MTmeta#1{% + \ensuremath\langle + \ifmmode \expandafter \nfss@text \fi + {% + \meta@font@select + \edef\meta@hyphen@restore + {\hyphenchar\the\font\the\hyphenchar\font}% + \hyphenchar\font\m@ne + \language\l@nohyphenation + #1\/% + \meta@hyphen@restore + }\ensuremath\rangle + \endgroup +} +\makeatother +\DeclareRobustCommand\meta{\begingroup\MakePrivateLetters\MTmeta}% +\def\MToarg#1{{\ttfamily[}\meta{#1}{\ttfamily]}\endgroup} +\DeclareRobustCommand\oarg{\begingroup\MakePrivateLetters\MToarg}% +\def\MHmarg#1{{\ttfamily\char`\{}\meta{#1}{\ttfamily\char`\}}\endgroup} +\DeclareRobustCommand\marg{\begingroup\MakePrivateLetters\MHmarg}% +\def\MHarg#1{{\ttfamily\char`\{#1\ttfamily\char`\}}\endgroup} +\DeclareRobustCommand\arg{\begingroup\MakePrivateLetters\MHarg}% +\def\MHcs#1{\texttt{\char`\\#1}\endgroup} +\DeclareRobustCommand\cs{\begingroup\MakePrivateLetters\MHcs} + +\def\endverbatim{\if@newlist +\leavevmode\fi\endtrivlist\vspace{-\baselineskip}} +\expandafter\let\csname endverbatim*\endcsname =\endverbatim + +\let\MTtheindex\theindex +\def\theindex{\MTtheindex\MakePrivateLetters} + +\usepackage[final,hyperindex=false]{hyperref} +\renewcommand*\usage[1]{\textit{\hyperpage{#1}}} + +\OnlyDescription +\begin{document} + \DocInput{mathtools.dtx} +\end{document} +%</driver> +% \fi +% +% \changes{v1.0}{2004/07/26}{Initial release} +% +% \GetFileInfo{mathtools.drv} +% +% \CheckSum{3107} +% +% \title{The \pkg{mathtools} package\thanks{This file has version number +% \fileversion, last revised \filedate.}} +% +% \author{Morten H\o gholm, Lars Madsen} +% \date{\filedate} +% +% \maketitle +% +% \begin{abstract} +% 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 +% 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. +% \end{abstract} +% +% \tableofcontents +% +% \section{Introduction} +% +% Although \pkg{amsmath} provides many handy tools for mathematical +% typesetting, it is nonetheless a static package. This is not a bad +% thing, because what it does, it mostly does quite well and having +% a stable math typesetting package is ``a good thing.'' However, +% \pkg{amsmath} does not fulfill all the needs of the mathematical +% part of the \LaTeX{} community, resulting in many authors writing +% small snippets of code for tweaking the mathematical layout. Some +% of these snippets has also been posted to newsgroups and mailing +% lists over the years, although more often than not without being +% released as stand-alone packages. +% +% +% The \pkg{mathtools} package is exactly what its name implies: tools +% for mathematical typesetting. It is a collection of many of these +% often needed small tweaks---with some big tweaks added as well. It +% can only do so by having harvesting newsgroups for code and/or you +% writing the maintainers with wishes for code to be included, so if +% you have any good macros or just macros that help you when writing +% mathematics, then don't hesitate to report them. It is +% easiest to just contact Lars Madsen at +% \begin{quote}\email{daleif@imf.au.dk}\end{quote} +% This is of course also the address to use in case of bug reports. +% Please put `\texttt{mathtools}' in the subject line. +% +% +% \medskip\noindent +% Update 2013: We now makes \cs{(}\cs{)} and \cs[\cs] +% robust (can be disabled via \texttt{nonrobust} package option). +% +% \section{Package loading} +% +% +% The \pkg{mathtools} package requires \pkg{amsmath} but is able to +% pass options to it as well. Thus a line like +% \begin{verbatim} +% \usepackage[fleqn,tbtags]{mathtools} +% \end{verbatim} +% is equivalent to +% \begin{verbatim} +% \usepackage[fleqn,tbtags]{amsmath} +% \usepackage{mathtools} +% \end{verbatim} +% +% +% \subsection{Special \pkg{mathtools} options} +% +% \begin{codesyntax} +% \SpecialOptIndex{fixamsmath}\opt{fixamsmath}\texttt{~~~~} +% \SpecialOptIndex{donotfixamsmathbugs}\opt{donotfixamsmathbugs} +% \end{codesyntax} +% The option \opt{fixamsmath} (default) fixes two bugs in +% \pkg{amsmath}.\footnote{See the online \LaTeX{} bugs database +% \url{http://www.latex-project.org/cgi-bin/ltxbugs2html} under +% \AmS\LaTeX{} problem reports 3591 and 3614.} Should you for some +% reason not want to fix these bugs then just add the option +% \opt{donotfixamsmathbugs} (if you can do it without typos). The +% reason for this extremely long name is that I really don't see why +% you wouldn't want these bugs to be fixed, so I've made it slightly +% difficult not to fix them. +% +% \begin{codesyntax} +% \SpecialOptIndex{allowspaces}\opt{allowspaces}\texttt{~~~~} +% \SpecialOptIndex{disallowspaces}\opt{disallowspaces} +% \end{codesyntax} +% Sometimes \pkg{amsmath} gives you nasty surprises, as here where +% things look seemingly innocent: +% \begin{verbatim} +% \[ +% \begin{gathered} +% [p] = 100 \\ +% [v] = 200 +% \end{gathered} +% \] +% \end{verbatim} +% Without \pkg{mathtools} this will result in this output: +% \[ +% \begin{gathered}[c] +% = 100 \\ +% [v] = 200 +% \end{gathered} +% \] +% Yes, the \texttt{[p]} has been gobbled without any warning +% whatsoever.\footnote{\pkg{amsmath} thought the \texttt[p] was an +% optional argument, checked if it was \texttt{t} or \texttt{b} and +% when both tests failed, assumed it was a \texttt{c}.} This is +% hardly what you'd expect as an end user, as the desired output was +% probably something like this instead: +% \[ +% \begin{gathered}[c] +% [p] = 100 \\ +% [v] = 200 +% \end{gathered} +% \] +% With the option \opt{disallowspaces} (default) \pkg{mathtools} +% disallows spaces in front of optional arguments where it could +% possibly cause problems just as \pkg{amsmath} does with |\\| +% inside the display environments. This includes the environments +% \env{gathered} (and also those shown in \S +% \vref{subsec:gathered}), \env{aligned}, \env{multlined}, and the +% extended \env{matrix}-environments (\S \vref{subsubsec:matrices}). +% If you however want to preserve the more dangerous standard +% optional spaces, simply choose the option \opt{allowspaces}. +% +% +% \section{Tools for mathematical typesetting} +% +% \begin{codesyntax} +% \SpecialUsageIndex{\mathtoolsset}\cs{mathtoolsset}\marg{key val list} +% \end{codesyntax} +% Many of the tools shown in this manual can be turned on and off by +% setting a switch to either true or false. In all cases it is done +% with the command \cs{mathtoolsset}. A typical use could be something like +% \begin{verbatim} +% \mathtoolsset{ +% showonlyrefs, +% mathic % or mathic = true +% } +% \end{verbatim} +% More information on the keys later on. +% +% \subsection{Fine-tuning mathematical layout} +% +% Sometimes you need to tweak the layout of formulas a little to get +% the best result and this part of the manual describes the various +% macros \pkg{mathtools} provides for this. +% +% \subsubsection{A complement to \texttt{\textbackslash smash}, +% \texttt{\textbackslash llap}, and \texttt{\textbackslash rlap}} +% +% \begin{codesyntax} +% \SpecialUsageIndex{\mathllap} +% \cs{mathllap}\oarg{mathstyle}\marg{math}\texttt{~~} +% \SpecialUsageIndex{\mathclap} +% \cs{mathclap}\oarg{mathstyle}\marg{math}\\ +% \SpecialUsageIndex{\mathrlap} +% \cs{mathrlap}\oarg{mathstyle}\marg{math}\texttt{~~} +% \SpecialUsageIndex{\clap} +% \cs{clap}\marg{text}\\ +% \SpecialUsageIndex{\mathmbox} +% \cs{mathmbox}\marg{math}\phantom{\meta{mathstyle}}\texttt{~~~~} +% \SpecialUsageIndex{\mathmakebox} +% \cs{mathmakebox}\oarg{width}\oarg{pos}\marg{math} +% \end{codesyntax} +% In \cite{Perlis01}, Alexander R.~Perlis describes some simple yet +% useful macros for use in math displays. For example the display +% \begin{verbatim} +% \[ +% X = \sum_{1\le i\le j\le n} X_{ij} +% \] +% \end{verbatim} +% \[ +% X = \sum_{1\le i\le j\le n} X_{ij} +% \] +% contains a lot of excessive white space. The idea that comes to +% mind is to fake the width of the subscript. The command +% \cs{mathclap} puts its argument in a zero width box and centers +% it, so it could possibly be of use here. +% \begin{verbatim} +% \[ +% X = \sum_{\mathclap{1\le i\le j\le n}} X_{ij} +% \] +% \end{verbatim} +% \[ +% X = \sum_{\mathclap{1\le i\le j\le n}} X_{ij} +% \] +% For an in-depth discussion of +% these macros I find it better to read the article; an online +% version can be found at +% \begin{quote} +% \url{http://www.tug.org/TUGboat/Articles/tb22-4/tb72perlS.pdf} +% \end{quote} +% Note that the definitions shown in the article do not exactly +% match the definitions in \pkg{mathtools}. Besides providing an +% optional argument for specifying the desired math style, these +% versions also work around a most unfortunate \TeX{} +% ``feature.''\footnote{The faulty reboxing procedure.} The +% \cs{smash} macro is fixed too. +% +% +% \subsubsection{Forcing a cramped style} +% +% \begin{codesyntax} +% \SpecialUsageIndex{\cramped} +% \cs{cramped}\oarg{mathstyle}\marg{math} +% \end{codesyntax} +% \cttPosting{Michael Herschorn}{1992/07/21} +% Let's look at another example where we have used \cs{mathclap}: +% \begin{verbatim} +% \begin{equation}\label{eq:mathclap} +% \sum_{\mathclap{a^2<b^2<c}}\qquad +% \sum_{a^2<b^2<c} +% \end{equation} +% \end{verbatim} +% \begin{equation}\label{eq:mathclap} +% \sum_{\mathclap{a^2<b^2<c}}\qquad +% \sum_{a^2<b^2<c} +% \end{equation} +% Do you see the difference? Maybe if I zoomed in a bit: +% \begingroup \fontsize{24}{\baselineskip}\selectfont +% \[ +% \sum_{\mathclap{a^2<b^2<c}}\qquad +% \sum_{a^2<b^2<c} +% \] +% \endgroup +% Notice how the limit of the right summation sign is typeset in a +% more compact style than the left. It is because \TeX{} sets the +% limits of operators in a \emph{cramped} style. For each of \TeX' +% four math styles (\cs{displaystyle}, \cs{textstyle}, +% \cs{scriptstyle}, and \cs{scriptscriptstyle}), there also exists a +% cramped style that doesn't raise exponents as much. Besides in the +% limits of operators, \TeX{} also automatically uses these cramped +% styles in radicals such as \cs{sqrt} and in the denominators of +% fractions, but unfortunately there are no primitive commands that +% allows you to detect crampedness or switch to it. +% +% \pkg{mathtools} offers the command \cs{cramped} which forces a +% cramped style in normal un-cramped math. Additionally you can +% choose which of the four styles you want it in as well by +% specifying it as the optional argument: +% \begin{verbatim} +% \[ +% \cramped{x^2} \leftrightarrow x^2 \quad +% \cramped[\scriptstyle]{x^2} \leftrightarrow {\scriptstyle x^2} +% \] +% \end{verbatim} +% \[ +% \cramped{x^2} \leftrightarrow x^2 \quad +% \cramped[\scriptstyle]{x^2} \leftrightarrow {\scriptstyle x^2} +% \] +% You may be surprised how often the cramped style can be +% beneficial yo your output. Take a look at this example: +% \begin{verbatim} +% \begin{quote} +% The 2005 Euro\TeX{} conference is held in Abbaye des +% Pr\'emontr\'es, France, marking the 16th ($2^{2^2}$) anniversary +% of both Dante and GUTenberg (the German and French \TeX{} users +% group resp.). +% \end{quote} +% \end{verbatim} +% \begin{quote} +% The 2005 Euro\TeX{} conference is held in Abbaye des +% Pr\'emontr\'es, France, marking the 16th ($2^{2^2}$) anniversary +% of both Dante and GUTenberg (the German and French \TeX{} users +% group resp.). +% \end{quote} +% Typesetting on a grid is generally considered quite desirable, but +% as the second line of the example shows, the exponents of $2$ +% causes the line to be too tall for the normal value of +% \cs{baselineskip}, so \TeX{} inserts a \cs{lineskip} (normal value +% is \the\lineskip). In order to circumvent the problem, we can +% force a cramped style so that the exponents aren't raised as much: +% \begin{verbatim} +% \begin{quote} +% The 2005 Euro\TeX{} ... 16th ($\cramped{2^{2^2}}$) ... +% \end{quote} +% \end{verbatim} +% \begin{quote} +% The 2005 Euro\TeX{} conference is held in Abbaye des +% Pr\'emontr\'es, France, marking the 16th ($\cramped{2^{2^2}}$) +% anniversary of both Dante and GUTenberg (the German and French +% \TeX{} users group resp.). +% \end{quote} +% +% \begin{codesyntax} +% \SpecialUsageIndex{\crampedllap} +% \cs{crampedllap}\oarg{mathstyle}\marg{math}\texttt{~~} +% \SpecialUsageIndex{\crampedclap} +% \cs{crampedclap}\oarg{mathstyle}\marg{math}\\ +% \SpecialUsageIndex{\crampedrlap} +% \cs{crampedrlap}\oarg{mathstyle}\marg{math} +% \end{codesyntax} +% The commands \cs{crampedllap}, \cs{crampedclap}, and +% \cs{crampedrlap} are identical to the three \cs{mathXlap} commands +% described earlier except the argument is typeset in cramped style. +% You need this in order to typeset \eqref{eq:mathclap} correctly +% while still faking the width of the limit. +% \begin{verbatim} +% \begin{equation*}\label{eq:mathclap-b} +% \sum_{\crampedclap{a^2<b^2<c}} +% \tag{\ref{eq:mathclap}*} +% \end{equation*} +% \end{verbatim} +% \begin{equation*}\label{eq:mathclap-b} +% \sum_{\crampedclap{a^2<b^2<c}} +% \tag{\ref{eq:mathclap}*} +% \end{equation*} +% Of course you could just type +% \begin{verbatim} +% \sum_{\mathclap{\cramped{a^2<b^2<c}}} +% \end{verbatim} +% but it has one major disadvantage: In order for \cs{mathXlap} and +% \cs{cramped} to get the right size, \TeX{} has to process them +% four times, meaning that nesting them as shown above will cause +% \TeX{} to typeset $4^2$ instances before choosing the right one. +% In this situation however, we will of course need the same style +% for both commands so it makes sense to combine the commands in +% one, thus letting \TeX{} make the choice only once rather than +% twice. +% +% +% +% \subsubsection{Smashing an operator} +% +% +% +% \begin{codesyntax} +% \SpecialUsageIndex{\smashoperator} +% \cs{smashoperator}\oarg{pos}\marg{operator with limits} +% \end{codesyntax} +% \FeatureRequest{Lars Madsen}{2004/05/04} +% Above we shoved how to get \LaTeX{} to ignore the width of the +% subscript of an operator. However this approach takes a lot of +% extra typing, especially if you have a wide superscript, meaning +% you have to put in \cs{crampedclap} in both sub- and superscript. +% To make things easier, \pkg{mathtools} provides a +% \cs{smashoperator} command, which simply ignores the width of the +% sub- and superscript. It also takes an optional argument, +% \texttt{l}, \texttt{r}, or \texttt{lr} (default), denoting which +% side of the operator should be ignored (smashed). +% \begin{verbatim} +% \[ +% V = \sum_{1\le i\le j\le n}^{\infty} V_{ij} \quad +% X = \smashoperator{\sum_{1\le i\le j\le n}^{3456}} X_{ij} \quad +% Y = \smashoperator[r]{\sum\limits_{1\le i\le j\le n}} Y_{ij} \quad +% Z = \smashoperator[l]{\mathop{T}_{1\le i\le j\le n}} Z_{ij} +% \] +% \end{verbatim} +% \[ +% V = \sum_{1\le i\le j\le n}^{\infty} V_{ij} \quad +% X = \smashoperator{\sum_{1\le i\le j\le n}^{3456}} X_{ij} \quad +% Y = \smashoperator[r]{\sum\limits_{1\le i\le j\le n}} Y_{ij} \quad +% Z = \smashoperator[l]{\mathop{T}_{1\le i\le j\le n}} Z_{ij} +% \] +% Note that \cs{smashoperator} always sets its argument in display +% style and with limits even if you have used the \opt{nosumlimits} +% option of \pkg{amsmath}. If you wish, you can use shorthands for +% \texttt{\_} and \texttt{\textasciicircum} such as \cs{sb} and +% \cs{sp}. +% +% +% \subsubsection{Adjusting limits of operators} +% +% \begin{codesyntax} +% \SpecialUsageIndex{\adjustlimits} +% \cs{adjustlimits}\marg{operator$\sb1$}\texttt{\_}\marg{limit$\sb1$} +% \marg{operator$\sb2$}\texttt{\_}\marg{limit$\sb2$} +% \end{codesyntax} +% \FeatureRequest{Lars Madsen}{2004/07/09} +% When typesetting two consecutive operators with limits one often +% wishes the limits of the operators were better aligned. Look +% closely at these examples: +% \begin{verbatim} +% \[ +% \text{a)} \lim_{n\to\infty} \max_{p\ge n} \quad +% \text{b)} \lim_{n\to\infty} \max_{p^2\ge n} \quad +% \text{c)} \lim_{n\to\infty} \sup_{p^2\ge nK} \quad +% \text{d)} \limsup_{n\to\infty} \max_{p\ge n} +% \] +% \end{verbatim} +% \[ +% \text{a)} \lim_{n\to\infty} \max_{p\ge n} \quad +% \text{b)} \lim_{n\to\infty} \max_{p^2\ge n} \quad +% \text{c)} \lim_{n\to\infty} \sup_{p^2\ge nK} \quad +% \text{d)} \limsup_{n\to\infty} \max_{p\ge n} +% \] +% a) looks okay, but b) is not quite as good because the second +% limit ($\cramped{p^2\ge n}$) is significantly taller than the +% first ($n\to\infty$). With c)~things begin to look really bad, +% because the second operator has a descender while the first +% doesn't, and finally we have d)~which looks just as bad as~c). The +% command \cs{adjustlimits} is useful in these cases, as you can +% just put it in front of these consecutive operators and it'll make +% the limits line up. +% \medskip\par\noindent +% \begin{minipage}{\textwidth} +% \begin{verbatim} +% \[ +% \text{a)} \adjustlimits\lim_{n\to\infty} \max_{p\ge n} \quad +% \text{b)} \adjustlimits\lim_{n\to\infty} \max_{p^2\ge n} \quad +% \text{c)} \adjustlimits\lim_{n\to\infty} \sup_{p^2\ge nK} \quad +% \text{d)} \adjustlimits\limsup_{n\to\infty} \max_{p\ge n} +% \] +% \end{verbatim} +% \end{minipage} +% \[ +% \text{a)} \adjustlimits\lim_{n\to\infty} \max_{p\ge n} \quad +% \text{b)} \adjustlimits\lim_{n\to\infty} \max_{p^2\ge n} \quad +% \text{c)} \adjustlimits\lim_{n\to\infty} \sup_{p^2\ge nK} \quad +% \text{d)} \adjustlimits\limsup_{n\to\infty} \max_{p\ge n} +% \] +% The use of \cs{sb} instead of \texttt{\_} is allowed. +% +% +% \subsubsection{Swapping space above \texorpdfstring{\AmS}{AMS} display math environments } +% \label{sec:swapping} +% +% One feature that the plain old \env{equation} environment has that +% the \AmS\ environments does not (because of thechnical reasons), is +% the feature of using less space above the equation if the situation +% presents itself. The \AmS\ environments cannot do this, but one can +% manually, using +% \begin{codesyntax} +% \SpecialUsageIndex{\SwapAboveDisplaySkip} +% \cs{SwapAboveDisplaySkip} +% \end{codesyntax} +% as the very first content within an \AmS\ display math +% environment. It will then issue an \cs{abovedisplayshortskip} +% instead of the normal \cs{abovedisplayskip}. +% +% Note it will not work with the \env{equation} or \env{multline} environments. +% +% Here is an example of the effect +% \begin{verbatim} +% \noindent\rule\textwidth{1pt} +% \begin{align*} A &= B \end{align*} +% \noindent\rule\textwidth{1pt} +% \begin{align*} +% \SwapAboveDisplaySkip +% A &= B +% \end{align*} +% \end{verbatim} +% \noindent\rule\textwidth{1pt} +% \begin{align*} A &= B \end{align*} +% \noindent\rule\textwidth{1pt} +% \begin{align*} +% \SwapAboveDisplaySkip +% A &= B +% \end{align*} +% +% +% \subsection{Controlling tags} +% +% In this section various tools for altering the appearance of tags +% are shown. All of the tools here can be used at any point in the +% document but they should probably be affect the whole document, so +% the preamble is the best place to issue them. +% +% \subsubsection{The appearance of tags} +% \begin{codesyntax} +% \SpecialUsageIndex{\newtagform} +% \cs{newtagform}\marg{name}\oarg{inner_format}\marg{left}\marg{right}\\ +% \SpecialUsageIndex{\renewtagform} +% \cs{renewtagform}\marg{name}\oarg{inner_format}\marg{left}\marg{right}\\ +% \SpecialUsageIndex{\usetagform} +% \cs{usetagform}\marg{name} +% \end{codesyntax} +% Altering the layout of equation numbers in \pkg{amsmath} is not +% very user friendly (it involves a macro with three \texttt{@}'s in +% its name), so \pkg{mathtools} provides an interface somewhat +% reminiscent of the page style concept. This way you can define +% several different tag forms and then choose the one you prefer. +% +% As an example let's try to define a tag form which puts the +% equation number in square brackets. First we define a brand new tag +% form: +% \begin{verbatim} +% \newtagform{brackets}{[}{]} +% \end{verbatim} +% Then we activate it: +% \begin{verbatim} +% \usetagform{brackets} +% \end{verbatim} +% The result is then +% \newtagform{brackets}{[}{]} +% \usetagform{brackets} +% \begin{equation} +% E \neq m c^3 +% \end{equation} +% +% Similarly you could define a second version of the brackets that +% prints the equation number in bold face instead +% \begin{verbatim} +% \newtagform{brackets2}[\textbf]{[}{]} +% \usetagform{brackets2} +% \begin{equation} +% E \neq m c^3 +% \end{equation} +% \end{verbatim} +% \newtagform{brackets2}[\textbf]{[}{]} +% \usetagform{brackets2} +% \begin{equation} +% E \neq m c^3 +% \end{equation} +% When you reference an equation with \cs{eqref}, the tag form in +% effect at the time of referencing controls the formatting, so be +% careful if you use different tag forms throughout your document. +% +% If you want to renew a tag form, then use the command +% \cs{renewtagform}. Should you want to +% return to the standard setting then choose\usetagform{default} +% \begin{verbatim} +% \usetagform{default} +% \end{verbatim} +% +% \changes{v1.12}{2012/05/09}{Added caveat} +% \noindent\textbf{Caveat regarding \pkg{ntheorem}}: If you like to +% change the appearence of the tags \emph{and} you are also using the +% \pkg{ntheorem} package, then please postpone the change of +% appearance until \emph{after} loading \pkg{ntheorem}. (In order to +% do its thing, \pkg{ntheorem} has to mess with the tags\dots) +% +% \subsubsection{Showing only referenced tags} +% +% \begin{codesyntax} +% \SpecialKeyIndex{showonlyrefs}$\key{showonlyrefs}=\texttt{true}\vert\texttt{false}$\\ +% \SpecialKeyIndex{showmanualtags}$\key{showmanualtags}=\texttt{true}\vert\texttt{false}$\\ +% \SpecialUsageIndex{\refeq}\cs{refeq}\marg{label} +% \end{codesyntax} +% An equation where the tag is produced with a manual \cs{tag*} +% shouldn't be referenced with the normal \cs{eqref} because that +% would format it according to the current tag format. Using just +% \cs{ref} on the other hand may not be a good solution either as +% the argument of \cs{tag*} is always set in upright shape in the +% equation and you may be referencing it in italic text. In the +% example below, the command \cs{refeq} is used to avoid what could +% possibly lead to confusion in cases where the tag font has very +% different form in upright and italic shape (here we switch to +% Palatino in the example): +% \begin{verbatim} +% \begin{quote}\renewcommand*\rmdefault{ppl}\normalfont\itshape +% \begin{equation*} +% a=b \label{eq:example}\tag*{Q\&A} +% \end{equation*} +% See \ref{eq:example} or is it better with \refeq{eq:example}? +% \end{quote} +% \end{verbatim} +% \begin{quote}\renewcommand*\rmdefault{ppl}\normalfont\itshape +% \begin{equation*} +% a=b \label{eq:example}\tag*{Q\&A} +% \end{equation*} +% See \ref{eq:example} or is it better with \refeq{eq:example}? +% \end{quote} +% +% +% Another problem sometimes faced is the need for showing the +% equation numbers for only those equations actually referenced. In +% \pkg{mathtools} this can be done by setting the key +% \key{showonlyrefs} to either true or false by using +% \cs{mathtoolsset}. You can also choose whether or not to show the +% manual tags specified with \cs{tag} or \cs{tag*} by setting the +% option \key{showmanualtags} to true or false.\footnote{I recommend +% setting \key{showmanualtags} to true, else the whole idea of using +% \cs{tag} doesn't really make sense, does it?} For both keys just +% typing the name of it chooses true as shown in the following +% example. +% +% \begin{verbatim} +% \mathtoolsset{showonlyrefs,showmanualtags} +% \usetagform{brackets} +% \begin{gather} +% a=a \label{eq:a} \\ +% b=b \label{eq:b} \tag{**} +% \end{gather} +% This should refer to the equation containing $a=a$: \eqref{eq:a}. +% Then a switch of tag forms. +% \usetagform{default} +% \begin{align} +% c&=c \label{eq:c} \\ +% d&=d \label{eq:d} +% \end{align} +% This should refer to the equation containing $d=d$: \eqref{eq:d}. +% \begin{equation} +% e=e +% \end{equation} +% Back to normal.\mathtoolsset{showonlyrefs=false} +% \begin{equation} +% f=f +% \end{equation} +% \end{verbatim} +% \mathtoolsset{showonlyrefs,showmanualtags} +% \usetagform{brackets} +% \begin{gather} +% a=a \label{eq:a} \\ +% b=b \label{eq:b} \tag{**} +% \end{gather} +% This should refer to the equation containing $a=a$: \eqref{eq:a}. +% Then a switch of tag forms. +% \usetagform{default} +% \begin{align} +% c&=c \label{eq:c} \\ +% d&=d \label{eq:d} +% \end{align} +% This should refer to the equation containing $d=d$: \eqref{eq:d}. +% \begin{equation} +% e=e +% \end{equation} +% Back to normal.\mathtoolsset{showonlyrefs=false} +% \begin{equation} +% f=f +% \end{equation} +% +% Note that this feature only works if you use \cs{eqref} or +% \cs{refeq} to reference your equations. +% +% When using \key{showonlyrefs} it might be useful to be able to +% actually add a few equation numbers without directly referring to +% them. +% \begin{codesyntax} +% \SpecialUsageIndex{\noeqref}\cs{noeqref}\marg{label,label,\dots} +% \end{codesyntax} +% \FeatureRequest{Rasmus Villemoes}{2008/03/26} +% The syntax is somewhat similar to \cs{nocite}. If a label in the +% list is undefined we will throw a warning in the same manner as +% \cs{ref}. +% +% \medskip\noindent\textbf{BUG 1:} Unfortunately the use of the +% \key{showonlyref} introduce a bug within amsmath's typesetting +% of formula versus equation number. This bug manifest itself by +% allowing formulas to be typeset close to or over the equation +% number. Currently no general fix is known, other than making sure +% that one's formulas are not long enough to touch the equation +% number. +% +% To make a long story stort, amsmath typesets its math environments +% twice, one time for measuring and one time for the actual +% typesetting. In the measuring part, the width of the equation +% number is recorded such that the formula or the equation number can +% be moved (if necessary) in the typesetting part. When +% \key{showonlyref} is enabled, the width of the equation number +% depend on whether or not this number is referred~to. To determine +% this, we need to know the current label. But the current label is +% \emph{not} known in the measuring phase. Thus the measured width is +% always zero (because no label equals not referred to) and therefore +% the typesetting phase does not take the equation number into +% account. +% +% \medskip\noindent\textbf{BUG 2:} Currently there is a bug between +% \key{showonlyrefs} and the \pkg{ntheorem} package, when the +% \pkg{ntheorem} option \key{thmmarks} is active. The shown equation +% numbers may come out wrong (seems to be multiplied by 2). Or the end +% marker may be placed in the wrong place if a proof ends with a +% displayed formula, and that formula is not refered to. +% +% There are two possible solutions to this both involving \pkg{empheq}. +% The easiest fix is to add the following line +% \begin{verbatim} +% \usepackage[overload,ntheorem]{empheq} +% \end{verbatim} +% before loading \pkg{ntheorem}. But the \texttt{overload} option of +% course disables things like \cs{intertext} and \cs{shotintertext}. +% +% The other thing to try is to use drop the \texttt{overload} option +% and use \env{empheq} on the very last expression, as in +% \begin{verbatim} +% \begin{empheq}{align} +% A &= B \label {eq:32}\\ +% & = 1. \label{eq:31} +% \end{empheq} +% \end{proof} +% \end{verbatim} +% +% The \pkg{empheq} package fixes some +% problems with \pkg{ntheorem} and lets \pkg{mathtools} get correct +% access to the equation numbers again. +% +% \subsection{Extensible symbols} +% +% The number of horizontally extensible symbols in standard \LaTeX{} +% and \pkg{amsmath} is somewhat low. This part of the manual +% describes what \pkg{mathtools} does to help this situation. +% +% \subsubsection{Arrow-like symbols} +% +% +% \begin{codesyntax} +% \SpecialUsageIndex{\xleftrightarrow} +% \cs{xleftrightarrow}\oarg{sub}\marg{sup}\texttt{~~~~~~~~~} +% \SpecialUsageIndex{\xRightarrow} +% \cs{xRightarrow}\oarg{sub}\marg{sup}\\ +% \SpecialUsageIndex{\xLeftarrow} +% \cs{xLeftarrow}\oarg{sub}\marg{sup}\texttt{~~~~~~~~~~~~~~} +% \SpecialUsageIndex{\xLeftrightarrow} +% \cs{xLeftrightarrow}\oarg{sub}\marg{sup}\\ +% \SpecialUsageIndex{\xhookleftarrow} +% \cs{xhookleftarrow}\oarg{sub}\marg{sup}\texttt{~~~~~~~~~~} +% \SpecialUsageIndex{\xhookrightarrow} +% \cs{xhookrightarrow}\oarg{sub}\marg{sup}\\ +% \SpecialUsageIndex{\xmapsto} +% \cs{xmapsto}\oarg{sub}\marg{sup} +% \end{codesyntax} +% Extensible arrows are part of \pkg{amsmath} in the form of the +% commands +% \begin{quote} +% \cs{xrightarrow}\oarg{subscript}\marg{superscript}\quad and\\ +% \cs{xleftarrow}\oarg{subscript}\marg{superscript} +% \end{quote} +% But what about extensible versions of say, \cs{leftrightarrow} or +% \cs{Longleftarrow}? It turns out that the above mentioned +% extensible arrows are the only two of their kind defined by +% \pkg{amsmath}, but luckily \pkg{mathtools} helps with that. The +% extensible arrow-like symbols in \pkg{mathtools} follow the same +% naming scheme as the one's in \pkg{amsmath} so to get an extensible +% \cs{Leftarrow} you simply do a +% \begin{verbatim} +% \[ +% A \xLeftarrow[under]{over} B +% \] +% \end{verbatim} +% \[ +% A \xLeftarrow[under]{over} B +% \] +% \begin{codesyntax} +% \SpecialUsageIndex{\xrightharpoondown} +% \cs{xrightharpoondown}\oarg{sub}\marg{sup}\texttt{~~~~} +% \SpecialUsageIndex{\xrightharpoonup} +% \cs{xrightharpoonup}\oarg{sub}\marg{sup}\\ +% \SpecialUsageIndex{\xleftharpoondown} +% \cs{xleftharpoondown}\oarg{sub}\marg{sup}\texttt{~~~~~} +% \SpecialUsageIndex{\xleftharpoonup} +% \cs{xleftharpoonup}\oarg{sub}\marg{sup}\\ +% \SpecialUsageIndex{\xrightleftharpoons} +% \cs{xrightleftharpoons}\oarg{sub}\marg{sup}\texttt{~~~} +% \SpecialUsageIndex{\xleftrightharpoons} +% \cs{xleftrightharpoons}\oarg{sub}\marg{sup} +% \end{codesyntax} +% \pkg{mathtools} also provides the extensible harpoons shown above. +% They're taken from~\cite{Voss:2004}. For those liking visuals, here +% are the macros in use in the order listed in the two boxes above. +% \begin{align*} +% A &\xleftrightarrow[below]{above} B & +% A &\xRightarrow[below]{above} B \\ +% A &\xLeftarrow[below]{above} B & +% A &\xLeftrightarrow[below]{above} B \\ +% A &\xhookleftarrow[below]{above} B & +% A &\xhookrightarrow[below]{above} B \\ +% A &\xmapsto[below]{above} B \\ +% A &\xrightharpoondown[below]{above} B & +% A &\xrightharpoonup[below]{above} B \\ +% A &\xleftharpoondown[below]{above} B & +% A &\xleftharpoonup[below]{above} B \\ +% A &\xrightleftharpoons[below]{above} B & +% A &\xleftrightharpoons[below]{above} B \\ +% \end{align*} +% +% +% +% \subsubsection{Braces and brackets} +% +% \LaTeX{} defines other kinds of extensible symbols like +% \cs{overbrace} and \cs{underbrace}, but sometimes you may want +% another symbol, say, a bracket. +% \begin{codesyntax} +% \SpecialUsageIndex{\underbracket}\cs{underbracket}\oarg{rule thickness} +% \oarg{bracket height}\marg{arg}\\ +% \SpecialUsageIndex{\overbracket}\cs{overbracket}\oarg{rule thickness} +% \oarg{bracket height}\marg{arg} +% \end{codesyntax} +% The commands \cs{underbracket} and \cs{overbracket} are inspired +% by \cite{Voss:2004}, although the implementation here is slightly +% different. +% Used without the optional arguments the bracket commands produce this: +% \begin{quote} +% |$\underbracket {foo\ bar}_{baz}$|\quad $\underbracket {foo\ bar}_{baz}$ \\ +% |$\overbracket {foo\ bar}^{baz}$ |\quad $\overbracket {foo\ bar}^{baz}$ +% \end{quote} +% The default rule thickness is equal to that of \cs{underbrace} +% (app.~$5/18$\,ex) while the default bracket height is equal to +% app.~$0.7$\,ex. These values give really pleasing results in all +% font sizes, but feel free to use the optional arguments. That way +% you may get ``beauties'' like +% \begin{verbatim} +% \[ +% \underbracket[3pt]{xxx\ yyy}_{zzz} \quad \text{and} \quad +% \underbracket[1pt][7pt]{xxx\ yyy}_{zzz} +% \] +% \end{verbatim} +% \[ +% \underbracket[3pt]{xxx\ yyy}_{zzz} \quad \text{and} \quad +% \underbracket[1pt][7pt]{xxx\ yyy}_{zzz} +% \] +% \begin{codesyntax} +% \SpecialUsageIndex{\underbrace}\cs{underbrace}\marg{arg}\texttt{~~} +% \SpecialUsageIndex{\LaTeXunderbrace}\cs{LaTeXunderbrace}\marg{arg}\\ +% \SpecialUsageIndex{\overbrace}\cs{overbrace}\marg{arg}\texttt{~~~} +% \SpecialUsageIndex{\LaTeXoverbrace}\cs{LaTeXoverbrace}\marg{arg} +% \end{codesyntax} +% The standard implementation of the math operators \cs{underbrace} +% and \cs{overbrace} in \LaTeX{} has some deficiencies. For example, +% all lengths used internally are \emph{fixed} and optimized for +% 10\,pt typesetting. As a direct consequence thereof, using font +% sizes other than 10 will produce less than optimal results. +% Another unfortunate feature is the size of the braces. In the +% example below, notice how the math operator \cs{sum} places its +% limit compared to \cs{underbrace}. +% \[ +% \mathop{\thinboxed[blue]{\sum}}_{n} +% \mathop{\thinboxed[blue]{\LaTeXunderbrace{\thinboxed[green]{foof}}}}_{zzz} +% \] +% The blue lines indicate the dimensions of the math operator and +% the green lines the dimensions of $foof$. As you can see, there +% seems to be too much space between the brace and the $zzz$ whereas +% the space between brace and $foof$ is okay. Let's see what happens +% when we use a bigger font size:\par\Huge\vskip-\baselineskip +% \[ +% \mathop{\thinboxed[blue]{\sum}}_{n} +% \mathop{\thinboxed[blue]{\LaTeXunderbrace{\thinboxed[green]{foof}}}}_{zzz} +% \] +% \normalsize Now there's too little space between the brace and the +% $zzz$ and also too little space between the brace and the $foof$. +% If you use Computer Modern you'll actually see that the $f$ +% overlaps with the brace! Let's try in \cs{footnotesize}: +% \par\footnotesize +% \[ +% \mathop{\thinboxed[blue]{\sum}}_{n} +% \mathop{\thinboxed[blue]{\LaTeXunderbrace{\thinboxed[green]{foof}}}}_{zzz} +% \]\normalsize +% Here the spacing above and below the brace is quite excessive. +% +% As \cs{overbrace} has the exact same problems, there are good +% reasons for \pkg{mathtools} to make redefinitions of +% \cs{underbrace} and \cs{overbrace}. These new versions work +% equally well in all font sizes and fixes the spacing issues and +% apart from working with the default Computer Modern fonts, they +% also work with the packages \pkg{mathpazo}, \pkg{pamath}, +% \pkg{fourier}, \pkg{eulervm}, \pkg{cmbright}, and \pkg{mathptmx}. +% If you use the \pkg{ccfonts} to get the full Concrete fonts, the +% original version saved under the names \cs{LaTeXunderbrace} and +% \cs{LaTeXoverbrace} are better, due to of the special design of +% the Concrete extensible braces. In that case you should probably +% just add the lines +% \begin{verbatim} +% \let\underbrace\LaTeXunderbrace +% \let\overbrace\LaTeXoverbrace +% \end{verbatim} +% to your preamble after loading \pkg{mathtools} which will restore +% the original definitions of \cs{overbrace} and \cs{underbrace}. +% +% +% +% +% \subsection{New mathematical building blocks} +% +% In this part of the manual, various mathematical environments are +% described. +% +% \subsubsection{Matrices}\label{subsubsec:matrices} +% +% \begin{codesyntax} +% \SpecialEnvIndex{matrix*}\cs{begin}\arg{matrix*}\texttt{ }\oarg{col} +% \meta{contents} \cs{end}\arg{matrix*}\\ +% \SpecialEnvIndex{pmatrix*}\cs{begin}\arg{pmatrix*}\oarg{col} +% \meta{contents} \cs{end}\arg{pmatrix*}\\ +% \SpecialEnvIndex{bmatrix*}\cs{begin}\arg{bmatrix*}\oarg{col} +% \meta{contents} \cs{end}\arg{bmatrix*}\\ +% \SpecialEnvIndex{Bmatrix*}\cs{begin}\arg{Bmatrix*}\oarg{col} +% \meta{contents} \cs{end}\arg{Bmatrix*}\\ +% \SpecialEnvIndex{vmatrix*}\cs{begin}\arg{vmatrix*}\oarg{col} +% \meta{contents} \cs{end}\arg{vmatrix*}\\ +% \SpecialEnvIndex{Vmatrix*}\cs{begin}\arg{Vmatrix*}\oarg{col} +% \meta{contents} \cs{end}\arg{Vmatrix*} +% \end{codesyntax} +% \FeatureRequest{Lars Madsen}{2004/04/05} +% All of the \pkg{amsmath} \env{matrix} environments center the +% columns by default, which is not always what you want. Thus +% \pkg{mathtools} provides a starred version for each of the original +% environments. These starred environments take an optional argument +% specifying the alignment of the columns, so that +% \begin{verbatim} +% \[ +% \begin{pmatrix*}[r] +% -1 & 3 \\ +% 2 & -4 +% \end{pmatrix*} +% \] +% \end{verbatim} +% yields +% \[ +% \begin{pmatrix*}[r] +% -1 & 3 \\ +% 2 & -4 +% \end{pmatrix*} +% \] +% The optional argument (default is \texttt{[c]}) can be any column +% type valid in the usual \env{array} environment. +% +% While we are at it, we also provide fenced versions of the +% \env{smallmatrix} environment, To keep up with the naming of the +% large matrix environments, we provide both a starred and a +% non-starred version. Since \env{smallmatrix} is defined in a +% different manner than the \env{matrix} environment, the option to +% say \env{smallmatrix*} \emph{has} to be either \texttt{c}, +% \texttt{l} \emph{or}~\texttt{r}. The default is \texttt{c}, which +% can be changed globally using the \key{smallmatrix-align}=\meta{c,l +% or r}. +% \begin{codesyntax} +% \SpecialEnvIndex{smallmatrix*}\cs{begin}\arg{smallmatrix*}\texttt{ }\oarg{col} +% \meta{contents} \cs{end}\arg{smallmatrix*}\\ +% \SpecialEnvIndex{psmallmatrix}\cs{begin}\arg{psmallmatrix} +% \meta{contents} \cs{end}\arg{psmallmatrix}\\ +% \SpecialEnvIndex{psmallmatrix*}\cs{begin}\arg{psmallmatrix*}\oarg{col} +% \meta{contents} \cs{end}\arg{psmallmatrix*}\\ +% \SpecialEnvIndex{bsmallmatrix}\cs{begin}\arg{bsmallmatrix} +% \meta{contents} \cs{end}\arg{bsmallmatrix}\\ +% \SpecialEnvIndex{bsmallmatrix*}\cs{begin}\arg{bsmallmatrix*}\oarg{col} +% \meta{contents} \cs{end}\arg{bsmallmatrix*}\\ +% \SpecialEnvIndex{Bsmallmatrix}\cs{begin}\arg{Bsmallmatrix} +% \meta{contents} \cs{end}\arg{Bsmallmatrix}\\ +% \SpecialEnvIndex{Bsmallmatrix*}\cs{begin}\arg{Bsmallmatrix*}\oarg{col} +% \meta{contents} \cs{end}\arg{Bsmallmatrix*}\\ +% \SpecialEnvIndex{vsmallmatrix}\cs{begin}\arg{vsmallmatrix} +% \meta{contents} \cs{end}\arg{vsmallmatrix}\\ +% \SpecialEnvIndex{vsmallmatrix*}\cs{begin}\arg{vsmallmatrix*}\oarg{col} +% \meta{contents} \cs{end}\arg{vsmallmatrix*}\\ +% \SpecialEnvIndex{Vsmallmatrix}\cs{begin}\arg{Vsmallmatrix} +% \meta{contents} \cs{end}\arg{Vsmallmatrix}\\ +% \SpecialEnvIndex{Vsmallmatrix*}\cs{begin}\arg{Vsmallmatrix*}\oarg{col} +% \meta{contents} \cs{end}\arg{Vsmallmatrix*}\\ +% \SpecialKeyIndex{smallmatrix-align}\makebox{$\key{smallmatrix-align}=\meta{c,l or r}$}\\ +% \SpecialKeyIndex{smallmatrix-inner-space}\makebox{$\key{smallmatrix-inner-space}=\cs{,}$} +% \end{codesyntax} +% \ProvidedBy{Rasmus Villemoes}{2011/01/17} +% \begin{verbatim} +% \[ +% \begin{bsmallmatrix} a & -b \\ -c & d \end{bsmallmatrix} +% \begin{bsmallmatrix*}[r] a & -b \\ -c & d \end{bsmallmatrix*} +% \] +% \end{verbatim} +% yields +% \[ +% \begin{bsmallmatrix} a & -b \\ -c & d \end{bsmallmatrix} +% \begin{bsmallmatrix*}[r] a & -b \\ -c & d \end{bsmallmatrix*} +% \] +% Inside the \verb?Xsmallmatrix? construction a small space is +% inserted between the fences and the contents, the size of it can be +% changed using \key{smallmatrix-align}=\meta{some spacing command}, +% the default is \cs{,}. +% +% As an extra trick the fences will behave as open and closing fences +% in constract to their auto-scaling nature.\footnote{\cs{left} and +% \cs{right} do \emph{not} produce open and closing fences, thus +% the space before or after may be too large. Inside this +% construction they behave.} +% +% \subsubsection{The \env{multlined} environment} +% +% \begin{codesyntax} +% \SpecialEnvIndex{multlined}\cs{begin}\arg{multlined}\oarg{pos}\oarg{width} +% \meta{contents} \cs{end}\arg{multlined}\\ +% \SpecialUsageIndex{\shoveleft}\cs{shoveleft}\oarg{dimen}\marg{arg}\texttt{~~} +% \SpecialUsageIndex{\shoveright}\cs{shoveright}\oarg{dimen}\marg{arg}\\ +% \makeatletter\settowidth\@tempdimc{\cs{shoveleft}\oarg{dimen}\marg{arg}}\global\@tempdimc\@tempdimc +% \SpecialKeyIndex{firstline-afterskip}\makebox[\@tempdimc][l]{$\key{firstline-afterskip}=\meta{dimen}$}\texttt{~~} +% \SpecialKeyIndex{lastline-preskip}$\key{lastline-preskip}=\meta{dimen}$\\ +% \makeatletter\SpecialKeyIndex{multlined-width}\makebox[\@tempdimc][l]{$\key{multlined-width}=\meta{dimen}$}\texttt{~~} +% \SpecialKeyIndex{multlined-pos}$\key{multlined-pos}=\texttt{c}\vert\texttt{b}\vert\texttt{t}$ +% \end{codesyntax} +% Some of the \pkg{amsmath} environments exist in two forms: an +% outer and an inner environment. One example is the pair +% \env{gather} \& \env{gathered}. There is one important omission on +% this list however, as there is no inner \env{multlined} +% environment, so this is where \pkg{mathtools} steps in. +% +% One might wonder what the sensible behavior should be. We want it +% to be an inner environment so that it is not wider than necessary, +% but on the other hand we would like to be able to control the +% width. The current implementation of \env{multlined} handles both +% cases. The idea is this: Set the first line flush left and add a +% hard space after it; this space is governed by the +% \key{firstline-afterskip} key. The last line should be set flush +% right and preceded by a hard space of size \key{lastline-preskip}. +% Both these hard spaces have a default value of \cs{multlinegap}. +% Here we use a `t' in the first optional argument denoting a +% top-aligned building block (the default is `c'). +% \begin{verbatim} +% \[ +% A = \begin{multlined}[t] +% \framebox[4cm]{first} \\ +% \framebox[4cm]{last} +% \end{multlined} B +% \] +% \end{verbatim} +% \[ +% A = \begin{multlined}[t] +% \framebox[4cm]{first} \\ +% \framebox[4cm]{last} +% \end{multlined} B +% \] +% Note also that \env{multlined} gives you access to an extended +% syntax for \cs{shoveleft} and \cs{shoveright} as shown in the +% example below. +% \begin{verbatim} +% \[ +% \begin{multlined} +% \framebox[.65\columnwidth]{First line} \\ +% \framebox[.5\columnwidth]{Second line} \\ +% \shoveleft{L+E+F+T} \\ +% \shoveright{R+I+G+H+T} \\ +% \shoveleft[1cm]{L+E+F+T} \\ +% \shoveright[\widthof{$R+I+G+H+T$}]{R+I+G+H+T} \\ +% \framebox[.65\columnwidth]{Last line} +% \end{multlined} +% \] +% \end{verbatim} +% \[ +% \begin{multlined} +% \framebox[.65\columnwidth]{First line} \\ +% \framebox[.5\columnwidth]{Second line} \\ +% \shoveleft{L+E+F+T} \\ +% \shoveright{R+I+G+H+T} \\ +% \shoveleft[1cm]{L+E+F+T} \\ +% \shoveright[\widthof{$R+I+G+H+T$}]{R+I+G+H+T} \\ +% \framebox[.65\columnwidth]{Last line} +% \end{multlined} +% \] +% +% You can also choose the width yourself by specifying it as an +% optional argument: +% \begin{verbatim} +% \[ +% \begin{multlined}[b][7cm] +% \framebox[4cm]{first} \\ +% \framebox[4cm]{last} +% \end{multlined} = B +% \] +% \end{verbatim} +% \[ +% \begin{multlined}[b][7cm] +% \framebox[4cm]{first} \\ +% \framebox[4cm]{last} +% \end{multlined} = B +% \] +% There can be two optional arguments (position and width) and +% they're interchangeable. +% +% \medskip\noindent +% \textbf{Bug:} +% \CommentAdded{2014/05/11} +% If used inside an \env{array} or +% a derivative (say, a \env{matrix} variant), \env{multlined} does +% not work as expected. The implementation contains an `invisible' +% line after the first \env{multline} row, inside an \env{array} this +% line is no longer `invisible' because \env{array} sets +% \cs{baselineskip} to zero. Currently we have no workaround for this. +% +% \subsubsection{More \env{cases}-like environments} +% +% \begin{codesyntax} +% \SpecialEnvIndex{dcases} +% \cs{begin}\arg{dcases}\texttt{~} \meta{math_column} |&| \meta{math_column} +% \cs{end}\arg{dcases}\\ +% \SpecialEnvIndex{dcases*} +% \cs{begin}\arg{dcases*} \meta{math_column} |&| \makebox[\widthof{\meta{math\_column}}][l]{\meta{text\_column}} +% \cs{end}\arg{dcases*}\\ +% \SpecialEnvIndex{rcases} +% \cs{begin}\arg{rcases}\texttt{~~} \meta{math_column} |&| \makebox[\widthof{\meta{math\_column}}][l]{\meta{math\_column}} +% \cs{end}\arg{rcases}\\ +% \SpecialEnvIndex{rcases*} +% \cs{begin}\arg{rcases*}\texttt{~} \meta{math_column} |&| \makebox[\widthof{\meta{math\_column}}][l]{\meta{text\_column}} +% \cs{end}\arg{rcases*}\\ +% \SpecialEnvIndex{drcases} +% \cs{begin}\arg{drcases}\texttt{~} \meta{math_column} |&| \makebox[\widthof{\meta{math\_column}}][l]{\meta{math\_column}} +% \cs{end}\arg{drcases}\\ +% \SpecialEnvIndex{drcases*} +% \cs{begin}\arg{drcases*} \meta{math_column} |&| \makebox[\widthof{\meta{math\_column}}][l]{\meta{text\_column}} +% \cs{end}\arg{drcases*}\\ +% \SpecialEnvIndex{cases*} +% \cs{begin}\arg{cases*}\texttt{~} \meta{math_column} |&| \makebox[\widthof{\meta{math\_column}}][l]{\meta{text\_column}} +% \cs{end}\arg{cases*} +% \end{codesyntax} +% \FeatureRequest{Lars Madsen}{2004/07/01} +% Anyone who have tried to use an integral in the regular +% \env{cases} environment from \pkg{amsmath} will have noticed that +% it is set as +% \[ +% a=\begin{cases} +% E = m c^2 & \text{Nothing to see here} \\ +% \int x-3\, dx & \text{Integral is text style} +% \end{cases} +% \] +% \pkg{mathtools} provides two environments similar to \env{cases}. +% Using the \env{dcases} environment you get the same output as with +% \env{cases} except that the rows are set in display style. +% \begin{verbatim} +% \[ +% \begin{dcases} +% E = m c^2 & c \approx 3.00\times 10^{8}\,\mathrm{m}/\mathrm{s} \\ +% \int x-3\, dx & \text{Integral is display style} +% \end{dcases} +% \] +% \end{verbatim} +% \[ +% \begin{dcases} +% E = m c^2 & c \approx 3.00\times 10^{8}\,\mathrm{m}/\mathrm{s} \\ +% \int x-3\, dx & \text{Integral is display style} +% \end{dcases} +% \] +% Additionally the environment \env{dcases*} acts just the same, but +% the second column is set in the normal roman font of the +% document.\footnote{Or rather: it inherits the font characteristics +% active just before the \env{dcases*} environment.} +% \begin{verbatim} +% \[ +% a= \begin{dcases*} +% E = m c^2 & Nothing to see here \\ +% \int x-3\, dx & Integral is display style +% \end{dcases*} +% \] +% \end{verbatim} +% \[ +% a= \begin{dcases*} +% E = m c^2 & Nothing to see here \\ +% \int x-3\, dx & Integral is display style +% \end{dcases*} +% \] +% The environments \env{rcases}, \env{rcases*}, \env{drcases} and +% \env{drcases*} are equivalent to \env{cases} and \env{dcases}, but +% here the brace is placed on the right instead of on the left. +% \begin{verbatim} +% \[ +% \begin{rcases*} +% x^2 & for $x>0$\\ +% x^3 & else +% \end{rcases*} \quad \Rightarrow \cdots +% \] +% \end{verbatim} +% \[ +% \begin{rcases*} +% x^2 & for $x>0$\\ +% x^3 & else +% \end{rcases*} \quad \Rightarrow\cdots +% \] +% +% +% \subsubsection{Emulating indented lines in alignments} +% \begin{codesyntax} +% \SpecialEnvIndex{\MoveEqLeft}\cs{MoveEqLeft}\oarg{number} +% \end{codesyntax} +% \ProvidedBy{Lars Madsen}{2008/06/05} In \cite{Swanson}, Ellen +% Swanson recommends that when ever one has a long displayed formula, +% spanning several lines, and it is unfeasible to align against a +% relation within the first line, then all lines in the display +% should be aligned at the left most edge of the first line, and all +% subsequent lines should be indented by 2\,em (or if needed by a +% smaller amount). That is we are talking about displayes that end up +% looking like this +% \begin{align*} +% \MoveEqLeft \framebox[10cm][c]{Long first line}\\ +% & = \framebox[6cm][c]{ \hphantom{g} 2nd line}\\ +% & \leq \dots +% \end{align*} +% Traditionally one could do this by starting subsequent lines by +% \verb+&\qquad ...+, but that is tedious. Instead the example above +% was made using \cs{MoveEqLeft}: +% \begin{verbatim} +% \begin{align*} +% \MoveEqLeft \framebox[10cm][c]{Long first line}\\ +% & = \framebox[6cm][c]{ \hphantom{g} 2nd line}\\ +% & \leq \dots +% \end{align*} +% \end{verbatim} +% \cs{MoveEqLeft} is placed instead of the \verb+&+ on the first +% line, and will effectively \emph{move} the entire first line +% \oarg{number} of ems to the left (default is 2). If you choose to +% align to the right of the relation, use \cs{MoveEqLeft}\verb+[3]+ +% to accommodate the extra distance to the alignment point: +% \begin{verbatim} +% \begin{align*} +% \MoveEqLeft[3] \framebox[10cm][c]{Part 1}\\ +% = {} & \framebox[8cm][c]{2nd line}\\ +% & + \framebox[4cm][c]{ last part} +% \end{align*} +% \end{verbatim} +% \begin{align*} +% \MoveEqLeft[3] \framebox[10cm][c]{Long first line}\\ +% = {} & \framebox[6cm][c]{ 2nd line}\\ +% & + \framebox[4cm][c]{ last part} +% \end{align*} +% +% \subsubsection{Boxing a single line in an alignment} +% +% The \texttt{amsmath} package provie the \cs{boxed} macro to box +% material in math mode. But this of course will not work if the box +% should cross an alignment point. We provide a macro that +% can.\footnote{Note that internally \cs{Aboxed} does use \cs{boxed}.} +% \hskip1sp +% \marginpar{% +% \parbox[b]{\marginparwidth}{\small\sffamily\raggedright +% \strut Evolved from a request by\\Merciadri Luca\\ +% 2010/06/28\\on comp.text.tex% +% }\strut +% }% +% \marginpar{\strut\\% +% \parbox[b]{\marginparwidth}{\small\sffamily\raggedright +% \strut Reimplemented by\\Florent Chervet (GL) \\ +% 2011/06/11\\on comp.text.tex% +% }\strut +% }% +% \begin{codesyntax} +% \SpecialEnvIndex{\Aboxed}\cs{Aboxed}\marg{left hand side +% \quad\texttt{\textnormal{\&}}\quad right hand side} +% \end{codesyntax} +% Example +% \begin{verbatim} +% \begin{align*} +% \Aboxed{ f(x) & = \int h(x)\, dx} \\ +% & = g(x) +% \end{align*} +% \end{verbatim} +% Resulting in: +% \begin{align*} +% \Aboxed{ f(x) & = \int h(x)\, dx} \\ +% & = g(x) +% \end{align*} +% One can have multiple boxes on each line, and the +% >>\texttt{\textnormal{\&}}\quad right hand side<< can even be +% missing. Here is an example of how the padding in the box can be changed +% \begin{verbatim} +% \begin{align*} +% \setlength\fboxsep{1em} +% \Aboxed{ f(x) &= 0 } & \Aboxed{ g(x) &= b} \\ +% \Aboxed{ h(x) } & \Aboxed{ i(x) } +% \end{align*} +% \end{verbatim} +% \begin{align*} +% \setlength\fboxsep{1em} +% \Aboxed{ f(x) &= 0 } & \Aboxed{ g(x) &= b} \\ +% \Aboxed{ h(x) } & \Aboxed{ i(x) } +% \end{align*} +% Note how the \cs{fboxsep} change only affect the box coming +% immediately after it. +% +% \marginpar{\strut\\% +% \parbox[b]{\marginparwidth}{\small\sffamily\raggedright +% \strut Comment by Qrrbrbirlbel on \url{tex.stackexchange.com}, 2013/05/20. +% }\strut +% }% +% As \cs{Aboxed} looks for the alignment \texttt{\&} it may be +% necessary to \emph{hide} constructions like matrices that also make +% use of \texttt{\&}. Just add a set of braces around the construction +% you want to hide. +% +% \subsubsection{Adding arrows between lines in an alignment} +% +% This first macro is a bit misleading, it is only intended to be +% used in combination with the \env{alignat(*)} environment. +% \begin{codesyntax} +% \SpecialEnvIndex{\ArrowBetweenLines}\cs{ArrowBetweenLines}\oarg{symbol}\\ +% \SpecialEnvIndex{\ArrowBetweenLines*}\cs{ArrowBetweenLines*}\oarg{symbol} +% \end{codesyntax} +% \hskip1sp +% \marginpar{% +% \parbox[b]{\marginparwidth}{\small\sffamily\raggedright +% \strut Evolved from a request by\\Christian +% Bohr-Halling\\2004/03/31\\on dk.edb.tekst% +% } +% }% +% To add, say $\Updownarrow$ between two lines in an alignment use +% \cs{ArrowBetweenLines} and the \env{alignat} environment (note the +% extra pair of \texttt{\&}'s in front): +% \begin{verbatim} +% \begin{alignat}{2} +% && \framebox[1.5cm]{} &= \framebox[3cm]{}\\ +% \ArrowBetweenLines % \Updownarrow is the default +% && \framebox[1.5cm]{} &= \framebox[2cm]{} +% \end{alignat} +% \end{verbatim} +% resulting in +% \begin{alignat}{2} +% && \framebox[1.5cm]{} &= \framebox[3cm]{}\\ +% \ArrowBetweenLines +% && \framebox[1.5cm]{} &= \framebox[2cm]{} +% \end{alignat} +% Note the use of \verb+&&+ starting each \emph{regular} line of +% math. For adding the arrow on the right, use +% \cs{ArrowBetweenLines*}\oarg{symbol}, and end each line of math +% with \verb+&&+. +% \begin{verbatim} +% \begin{alignat*}{2} +% \framebox[1.5cm]{} &= \framebox[3cm]{} &&\\ +% \ArrowBetweenLines*[\Downarrow] +% \framebox[1.5cm]{} &= \framebox[2cm]{} && +% \end{alignat*} +% \end{verbatim} +% resulting in +% \begin{alignat*}{2} +% \framebox[1.5cm]{} &= \framebox[3cm]{} &&\\ +% \ArrowBetweenLines*[\Downarrow] +% \framebox[1.5cm]{} &= \framebox[2cm]{} && +% \end{alignat*} +% +% +% \subsubsection{Centered \cs{vdots}} +% +% If one want to mark a vertical continuation, there is +% the \verb?\vdots? command, but combine this with an alignment and +% we get something rather suboptimal +% \FeatureRequest{Bruno Le Floch \\(and many others)}{2011/01/25} +% \begin{align*} +% \framebox[1.5cm]{} &= \framebox[3cm]{}\\ +% & \vdots\\ +% &= \framebox[3cm]{} +% \end{align*} +% It would be nice to have (1) a \verb?\vdots? centered within the +% width of another symbol, and (2) a construction similar to +% \verb?\ArrowBetweenLines? that does not take up so much space. +% We provide both. +% \begin{codesyntax} +% \SpecialUsageIndex{\vdotswithin}\cs{vdotswithin}\marg{symbol}\\ +% \SpecialUsageIndex{\shortvdotswithin}\cs{shortvdotswithin}\marg{symbol}\\ +% \SpecialUsageIndex{\shortvdotswithin*}\cs{shortvdotswithin*}\marg{symbol}\\ +% \SpecialUsageIndex{\MTFlushSpaceAbove}\cs{MTFlushSpaceAbove}\\ +% \SpecialUsageIndex{\MTFlushSpaceBelow}\cs{MTFlushSpaceBelow}\\ +% \SpecialKeyIndex{shortvdotsadjustabove}\makebox{$\key{shortvdotsadjustabove}=\meta{length}$}\\ +% \SpecialKeyIndex{shortvdotsadjustbelow}\makebox{$\key{shortvdotsadjustbelow}=\meta{length}$} +% \end{codesyntax} +% Two examples in one +% \begin{verbatim} +% \begin{align*} +% a &= b \\ +% & \vdotswithin{=} \\ +% & = c \\ +% \shortvdotswithin{=} +% & = d +% \end{align*} +% \end{verbatim} +% yielding +% \begin{align*} +% a &= b \\ +% & \vdotswithin{=} \\ +% & = c \\ +% \shortvdotswithin{=} +% & = d +% \end{align*} +% Thus \verb?\vdotswithin{=}? create a box corersponding to +% \verb?{}={}? and typeset a >>$\vdots$<< centered inside it. When doing +% this as a normal line in an alignment leaves us with excessive space +% which \verb?\shortvdotswithin{=}? takes care with for us. +% +% \verb?\shortvdotswithin{=}? corresponds to +% \begin{verbatim} +% \MTFlushSpaceAbove +% & \vdotswithin{=} \\ +% \MTFlushSpaceBelow +% \end{verbatim} +% whereas \verb?\shortvdotswithin*{=}? is the case with +% \verb?\vdotswithin{=} & \\?. This also means one cannot write more +% on the line when using \verb?\shortvdotswithin? or the starred +% version. But one can de-construct the macro and arrive at +% \begin{verbatim} +% \begin{alignat*}{3} +% A&+ B &&= C &&+ D \\ +% \MTFlushSpaceAbove +% &\vdotswithin{+} &&&& \vdotswithin{+} +% \MTFlushSpaceBelow +% C &+ D &&= Y &&+K +% \end{alignat*} +% \end{verbatim} +% yielding +% \begin{alignat*}{3} +% A&+ B &&= C &&+ D \\ +% \MTFlushSpaceAbove +% &\vdotswithin{+} &&&& \vdotswithin{+} +% \MTFlushSpaceBelow +% C &+ D &&= Y &&+K +% \end{alignat*} +% If one has the need for such a construction. +% +% The de-spaced version does support the \env{spreadlines} +% environment. The actual amount of space being \emph{flushed} above +% and below can be controlled by the user using the two options +% indicated. Their original values are \verb?2.15\origjot? and +% \verb?\origjot? respectively (\verb?\origjot? is usually 3pt). +% +% \subsection{Intertext and short intertext} +% +% +% \begin{codesyntax} +% \SpecialUsageIndex{\shortintertext}\cs{shortintertext}\marg{text} +% \end{codesyntax} +% \cttPosting{Gabriel Zachmann and Donald Arseneau}{2000/05/12--13} +% \pkg{amsmath} provides the command \cs{intertext} for interrupting +% a multiline display while still maintaining the alignment points. +% However the spacing often seems quite excessive as seen below. +% \begin{verbatim} +% \begin{align} +% a&=b \intertext{Some text} +% c&=d +% \end{align} +% \end{verbatim} +% \begin{align} +% a&=b \intertext{Some text} +% c&=d +% \end{align} +% +% Using the command \cs{shortintertext} alleviates this situation +% somewhat: +% \begin{verbatim} +% \begin{align} +% a&=b \shortintertext{Some text} +% c&=d +% \end{align} +% \end{verbatim} +% \begin{align} +% a&=b \shortintertext{Some text} +% c&=d +% \end{align} +% +% \noindent +% It turns out that both \cs{shortintertext} and the original +% \cs{intertext} from \pkg{amsmath} has a slight problem. If we use +% the \env{spreadlines} (see section~\ref{sec:spread}) to open up +% the equations in a multiline calculation, then this opening up +% value also applies to the spacing above and below the original +% \cs{shortintertext} and \cs{intertext}. \tsxPosting{Tobias Weh +% \\(referring to a suggestion by Chung-chieh Shan)}{2011/05/29} +% It can be illustrated using the following example, an interested +% reader, can apply it with and with out the original \cs{intertext} +% and \cs{shortintertext}. +% \begin{verbatim} +% % the original \intertext and \shortintertext +% \mathtoolsset{original-intertext,original-shortintertext} +% \newcommand\myline{\par\noindent\rule{\textwidth}{1mm}} +% \myline +% \begin{spreadlines}{1em} +% \begin{align*} +% AA\\ BB\\ \intertext{\myline} +% AA\\ BB\\ \shortintertext{\myline} +% AA\\ BB +% \end{align*} +% \end{spreadlines} +% \myline +% \end{verbatim} +% +% We now fix this internaly for both \cs{intertext} and +% \cs{shortintertext}, plus we add the posibility to fine tune +% spacing around these constructions. The original versions can be +% brought back using the \texttt{original-x} keys below. +% \begin{codesyntax} +% \SpecialUsageIndex{\intertext}\cs{intertext}\marg{text}\\ +% \SpecialUsageIndex{\shortintertext}\cs{shortintertext}\marg{text}\\ +% \SpecialKeyIndex{original-intertext}$\key{original-intertext}=\texttt{true}\vert\texttt{false}$ \quad(default: \texttt{false})\\ +% \SpecialKeyIndex{original-shortintertext}$\key{original-shortintertext}=\texttt{true}\vert\texttt{false}$ +% \quad(default: \texttt{false})\\ +% \SpecialKeyIndex{above-intertext-sep}$\key{above-intertext-sep}=\meta{dimen}$ \quad(default: 0pt)\\ +% \SpecialKeyIndex{below-intertext-sep}$\key{below-intertext-sep}=\meta{dimen}$ \quad(default: 0pt)\\ +% \SpecialKeyIndex{above-shortintertext-sep}$\key{above-shortintertext-sep}=\meta{dimen}$ \quad(default: 3pt)\\ +% \SpecialKeyIndex{below-shortintertext-sep}$\key{below-shortintertext-sep}=\meta{dimen}$ \quad(default: 3pt) +% \end{codesyntax} +% The updated \cs{shortintertext} will look like the original version +% unless for areas with an enlarged \cs{jot} value (see for example +% the \env{spreadlines}, section~\ref{sec:spread}). Whereas \cs{intertext} +% will have a slightly smaller value above and below (corresponding +% to about 3pt less space above and below), the spacing around +% \cs{intertext} should now match the normal spacing going into and +% out of an \env{align}. +% +% \textbf{Tip:} \cs{intertext} and \cs{shortintertext} also works +% within \env{gather}. +% +% \subsection{Paired delimiters} +% +% +% \begin{codesyntax} +% \SpecialUsageIndex{\DeclarePairedDelimiter} +% \cs{DeclarePairedDelimiter}\marg{cmd}\marg{left_delim}\marg{right_delim} +% \end{codesyntax} +% \FeatureRequest{Lars Madsen}{2004/06/25} +% In the \pkg{amsmath} documentation it is shown how to define a few +% commands for typesetting the absolute value and norm. These +% definitions are: +% \begin{verbatim} +% \newcommand*\abs[1]{\lvert#1\rvert} +% \newcommand*\norm[1]{\lVert#1\rVert} +% \end{verbatim} +% \DeclarePairedDelimiter\abs\lvert\rvert +% While they produce correct horizontal spacing you have to be +% careful about the vertical spacing if the argument is just a +% little taller than usual as in +% \[ +% \abs{\frac{a}{b}} +% \] +% Here it won't give a nice result, so you have to manually put in +% either \cs{left}--\cs{right} pair or a \cs{bigl}--\cs{bigr} pair. +% Both methods mean that you have to delete your \cs{abs} command, +% which may not sound like an ideal solution. +% +% With the command \cs{DeclarePairedDelimiter} you can combine all +% these features in one easy to use command. Let's show an example: +% \begin{verbatim} +% \DeclarePairedDelimiter\abs{\lvert}{\rvert} +% \end{verbatim} +% This defines the command \cs{abs} just like in the +% \pkg{amsmath} documentation but with a few additions: +% \begin{itemize} +% \item A starred variant: \cs{abs*} produces delimiters that are preceded +% by \cs{left} and \cs{right} resp.: +% \begin{verbatim} +% \[ +% \abs*{\frac{a}{b}} +% \] +% \end{verbatim} +% \[ +% \abs*{\frac{a}{b}} +% \] +% \item A variant with an optional argument: +% \cs{abs}\oarg{size_cmd}, where +% \meta{size_cmd} is either \cs{big}, \cs{Big}, \cs{bigg}, or +% \cs{Bigg} (if you have any bigggger versions you can use them +% too). +% \begin{verbatim} +% \[ +% \abs[\Bigg]{\frac{a}{b}} +% \] +% \end{verbatim} +% \[ +% \abs[\Bigg]{\frac{a}{b}} +% \] +% \end{itemize} +% +% \begin{codesyntax} +% \SpecialUsageIndex{\DeclarePairedDelimiterX} +% \cs{DeclarePairedDelimiterX}\marg{cmd}\oarg{num args}\marg{left_delim}\marg{right_delim}\marg{body}\\ +% \cs{delimsize} +% \end{codesyntax} +% Sometimes one might want to have the capabilities of +% \cs{DeclarePairedDelimiter}, but also want a macro the takes more +% than one argument and specify plus being able to specify the body +% of the generated macro. +% +% \cs{DeclarePairedDelimiterX} extends the features of +% \cs{DeclarePairedDelimiter} such that the user will get a macro +% which is fenced off at either end, plus the capability to provide +% the \meta{body} for what ever the macro should do within these +% fences. +% +% Inside the \meta{body} part, the macro \cs{delimsize} refer to the +% size of the outer fences. It can then be used inside \meta{body} to +% scale any inner fences. +% +% Thus +% \begin{quote} +% \cs{DeclarePairedDelimiter}\marg{cmd}\marg{left_delim}\marg{right_delim} +% \end{quote} +% is the same thing as +% \begin{quote} +% \cs{DeclarePairedDelimiterX}\marg{cmd}\verb|[1]|\marg{left_delim}\marg{right_delim}\verb|{#1}| +% \end{quote} +% % +% Let us do some examples. First we want to prepare a macro for inner +% products, with two arguments such that we can hide the character +% separating the arguments (a~journal style might require a +% semi-colon, so we will save a lot of hand editing). This can be +% done via +% \begin{verbatim} +% \DeclarePairedDelimiterX\innerp[2]{\langle}{\rangle}{#1,#2} +% \end{verbatim} +% More interestingly we can refer to the size inside the +% \meta{code}. Here we do a weird three argument `braket' +% \begin{verbatim} +% \DeclarePairedDelimiterX\braket[3]{\langle}{\rangle}% +% {#1\,\delimsize\vert\,\mathopen{}#2\,\delimsize\vert\,\mathopen{}#3} +% \end{verbatim} +% \begin{itshape} +% Note the use of >>\verb|\mathopen{}|<< in the \meta{body} of +% \cs{braket}, this is very important when a scalable delimiter is +% being used and it does not present itself as a left or right +% delimiter. You will see why it is needed if you use +% \verb|\braket{A}{-B}| in a version without +% \verb|\mathopen{}|.\footnote{Basically, the problem is that +% \cs{vert} is a `symbol', thus $\vert-B$ is interpreted +% \emph{subtraction}, not a symbol followed by negative $B$. When +% \cs{mathopen\{\}} is added, \TeX\ is told that an opening +% delimiter just occurred, and it will adjust the minus +% accordingly.} +% \end{itshape} +% +% Then we get +% \DeclarePairedDelimiterX\innerp[2]{\langle}{\rangle}{#1,#2} +% \DeclarePairedDelimiterX\braket[3]{\langle}{\rangle}% +% {#1\,\delimsize\vert\,\mathopen{}#2\,\delimsize\vert\,\mathopen{}#3} +% \begin{verbatim} +% \[ +% \innerp*{A}{ \frac{1}{2} } \quad +% \braket[\Big]{B}{\sum_{k} f_k}{C} +% \] +% \end{verbatim} +% \[ +% \innerp*{A}{ \frac{1}{2} } \quad +% \braket[\Big]{B}{\sum_{k}}{C} +% \] +% +% +% \iffalse +% \bigskip +% +% \noindent +% \textbf{\textit{Side note:}} We have changed the internal code of +% \cs{DeclarePairedDelimiter} and \cs{DeclarePairedDelimiterX} such +% that the starred version does no longer give the odd spacings that +% \cs{left}\dots\cs{right} sometimes give. Compare this +% \begin{verbatim} +% \[ +% 2\innerp{A}{B} \quad 2\innerp*{A}{B} \quad 2\left\langle A,B \right\rangle +% \] +% \end{verbatim} +% \[ +% \sin\innerp{A}{B} \quad +% \sin\innerp*{A}{B} \quad +% \sin\left\langle A,B \right\rangle +% \] +% The spacing in the last one does not behave like other fences (this +% is a feature of the \cs{left}\dots\cs{right} construction). +% \fi +% +% With the inner scaling, we can provide macros whos syntax closely +% follow the mathematical meaning. Fx for building sets, try +% this\footnote{The reason for using a separate \cs{SetSymbol} macro +% has to do with complicated set definitions, where the condition +% spans several lines. In this case \cs{Set} cannot be used. Thus it +% is nice to be able to refer to the specific set building symbol we +% have decided to use in this document.} +% \begin{verbatim} +% % just to make sure it exists +% \providecommand\given{} +% % can be useful to refer to this outside \Set +% \newcommand\SetSymbol[1][]{\nonscript\:#1\vert\nonscript\: +% \mathopen{}\allowbreak} +% \DeclarePairedDelimiterX\Set[1]\{\}{% +% \renewcommand\given{\SetSymbol[\delimsize]} +% #1 +% } +% \end{verbatim} +% \providecommand\given{} +% \newcommand\SetSymbol[1][]{\nonscript\:#1\vert\nonscript\:\mathopen{}\allowbreak} +% \DeclarePairedDelimiterX\Set[1]\{\}{% +% \renewcommand\given{\SetSymbol[\delimsize]} +% #1 +% } +% \begin{verbatim} +% \[ \Set*{ x \in X \given \frac{\sqrt{x}}{x^2+1} > 1 } \] +% \end{verbatim} +% \[ \Set*{ x \in X \given \frac{\sqrt{x}}{x^2+1} > 1 } \] +% Thus we end up with a syntax much closer to how we read this +% aloud. Also we hide the `given' symbol for easy replacement. +% +% Combining with \pkg{etoolbox} it becomes easy to make a function +% that automatically provide a marker for a blank argument: +% \begin{verbatim} +% \usepackage{etoolbox} +% \DeclarePairedDelimiterX\norm[1]\lVert\rVert{ +% \ifblank{#1}{\:\cdot\:}{#1} +% } +% \end{verbatim} +% Then \verb|\norm{}| will give you $\lVert\:\cdot\:\rVert$ while +% \verb|\norm{a}| gives the expected $\lVert a \rVert$. +% +% \begin{codesyntax} +% \SpecialUsageIndex{\DeclarePairedDelimiterXPP} +% \cs{DeclarePairedDelimiterXPP}\marg{cmd}\oarg{num args}\marg{pre +% code}\marg{left_delim}\\% +% \marg{right_delim}\marg{post code}\marg{body} +% \end{codesyntax} +% \FeatureRequest{Barbara Beeton (on TSE)}{2013/10/07} +% \cs{DeclarePairedDelimiterX} has an annoying caveat: it is very hard +% to make a macro \verb|\lnorm{a}| that should result in $\lVert +% a\rVert_2$.\footnote{The added >>\texttt{\_2}<< is hard to get around +% the argument parsing.} +% +% As a consequence we provide +% \cs{DeclarePairedDelimiterXPP}.\footnote{Extended +% DeclarePairedDelimiter with Pre and Post code.} With the addition of +% the \marg{pre code} and \marg{post code} it is identical to +% \cs{DeclarePairedDelimiterX}. It should be interpreted as +% \begin{center} +% \marg{pre code} \marg{left_delim} \marg{body} +% \marg{right_delim} \marg{post code} +% \end{center} +% +% +% An $\mathcal{L}^2$ norm can now be defined as +% \begin{verbatim} +% \DeclarePairedDelimiterXPP\lnorm[1]{}\lVert\rVert{_2}{#1} +% \end{verbatim} +% A probability macro with build in support for conditionals +% (\cs{given} initialized as above) +% \begin{verbatim} +% \DeclarePairedDelimiterXPP\Prop[1]{\mathbb{P}}(){}{ +% \renewcommand\given{\nonscript\:\delimsize\vert\nonscript\:\mathopen{}} +% #1} +% \end{verbatim} +% Thus giving support for \verb|\Prob{A \given B}|. +% +% \medskip\noindent\textbf{Note:} 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 +% \url{http://tex.stackexchange.com/a/136767/3929} there is a +% suggested replacement for \cs{DeclarePairedDelimiter}, that greatly +% reduces the number of macros and provides a key-val +% interface. However, the code use \pkg{xparse}, and if we want to use +% \pkg{xparse} for some of our macros, we might just as well rewrite +% the entire \pkg{mathtools} package in \pkg{expl3}. Also it is not +% obvious how to get \pkg{xparse} to support \verb|[3]| for the number +% of arguments. We will consider this for a future release. +% +% \subsubsection{Expert use} +% +% Within the starred version of \cs{DeclarePairedDelimiter} and +% \cs{DeclarePairedDelimiterX} we make a few changes such that the +% auto scaled \cs{left} and \cs{right} fences behave as opening and +% closing fences, i.e.\ $\sin(x)$ vs. $\sin\left(x\right)$ (the later +% made via \verb|$\sin\left(x\right)$|), notice the gab between +% '$\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} +% \end{codesyntax} +% Internally several macros are created, including two 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}: +% \begin{verbatim} +% \DeclarePairedDelimiter\abs\lvert\rvert +% \reDeclarePairedDelimiterInnerWrapper\abs{star}{#1#2#3} +% \reDeclarePairedDelimiterInnerWrapper\abs{nostar}{\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} +% \end{verbatim} +% +% \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 +% breakable across lines, even breakable within an \env{align} +% construction. Currently, this can only be applied to macros made +% using \cs{DeclarePairedDelimiter} and \emph{not} macros made using +% \cs{DeclarePairedDelimiterX} or \cs{DeclarePairedDelimiterXPP} as +% the contents is typeset inside a group (to limit \cs{delimsize}) +% and thus hide any \verb|&| or \verb|\\| from \env{align} and +% \env{align} breaks down. +% +% When \cs{DeclarePairedDelimiter} is used, Sebastien Gouezel has +% provided the following example \ProvidedBy{Sebastien +% Gouezel}{2014/05/14} +% \begin{verbatim} +% \newcommand\MTkillspecial[1]{% helper macro +% \bgroup +% \catcode`\&=9 +% \let\\\relax% +% \scantokens{#1}% +% \egroup +% } +% \DeclarePairedDelimiter\abs\lvert\rvert +% \reDeclarePairedDelimiterInnerWrapper\abs{star}{ +% \mathopen{#1\vphantom{\MTkillspecial{#2}}\kern-\nulldelimiterspace\right.} +% #2 +% \mathclose{\left.\kern-\nulldelimiterspace\vphantom{\MTkillspecial{#2}}#3}} +% \end{verbatim} +% Then this example works just fine: +% \begin{verbatim} +% \begin{align*} +% f(a) &= +% \!\begin{aligned}[t] +% \abs*{ & \frac{1}{2}+\cdots \\ +% & \dots+\frac{1}{2} } +% \end{aligned} +% \end{align*} +% \end{verbatim} +% \newcommand\MTkillspecial[1]{% helper macro +% \bgroup +% \catcode`\&=9 +% \let\\\relax% +% \scantokens{#1}% +% \egroup +% } +% \let\abs\relax +% \MHInternalSyntaxOn +% \MH_let:NwN\MT_delim_abs_nostar:\relax +% \MHInternalSyntaxOff +% \DeclarePairedDelimiter\abs\lvert\rvert +% \reDeclarePairedDelimiterInnerWrapper\abs{star}{ +% \mathopen{#1\vphantom{\MTkillspecial{#2}}\kern-\nulldelimiterspace\right.} +% #2 +% \mathclose{\left.\kern-\nulldelimiterspace\vphantom{\MTkillspecial{#2}}#3}} +% \begin{align*} +% f(a) &= +% \!\begin{aligned}[t] +% \abs*{&\frac{1}{2}+\cdots \\ +% &\dots+\frac{1}{2}} +% \end{aligned} +% \end{align*} +% +% +% \subsection{Special symbols} +% +% This part of the manual is about special symbols. So far only one +% technique is covered, but more will come. +% +% \subsubsection{Left and right parentheses} +% +% \begin{codesyntax} +% \SpecialUsageIndex{\lparen}\cs{lparen}\texttt{~~} +% \SpecialUsageIndex{\rparen}\cs{rparen} +% \end{codesyntax} +% When you want a big parenthesis or bracket in a math display you +% usually just type +% \begin{quote} +% |\left( ... \right)|\quad or\quad |\left[ ... \right]| +% \end{quote} +% \LaTeX{} also defines the macro names \cs{lbrack} and \cs{rbrack} +% to be shorthands for the left and right square bracket resp., but +% doesn't provide similar definitions for the parentheses. Some +% packages need command names to work with\footnote{The \pkg{empheq} +% package needs command names for delimiters in order to make +% auto-scaling versions.} so \pkg{mathtools} defines the commands +% \cs{lparen} and \cs{rparen} to represent the left and right +% parenthesis resp. +% +% +% \subsubsection{Vertically centered colon} +% +% \begin{codesyntax} +% \SpecialKeyIndex{centercolon}$\key{centercolon}=\texttt{true}\vert\texttt{false}$\\ +% \SpecialUsageIndex{\vcentcolon}\cs{vcentcolon}\texttt{~~} +% \SpecialUsageIndex{\ordinarycolon}\cs{ordinarycolon} +% \end{codesyntax} +% \cttPosting{Donald Arseneau}{2000/12/07} +% When trying to show assignment operations as in $ a := b $, one +% quickly notices that the colon is not centered on the math axis as +% the equal sign, leading to an odd-looking output. The command +% \cs{vcentcolon} is a shorthand for such a vertically centered +% colon, and can be used as in |$a \vcentcolon= b$| and results in +% the desired output: $a \vcentcolon= b$. % for now +% +% Typing \cs{vcentcolon} every time is quite tedious, so one can use +% the key \key{centercolon} to make the colon active instead. +% \begin{verbatim} +% \mathtoolsset{centercolon} +% \[ +% a := b +% \] +% \mathtoolsset{centercolon=false} +% \end{verbatim} +% \[\mathtoolsset{centercolon} +% a := b +% \] +% In this case the command \cs{ordinarycolon} typesets an~\ldots\ +% ordinary colon (what a surprise). +% +% \medskip +% \noindent\textbf{Warning:} \texttt{centercolon} \emph{does not} +% work with languages that make use of an active colon, most notably +% \emph{French}. Sadly the \texttt{babel} package does not distinguish +% between text and math when it comes to active characters. Nor does +% it provide any hooks to deal with math. So currently no general +% solution exists for this problem. +% +% \begin{codesyntax} +% \SpecialUsageIndex{\coloneqq}\cs{coloneqq}\texttt{~~~~~} +% \SpecialUsageIndex{\Coloneqq}\cs{Coloneqq}\texttt{~~~~~} +% \SpecialUsageIndex{\coloneq}\cs{coloneq}\texttt{~~~} +% \SpecialUsageIndex{\Coloneq}\cs{Coloneq}\\ +% \SpecialUsageIndex{\eqqcolon}\cs{eqqcolon}\texttt{~~~~~} +% \SpecialUsageIndex{\Eqqcolon}\cs{Eqqcolon}\texttt{~~~~~} +% \SpecialUsageIndex{\eqcolon}\cs{eqcolon}\texttt{~~~} +% \SpecialUsageIndex{\Eqcolon}\cs{Eqcolon}\\ +% \SpecialUsageIndex{\colonapprox}\cs{colonapprox}\texttt{~~} +% \SpecialUsageIndex{\Colonapprox}\cs{Colonapprox}\texttt{~~} +% \SpecialUsageIndex{\colonsim}\cs{colonsim}\texttt{~~} +% \SpecialUsageIndex{\Colonsim}\cs{Colonsim}\\ +% \SpecialUsageIndex{\dblcolon}\cs{dblcolon} +% \end{codesyntax} +% The font packages \pkg{txfonts} and \pkg{pxfonts} provides various +% symbols that include a vertically centered colon but with tighter +% spacing. For example, the combination |:=| exists as the symbol +% \cs{coloneqq} which typesets as $\coloneqq$ instead of +% $\vcentcolon=$. The primary disadvantage of using these fonts are +% the support packages' lack of support for \pkg{amsmath} (and thus +% \pkg{mathtools}) and worse yet, the side-bearings are way too +% tight; see~\cite{A-W:MG04} for examples. If you're not using these +% fonts, \pkg{mathtools} provides the symbols for you. Here are a few +% examples: +% \begin{verbatim} +% \[ +% a \coloneqq b \quad c \Colonapprox d \quad e \dblcolon f +% \] +% \end{verbatim} +% \[ +% a \coloneqq b \quad c \Colonapprox d \quad e \dblcolon f +% \] +% +% +% +% \subsubsection{A few missing symbols} +% +% Most provided math font sets are missing the symbols \cs{nuparrow} +% and \cs{ndownarrow} (i.e.\ negated up- and downarrow) plus a `big' +% version of \cs{times}. Therefore we will provide constructed +% versions of these whenever they are not already available. +% \begin{codesyntax} +% \SpecialUsageIndex{\nuparrow}\cs{nuparrow}\\ +% \SpecialUsageIndex{\ndownarrow}\cs{ndownarrow}\\ +% \SpecialUsageIndex{\bigtimes}\cs{bigtimes} +% \end{codesyntax} +% +% \noindent +% \textbf{Note:} that these symbols are constructed via +% features from the \pkg{graphicx} package, and thus may not display +% correctly in most DVI previewers. Also note that \cs{nuparrow} and +% \cs{ndownarrow} are constructed via \cs{nrightarrow} and +% \cs{nleftarrrow} respectively, so these needs to be +% present. Usually this is done via \pkg{amssymb}, but some packages +% may be incompatible with \pkg{amssymb} so the user will have to +% load \pkg{amssymb} or a similar package, that provides +% \cs{nrightarrow} and \cs{nleftarrow}, themselves. +% +% With those requirements in place, we have +% \begin{verbatim} +% \[ +% \lim_{a\ndownarrow 0} f(a) \neq \bigtimes_n X_n \qquad +% \frac{ \bigtimes_{k=1}^7 B_k \nuparrow \Omega }{2} +% \] +% \end{verbatim} +% \[ +% \lim_{a\ndownarrow 0} f(a) \neq \bigtimes_n X_n \qquad +% \frac{ \bigtimes_{k=1}^7 B_k \nuparrow \Omega }{2} +% \] +% +% +% +% +% \section{A tribute to Michael J.~Downes} +% +% Michael J.~Downes (1958--2003) was one of the major architects +% behind \pkg{amsmath} and member of the \LaTeX{} Team. He made many +% great contributions to the \TeX{} community; not only by the means +% of widely spread macro packages such as \pkg{amsmath} but also in +% the form of actively giving advice on newsgroups. Some of +% Michael's macro solutions on the newsgroups never made it into +% publicly available macro packages although they certainly deserved +% it, so \pkg{mathtools} tries to rectify this matter. The macros +% described in this section are either straight copies or heavily +% inspired by his original postings. +% +% \subsection{Mathematics within italic text} +% +% \begin{codesyntax} +% \SpecialKeyIndex{mathic}$\key{mathic}=\texttt{true}\vert\texttt{false}$ +% \end{codesyntax} +% \cttPosting{Michael J.~Downes}{1998/05/14} +% \TeX{} usually takes care of italic corrections in text, but fails +% when it comes to math. If you use the \LaTeX{} inline math +% commands \cs{(} and \cs{)} you can however work around it by +% setting the key \key{mathic} to true as shown below. +% \begin{verbatim} +% \begin{quote}\itshape +% Compare these lines: \par +% \mathtoolsset{mathic} % or \mathtoolsset{mathic=true} +% Subset of \(V\) and subset of \(A\). \par +% \mathtoolsset{mathic=false} +% Subset of \(V\) and subset of \(A\). +% \par +% \end{quote} +% \end{verbatim} +% \begin{quote}\itshape +% Compare these lines: \par +% \mathtoolsset{mathic} +% Subset of \(V\) and subset of \(A\). \par +% \mathtoolsset{mathic=false} +% Subset of \(V\) and subset of \(A\). +% \par +% \end{quote} +% \noindent +% As of 2013, \cs(\cs) are robust, as is the italic corrected versions. +% +% \medskip\noindent \textbf{Caveat:} Italic correction is a +% treacherous area. For example any penalties will cancel the italic +% correction inserted by \verb|\(| (for an explanation see +% \cite{TBT}, section 4.3.3). We have changed Michaels original to +% accomodate one specific penalty construction: the \emph{tie}, i.e., +% >>\verb|text~\(|<< will work as expected (as~of July, 2014). +% +% \subsection{Left sub/superscripts} +% +% \begin{codesyntax} +% \SpecialUsageIndex{\prescript} +% \cs{prescript}\marg{sup}\marg{sub}\marg{arg}\texttt{~~} +% \SpecialKeyIndex{prescript-sup-format} +% $\key{prescript-sup-format}=\meta{cmd}$\\ +% \SpecialKeyIndex{prescript-sub-format} +% $\key{prescript-sub-format}=\meta{cmd}$\hfill +% \SpecialKeyIndex{prescript-arg-format} +% \rlap{$\key{prescript-arg-format}=\meta{cmd}$}^^A +% \phantom{$\key{prescript-sup-format}=\meta{cmd}$} +% \end{codesyntax} +% \cttPosting{Michael J.~Downes}{2000/12/20} +% Sometimes one wants to put a sub- or superscript on the left of +% the argument. The \cs{prescript} command does just that: +% \begin{verbatim} +% \[ +% {}^{4}_{12}\mathbf{C}^{5+}_{2} \quad +% \prescript{14}{2}{\mathbf{C}}^{5+}_{2} \quad +% \prescript{4}{12}{\mathbf{C}}^{5+}_{2} \quad +% \prescript{14}{}{\mathbf{C}}^{5+}_{2} \quad +% \prescript{}{2}{\mathbf{C}}^{5+}_{2} +% \] +% \end{verbatim} +% \[ +% {}^{4}_{12}\mathbf{C}^{5+}_{2} \quad +% \prescript{14}{2}{\mathbf{C}}^{5+}_{2} \quad +% \prescript{4}{12}{\mathbf{C}}^{5+}_{2} \quad +% \prescript{14}{}{\mathbf{C}}^{5+}_{2} \quad +% \prescript{}{2}{\mathbf{C}}^{5+}_{2} +% \] +% +% The formatting of the arguments is controlled by three keys. This +% silly example shows you how to use them: +% \begin{verbatim} +% \newcommand*\myisotope[3]{% +% \begingroup % to keep changes local. We cannot use a brace group +% % as it affects spacing! +% \mathtoolsset{ +% prescript-sup-format=\mathit, +% prescript-sub-format=\mathbf, +% prescript-arg-format=\mathrm, +% }% +% \prescript{#1}{#2}{#3}% +% \endgroup +% } +% \[ +% \myisotope{A}{Z}{X}\to \myisotope{A-4}{Z-2}{Y}+ +% \myisotope{4}{2}{\alpha} +% \] +% \end{verbatim} +% \newcommand*\myisotope[3]{% +% \begingroup +% \mathtoolsset{ +% prescript-sup-format=\mathit, +% prescript-sub-format=\mathbf, +% prescript-arg-format=\mathrm, +% }% +% \prescript{#1}{#2}{#3}% +% \endgroup +% } +% \[ +% \myisotope{A}{Z}{X}\to \myisotope{A-4}{Z-2}{Y}+ +% \myisotope{4}{2}{\alpha} +% \] +% (Though a package like \pkg{mhchem} might be more suitable for this +% type of material.) +% +% \subsection{Declaring math sizes} +% +% \begin{codesyntax} +% \SpecialUsageIndex{\DeclareMathSizes} +% \cs{DeclareMathSizes}\marg{dimen}\marg{dimen}\marg{dimen}\marg{dimen} +% \end{codesyntax} +% \cttPosting{Michael J.~Downes}{2002/10/17} +% If you don't know about \cs{DeclareMathSizes}, then skip the rest +% of this text. If you do know, then all that is needed to say is +% that with \pkg{mathtools} it is patched so that all regular +% dimension suffixes are now valid in the last three arguments. Thus +% a declaration such as +% \begin{verbatim} +% \DeclareMathSize{9.5dd}{9.5dd}{7.5dd}{6.5dd} +% \end{verbatim} +% will now work (it doesn't in standard \LaTeX). When this bug has +% been fixed in \LaTeX, this fix will be removed from +% \pkg{mathtools}. +% +% \subsection{Spreading equations}\label{sec:spread} +% +% \begin{codesyntax} +% \SpecialEnvIndex{spreadlines} +% \cs{begin}\arg{spreadlines}\marg{dimen} \meta{contents} +% \cs{end}\arg{spreadlines} +% \end{codesyntax} +% \cttPosting{Michael J.~Downes}{2002/10/17} +% The spacing between lines in a multiline math environment such as +% \env{gather} is governed by the dimension \cs{jot}. The +% \env{spreadlines} environment takes one argument denoting the +% value of \cs{jot} inside the environment: +% \begin{verbatim} +% \begin{spreadlines}{20pt} +% Large spaces between the lines. +% \begin{gather} +% a=b\\ +% c=d +% \end{gather} +% \end{spreadlines} +% Back to normal spacing. +% \begin{gather} +% a=b\\ +% c=d +% \end{gather} +% \end{verbatim} +% \begin{spreadlines}{20pt} +% Large spaces between the lines. +% \begin{gather} +% a=b\\ +% c=d +% \end{gather} +% \end{spreadlines} +% Back to normal spacing. +% \begin{gather} +% a=b\\ +% c=d +% \end{gather} +% +% +% \subsection{Gathered environments}\label{subsec:gathered} +% +% \begin{codesyntax} +% \SpecialEnvIndex{lgathered}\cs{begin}\arg{lgathered}\oarg{pos} +% \meta{contents} \cs{end}\arg{lgathered} \\ +% \SpecialEnvIndex{rgathered}\cs{begin}\arg{rgathered}\oarg{pos} +% \meta{contents} \cs{end}\arg{rgathered} \\ +% \SpecialUsageIndex{\newgathered}\cs{newgathered}\marg{name}\marg{pre_line}\marg{post_line}\marg{after}\\ +% \SpecialUsageIndex{\renewgathered}\cs{renewgathered}\marg{name}\marg{pre_line}\marg{post_line}\marg{after} +% \end{codesyntax} +% \cttPosting{Michael J.~Downes}{2001/01/17} +% In a document set in \opt{fleqn}, you might sometimes want an +% inner \env{gathered} environment that doesn't center its lines but +% puts them flush left. The \env{lgathered} environment works just +% like the standard \env{gathered} except that it flushes its +% contents left: +% \begin{verbatim} +% \begin{equation} +% \begin{lgathered} +% x=1,\quad x+1=2 \\ +% y=2 +% \end{lgathered} +% \end{equation} +% \end{verbatim} +% \begin{equation} +% \begin{lgathered} +% x=1,\quad x+1=2 \\ +% y=2 +% \end{lgathered} +% \end{equation} +% Similarly the \env{rgathered} puts it contents flush right. +% +% More interesting is probably the command \cs{newgathered}. In this +% example we define a gathered version that centers the lines and +% also prints a star and a number at the left of each line. +% \begin{verbatim} +% \newcounter{steplinecnt} +% \newcommand\stepline{\stepcounter{steplinecnt}\thesteplinecnt} +% \newgathered{stargathered} +% {\llap{\stepline}$*$\quad\hfil}% \hfil for centering +% {\hfil}% \hfil for centering +% {\setcounter{steplinecnt}{0}}% reset counter +% \end{verbatim} +% \newcounter{steplinecnt} +% \newcommand\stepline{\stepcounter{steplinecnt}\thesteplinecnt} +% \newgathered{stargathered}{\llap{\stepline}$*$\quad\hfil}{\hfil}{\setcounter{steplinecnt}{0}} +% With these definitions we can get something like this: +% \begin{verbatim} +% \begin{gather} +% \begin{stargathered} +% x=1,\quad x+1=2 \\ +% y=2 +% \end{stargathered} +% \end{gather} +% \end{verbatim} +% \begin{gather} +% \begin{stargathered} +% x=1,\quad x+1=2 \\ +% y=2 +% \end{stargathered} +% \end{gather} +% \cs{renewgathered} renews a gathered environment of course. +% +% In all fairness it should be stated that the original concept by +% Michael has been extended quite a bit in \pkg{mathtools}. Only the +% end product of \env{lgathered} is the same. +% +% \subsection{Split fractions} +% +% \begin{codesyntax} +% \SpecialUsageIndex{\splitfrac}\cs{splitfrac}\marg{numer}\marg{denom}\texttt{~~} +% \SpecialUsageIndex{\splitdfrac}\cs{splitdfrac}\marg{numer}\marg{denom} +% \end{codesyntax} +% \cttPosting{Michael J.~Downes}{2001/12/06} +% These commands provide split fractions e.g., multiline fractions: +% \begin{verbatim} +% \[ +% a=\frac{ +% \splitfrac{xy + xy + xy + xy + xy} +% {+ xy + xy + xy + xy} +% } +% {z} +% =\frac{ +% \splitdfrac{xy + xy + xy + xy + xy} +% {+ xy + xy + xy + xy} +% } +% {z} +% \] +% \end{verbatim} +% \[ +% a=\frac{ +% \splitfrac{xy + xy + xy + xy + xy} +% {+ xy + xy + xy + xy} +% } +% {z} +% =\frac{ +% \splitdfrac{xy + xy + xy + xy + xy} +% {+ xy + xy + xy + xy} +% } +% {z} +% \] +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% +% \begin{thebibliography}{9} +% \bibitem{Perlis01} +% Alexander R. Perlis, +% \emph{A complement to \cs{smash}, \cs{llap}, and \cs{rlap}}, +% TUGboat 22(4) (2001). +% \bibitem{Ams99} +% American Mathematical Society and Michael Downes, +% \emph{Technical notes on the \pkg{amsmath} package} Version 2.0, +% 1999/10/29. +% (Available from CTAN as file \texttt{technote.tex}.) +% \bibitem{Ams00} +% Frank Mittelbach, Rainer Sch\"opf, Michael Downes, and David M.~Jones, +% \emph{The \pkg{amsmath} package} Version 2.13, +% 2000/07/18. +% (Available from CTAN as file \texttt{amsmath.dtx}.) +% \bibitem{A-W:MG04} +% Frank Mittelbach and Michel Goossens. +% \emph{The {\LaTeX} Companion}. +% Tools and Techniques for Computer Typesetting. Addison-Wesley, +% Boston, Massachusetts, 2 edition, 2004. +% With Johannes Braams, David Carlisle, and Chris Rowley. +% +% \bibitem{Carl99} +% David Carlisle, +% \emph{The \pkg{keyval} Package}, +% Version 1.13, 1999/03/16. +% (Available from CTAN as file \texttt{keyval.dtx}.) +% +% \bibitem{Voss:2004} +% Herbert Vo\ss, +% \emph{Math mode}, Version 1.71, +% 2004/07/06. +% (Available from CTAN as file \texttt{Voss-Mathmode.pdf}.) +% +% \bibitem{Swanson} +% Ellen Swanson, +% \emph{Mathematics into type}. +% American Mathematical Society, updated edition, 1999. +% Updated by Arlene O'Sean and Antoinette Schleyer. +% \bibitem{TBT} +% Victor Eijkhout, \emph{\TeX\ by Topic, A Texnician’s Reference}, 2007. +% Freely available at \url{http://ctan.org/tex-archive/info/texbytopic}. +% \end{thebibliography} +% +% +% \StopEventually{} +% +% +% \section{Options and package loading} +% +% +% Lets start the package. +% \begin{macrocode} +%<*package> +\ProvidesPackage{mathtools}% + [2014/07/16 v1.15 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] +\MHInternalSyntaxOn +% \end{macrocode} +% \changes{v1.13}{2013/02/11}{Robustifying \cs{(}\cs{)}\cs{[}\cs{]}} +% We'd like to make \cs{(}\cs{)} and \cs{[}\cs{]} robust. This can +% easily be done via the \pkg{fixltx2e} package, but auto loading that +% package may cause problems for some. We make copies instead. +% \begin{macro}{\EQ_MakeRobust} +% \begin{macro}{\forced_EQ_MakeRobust} +% \begin{macrocode} + % borrowed from fixltx2e +\def\EQ_MakeRobust#1{% + \@ifundefined{\expandafter\@gobble\string#1}{% + \@latex@error{The control sequence `\string#1' is undefined!% + \MessageBreak There is nothing here to make robust}% + \@eha + }% + {% + \@ifundefined{\expandafter\@gobble\string#1\space}% + {% + \expandafter\let\csname + \expandafter\@gobble\string#1\space\endcsname=#1% + \edef\reserved@a{\string#1}% + \def\reserved@b{#1}% + \edef\reserved@b{\expandafter\strip@prefix\meaning\reserved@b}% + \edef#1{% + \ifx\reserved@a\reserved@b + \noexpand\x@protect\noexpand#1% + \fi + \noexpand\protect\expandafter\noexpand + \csname\expandafter\@gobble\string#1\space\endcsname}% + }% + {\@latex@info{The control sequence `\string#1' is already robust}}% + }% +} +% \end{macrocode} +% We also provide a handy alternativ version, that will robustify no +% matter what. Useful for the \texttt{mathic} option. +% \begin{macrocode} +\def\forced_EQ_MakeRobust#1{% + \@ifundefined{\expandafter\@gobble\string#1}{% + \@latex@error{The control sequence `\string#1' is undefined!% + \MessageBreak There is nothing here to make robust}% + \@eha + }% + {% + % \@ifundefined{\expandafter\@gobble\string#1\space}% + % {% + \expandafter\let\csname + \expandafter\@gobble\string#1\space\endcsname=#1% + \edef\reserved@a{\string#1}% + \def\reserved@b{#1}% + \edef\reserved@b{\expandafter\strip@prefix\meaning\reserved@b}% + \edef#1{% + \ifx\reserved@a\reserved@b + \noexpand\x@protect\noexpand#1% + \fi + \noexpand\protect\expandafter\noexpand + \csname\expandafter\@gobble\string#1\space\endcsname}% + % }% + % {\@latex@info{The control sequence `\string#1' is already robust}}% + }% +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\MT_options_name:} +% \begin{macro}{\mathtoolsset} +% The name for the options and a user interface for setting keys. +% \begin{macrocode} +\def\MT_options_name:{mathtools} +\newcommand*\mathtoolsset[1]{\setkeys{\MT_options_name:}{#1}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% Fix \pkg{amsmath} bugs (strongly recommended!). It requires a +% great deal of typing to avoid fixing the bugs. He he. +% \begin{macrocode} +\MH_new_boolean:n {fixamsmath} +\DeclareOption{fixamsmath}{ + \MH_set_boolean_T:n {fixamsmath} +} +\DeclareOption{donotfixamsmathbugs}{ + \MH_set_boolean_F:n {fixamsmath} +} +% \end{macrocode} +% Disallow spaces before optional arguments in certain \pkg{amsmath} +% building blocks. +% \begin{macrocode} +\DeclareOption{allowspaces}{ + \MH_let:NwN \MaybeMHPrecedingSpacesOff + \relax + \MH_let:NwN \MH_maybe_nospace_ifnextchar:Nnn \kernel@ifnextchar +} +\DeclareOption{disallowspaces}{ + \MH_let:NwN \MaybeMHPrecedingSpacesOff + \MHPrecedingSpacesOff + \MH_let:NwN \MH_maybe_nospace_ifnextchar:Nnn \MH_nospace_ifnextchar:Nnn +} +% \end{macrocode} +% \changes{v1.13}{2013/02/11}{Option to disable robustifying +% \cs{(}\cs{)} and \cs{[}\cs{]}} +% Option to disallow robustifying \cs{(}\cs{)} and \cs{[}\cs{]}. +% \begin{macrocode} +\MH_new_boolean:n {robustify} +\MH_set_boolean_T:n {robustify} +\DeclareOption{nonrobust}{ + \MH_set_boolean_F:n {robustify} +} +% \end{macrocode} +% Pass all other options directly to \pkg{amsmath}. +% \begin{macrocode} +\DeclareOption*{ + \PassOptionsToPackage{\CurrentOption}{amsmath} +} +% \end{macrocode} +% Executing options +% \begin{macrocode} +\ExecuteOptions{fixamsmath,disallowspaces} +\ProcessOptions\relax +% \end{macrocode} +% We have to turn off the new syntax when \pkg{amstext} is loaded. +% \begin{macrocode} +\MHInternalSyntaxOff +\RequirePackage{amsmath}[2000/07/18] +\MHInternalSyntaxOn +\AtEndOfPackage{\MHInternalSyntaxOff} +% \end{macrocode} +% \begin{macro}{\MT_true_false_error:} +% Make sure the user selects either `true' or `false' when asked too. +% \begin{macrocode} +\def\MT_true_false_error:{ + \PackageError{mathtools} + {You~ have~ to~ select~ either~ `true'~ or~ `false'} + {I'll~ assume~ you~ chose~ `false'~ for~ now.} +} +% \end{macrocode} +% \end{macro} +% \changes{v1.13}{2013/02/11}{Make \cs{(}\cs{)} and \cs{[}\cs{]} +% robust} +% We start of with making \cs{(}\cs{)} and \cs{[}\cs{]} robust, +% unless the user explicitly asked us not to. +% \begin{macrocode} +\MH_if_boolean:nT {robustify}{ + \EQ_MakeRobust\( + \EQ_MakeRobust\) + \EQ_MakeRobust\[ + \EQ_MakeRobust\] +} +% \end{macrocode} +% +% +% \section{Macros I got ideas for myself} +% +% +% +% \subsection{Tag forms} +% This is quite simple, but why isn't it then a part of some widely +% distributed package? Beats me. +% +% \begin{macro}{\MT_define_tagform:nwnn} +% We start out by defining a command that will allow us to define +% commands similar to \cs{tagform@} only this will give us tag form +% \emph{types}. The actual code is very similar to the one in +% \pkg{amsmath}. +% \begin{macrocode} +\def\MT_define_tagform:nwnn #1[#2]#3#4{ + \@namedef{MT_tagform_#1:n}##1 + {\maketag@@@{#3\ignorespaces#2{##1}\unskip\@@italiccorr#4}} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\newtagform} +% Similar to \cs{newcommand}. Check if defined and scan for presence +% of optional argument. Then call generic command. +% \begin{macrocode} +\providecommand*\newtagform[1]{% + \@ifundefined{MT_tagform_#1:n} + {\@ifnextchar[% + {\MT_define_tagform:nwnn #1}% + {\MT_define_tagform:nwnn #1[]}% + }{\PackageError{mathtools} + {The~ tag~ form~ `#1'~ is~ already~ defined\MessageBreak + You~ probably~ want~ to~ look~ up~ \@backslashchar renewtagform~ + instead} + {I~ will~ just~ ignore~ your~ wish~ for~ now.}} +} +% \end{macrocode} +% Provide a default tag form which---surprise, surprise---is +% identical to the standard definition. +% \begin{macrocode} +\newtagform{default}{(}{)} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\renewtagform} +% Similar to \cs{renewcommand}. +% \begin{macrocode} +\providecommand*\renewtagform[1]{% + \@ifundefined{MT_tagform_#1:n} + {\PackageError{mathtools} + {The~ tag~ form~ `#1'~ is~ not~ defined\MessageBreak + You~ probably~ want~ to~ look~ up~ \@backslashchar newtagform~ instead} + {I~ will~ just~ ignore~ your~ wish~ for~ now.}} + {\@ifnextchar[% + {\MT_define_tagform:nwnn #1}% + {\MT_define_tagform:nwnn #1[]}% + } +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\usetagform} +% Then the activator. Test if the tag form is defined and then +% activate it by redefining \cs{tagform@}. +% \begin{macrocode} +\providecommand*\usetagform[1]{% + \@ifundefined{MT_tagform_#1:n} + { + \PackageError{mathtools}{% + You~ have~ chosen~ the~ tag~ form~ `#1'\MessageBreak + but~ it~ appears~ to~ be~ undefined} + {I~ will~ use~ the~ default~ tag~ form~ instead.}% + \@namedef{tagform@}{\@nameuse{MT_tagform_default:n}} + } + { \@namedef{tagform@}{\@nameuse{MT_tagform_#1:n}} } +% \end{macrocode} +% Here we patch if we're using the special ``show only referenced +% equations'' feature. +% \begin{macrocode} + \MH_if_boolean:nT {show_only_refs}{ + \MH_let:NwN \MT_prev_tagform:n \tagform@ + \def\tagform@##1{\MT_extended_tagform:n {##1}} + } +} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Showing only referenced tags} +% A little more interesting is the way to print only the equation +% numbers that are actually referenced. +% +% A few booleans to help determine which situations we're in. +% \begin{macrocode} +\MH_new_boolean:n {manual_tag} +\MH_new_boolean:n {raw_maketag} +% \end{macrocode} +% \begin{macro}{\MT_AmS_tag_in_align:} +% \begin{macro}{\tag@in@align} +% \begin{macro}{\tag@in@display} +% We'll need to know when the user has put in a manual tag, and since +% \cs{tag} is \cs{let} to all sorts of things inside the \pkg{amsmath} +% code it is safer to provide a small hack to the functions it is copied +% from. Note that we can't use \cs{iftag@}. +% \begin{macrocode} +\MH_let:NwN \MT_AmS_tag_in_align: \tag@in@align +\def\tag@in@align{ + \global\MH_set_boolean_T:n {manual_tag} + \MT_AmS_tag_in_align: +} +\def\tag@in@display#1#{ + \relax + \global\MH_set_boolean_T:n {manual_tag} + \tag@in@display@a{#1} +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\MT_extended_tagform:n} +% \changes{v1.01}{2004/08/03}{Simplified quite a bit} +% The extended version of \cs{tagform@}. +% \begin{macrocode} +\def\MT_extended_tagform:n #1{ + \MH_set_boolean_F:n {raw_maketag} +% \end{macrocode} +% We test if the equation was labelled. We already know if it was +% tagged manually. Have to watch out for \TeX\ inserting a blank line +% 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}} +% \begin{macrocode} + \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_if_boolean:nTF {manual_tag} + { \MH_if_boolean:nTF {show_manual_tags} + { \MT_prev_tagform:n {#1} } + { \@safe@activestrue + \@ifundefined{MT_r_\df@label} +% \end{macrocode} +% Next we need to remember to deactivate the manual tags switch. This +% is usually done using \verb|\MT_extended_maketag:n|, but this is not +% the case if the show manual tags is false and the manual tag is not +% 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} +% \begin{macrocode} + { \global\MH_set_boolean_F:n {manual_tag} } + { \MT_prev_tagform:n {#1} } + \@safe@activesfalse + } + } + { + \@safe@activestrue + \@ifundefined{MT_r_\df@label} + { } + { \refstepcounter{equation}\MT_prev_tagform:n {#1} } + \@safe@activesfalse + } + \fi: + \global\MH_set_boolean_T:n {raw_maketag} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\MT_extended_maketag:n} +% The extended version of \cs{maketag@@@}. +% \changes{v1.12}{2012/04/24}{Added \cs{@safe@activestrue/false}} +% \begin{macrocode} +\def\MT_extended_maketag:n #1{ + \ifx\df@label\@empty + \MT_maketag:n {#1} + \else: + \MH_if_boolean:nTF {raw_maketag} + { + \MH_if_boolean:nTF {show_manual_tags} + { \MT_maketag:n {#1} } + { \@safe@activestrue + \@ifundefined{MT_r_\df@label} + { } + { \MT_maketag:n {#1} } + \@safe@activesfalse + } + } + { \MT_maketag:n {#1} } + \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). +% \begin{macrocode} + \global\MH_set_boolean_F:n {manual_tag} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\MT_extended_eqref:n} +% \changes{v1.01}{2004/08/03}{Make it robust} +% We let \cs{eqref} write the label to the \file{aux} file, which is +% read at the beginning of the next run. Then we print the equation +% number as usual. +% \changes{v1.14}{2013/03/07}{It was not really robust} +% \begin{macrocode} +\def\MT_extended_eqref:n #1{ + \protected@write\@auxout{} + {\string\MT@newlabel{#1}} + \textup{\MT_prev_tagform:n {\ref{#1}}} +} +\EQ_MakeRobust\MT_extended_eqref:n +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\refeq} +% \begin{macro}{\MT_extended_refeq:n} +% Similar to \cs{eqref} and \cs{MT_extended_eqref:n}. +% \begin{macrocode} +\newcommand*\refeq[1]{ + \textup{\ref{#1}} +} +\def\MT_extended_refeq:n #1{ + \protected@write\@auxout{} + {\string\MT@newlabel{#1}} + \textup{\ref{#1}} +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\MT@newlabel} +% We can't use |:| or |_| in the command name (yet). We define the +% special labels for the equations that have been referenced in the +% previous run. +% \begin{macrocode} +\newcommand*\MT@newlabel[1]{ \global\@namedef{MT_r_#1}{} } +% \end{macrocode} +% \end{macro} +% \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:} + { \MT_true_false_error: + \@nameuse{boolean_show_manual_tags_false:} + } + { \@nameuse{boolean_show_manual_tags_#1:} } +} +% \end{macrocode} +% \begin{macro}{\MT_showonlyrefs_true:} +% The implementation is based on the idea that \cs{tagform@} can be +% called in two circumstances: when the tag is being printed in the +% equation and when it is being printed during a reference. +% \begin{macrocode} +\newcommand*\MT_showonlyrefs_true:{ + \MH_if_boolean:nF {show_only_refs}{ + \MH_set_boolean_T:n {show_only_refs} +% \end{macrocode} +% Save the definitions of the original commands. +% \begin{macrocode} + \MH_let:NwN \MT_incr_eqnum: \incr@eqnum + \MH_let:NwN \incr@eqnum \@empty + \MH_let:NwN \MT_array_parbox_restore: \@arrayparboxrestore + \@xp\def\@xp\@arrayparboxrestore\@xp{\@arrayparboxrestore + \MH_let:NwN \incr@eqnum \@empty + } + \MH_let:NwN \MT_prev_tagform:n \tagform@ + \MH_let:NwN \MT_eqref:n \eqref + \MH_let:NwN \MT_refeq:n \refeq + \MH_let:NwN \MT_maketag:n \maketag@@@ + \MH_let:NwN \maketag@@@ \MT_extended_maketag:n +% \end{macrocode} +% We redefine \cs{tagform@}. +% \begin{macrocode} + \def\tagform@##1{\MT_extended_tagform:n {##1}} +% \end{macrocode} +% Then \cs{eqref}: +% \begin{macrocode} + \MH_let:NwN \eqref \MT_extended_eqref:n + \MH_let:NwN \refeq \MT_extended_refeq:n + } +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\MT_showonlyrefs_false:} +% This macro reverts the settings. +% \begin{macrocode} +\def\MT_showonlyrefs_false: { + \MH_if_boolean:nT {show_only_refs}{ + \MH_set_boolean_F:n {show_only_refs} + \MH_let:NwN \tagform@ \MT_prev_tagform:n + \MH_let:NwN \eqref \MT_eqref:n + \MH_let:NwN \refeq \MT_refeq:n + \MH_let:NwN \maketag@@@ \MT_maketag:n + \MH_let:NwN \incr@eqnum \MT_incr_eqnum: + \MH_let:NwN \@arrayparboxrestore \MT_array_parbox_restore: + } +} +\define@key{\MT_options_name:}{showonlyrefs}[true]{ + \@nameuse{MT_showonlyrefs_#1:} +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\nonumber} +% \changes{v1.01}{2004/08/03}{Fixed using \cs{notag} or \cs{nonumber} +% with the \key{showonlyrefs} feature} +% We have to redefine \cs{nonumber} else it will subtract one from the +% 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. +% \begin{macrocode} +\renewcommand\nonumber{ + \if@eqnsw + \if_meaning:NN \incr@eqnum\@empty +% \end{macrocode} +% Only subtract the number if |show_only_refs| is false. +% \begin{macrocode} + \MH_if_boolean:nF {show_only_refs} + {\addtocounter{equation}\m@ne} + \fi: + \fi: + \MH_let:NwN \print@eqnum\@empty \MH_let:NwN \incr@eqnum\@empty + \global\@eqnswfalse +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\noeqref} +% \changes{v1.04}{2008/03/26}{Added \cs{noeqref} (daleif)} +% \changes{v1.12}{2012/04/20}{Labels containing active chars (babel) +% are now allowed} +% \changes{v1.12}{2012/04/24}{\cs{noeqref} will now make a reference +% warning if users use undefined labels in \cs{noeqref}, requested +% by Tue Christensen} +% Macro for adding numbers to non-referred equations. Syntax similar +% to \cs{nocite}. +% \begin{macrocode} +\MHInternalSyntaxOff +\newcommand\noeqref[1]{\@bsphack + \@for\@tempa:=#1\do{% + \@safe@activestrue% + \edef\@tempa{\expandafter\@firstofone\@tempa}% + \@ifundefined{r@\@tempa}{% + \protect\G@refundefinedtrue% + \@latex@warning{Reference `\@tempa' on page \thepage \space + undefined (\string\noeqref)}% + }{}% + \if@filesw\protected@write\@auxout{}% + {\string\MT@newlabel{\@tempa}}\fi% + \@safe@activesfalse} + \@esphack} + +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@safe@activestrue} +% \begin{macro}{\@safe@activesfalse} +% These macros are provided by babel. We \emph{provide} them here, +% just to make sure they exist. +% \begin{macrocode} +\providecommand\@safe@activestrue{}% +\providecommand\@safe@activesfalse{}% + +\MHInternalSyntaxOn +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% +% \subsection{Extensible arrows etc.} +% +% \begin{macro}{\xleftrightarrow} +% \begin{macro}{\MT_leftrightarrow_fill:} +% \begin{macro}{\xLeftarrow} +% \begin{macro}{\xRightarrow} +% \begin{macro}{\xLeftrightarrow} +% +% These are straight adaptions from \pkg{amsmath}. +% \begin{macrocode} +\providecommand*\xleftrightarrow[2][]{% + \ext@arrow 3095\MT_leftrightarrow_fill:{#1}{#2}} +\def\MT_leftrightarrow_fill:{% + \arrowfill@\leftarrow\relbar\rightarrow} +\providecommand*\xLeftarrow[2][]{% + \ext@arrow 0055{\Leftarrowfill@}{#1}{#2}} +\providecommand*\xRightarrow[2][]{% + \ext@arrow 0055{\Rightarrowfill@}{#1}{#2}} +\providecommand*\xLeftrightarrow[2][]{% + \ext@arrow 0055{\Leftrightarrowfill@}{#1}{#2}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\MT_rightharpoondown_fill:} +% \begin{macro}{\MT_rightharpoonup_fill:} +% \begin{macro}{\MT_leftharpoondown_fill:} +% \begin{macro}{\MT_leftharpoonup_fill:} +% \begin{macro}{\xrightharpoondown} +% \begin{macro}{\xrightharpoonup} +% \begin{macro}{\xleftharpoondown} +% \begin{macro}{\xleftharpoonup} +% \begin{macro}{\xleftrightharpoons} +% \begin{macro}{\xrightleftharpoons} +% The harpoons. +% \begin{macrocode} +\def\MT_rightharpoondown_fill:{% + \arrowfill@\relbar\relbar\rightharpoondown} +\def\MT_rightharpoonup_fill:{% + \arrowfill@\relbar\relbar\rightharpoonup} +\def\MT_leftharpoondown_fill:{% + \arrowfill@\leftharpoondown\relbar\relbar} +\def\MT_leftharpoonup_fill:{% + \arrowfill@\leftharpoonup\relbar\relbar} +\providecommand*\xrightharpoondown[2][]{% + \ext@arrow 0359\MT_rightharpoondown_fill:{#1}{#2}} +\providecommand*\xrightharpoonup[2][]{% + \ext@arrow 0359\MT_rightharpoonup_fill:{#1}{#2}} +\providecommand*\xleftharpoondown[2][]{% + \ext@arrow 3095\MT_leftharpoondown_fill:{#1}{#2}} +\providecommand*\xleftharpoonup[2][]{% + \ext@arrow 3095\MT_leftharpoonup_fill:{#1}{#2}} +\providecommand*\xleftrightharpoons[2][]{\mathrel{% + \raise.22ex\hbox{% + $\ext@arrow 3095\MT_leftharpoonup_fill:{\phantom{#1}}{#2}$}% + \setbox0=\hbox{% + $\ext@arrow 0359\MT_rightharpoondown_fill:{#1}{\phantom{#2}}$}% + \kern-\wd0 \lower.22ex\box0}} +\providecommand*\xrightleftharpoons[2][]{\mathrel{% + \raise.22ex\hbox{% + $\ext@arrow 0359\MT_rightharpoonup_fill:{\phantom{#1}}{#2}$}% + \setbox0=\hbox{% + $\ext@arrow 3095\MT_leftharpoondown_fill:{#1}{\phantom{#2}}$}% + \kern-\wd0 \lower.22ex\box0}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\xhookleftarrow} +% \begin{macro}{\xhookrightarrow} +% \begin{macro}{\MT_hookright_fill:} +% The hooks. +% \begin{macrocode} +\providecommand*\xhookleftarrow[2][]{% + \ext@arrow 3095\MT_hookleft_fill:{#1}{#2}} +\def\MT_hookleft_fill:{% + \arrowfill@\leftarrow\relbar{\relbar\joinrel\rhook}} +\providecommand*\xhookrightarrow[2][]{% + \ext@arrow 3095\MT_hookright_fill:{#1}{#2}} +\def\MT_hookright_fill:{% + \arrowfill@{\lhook\joinrel\relbar}\relbar\rightarrow} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\xmapsto} +% \begin{macro}{\MT_mapsto_fill:} +% The maps-to arrow. +% \begin{macrocode} +\providecommand*\xmapsto[2][]{% + \ext@arrow 0395\MT_mapsto_fill:{#1}{#2}} +\def\MT_mapsto_fill:{% + \arrowfill@{\mapstochar\relbar}\relbar\rightarrow} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \subsection{Underbrackets etc.} +% \begin{macro}{\underbracket} +% \begin{macro}{\MT_underbracket_I:w} +% \begin{macro}{\MT_underbracket_II:w} +% \begin{macro}{\upbracketfill} +% \begin{macro}{\upbracketend} +% The \cs{underbracket} macro. Scan for two optional arguments. When +% \pkg{xparse} becomes the standard this will be so much easier. +% \begin{macrocode} +\providecommand*\underbracket{ + \@ifnextchar[ + {\MT_underbracket_I:w} + {\MT_underbracket_I:w[\l_MT_bracketheight_fdim]}} +\def\MT_underbracket_I:w[#1]{ + \@ifnextchar[ + {\MT_underbracket_II:w[#1]} + {\MT_underbracket_II:w[#1][.7\fontdimen5\textfont2]}} +\def\MT_underbracket_II:w[#1][#2]#3{% + \mathop{\vtop{\m@th\ialign{## + \crcr + $\hfil\displaystyle{#3}\hfil$% + \crcr + \noalign{\kern .2\fontdimen5\textfont2 \nointerlineskip}% + \upbracketfill {#1}{#2}% + \crcr}}} + \limits} +\def\upbracketfill#1#2{% + \sbox\z@{$\braceld$} + \edef\l_MT_bracketheight_fdim{\the\ht\z@}% + \upbracketend{#1}{#2} + \leaders \vrule \@height \z@ \@depth #1 \hfill + \upbracketend{#1}{#2}% +} +\def\upbracketend#1#2{\vrule \@height #2 \@width #1\relax} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\overbracket} +% \begin{macro}{\MT_overbracket_I:w} +% \begin{macro}{\MT_overbracket_II:w} +% \begin{macro}{\downbracketfill} +% \begin{macro}{\downbracketend} +% The overbracket is quite similar. +% \begin{macrocode} +\providecommand*\overbracket{ + \@ifnextchar[ + {\MT_overbracket_I:w} + {\MT_overbracket_I:w[\l_MT_bracketheight_fdim]}} +\def\MT_overbracket_I:w[#1]{ + \@ifnextchar[ + {\MT_overbracket_II:w[#1]} + {\MT_overbracket_II:w[#1][.7\fontdimen5\textfont2]}} +\def\MT_overbracket_II:w[#1][#2]#3{% + \mathop{\vbox{\m@th\ialign{## + \crcr + \downbracketfill{#1}{#2}% + \crcr + \noalign{\kern .2\fontdimen5\textfont2 \nointerlineskip}% + $\hfil\displaystyle{#3}\hfil$ + \crcr}}}% + \limits} +\def\downbracketfill#1#2{% + \sbox\z@{$\braceld$}\edef\l_MT_bracketheight_fdim{\the\ht\z@} + \downbracketend{#1}{#2} + \leaders \vrule \@height #1 \@depth \z@ \hfill + \downbracketend{#1}{#2}% +} +\def\downbracketend#1#2{\vrule \@width #1\@depth #2\relax} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\LaTeXunderbrace} +% \begin{macro}{\underbrace} +% Redefinition of \cs{underbrace} and \cs{overbrace}. +% \begin{macrocode} +\MH_let:NwN \LaTeXunderbrace \underbrace +\def\underbrace#1{\mathop{\vtop{\m@th\ialign{##\crcr + $\hfil\displaystyle{#1}\hfil$\crcr + \noalign{\kern.7\fontdimen5\textfont2\nointerlineskip}% +% \end{macrocode} +% |.5\fontdimen5\textfont2| is the height of the tip of the brace. +% the remaining |.2\fontdimen5\textfont2| is for space between +% \begin{macrocode} + \upbracefill\crcr\noalign{\kern.5\fontdimen5\textfont2}}}}\limits} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\LaTeXoverbrace} +% \begin{macro}{\overbrace} +% Same technique for \cs{overbrace}. +% \begin{macrocode} +\MH_let:NwN \LaTeXoverbrace \overbrace +\def\overbrace#1{\mathop{\vbox{\m@th\ialign{##\crcr + \noalign{\kern.5\fontdimen5\textfont2}% +% \end{macrocode} +% Adjust for tip height +% \begin{macrocode} + \downbracefill\crcr + \noalign{\kern.7\fontdimen5\textfont2\nointerlineskip}% +% \end{macrocode} +% |.5\fontdimen5\textfont2| is the height of the tip of the brace. +% The remaining |.2\fontdimen5\textfont2| is for space between +% \begin{macrocode} + $\hfil\displaystyle{#1}\hfil$\crcr}}}\limits} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% +% +% +% \subsection{Special symbols} +% +% \subsubsection{Command names for parentheses} +% \begin{macro}{\lparen} +% \begin{macro}{\rparen} +% Just an addition to the \LaTeXe\ kernel. +% \begin{macrocode} +\providecommand*\lparen{(} +\providecommand*\rparen{)} +% \end{macrocode} +% \end{macro} +% \end{macro} + +% \subsubsection{Vertically centered colon} +% +% \begin{macro}{\vcentcolon} +% \begin{macro}{\ordinarycolon} +% \begin{macro}{\MT_active_colon_true:} +% \begin{macro}{\MT_active_colon_false:} +% This is from the hands of Donald Arseneau. Somehow it is not +% distributed, so I include it here. Here's the original text by +% Donald: +% \begin{verbatim} +% centercolon.sty Dec 7, 2000 +% Donald Arseneau asnd@triumf.ca +% Public domain. +% Vertically center colon characters (:) in math mode. +% Particularly useful for $ a:=b$, and still correct for +% $f : x\to y$. May be used in any TeX. +% \end{verbatim} +% +% Slight change: the colon meaning is given only if \verb|centercolon| +% is explicitly requested (before it was always assigned even if : remained +% catcode 12). This allows better interaction with packages like babel +% that also make colon active. +% \begin{macrocode} +\def\vcentcolon{\mathrel{\mathop\ordinarycolon}} +\providecommand\ordinarycolon{:} +\begingroup + \catcode`\:=\active + \lowercase{\endgroup +\def\MT_activate_colon{% + \ifnum\mathcode`\:=32768\relax + \let\ordinarycolon= :% + \else + \mathchardef\ordinarycolon\mathcode`\: % + \fi + \let :\vcentcolon + } +} +% \end{macrocode} +% Option processing. +% The `false' branch can only be requested if the option has previously been set `true'. +% (By default neither are set.) +% \begin{macrocode} +\MH_new_boolean:n {center_colon} +\define@key{\MT_options_name:}{centercolon}[true]{ + \@ifundefined{MT_active_colon_#1:} + { \MT_true_false_error:n + \@nameuse{MT_active_colon_false:} + } + { \@nameuse{MT_active_colon_#1:} } +} +\def\MT_active_colon_true: { + \MT_activate_colon + \MH_if_boolean:nF {center_colon}{ + \MH_set_boolean_T:n {center_colon} + \edef\MT_active_colon_false: + {\mathcode`\noexpand\:=\the\mathcode`\:\relax} + \mathcode`\:=32768 + } +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\dblcolon} +% \begin{macro}{\coloneqq} +% \begin{macro}{\Coloneqq} +% \begin{macro}{\coloneq} +% \begin{macro}{\Coloneq} +% \begin{macro}{\eqqcolon} +% \begin{macro}{\Eqqcolon} +% \begin{macro}{\eqcolon} +% \begin{macro}{\Eqcolon} +% \begin{macro}{\colonapprox} +% \begin{macro}{\Colonapprox} +% \begin{macro}{\colonsim} +% \begin{macro}{\Colonsim} +% This is just to simulate all the \cs{..colon..} symbols from +% \pkg{txfonts} and \pkg{pxfonts}. +% \changes{v1.08c}{2010/11/17}{Enclosed all in \cs{mathrel}} +% \begin{macrocode} +\AtBeginDocument{ + \providecommand*\dblcolon{\mathrel{\vcentcolon\mkern-.9mu\vcentcolon}} + \providecommand*\coloneqq{\mathrel{\vcentcolon\mkern-1.2mu=}} + \providecommand*\Coloneqq{\mathrel{\dblcolon\mkern-1.2mu=}} + \providecommand*\coloneq{\mathrel{\vcentcolon\mkern-1.2mu\mathrel{-}}} + \providecommand*\Coloneq{\mathrel{\dblcolon\mkern-1.2mu\mathrel{-}}} + \providecommand*\eqqcolon{\mathrel{=\mkern-1.2mu\vcentcolon}} + \providecommand*\Eqqcolon{\mathrel{=\mkern-1.2mu\dblcolon}} + \providecommand*\eqcolon{\mathrel{\mathrel{-}\mkern-1.2mu\vcentcolon}} + \providecommand*\Eqcolon{\mathrel{\mathrel{-}\mkern-1.2mu\dblcolon}} + \providecommand*\colonapprox{\mathrel{\vcentcolon\mkern-1.2mu\approx}} + \providecommand*\Colonapprox{\mathrel{\dblcolon\mkern-1.2mu\approx}} + \providecommand*\colonsim{\mathrel{\vcentcolon\mkern-1.2mu\sim}} + \providecommand*\Colonsim{\mathrel{\dblcolon\mkern-1.2mu\sim}} +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \subsection{Multlined} +% +% \begin{macro}{\g_MT_multlinerow_int} +% \begin{macro}{\l_MT_multwidth_dim} +% Helpers. +% \begin{macrocode} +\let \AMS@math@cr@@ \math@cr@@ +\MH_new_boolean:n {mult_firstline} +\MH_new_boolean:n {outer_mult} +\newcount\g_MT_multlinerow_int +\newdimen\l_MT_multwidth_dim +% \end{macrocode} +% \end{macro} +% \end{macro} +% \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. +% \begin{macrocode} +\newcommand*\MT_test_for_tcb_other:nnnnn [1]{ + \if:w t#1\relax + \expandafter\MH_use_choice_i:nnnn + \else: + \if:w c#1\relax + \expandafter\expandafter\expandafter\MH_use_choice_ii:nnnn + \else: + \if:w b#1\relax + \expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter\expandafter + \MH_use_choice_iii:nnnn + \else: + \expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter\expandafter + \MH_use_choice_iv:nnnn + \fi: + \fi: + \fi: +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\MT_mult_invisible_line:} +% An invisible line. +% \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}} +% \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} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\MT_mult_mathcr_atat:w} +% The normal \cs{math@cr@@} with our hooks. +% \begin{macrocode} +\def\MT_mult_mathcr_atat:w [#1]{% + \if_num:w 0=`{\fi: \iffalse}\fi: + \MH_if_boolean:nT {mult_firstline}{ + \kern\l_MT_mult_left_fdim + \MT_mult_invisible_line: + } + \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_let:NwN \math@cr@@\MT_mult_last_mathcr:w + \fi: +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\MT_mult_firstandlast_mathcr:w} +% 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. +% \begin{macrocode} +\def\MT_mult_firstandlast_mathcr:w [#1]{% + \if_num:w 0=`{\fi: \iffalse}\fi: + \kern\l_MT_mult_left_fdim + \MT_mult_invisible_line: + \noalign{\vskip#1\relax} + \kern\l_MT_mult_right_fdim +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\MT_mult_last_mathcr:w} +% The normal last \cs{math@cr@@} which inserts the last kern. +% \begin{macrocode} +\def\MT_mult_last_mathcr:w [#1]{ + \if_num:w 0=`{\fi: \iffalse}\fi:\math@cr@@@ + \noalign{\vskip#1\relax} + \kern\l_MT_mult_right_fdim} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\MT_start_mult:N} +% Setup for \env{multlined}. Finds the position. +% \begin{macrocode} +\newcommand\MT_start_mult:N [1]{ + \MT_test_for_tcb_other:nnnnn {#1} + { \MH_let:NwN \MT_next:\vtop } + { \MH_let:NwN \MT_next:\vcenter } + { \MH_let:NwN \MT_next:\vbox } + { + \PackageError{mathtools} + {Invalid~ position~ specifier.~ I'll~ try~ to~ recover~ with~ + `c'}\@ehc + } + \collect@body\MT_mult_internal:n +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\MT_shoveright:wn} +% \begin{macro}{\MT_shoveleft:wn} +% Extended versions of \cs{shoveleft} and \cs{shoveright}. +% \begin{macrocode} +\newcommand*\MT_shoveright:wn [2][0pt]{% + #2\hfilneg + \setlength\@tempdima{#1} + \kern\@tempdima +} +\newcommand*\MT_shoveleft:wn [2][0pt]{% + \hfilneg + \setlength\@tempdima{#1} + \kern\@tempdima + #2 +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \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}. +% \begin{macrocode} +\newcommand*\MT_mult_internal:n [1]{ + \MH_if_boolean:nF {outer_mult}{\null\,} + \MT_next: + \bgroup +% \end{macrocode} +% Restore the meaning of \cmd{\\} inside \env{multlined}, else it +% wouldn't work in the \env{equation} environment. Set the fake row +% counter to zero. +% \begin{macrocode} + \Let@ + \def\l_MT_multline_lastline_fint{0 } + \chardef\dspbrk@context\@ne \restore@math@cr +% \end{macrocode} +% Use private versions. +% \begin{macrocode} + \MH_let:NwN \math@cr@@\MT_mult_mathcr_atat:w + \MH_let:NwN \shoveleft\MT_shoveleft:wn + \MH_let:NwN \shoveright\MT_shoveright:wn + \spread@equation + \MH_set_boolean_F:n {mult_firstline} +% \end{macrocode} +% Do some measuring. +% \begin{macrocode} + \MT_measure_mult:n {#1} +% \end{macrocode} +% Make sure the box is wide enough. +% \begin{macrocode} + \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. +% \begin{macrocode} + \if_num:w \l_MT_multline_lastline_fint=\@ne + \MH_let:NwN \math@cr@@ \MT_mult_firstandlast_mathcr:w + \fi: +% \end{macrocode} +% Do the typesetting. +% \begin{macrocode} + \ialign\bgroup + \hfil\strut@$\m@th\displaystyle{}##$\hfil + \crcr + \hfilneg + #1 +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\MT_measure_mult:n} +% \changes{v1.01a}{2004/10/10}{Added Ord atom to beginning of each line} +% Measuring. Disable all labelling and check the number of lines. +% \begin{macrocode} +\newcommand\MT_measure_mult:n [1]{ + \begingroup + \g_MT_multlinerow_int\@ne + \MH_let:NwN \label\MT_gobblelabel:w + \MH_let:NwN \tag\gobble@tag + \setbox\z@\vbox{ + \ialign{\strut@$\m@th\displaystyle{}##$ + \crcr + #1 + \crcr + } + } + \xdef\l_MT_multline_measure_fdim{\the\wdz@} + \advance\g_MT_multlinerow_int\m@ne + \xdef\l_MT_multline_lastline_fint{\number\g_MT_multlinerow_int} + \endgroup + \g_MT_multlinerow_int\@ne +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\MT_multlined_second_arg:w} +% Scan for a second optional argument. +% \begin{macrocode} +\MaybeMHPrecedingSpacesOff +\newcommand*\MT_multlined_second_arg:w [1][\@empty]{ + \MT_test_for_tcb_other:nnnnn {#1} + {\def\MT_mult_default_pos:{#1}} + {\def\MT_mult_default_pos:{#1}} + {\def\MT_mult_default_pos:{#1}} + { + \if_meaning:NN \@empty#1\@empty + \else: + \setlength \l_MT_multwidth_dim{#1} + \fi: + } + \MT_start_mult:N \MT_mult_default_pos: +} +% \end{macrocode} +% \end{macro} +% \begin{environment}{multlined} +% The user environment. Scan for an optional argument. +% \begin{macrocode} +\newenvironment{multlined}[1][] + {\MH_group_align_safe_begin: + \MT_test_for_tcb_other:nnnnn {#1} + {\def\MT_mult_default_pos:{#1}} + {\def\MT_mult_default_pos:{#1}} + {\def\MT_mult_default_pos:{#1}} + { + \if_meaning:NN \@empty#1\@empty + \else: + \setlength \l_MT_multwidth_dim{#1} + \fi: + } + \MT_multlined_second_arg:w + } + { + \hfilneg \endaligned \MH_group_align_safe_end: + } +\MHPrecedingSpacesOn +% \end{macrocode} +% \end{environment} +% The keys needed. +% \begin{macrocode} +\define@key{\MT_options_name:} + {firstline-afterskip}{\def\l_MT_mult_left_fdim{#1}} +\define@key{\MT_options_name:} + {lastline-preskip}{\def\l_MT_mult_right_fdim{#1}} +\define@key{\MT_options_name:} + {multlined-width}{\setlength \l_MT_multwidth_dim{#1}} +\define@key{\MT_options_name:} + {multlined-pos}{\def\MT_mult_default_pos:{#1}} +\setkeys{\MT_options_name:}{ + firstline-afterskip=\multlinegap, + lastline-preskip=\multlinegap, + multlined-width=0pt, + multlined-pos=c, +} +% \end{macrocode} +% \begin{macro}{\MT_gobblelabel:w} +% Better than to assume that \cs{label} has exactly one mandatory +% argument, hence the \texttt{w} specifier. +% \begin{macrocode} +\def\MT_gobblelabel:w #1{} +% \end{macrocode} +% \end{macro} +% +% +% +% +% \section{Macros suggested/requested by Lars Madsen} +% +% The macros in this section are all requests made by Lars Madsen. +% +% \subsection{Paired delimiters} +% +% \changes{v1.13}{2012/05/10}{Extended \cs{DeclarePairedDelimiter(X)}} +% \begin{macro}{\MT_delim_default_inner_wrappers:n} +% In some cases users may want to control the internals a bit more. We +% therefore create two call back macros each time the +% \cs{DeclarePaired...} macro is issued. The default value of these +% call backs are provided by |\MT_delim_default_inner_wrappers:n| +% \begin{macrocode} +\newcommand\MT_delim_default_inner_wrappers:n [1]{ + \@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{ + \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 +% argument \texttt{\#1} and \texttt{\#3} respectively refer to the +% scaled fences and \texttt{\#3} refer to whatever come between. +% \begin{macrocode} +\newcommand\reDeclarePairedDelimiterInnerWrapper[3]{ + \@namedef{MT_delim_\MH_cs_to_str:N #1 _ #2 _wrapper:nnn}##1##2##3{ + #3 + } +} + +% \end{macrocode} +% +% \end{macro} +% \begin{macro}{\DeclarePairedDelimiter} +% \changes{v1.06}{2008/08/01}{Made user command robust} +% This macro defines |#1| to be a control sequence that takes either +% a star or an optional argument and one mandatory argument. +% \begin{macrocode} +\newcommand*\DeclarePairedDelimiter[3]{% + \@ifdefinable{#1}{ +% \end{macrocode} +% Define the starred command to just put \cs{left} and \cs{right} +% 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.} +% \changes{v1.13}{2012/05/10}{Using call back instead} +% \begin{macrocode} + \MT_delim_default_inner_wrappers:n{#1} + \@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} +% The command with optional argument. It should be \cs{bigg} or +% alike. +% \begin{macrocode} + \@xp\@xp\@xp + \newcommand + \@xp\csname MT_delim_\MH_cs_to_str:N #1 _nostar:\endcsname + [2][\\@gobble] + { +% \end{macrocode} +% 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} + } +% \end{macrocode} +% The user command comes here. Just check for the star and choose +% the right internal command. +% \begin{macrocode} + \DeclareRobustCommand{#1}{ + \@ifstar + {\@nameuse{MT_delim_\MH_cs_to_str:N #1 _star:}} + {\@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostar:}} + } + } +} +% \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{macrocode} +\def\MHempty{} +\def\DeclarePairedDelimiterX#1[#2]#3#4#5{% + \@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} +% \begin{macrocode} + \MT_paired_delimx_arg_test:n{#2} +% \end{macrocode} +% \changes{v1.13}{2012/05/10}{Using call back instead} +% Define the default call backs. +% \begin{macrocode} + \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 +% 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} + \@xp\@xp\@xp + \newcommand + \@xp\csname MT_delim_\MH_cs_to_str:N #1 _star:\endcsname + [#2] + { + \begingroup + \def\delimsize{\middle} +% \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 +% \cs{mathclose}. This change is now factored out into call backs. +% \changes{v1.08e}{2010/09/14}{redid the left/right fix, inspired by +% ctt thread named `spacing after \cs{right}) and before \cs{left})' +% 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} + \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. +% \begin{macrocode} + \@xp\@xp\@xp + \newcommand + \@xp\csname MT_delim_\MH_cs_to_str:N #1 _nostar:\endcsname + [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:| +% \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} +% \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:}} + {\@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostar:}} + } + } +} +% \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{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:}} + } + } +} + +% \end{macrocode} +% \end{macro} + + +% +% \subsection{A \texttt{\textbackslash displaystyle} \env{cases} environment} +% +% \begin{macro}{\MT_start_cases:nnn} +% We define a single command that does all the hard work. +% \changes{v1.08}{2010/06/10}{made \cs{MT_start_cases:nnnn} more general} +% \begin{macrocode} +\def\MT_start_cases:nnnn #1#2#3#4{ % #1=sep,#2=lpreamble,#3=rpreamble,#4=delim + \RIfM@\else + \nonmatherr@{\begin{\@currenvir}} + \fi + \MH_group_align_safe_begin: + \left#4 + \vcenter \bgroup + \Let@ \chardef\dspbrk@context\@ne \restore@math@cr + \let \math@cr@@\AMS@math@cr@@ + \spread@equation + \ialign\bgroup +% \end{macrocode} +% Set the first column flush left in \cs{displaystyle} math and the +% second as specified by the second argument. The first argument is +% the separation between the columns. It could be a \cs{quad} or +% something entirely different. +% \begin{macrocode} + \strut@#2 \strut@ + #3 + \crcr +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\MH_end_cases:} +% \begin{macrocode} +\def\MH_end_cases:{\crcr\egroup + \restorecolumn@ + \egroup + \MH_group_align_safe_end: +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\newcases} +% \begin{macro}{\renewcases} +% Easy creation of new \env{cases}-like environments. +% \changes{v1.08}{2010/06/10}{changed to match the change in \cs{MT_start_cases:nnnn}} +% \begin{macrocode} +\newcommand*\newcases[6]{% #1=name, #2=sep, #3=preamble, #4=left, #5=right + \newenvironment{#1} + {\MT_start_cases:nnnn {#2}{#3}{#4}{#5}} + {\MH_end_cases:\right#6} +} +\newcommand*\renewcases[6]{ + \renewenvironment{#1} + {\MT_start_cases:nnnn {#2}{#3}{#4}{#5}} + {\MH_end_cases:\right#6} +} +% \end{macrocode} +% \begin{environment}{dcases} +% \begin{environment}{dcases*} +% \begin{environment}{rcases} +% \begin{environment}{rcases*} +% \begin{environment}{drcases} +% \begin{environment}{drcases*} +% \begin{environment}{cases*} +% \env{dcases} is a traditional cases with display style math in +% both columns, while \env{dcases*} has text in the second column. +% \changes{v1.08}{2010/06/10}{changed to match the change in +% \cs{newcases} plus added rcases and drcases} +% \begin{macrocode} +\newcases{dcases}{\quad}{% + $\m@th\displaystyle{##}$\hfil}{$\m@th\displaystyle{##}$\hfil}{\lbrace}{.} +\newcases{dcases*}{\quad}{% + $\m@th\displaystyle{##}$\hfil}{{##}\hfil}{\lbrace}{.} +\newcases{rcases}{\quad}{% + $\m@th{##}$\hfil}{$\m@th{##}$\hfil}{.}{\rbrace} +\newcases{rcases*}{\quad}{% + $\m@th{##}$\hfil}{{##}\hfil}{.}{\rbrace} +\newcases{drcases}{\quad}{% + $\m@th\displaystyle{##}$\hfil}{$\m@th\displaystyle{##}$\hfil}{.}{\rbrace} +\newcases{drcases*}{\quad}{% + $\m@th\displaystyle{##}$\hfil}{{##}\hfil}{.}{\rbrace} +\newcases{cases*}{\quad}{% + $\m@th{##}$\hfil}{{##}\hfil}{\lbrace}{.} +% \end{macrocode} +% \end{environment} +% \end{environment} +% \end{environment} +% \end{environment} +% \end{environment} +% \end{environment} +% \end{environment} +% \end{macro} +% \end{macro} +% +% \subsection{New matrix environments} +% \begin{macro}{\MT_matrix_begin:N} +% \begin{macro}{\MT_matrix_end:} +% Here are a few helpers for the matrices. \cs{MT_matrix_begin:N} +% takes one argument specifying the column type for the array inside +% the matrix. and \cs{MT_matrix_end:} inserts the correct ending. +% \begin{macrocode} +\def\MT_matrix_begin:N #1{% + \hskip -\arraycolsep + \MH_let:NwN \@ifnextchar \MH_nospace_ifnextchar:Nnn + \array{*\c@MaxMatrixCols #1}} +\def\MT_matrix_end:{\endarray \hskip -\arraycolsep} +% \end{macrocode} +% \end{macro} +% \end{macro} +% Before we define the environments we better make sure that spaces +% before the optional argument is disallowed. Else a user who types +% \begin{verbatim} +% \[ +% \begin{pmatrix*} +% [c] & a \\ +% b & d +% \end{pmatrix*} +% \] +% \end{verbatim} +% will lose the \texttt{[c]}! +% \begin{macrocode} +\MaybeMHPrecedingSpacesOff +% \end{macrocode} +% \begin{environment}{matrix*} +% This environment is just like \env{matrix} only it takes an +% optional argument specifying the column type. +% \begin{macrocode} +\newenvironment{matrix*}[1][c] + {\MT_matrix_begin:N #1} + {\MT_matrix_end:} +% \end{macrocode} +% \end{environment} +% \begin{environment}{pmatrix*} +% \begin{environment}{bmatrix*} +% \begin{environment}{Bmatrix*} +% \begin{environment}{vmatrix*} +% \begin{environment}{Vmatrix*} +% Then starred versions of the other \AmS{} matrices. +% \begin{macrocode} +\newenvironment{pmatrix*}[1][c] + {\left(\MT_matrix_begin:N #1} + {\MT_matrix_end:\right)} +\newenvironment{bmatrix*}[1][c] + {\left[\MT_matrix_begin:N #1} + {\MT_matrix_end:\right]} +\newenvironment{Bmatrix*}[1][c] + {\left\lbrace\MT_matrix_begin:N #1} + {\MT_matrix_end:\right\rbrace} +\newenvironment{vmatrix*}[1][c] + {\left\lvert\MT_matrix_begin:N #1} + {\MT_matrix_end:\right\rvert} +\newenvironment{Vmatrix*}[1][c] + {\left\lVert\MT_matrix_begin:N #1} + {\MT_matrix_end:\right\lVert} +% \end{macrocode} +% \end{environment} +% \end{environment} +% \end{environment} +% \end{environment} +% \end{environment} +% +% \changes{v1.10}{2011/02/12}{Added the code below, courtesy of Rasmus Villemoes} +% Now we are at it why not provide fenced versions of the +% \env{smallmatrix} construction as well. We will only provide a +% version that can be adjusted as \env{matrix*} above, thus we keep +% the * in the name. The implementation is courtesy of Rasmus +% Villemoes. Rasmus also suggested making the default alignment in +% these environments globally adjustable, so we did +% (\texttt{smallmatrix-align=c} by default). It \emph{is} possible to +% do something similar with the large matrix environments, but that +% might cause problems with the \texttt{array} package, thus for now +% we lease that feature alone. +% +% The base code is a variation over the original \env{smallmatrix} +% environmetn fround in \texttt{amsmath}, thus we will not comment it further. +% +% TODO: make the code check that the optional argument is either +% \texttt{c}, \texttt{l} or \texttt{r}. +% \begin{macrocode} +\def\MT_smallmatrix_begin:N #1{% + \Let@\restore@math@cr\default@tag + \baselineskip6\ex@ \lineskip1.5\ex@ \lineskiplimit\lineskip + \csname MT_smallmatrix_#1_begin:\endcsname +} +\def\MT_smallmatrix_end:{\crcr\egroup\egroup\MT_smallmatrix_inner_space:} +\def\MT_smallmatrix_l_begin:{\null\MT_smallmatrix_inner_space:\vcenter\bgroup + \ialign\bgroup$\m@th\scriptstyle##$\hfil&&\thickspace + $\m@th\scriptstyle##$\hfil\crcr +} +\def\MT_smallmatrix_c_begin:{\null\MT_smallmatrix_inner_space:\vcenter\bgroup + \ialign\bgroup\hfil$\m@th\scriptstyle##$\hfil&&\thickspace\hfil + $\m@th\scriptstyle##$\hfil\crcr +} +\def\MT_smallmatrix_r_begin:{\null\MT_smallmatrix_inner_space:\vcenter\bgroup + \ialign\bgroup\hfil$\m@th\scriptstyle##$&&\thickspace\hfil + $\m@th\scriptstyle##$\crcr +} +\newenvironment{smallmatrix*}[1][\MT_smallmatrix_default_align:] + {\MT_smallmatrix_begin:N #1} + {\MT_smallmatrix_end:} +% \end{macrocode} +% We would like to keep to the tradition of the \verb?Xmatrix? and +% \verb?Xmatrix*? macros we added earlier, since most code is similar +% we define them using a constructor macro. We also apply the trick +% used within \verb?\DeclarePairedDelimiter(X)? such that \verb?\left? +% \verb?\right? constructions produce spacings corresponding to +% \verb?\mathopen? and \verb?\mathclose?. +% \begin{macrocode} +\def\MT_fenced_sm_generator:nnn #1#2#3{% + \@ifundefined{#1}{% + \newenvironment{#1} + {\@nameuse{#1hook}\mathopen{}\mathclose\bgroup\left#2\MT_smallmatrix_begin:N c}% + {\MT_smallmatrix_end:\aftergroup\egroup\right#3}% + }{}% + \@ifundefined{#1*}{% + \newenvironment{#1*}[1][\MT_smallmatrix_default_align:]% + {\@nameuse{#1hook}\mathopen{}\mathclose\bgroup\left#2\MT_smallmatrix_begin:N ##1}% + {\MT_smallmatrix_end:\aftergroup\egroup\right#3}% + }{}% +} +\MT_fenced_sm_generator:nnn{psmallmatrix}() +\MT_fenced_sm_generator:nnn{bsmallmatrix}[] +\MT_fenced_sm_generator:nnn{Bsmallmatrix}\lbrace\rbrace +\MT_fenced_sm_generator:nnn{vsmallmatrix}\lvert\rvert +\MT_fenced_sm_generator:nnn{Vsmallmatrix}\lVert\rVert +% \end{macrocode} +% +% The options associated with this. +% \begin{macrocode} +\define@key{\MT_options_name:} + {smallmatrix-align}{\def\MT_smallmatrix_default_align:{#1}} +\define@key{\MT_options_name:} + {smallmatrix-inner-space}{\def\MT_smallmatrix_inner_space:{#1}} +\setkeys{\MT_options_name:}{ + smallmatrix-align=c, + smallmatrix-inner-space=\, +} + +% \end{macrocode} +% Restore the usual spacing behavior. +% \begin{macrocode} +\MHPrecedingSpacesOn +% \end{macrocode} +% +% \subsection{Smashing an operator with limits} +% +% \begin{macro}{\smashoperator} +% The user command. Define \cs{MT_smop_use:NNNNN} to be one of the +% specialized commands \cs{MT_smop_smash_l:NNNNN}, +% \cs{MT_smop_smash_r:NNNNN}, or the default +% \cs{MT_smop_smash_lr:NNNNN}. +% \begin{macrocode} +\newcommand*\smashoperator[2][lr]{ + \def\MT_smop_use:NNNNN {\@nameuse{MT_smop_smash_#1:NNNNN}} + \toks@{#2} + \expandafter\MT_smop_get_args:wwwNnNn + \the\toks@\@nil\@nil\@nil\@nil\@nil\@nil\@@nil +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\MT_smop_remove_nil_vi:N} +% \begin{macro}{\MT_smop_mathop:n} +% \begin{macro}{\MT_smop_limits:} +% Some helper functions. +% \begin{macrocode} +\def\MT_smop_remove_nil_vi:N #1\@nil\@nil\@nil\@nil\@nil\@nil{#1} +\def\MT_smop_mathop:n {\mathop} +\def\MT_smop_limits: {\limits} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% Some conditionals. +% \begin{macrocode} +\MH_new_boolean:n {smop_one} +\MH_new_boolean:n {smop_two} +% \end{macrocode} +% \begin{macro}{\MT_smop_get_args:wwwNnNn} +% The argument stripping. There are three different valid types of +% input: +% \begin{enumerate} +% \item An operator with neither subscript nor superscript. +% \item An operator with one subscript or superscript. +% \item An operator with both subscript and superscript. +% \end{enumerate} +% Additionally an operator can be either a single macro as in +% \cs{sum} or in \cs{mathop}\arg{A} and people might be tempted to +% put a \cs{limits} after the operator, even though it's not +% necessary. Thus the input with most tokens would be something like +% \begin{verbatim} +% \mathop{TTT}\limits_{sub}^{sup} +% \end{verbatim} +% Therefore we have to scan for seven arguments, but there might +% only be one actually. So let's list the possible situations: +% \begin{enumerate} +% \item \verb|\mathop{TTT}\limits_{subsub}^{supsup}| +% \item \verb|\mathop{TTT}_{subsub}^{supsup}| +% \item \verb|\sum\limits_{subsub}^{supsup}| +% \item \verb|\sum_{subsub}^{supsup}| +% \end{enumerate} +% Furthermore the |_{subsub}^{supsup}| part can also just be +% |_{subsub}| or empty. +% \begin{macrocode} +\def\MT_smop_get_args:wwwNnNn #1#2#3#4#5#6#7\@@nil{% + \begingroup + \def\MT_smop_arg_A: {#1} \def\MT_smop_arg_B: {#2} + \def\MT_smop_arg_C: {#3} \def\MT_smop_arg_D: {#4} + \def\MT_smop_arg_E: {#5} \def\MT_smop_arg_F: {#6} + \def\MT_smop_arg_G: {#7} +% \end{macrocode} +% Check if A is \cs{mathop}. If it is, we know that B is the argument +% of the \cs{mathop}. +% \begin{macrocode} + \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} +% \begin{macrocode} + \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}. +% \begin{macrocode} + \if_meaning:NN \MT_smop_arg_D: \@nnil + \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_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: +% \end{macrocode} +% Here we have something like \verb|\mathop{TTT}|. Still check +% if D is \cs{@nil}. +% \begin{macrocode} + \def\MT_smop_final_arg_A:{#1{#2}}% + \if_meaning:NN \MT_smop_arg_D: \@nnil + \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_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: +% \end{macrocode} +% If A was not \cs{mathop}, it is an operator in itself, so we check +% if B is \cs{limits} +% \begin{macrocode} + \else: + \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_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_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: +% \end{macrocode} +% No \cs{limits} was found, so we already have the right input. Just +% forget about the last two arguments. +% \begin{macrocode} + \def\MT_smop_final_arg_A:{#1}% + \if_meaning:NN \MT_smop_arg_C: \@nnil + \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_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: +% \end{macrocode} +% No reason to measure if there's no sub or sup. +% \begin{macrocode} + \MH_if_boolean:nT {smop_one}{ + \MT_smop_measure:NNNNN + \MT_smop_final_arg_A: \MT_smop_final_arg_B: \MT_smop_final_arg_C: + \MT_smop_final_arg_D: \MT_smop_final_arg_E: + } + \MT_smop_use:NNNNN + \MT_smop_final_arg_A: \MT_smop_final_arg_B: \MT_smop_final_arg_C: + \MT_smop_final_arg_D: \MT_smop_final_arg_E: + \endgroup +} +% \end{macrocode} +% \end{macro} +% Typeset what is necessary and ignore width of sub and sup: +% \begin{macrocode} +\def\MT_smop_needed_args:NNNNN #1#2#3#4#5{% + \displaystyle #1 + \MH_if_boolean:nT {smop_one}{ +% \end{macrocode} +% Let's use the internal versions of \cs{crampedclap} now that we now +% it is set in \cs{scriptstyle}. +% \begin{macrocode} + \limits#2{\MT_cramped_clap_internal:Nn \scriptstyle{#3}} + \MH_if_boolean:nT {smop_two}{ + #4{\MT_cramped_clap_internal:Nn \scriptstyle{#5}} + } + } +} +% \end{macrocode} +% Measure the natural width. \cs{@tempdima} holds the dimen we need to +% adjust it all with. +% \begin{macrocode} +\def\MT_smop_measure:NNNNN #1#2#3#4#5{% + \MH_let:NwN \MT_saved_mathclap:Nn \MT_cramped_clap_internal:Nn + \MH_let:NwN \MT_cramped_clap_internal:Nn \@secondoftwo + \sbox\z@{$\m@th\MT_smop_needed_args:NNNNN #1#2#3#4#5$} + \MH_let:NwN \MT_cramped_clap_internal:Nn \MT_saved_mathclap:Nn + \sbox\tw@{$\m@th\displaystyle#1$} + \@tempdima=.5\wd0 + \advance\@tempdima-.5\wd2 +} +% \end{macrocode} +% The `l' variant +% \begin{macrocode} +\def\MT_smop_smash_l:NNNNN #1#2#3#4#5{ + \MT_smop_needed_args:NNNNN #1#2#3#4#5\kern\@tempdima +} +% \end{macrocode} +% The `r' variant +% \begin{macrocode} +\def\MT_smop_smash_r:NNNNN #1#2#3#4#5{ + \kern\@tempdima\MT_smop_needed_args:NNNNN #1#2#3#4#5 +} +% \end{macrocode} +% The `lr' variant +% \begin{macrocode} +\def\MT_smop_smash_lr:NNNNN #1#2#3#4#5{ + \MT_smop_needed_args:NNNNN #1#2#3#4#5 +} +% \end{macrocode} +% +% +% \subsection{Adjusting limits} +% +% +% \begin{macro}{\MT_vphantom:Nn} +% \begin{macro}{\MT_hphantom:Nn} +% \begin{macro}{\MT_phantom:Nn} +% \begin{macro}{\MT_internal_phantom:N} +% The main advantage of \cs{phantom} et al., is the ability to +% choose the right size automatically, but it requires the input to +% be typeset four times. Since we will need to have a \cs{cramped} +% inside a \cs{vphantom} it is much, much faster to choose the style +% ourselves (we already know it). These macros make it possible. +% \begin{macrocode} +\def\MT_vphantom:Nn {\v@true\h@false\MT_internal_phantom:N} +\def\MT_hphantom:Nn {\v@false\h@true\MT_internal_phantom:N} +\def\MT_phantom:Nn {\v@true\h@true\MT_internal_phantom:N} +\def\MT_internal_phantom:N #1{ + \ifmmode + \expandafter\mathph@nt\expandafter#1 + \else + \expandafter\makeph@nt + \fi +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\adjustlimits} +% This is for making sure limits line up on two consecutive +% operators. +% \begin{macrocode} +\newcommand*\adjustlimits[6]{ +% \end{macrocode} +% We measure the two operators and save the difference of their +% depths. +% \begin{macrocode} + \sbox\z@{$\m@th \displaystyle #1$} + \sbox\tw@{$\m@th \displaystyle #4$} + \@tempdima=\dp\z@ \advance\@tempdima-\dp\tw@ +% \end{macrocode} +% We force \cs{displaystyle} for the operator and \cs{scripstyle} +% for the limit. If we make use of the regular \cs{smash}, +% \cs{vphantom}, and \cs{cramped} macros, and let \TeX{} choose the +% right style for each one of them, we get a lot of redundant code +% as we have no need for the combination +% $(\cs{displaystyle},\cs{textstyle})$ etc. Only +% $(\cs{scriptstyle},\cs{scriptstyle})$ is useful. +% \begin{macrocode} + \if_dim:w \@tempdima>\z@ + \mathop{#1}\limits#2{#3} + \else: + \mathop{#1\MT_vphantom:Nn \displaystyle{#4}}\limits + #2{ + \def\finsm@sh{\ht\z@\z@ \box\z@} + \mathsm@sh\scriptstyle{\MT_cramped_internal:Nn \scriptstyle{#3}} + \MT_vphantom:Nn \scriptstyle + {\MT_cramped_internal:Nn \scriptstyle{#6}} + } + \fi: + \if_dim:w \@tempdima>\z@ + \mathop{#4\MT_vphantom:Nn \displaystyle{#1}}\limits + #5 + { + \MT_vphantom:Nn \scriptstyle + {\MT_cramped_internal:Nn \scriptstyle{#3}} + \def\finsm@sh{\ht\z@\z@ \box\z@} + \mathsm@sh\scriptstyle{\MT_cramped_internal:Nn \scriptstyle{#6}} + } + \else: + \mathop{#4}\limits#5{#6} + \fi: +} +% \end{macrocode} +% \end{macro} +% +% \subsection{Swapping above display skip} +% +% \begin{macro}{\SwapAboveDisplaySkip} +% This macro is intended to be used at the start of \AmS\ +% environments, in order to force it to use +% \cs{abovedisplayshortskip} instead of \cs{abovedisplayskip} above +% the displayed math. Because of the use of \cs{noalign} it will not +% work inside \env{equation} or \env{multline}. +% \begin{macrocode} +\newcommand\SwapAboveDisplaySkip{% + \noalign{\vskip-\abovedisplayskip\vskip\abovedisplayshortskip} +} + +% \end{macrocode} +% +% \end{macro} +% +% \subsection{An aid to alignment} +% +% \begin{macro}{\MoveEqLeft} +% \changes{v1.05}{2008/06/05}{Added \cs{MoveEqLeft} (daleif)} +% \changes{v1.05b}{2008/06/18}{We don't need \cs{setlength} here +% (daleif), after discussion about \cs{global} and \cs{setlength} +% on ctt} +% \changes{v1.12}{2011/06/12}{We don't even need lengths. GL +% suggested on ctt to just apply them directly.} +% This is a very simple macro, we `move' a line in an +% alignment backwards in order to simulate that all subsequent lines +% have been indented. Note that simply using \verb+\kern-2m+ after +% the \verb+&+ is not enough, then the alignemnt environment never +% detects that there is anything (though simulated) in the cell +% before the \verb+&+. +% \begin{macrocode} +\newcommand\MoveEqLeft[1][2]{\kern #1em & \kern -#1em} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Aboxed} +% \changes{v1.08}{2010/06/29}{Added \cs{Aboxed}} +% The idea from \cs{MoveEqLeft} can be used for other things. Here we +% create a macro that will allow a user to box an equation inside an +% alignment. +% \changes{v1.12}{2011/08/17}{\cs{Aboxed} reimplemented, cudos to GL} +% \begin{macrocode} +\newcommand\Aboxed[1]{\let\bgroup{\romannumeral-`}\@Aboxed#1&&\ENDDNE} +% \end{macrocode} +% \sloppy +% The macro has been reimplemented courtesy of Florent Chervet out of +% a posting on ctt, \url{https://groups.google.com/group/comp.text.tex/browse_thread/thread/5d66395f2a1b5134/93fd9661484bd8d8?#93fd9661484bd8d8} +% \begin{macrocode} +\def\@Aboxed#1\ENDDNE{% + \ifnum0=`{}\fi \setbox \z@ + \hbox{$\displaystyle#1{}\m@th$\kern\fboxsep \kern\fboxrule }% + \edef\@tempa {\kern \wd\z@ &\kern -\the\wd\z@ \fboxsep + \the\fboxsep \fboxrule \the\fboxrule }\@tempa \boxed {#1#2}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ArrowBetweenLines} +% \changes{v1.05}{2008/06/05}{Added \cs{ArrowBetweenLines} as it +% belongs here and not just in my \LaTeX book (daleif)} +% ????Implementation notes are needed???? +% \begin{macrocode} +\MHInternalSyntaxOff +\def\ArrowBetweenLines{\relax + \iffalse{\fi\ifnum0=`}\fi + \@ifstar{\ArrowBetweenLines@auxI{00}}{\ArrowBetweenLines@auxI{01}}} +\def\ArrowBetweenLines@auxI#1{% + \@ifnextchar[% + {\ArrowBetweenLines@auxII{#1}}% + {\ArrowBetweenLines@auxII{#1}[\Updownarrow]}} +\def\ArrowBetweenLines@auxII#1[#2]{% + \ifnum0=`{\fi \iffalse}\fi +% \end{macrocode} +% It turns out that for some reason the \cs{crcr} (next) removes the +% automatic equation number replacement. The replacement hack seems to +% the trick, though I have no idea why \cs{crcr} broke things (/daleif). +% \changes{v1.08}{2010/06/15}{fixed eq num replacement bug} +% \begin{macrocode} +% \crcr + \expandafter\in@\expandafter{\@currenvir}% + {alignedat,aligned,gathered}% + \ifin@ \else + \notag + \fi% + \\ + \noalign{\nobreak\vskip-\baselineskip\vskip-\lineskip}% + \noalign{\expandafter\in@\expandafter{\@currenvir}% + {alignedat,aligned,gathered}% + \ifin@ \else\notag\fi% + }% + \if#1 &&\quad #2\else #2\quad\fi + \\\noalign{\nobreak\vskip-\lineskip}} + +\MHInternalSyntaxOn +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Centered vertical dots} +% +% Doing a \verb?\vdots? centered within a different sized box, is +% rather easy with the tools available. Note that it does \emph{not} +% check for the style we are running in, thus do not expect this to +% work well within \verb?\scriptstyle? and smaller. Basically we +% create a box of a width corresponding to \verb?{}#1{}? and center +% the \verb?\vdots? within it. +% \begin{macrocode} +\newcommand\vdotswithin[1]{% + {\mathmakebox[\widthof{\ensuremath{{}#1{}}}][c]{{\vdots}}}} +% \end{macrocode} +% Next we are inspired by \verb?\ArrowBetweenLines? and provide a +% costruction to be used within alignments with much less vertical +% space above and below. +% +% First in order to support \env{spreadlines} we need to store the +% original value of \verb?\jot? (and hope the user does not mess with it). +% \begin{macrocode} +\newlength\origjot +\setlength\origjot{\jot} +% \end{macrocode} +% Next define how much we spacing we flush out, and make this user adjustable. +% \begin{macrocode} +\newdimen\l_MT_shortvdotswithinadjustabove_dim +\newdimen\l_MT_shortvdotswithinadjustbelow_dim +\define@key{\MT_options_name:} + {shortvdotsadjustabove}{\setlength\l_MT_shortvdotswithinadjustabove_dim{#1}} +\define@key{\MT_options_name:} + {shortvdotsadjustbelow}{\setlength\l_MT_shortvdotswithinadjustbelow_dim{#1}} +% \end{macrocode} +% The actual defaults we found by trail and error. +% \begin{macrocode} +\setkeys{\MT_options_name:}{ + shortvdotsadjustabove=2.15\origjot, + shortvdotsadjustbelow=\origjot +} +% \end{macrocode} +% The user macro comes in two versions, starred version corresponding +% to alignment \emph{before} and \verb?&? and a non-starred version +% with alignment \emph{after} \verb?&?. +% \begin{macrocode} +\def\shortvdotswithin{\relax + \@ifstar{\MT_svwi_aux:nn{00}}{\MT_svwi_aux:nn{01}}} +\def\MT_svwi_aux:nn #1#2{ + \MTFlushSpaceAbove + \if#1 \vdotswithin{#2}& \else &\vdotswithin{#2} \fi + \MTFlushSpaceBelow +} +% \end{macrocode} +% We will need a way to remove any tags (eq. numbers) on the +% \verb?\vdots? line. We cannot use the method used by +% \verb?\ArrowBetweenLines? so we use inspiration from +% \texttt{etoolbox}. +% \begin{macrocode} +\def\MT_remove_tag_unless_inner:n #1{% + \begingroup + \def\etb@tempa##1|#1|##2\MT@END{\endgroup + \ifx\@empty##2\@empty\notag\fi}% + \expandafter\etb@tempa\expandafter|alignedat|aligned|split|#1|\MT@END} + %| emacs +% \end{macrocode} +% These macros take care of removing the space above or below. Since +% these may be useful for the user in very special cases, we provide +% them as separate macros. +% \begin{macrocode} +\newcommand\MTFlushSpaceAbove{ + \expandafter\MT_remove_tag_unless_inner:n\expandafter{\@currenvir} + \\ + \noalign{% + \nobreak\vskip-\baselineskip\vskip-\lineskip% + \vskip-\l_MT_shortvdotswithinadjustabove_dim + \vskip-\origjot + \vskip\jot + }% + \noalign{ + \expandafter\MT_remove_tag_unless_inner:n\expandafter{\@currenvir} + } +} +\newcommand\MTFlushSpaceBelow{ + \\\noalign{% + \nobreak\vskip-\lineskip + \vskip-\l_MT_shortvdotswithinadjustbelow_dim + \vskip-\origjot + \vskip\jot + } +} + +% \end{macrocode} +% +% +% \section{A few extra symbols} +% +% Most math font sets are missing three symbols: \cs{nuparrow}, +% \cs{ndownarrow} and \cs{bigtimes}. We provide \emph{simulated} +% versions of these symbols in case they are missing. +% +% \subsection{Negated up- and down arrows} +% +% Note that the \cs{nuparrow} and the \cs{ndownarrow} are made from +% \cs{nrightarrow} and \cs{nleftarrow}, so these have to be +% present. If they are not, we throw an error at use. The +% implementation details are due to Enrico Gregorio +% (\url{http://groups.google.com/group/comp.text.tex/msg/689cc8bd604fdb51}), +% the basic idea is to reflect and rotate existing negated +% arrows. Note that the reflection and rotation will not show up i +% most DVI previewers. +% \begin{macro}{\MH_nrotarrow:NN} +% \changes{v1.07}{2008/08/11}{Added support for \cs{nuparrow} and \cs{ndownaddow}} +% First a common construction macro. +% \begin{macrocode} +\def\MH_nrotarrow:NN #1#2{% + \setbox0=\hbox{$\m@th#1\uparrow$}\dimen0=\dp0 + \setbox0=\hbox{% + \reflectbox{\rotatebox[origin=c]{90}{$\m@th#1\mkern2.22mu #2$}}}% + \dp0=\dimen0 \box0 \mkern2.3965mu +} +% \end{macrocode} +% \end{macro} +% The negated arrows are then made using this macro on respectively +% \cs{nrightarrow} and \cs{nleftarrow} +% \begin{macro}{\MH_nuparrow:} +% \begin{macro}{\MH_ndownarrow:} +% \begin{macrocode} +\def\MH_nuparrow: {% + \mathrel{\mathpalette\MH_nrotarrow:NN\nrightarrow} } +\def\MH_ndownarrow: {% + \mathrel{\mathpalette\MH_nrotarrow:NN\nleftarrow} } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\nuparrow} +% \begin{macro}{\ndownarrow} +% Next we provide \cs{nuparrow} and \cs{ndownarrow} at begin +% document. Since they depend on \cs{nrightarrow} and +% \cs{nleftarrow} we test for these and let the macros throw an +% error if they are missing. +% \changes{v1.08b}{2010/07/21}{Moved graphicx loading down here such +% that we do not get into option clash problems} +% \begin{macrocode} +\AtBeginDocument{% + \RequirePackage{graphicx}% + \@ifundefined{nrightarrow}{% + \providecommand\nuparrow{% + \PackageError{mathtools}{\string\nuparrow\space~ is~ + constructed~ from~ \string\nrightarrow,~ which~ is~ not~ + provided.~ Please~ load~ the~ amssymb~ package~ or~ similar}{} + }}{ \providecommand\nuparrow{\MH_nuparrow:}} + \@ifundefined{nleftarrow}{% + \providecommand\ndownarrow{% + \PackageError{mathtools}{\string\ndownarrow\space~ is~ + constructed~ from~ \string\nleftarrow,~ which~ is~ not~ + provided.~ Please~ load~ the~ amssymb~ package~ or~ similar}{} + }}{ \providecommand\ndownarrow{\MH_ndownarrow:}} } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \subsection{Providing bigtimes} +% +% The idea is to use the original \cs{times} and then scale it +% accordingly. Again the implementation details have been improved by +% Enrico Gregorio +% (\url{http://groups.google.com/group/comp.text.tex/msg/9685c9405df2ff94}). +% +% \begin{macro}{\MH_bigtimes_scaler:N} +% \begin{macro}{\MH_bigtimes_inner:} +% \begin{macro}{\MH_csym_bigtimes:} +% \changes{v1.07}{2008/08/11}{Added support for \cs{bigtimes}} +% \begin{macrocode} +\def\MH_bigtimes_scaler:N #1{% + \vcenter{\hbox{#1$\m@th\mkern-2mu\times\mkern-2mu$}}} +% \end{macrocode} +% This is then combined with \cs{mathchoice} to form the inner parts +% of the macro +% \begin{macrocode} +\def\MH_bigtimes_inner: { + \mathchoice{\MH_bigtimes_scaler:N \huge} % display style + {\MH_bigtimes_scaler:N \LARGE} % text style + {\MH_bigtimes_scaler:N {}} % script style + {\MH_bigtimes_scaler:N \footnotesize} % script script style +} +% \end{macrocode} +% And thus the internal prepresentaion of the \cs{bigtimes} macro. +% \begin{macrocode} +\def\MH_csym_bigtimes: {\mathop{\MH_bigtimes_inner:}\displaylimits} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\bigtimes} +% In the end we provide \cs{bigtimes} if otherwise not defined. +% \begin{macrocode} +\AtBeginDocument{ + \providecommand\bigtimes{\MH_csym_bigtimes:} +} +% \end{macrocode} +% \end{macro} +% +% \section{Macros by other people} +% +% \subsection{Intertext and short intertext} +% +% It turns out that \cs{intertext} use a bit too much +% space. Especially noticable if combined with the \env{spreadlines} +% environment, the extra space is also applied above and below +% \cs{intertext}, which ends up looking unproffesional. Chung-chieh +% Shan +% (\url{http://conway.rutgers.edu/~ccshan/wiki/blog/posts/Beyond_amsmath/}) +% via Tobias Weh suggested a fix. We apply it here, but also keep the +% original \cs{intertext} in case a user would rather want it. +% \begin{macro}{\MT_orig_intertext:} +% \begin{macro}{\MT_intertext:} +% \changes{v1.13}{2012/08/19}{\cs{l_MT_X_intertext_dim} renamed to +% \cs{l_MT_X_intertext_sep}} +% \begin{macro}{\l_MT_above_intertext_sep} +% \begin{macro}{\l_MT_below_intertext_sep} +% First store the originam Ams version. +% \begin{macrocode} +\MH_let:NwN \MT_orig_intertext: \intertext@ +% \end{macrocode} +% And then for some reconfiguration. First a few lengths +% \changes{v1.13}{2012/08/19}{Fixed typos and changed the names} +% \begin{macrocode} +\newdimen\l_MT_above_intertext_sep +\newdimen\l_MT_below_intertext_sep +\define@key{\MT_options_name:} + {aboveintertextdim}{\setlength\l_MT_above_intertext_sep{#1}} +\define@key{\MT_options_name:} + {belowintertextdim}{\setlength\l_MT_below_intertext_sep{#1}} +\define@key{\MT_options_name:} + {above-intertext-dim}{\setlength\l_MT_above_intertext_sep{#1}} +\define@key{\MT_options_name:} + {below-intertext-dim}{\setlength\l_MT_below_intertext_sep{#1}} +\define@key{\MT_options_name:} + {above-intertext-sep}{\setlength\l_MT_above_intertext_sep{#1}} +\define@key{\MT_options_name:} + {below-intertext-sep}{\setlength\l_MT_below_intertext_sep{#1}} +% \end{macrocode} +% Their default values are zero. Now for our extended version of +% CCShan's solution. +% \begin{macrocode} +\def\MT_intertext: {% + \def\intertext##1{% + \ifvmode\else\\\@empty\fi + \noalign{% + \penalty\postdisplaypenalty\vskip\belowdisplayskip + \vskip-\lineskiplimit % CCS + \vskip\normallineskiplimit % CCS + \vskip\l_MT_above_intertext_sep + \vbox{\normalbaselines + \ifdim\linewidth=\columnwidth + \else \parshape\@ne \@totalleftmargin \linewidth + \fi + \noindent##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 +% \begin{macrocode} +\def\MT_orig_intertext_true: { \MH_let:NwN \intertext@ \MT_orig_intertext: } +\def\MT_orig_intertext_false: { \MH_let:NwN \intertext@ \MT_intertext: } +\define@key{\MT_options_name:}{original-intertext}[true]{ + \@nameuse{MT_orig_intertext_#1:} +} +% \end{macrocode} +% And use the new version as default. +% \begin{macrocode} +\setkeys{\MT_options_name:}{ + original-intertext=false +} +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% Gabriel Zachmann, Donald Arseneau on comp.text.tex 2000/05/12-13 +% \begin{macro}{\shortintertext} +% \begin{macro}{\MT_orig_shortintertext} +% \begin{macro}{\MT_shortintertext} +% \begin{macro}{\l_above_shortintertext_sep} +% \begin{macro}{\l_below_shortintertext_sep} +% This is like \cs{intertext} but uses shorter skips between the +% math. Again this turned out to have the same problem as +% \cs{intertext}, so we provide two versions. +% \begin{macrocode} +\def\MT_orig_shortintertext:n #1{% + \ifvmode\else\\\@empty\fi + \noalign{% + \penalty\postdisplaypenalty\vskip\abovedisplayshortskip + \vbox{\normalbaselines + \if_dim:w \linewidth=\columnwidth + \else: + \parshape\@ne \@totalleftmargin \linewidth + \fi: + \noindent#1\par}% + \penalty\predisplaypenalty\vskip\abovedisplayshortskip% + }% +} +% \end{macrocode} +% Lengths like above +% \changes{v1.13}{2012/08/19}{The option was named differently in the +% manual. Also renamed to use the postfix \emph{sep} instead. Though +% the old names remain for compatibility.} +% \changes{v1.14}{2014/01/20}{Apparently did not check it good enough, +% the option should have shortintertext not short-intertext} +% \begin{macrocode} +\newdimen\l_MT_above_shortintertext_sep +\newdimen\l_MT_below_shortintertext_sep +\define@key{\MT_options_name:} + {aboveshortintertextdim}{\setlength \l_MT_above_shortintertext_sep{#1}} +\define@key{\MT_options_name:} + {belowshortintertextdim}{\setlength \l_MT_below_shortintertext_sep{#1}} +\define@key{\MT_options_name:} + {above-short-intertext-dim}{\setlength \l_MT_above_shortintertext_sep{#1}} +% old typo in manual +\define@key{\MT_options_name:} + {below-short-intertext-dim}{\setlength \l_MT_below_shortintertext_sep{#1}} +\define@key{\MT_options_name:} + {above-short-intertext-sep}{\setlength \l_MT_above_shortintertext_sep{#1}} +% old typo in manual +\define@key{\MT_options_name:} + {below-short-intertext-sep}{\setlength \l_MT_below_shortintertext_sep{#1}} +\define@key{\MT_options_name:} + {above-shortintertext-sep}{\setlength \l_MT_above_shortintertext_sep{#1}} +\define@key{\MT_options_name:} + {below-shortintertext-sep}{\setlength \l_MT_below_shortintertext_sep{#1}} +% \end{macrocode} +% Looks best with the `old' values of the original \cs{jot} +% setting. So we set them to 3pt each. +% \begin{macrocode} +\setkeys{\MT_options_name:}{ + aboveshortintertextdim=3pt, + belowshortintertextdim=3pt +} +% \end{macrocode} +% Next, just add the same as we did for \cs{intertext} +% \begin{macrocode} +\def\MT_shortintertext:n #1{% + \ifvmode\else\\\@empty\fi + \noalign{% + \penalty\postdisplaypenalty\vskip\abovedisplayshortskip + \vskip-\lineskiplimit + \vskip\normallineskiplimit + \vskip\l_MT_above_shortintertext_sep + \vbox{\normalbaselines + \if_dim:w \linewidth=\columnwidth + \else: + \parshape\@ne \@totalleftmargin \linewidth + \fi: + \noindent#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. +% \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:} +} +% \end{macrocode} +% With the updated one as the default. +% \begin{macrocode} +\setkeys{\MT_options_name:}{ + original-shortintertext=false +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Fine-tuning mathematical layout} +% +% \subsubsection{A complement to \texttt{\textbackslash smash}, +% \texttt{\textbackslash llap}, and \texttt{\textbackslash rlap}} +% \begin{macro}{\clap} +% \begin{macro}{\mathllap} +% \begin{macro}{\mathrlap} +% \begin{macro}{\mathclap} +% \begin{macro}{\MT_mathllap:Nn} +% \begin{macro}{\MT_mathrlap:Nn} +% \begin{macro}{\MT_mathclap:Nn} +% First we'll \cs{provide} those macros (they are so simple that I +% think other packages might define them as well). +% \begin{macrocode} +\providecommand*\clap[1]{\hb@xt@\z@{\hss#1\hss}} +\providecommand*\mathllap[1][\@empty]{ + \ifx\@empty#1\@empty + \expandafter \mathpalette \expandafter \MT_mathllap:Nn + \else + \expandafter \MT_mathllap:Nn \expandafter #1 + \fi +} +\providecommand*\mathrlap[1][\@empty]{ + \ifx\@empty#1\@empty + \expandafter \mathpalette \expandafter \MT_mathrlap:Nn + \else + \expandafter \MT_mathrlap:Nn \expandafter #1 + \fi +} +\providecommand*\mathclap[1][\@empty]{ + \ifx\@empty#1\@empty + \expandafter \mathpalette \expandafter \MT_mathclap:Nn + \else + \expandafter \MT_mathclap:Nn \expandafter #1 + \fi +} +% \end{macrocode} +% We have to insert |{}| because we otherwise risk triggering a +% ``feature'' in \TeX. +% \begin{macrocode} +\def\MT_mathllap:Nn #1#2{{}\llap{$\m@th#1{#2}$}} +\def\MT_mathrlap:Nn #1#2{{}\rlap{$\m@th#1{#2}$}} +\def\MT_mathclap:Nn #1#2{{}\clap{$\m@th#1{#2}$}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\mathmbox} +% \begin{macro}{\MT_mathmbox:nn} +% \begin{macro}{\mathmakebox} +% \begin{macro}{\MT_mathmakebox_I:w} +% \begin{macro}{\MT_mathmakebox_II:w} +% \begin{macro}{\MT_mathmakebox_III:w} +% Then the \cs{mathmbox}\marg{arg} and +% \cs{mathmakebox}\oarg{width}\oarg{pos}\marg{arg} macros which are +% very similar to \cs{mbox} and \cs{makebox}. The differences are: +% \begin{itemize} +% \item \meta{arg} is set in math mode of course. +% \item No need for \cs{leavevmode} as we're in math mode. +% \item No need to make them \cs{long} (we're still in math mode). +% \item No need to support a picture version. +% \end{itemize} +% The first is easy. +% \begin{macrocode} +\providecommand*\mathmbox{\mathpalette\MT_mathmbox:nn} +\def\MT_mathmbox:nn #1#2{\mbox{$\m@th#1#2$}} +% \end{macrocode} +% We scan for the optional arguments first. +% \begin{macrocode} +\providecommand*\mathmakebox{ + \@ifnextchar[ \MT_mathmakebox_I:w + \mathmbox} +\def\MT_mathmakebox_I:w[#1]{% + \@ifnextchar[ {\MT_mathmakebox_II:w[#1]} + {\MT_mathmakebox_II:w[#1][c]}} +% \end{macrocode} +% We had to get the optional arguments out of the way before calling +% upon the powers of \cs{mathpalette}. +% \begin{macrocode} +\def\MT_mathmakebox_II:w[#1][#2]{ + \mathpalette{\MT_mathmakebox_III:w[#1][#2]}} +\def\MT_mathmakebox_III:w[#1][#2]#3#4{% + \@begin@tempboxa\hbox{$\m@th#3#4$}% + \setlength\@tempdima{#1}% + \hbox{\hb@xt@\@tempdima{\csname bm@#2\endcsname}}% + \@end@tempboxa} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\mathsm@sh} +% Fix \cs{smash}. +% \begin{macrocode} +\def\mathsm@sh#1#2{% + \setbox\z@\hbox{$\m@th#1{#2}$}{}\finsm@sh} +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{A cramped style} +% +% comp.text.tex on 1992/07/21 by Michael Herschorn. +% With speed-ups by the Grand Wizard himself as shown on +% \begin{quote}\rightskip-\leftmargini +% \url{http://mirrors.ctan.org/info/digests/tex-implementors/042} +% \end{quote} +% The (better) user interface by the author. +% +% \begin{macro}{\cramped} +% Make sure the expansion is timed correctly. +% \begin{macrocode} +\providecommand*\cramped[1][\@empty]{ + \ifx\@empty#1\@empty + \expandafter \mathpalette \expandafter \MT_cramped_internal:Nn + \else + \expandafter \MT_cramped_internal:Nn \expandafter #1 + \fi +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\MT_cramped_internal:Nn} +% The internal command. +% \begin{macrocode} +\def\MT_cramped_internal:Nn #1#2{ +% \end{macrocode} +% Create a box containing the math and force a cramped style by +% issuing a non-existing radical. +% \begin{macrocode} + \sbox\z@{$\m@th#1\nulldelimiterspace=\z@\radical\z@{#2}$} +% \end{macrocode} +% Then make sure the height is correct. +% \begin{macrocode} + \ifx#1\displaystyle + \dimen@=\fontdimen8\textfont3 + \advance\dimen@ .25\fontdimen5\textfont2 + \else + \dimen@=1.25\fontdimen8 + \ifx#1\textstyle\textfont + \else + \ifx#1\scriptstyle + \scriptfont + \else + \scriptscriptfont + \fi + \fi + 3 + \fi + \advance\dimen@-\ht\z@ \ht\z@=-\dimen@ + \box\z@ +} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Cramped versions of \texttt{\textbackslash +% mathllap}, \texttt{\textbackslash mathclap}, and +% \texttt{\textbackslash mathrlap}} +% \begin{macro}{\crampedllap} +% \begin{macro}{\MT_cramped_llap_internal:Nn} +% \begin{macro}{\crampedclap} +% \begin{macro}{\MT_cramped_clap_internal:Nn} +% \begin{macro}{\crampedrlap} +% \begin{macro}{\MT_cramped_rlap_internal:Nn} +% Cramped versions of \cs{mathXlap} (for speed). Made by the author. +% \begin{macrocode} +\providecommand*\crampedllap[1][\@empty]{ + \ifx\@empty#1\@empty + \expandafter \mathpalette \expandafter \MT_cramped_llap_internal:Nn + \else + \expandafter \MT_cramped_llap_internal:Nn \expandafter #1 + \fi +} +\def\MT_cramped_llap_internal:Nn #1#2{ + {}\llap{\MT_cramped_internal:Nn #1{#2}} +} +\providecommand*\crampedclap[1][\@empty]{ + \ifx\@empty#1\@empty + \expandafter \mathpalette \expandafter \MT_cramped_clap_internal:Nn + \else + \expandafter \MT_cramped_clap_internal:Nn \expandafter #1 + \fi +} +\def\MT_cramped_clap_internal:Nn #1#2{ + {}\clap{\MT_cramped_internal:Nn #1{#2}} +} +\providecommand*\crampedrlap[1][\@empty]{ + \ifx\@empty#1\@empty + \expandafter \mathpalette \expandafter \MT_cramped_rlap_internal:Nn + \else + \expandafter \MT_cramped_rlap_internal:Nn \expandafter #1 + \fi +} +\def\MT_cramped_rlap_internal:Nn #1#2{ + {}\rlap{\MT_cramped_internal:Nn #1{#2}} +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \section{Macros by Michael J.~Downes} +% +% The macros in this section are all by Michael J.~Downes. Either +% they are straight copies of his original macros or inspired and +% extended here. +% +% +% \subsection{Prescript} +% \begin{macro}{\prescript} +% This command is taken from a posting to comp.text.tex on +% December~20th 2000 by Michael J.~Downes. The comments are his. I +% have added some formatting options to the arguments so that a user +% can emulate the \pkg{isotope} package. +% +% \changes{v.1.12}{2012/04/19}{Extended \cs{prescript} to change style +% if used in say S context. Requestd by Oliver Buerschaper.} +% Update 2012: One drawback from MJD's original implementation, is +% that the math style is hardwired, such that if used in say +% \cs{scriptstyle} context, then the style/size of the prescript +% remain the same size. A slightly expensive fix, is to use the +% \cs{mathchoice} construction. First exdent MJD's code a little +% (keeping his comments) +% \begin{macro}{\MT_prescript_inner:} +% We make the style an extra forth argument +% \begin{macrocode} +\newcommand{\MT_prescript_inner:}[4]{ +% \end{macrocode} +% Put the sup in box 0 and the sub in box 2. +% \begin{macrocode} + \@mathmeasure\z@#4{\MT_prescript_sup:{#1}} + \@mathmeasure\tw@#4{\MT_prescript_sub:{#2}} + \if_dim:w \wd\tw@>\wd\z@ + \setbox\z@\hbox to\wd\tw@{\hfil\unhbox\z@} + \else: + \setbox\tw@\hbox to\wd\z@{\hfil\unhbox\tw@} + \fi: +% \end{macrocode} +% Do not let a preceding mathord symbol approach without any +% intervening space. +% \begin{macrocode} + \mathop{} +% \end{macrocode} +% Use \cs{mathopen} to suppress space between the prescripts and the +% base object even when the latter is not of type ord. +% \begin{macrocode} + \mathopen{\vphantom{\MT_prescript_arg:{#3}}}^{\box\z@}\sb{\box\tw@} + \MT_prescript_arg:{#3} +} +% \end{macrocode} +% \end{macro} +% Next create \cs{prescript} using \cs{mathchoice} +% \begin{macrocode} +\DeclareRobustCommand{\prescript}[3]{ + \mathchoice +% \end{macrocode} +% In D and T style, we use MJD's default: +% \begin{macrocode} + {\MT_prescript_inner:{#1}{#2}{#3}{\scriptstyle}} + {\MT_prescript_inner:{#1}{#2}{#3}{\scriptstyle}} +% \end{macrocode} +% In the others we step one style down. Of couse in SS style, using +% \cs{scriptscript} may seem wrong, but there is no lower style. +% \begin{macrocode} + {\MT_prescript_inner:{#1}{#2}{#3}{\scriptscriptstyle}} + {\MT_prescript_inner:{#1}{#2}{#3}{\scriptscriptstyle}} +} +% \end{macrocode} +% \end{macro} +% Then the named arguments. Can you see I'm preparing for templates? +% \begin{macrocode} +\define@key{\MT_options_name:} + {prescript-sup-format}{\def\MT_prescript_sup:{#1}} +\define@key{\MT_options_name:} + {prescript-sub-format}{\def\MT_prescript_sub:{#1}} +\define@key{\MT_options_name:} + {prescript-arg-format}{\def\MT_prescript_arg:{#1}} +\setkeys{\MT_options_name:}{ + prescript-sup-format={}, + prescript-sub-format={}, + prescript-arg-format={}, +} +% \end{macrocode} +% +% \subsection{Math sizes} +% \begin{macro}{\@DeclareMathSizes} +% This command is taken from a posting to comp.text.tex on +% October~17th 2002 by Michael J.~Downes. The purpose is to be able +% to put dimensions on the last three arguments of +% \cs{DeclareMathSizes}. +% \begin{macrocode} +\def\@DeclareMathSizes #1#2#3#4#5{% + \@defaultunits\dimen@ #2pt\relax\@nnil + \if:w $#3$% + \MH_let:cN {S@\strip@pt\dimen@}\math@fontsfalse + \else: + \@defaultunits\dimen@ii #3pt\relax\@nnil + \@defaultunits\@tempdima #4pt\relax\@nnil + \@defaultunits\@tempdimb #5pt\relax\@nnil + \toks@{#1}% + \expandafter\xdef\csname S@\strip@pt\dimen@\endcsname{% + \gdef\noexpand\tf@size{\strip@pt\dimen@ii}% + \gdef\noexpand\sf@size{\strip@pt\@tempdima}% + \gdef\noexpand\ssf@size{\strip@pt\@tempdimb}% + \the\toks@ + }% + \fi: +} +% \end{macrocode} +% \end{macro} +% +% \subsection{Mathematics within italic text} +% mathic: Michael J.~Downes on comp.text.tex, 1998/05/14. +% \begin{macro}{\MT_mathic_true:} +% \begin{macro}{\MT_mathic_false:} +% Renew \cs{(} so that it detects the slant of the font and inserts +% an italic correction. In January 2013 Andrew Swann suggested that +% this should be made robust. It is a little tricky, but seems to +% work. +% \changes{v1.13}{2013/02/11}{Added robustness code} +% \begin{macrocode} +\def\MT_mathic_true: { + \MH_if_boolean:nF {math_italic_corr}{ + \MH_set_boolean_T:n {math_italic_corr} +% \end{macrocode} +% 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). +% \begin{macrocode} + \MH_if_boolean:nTF {robustify}{ + \MH_let:NwN \MT_mathic_redeffer: \DeclareRobustCommand + }{ + \MH_let:NwN \MT_mathic_redeffer: \renewcommand + } + \MH_let:NwN \MT_begin_inlinemath: \( + %\renewcommand*\({ + \MT_mathic_redeffer:*\({ + \relax\ifmmode\@badmath\else + \ifhmode + \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. +% \begin{macrocode} + \if_dim:w \lastskip>\z@ + \skip@\lastskip\unskip +% \end{macrocode} +% \changes{v1.15}{2014/07/16}{Added penalty workaround} +% Here is the fix. +% \begin{macrocode} + \if_num:w \lastpenalty>\z@ + \count@\lastpenalty\unpenalty + \fi: + \@@italiccorr +% \end{macrocode} +% \changes{v1.15}{2014/07/16}{Added penalty workaround} +% And here it is inserted again. +% \begin{macrocode} + \if_num:w \count@>\z@ + \penalty\count@ + \fi: + \hskip\skip@ + \else: + \@@italiccorr + \fi: + \fi: + \fi: + $\fi: + } + } +} +%$ for emacs coloring ;-) +% \end{macrocode} +% Just for restoring the old behavior. +% \begin{macrocode} +\def\MT_mathic_false: { + \MH_if_boolean:nT {math_italic_corr}{ + \MH_set_boolean_F:n {math_italic_corr} +% \end{macrocode} +% When \cs{(} is robust, we cannot simply relet it to the old value, +% as all the robust macro is not saved. Instead we redefined partly +% and force robustness. +% \begin{macrocode} + \MH_if_boolean:nTF {robustify}{ + \edef\({\MT_begin_inlinemath:}% + \forced_EQ_MakeRobust\(% + }{ + \MH_let:NwN \( \MT_begin_inlinemath: + } + } +} +\MH_new_boolean:n {math_italic_corr} +\define@key{\MT_options_name:}{mathic}[true]{ + \@ifundefined{MT_mathic_#1:} + { \MT_true_false_error: + \@nameuse{MT_mathic_false:} + } + { \@nameuse{MT_mathic_#1:} } +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Spreading equations} +% +% Michael J.~Downes on comp.text.tex 1999/08/25 +% \begin{environment}{spreadlines} +% This is meant to be used outside math, just like +% \env{subequations}. +% \begin{macrocode} +\newenvironment{spreadlines}[1]{ + \setlength{\jot}{#1} + \ignorespaces +}{ \ignorespacesafterend } +% \end{macrocode} +% \end{environment} +% +% \subsection{Gathered} +% +% Inspired by Michael J.~Downes on comp.text.tex 2002/01/17. +% \begin{environment}{MT_gathered_env} +% Just like the normal \env{gathered}, only here we're allowed to +% specify actions before and after each line. +% \begin{macrocode} +\MaybeMHPrecedingSpacesOff +\newenvironment{MT_gathered_env}[1][c]{% + \RIfM@\else + \nonmatherr@{\begin{\@currenvir}}% + \fi + \null\,% + \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi\fi \bgroup + \Let@ \chardef\dspbrk@context\@ne \restore@math@cr + \spread@equation + \ialign\bgroup + \MT_gathered_pre: + \strut@$\m@th\displaystyle##$ + \MT_gathered_post: + \crcr +}{% + \endaligned + \MT_gathered_env_end: +} +\MHPrecedingSpacesOn +% \end{macrocode} +% \end{environment} +% \begin{macro}{\newgathered} +% \begin{macro}{\renewgathered} +% \begin{environment}{lgathered} +% \begin{environment}{rgathered} +% \begin{environment}{gathered} +% An easier interface. +% \begin{macrocode} +\newcommand*\newgathered[4]{ + \newenvironment{#1} + { \def\MT_gathered_pre:{#2} + \def\MT_gathered_post:{#3} + \def\MT_gathered_env_end:{#4} + \MT_gathered_env + }{\endMT_gathered_env} +} +\newcommand*\renewgathered[4]{ + \renewenvironment{#1} + { \def\MT_gathered_pre:{#2} + \def\MT_gathered_post:{#3} + \def\MT_gathered_env_end:{#4} + \MT_gathered_env + }{\endMT_gathered_env} +} +\newgathered{lgathered}{}{\hfil}{} +\newgathered{rgathered}{\hfil}{}{} +\renewgathered{gathered}{\hfil}{\hfil}{} +% \end{macrocode} +% \end{environment} +% \end{environment} +% \end{environment} +% \end{macro} +% \end{macro} +% +% \subsection{Split fractions} +% +% Michael J.~Downes on comp.text.tex 2001/12/06. +% \begin{macro}{\splitfrac} +% \begin{macro}{\splitdfrac} +% These commands use \cs{genfrac} to typeset a split fraction. The +% thickness of the fraction rule is simply set to zero. +% \begin{macrocode} +\newcommand*\splitfrac[2]{% + \genfrac{}{}{0pt}{1}% + {\textstyle#1\quad\hfill}% + {\textstyle\hfill\quad\mathstrut#2}% +} +\newcommand*\splitdfrac[2]{% + \genfrac{}{}{0pt}{0}{#1\quad\hfill}{\hfill\quad\mathstrut #2}% +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \section{Bug fixes for \pkg{amsmath}} +% The following fixes some bugs in \pkg{amsmath}, but only if the +% switch is true. +% \begin{macrocode} +\MH_if_boolean:nT {fixamsmath}{ +% \end{macrocode} +% \begin{macro}{\place@tag} +% This corrects a bug in \pkg{amsmath} affecting tag placement in +% \env{flalign}.\footnote{See +% \url{http://www.latex-project.org/cgi-bin/ltxbugs2html?pr=amslatex/3591}} +% \begin{macrocode} +\def\place@tag{% + \iftagsleft@ + \kern-\tagshift@ +% \end{macrocode} +% The addition. If we're in \env{flalign} (meaning +% $\cs{xatlevel@}=\cs{tw@}$) we skip back by an amount of +% \cs{@mathmargin}. This test is also true for the \env{xxalignat} +% environment, but it doesn't matter because a)~it's not +% supported/described in the documentation anymore so new users +% won't know about it and b)~it forbids the use of \cs{tag} +% anyway. +% \begin{macrocode} + \if@fleqn + \if_num:w \xatlevel@=\tw@ + \kern-\@mathmargin + \fi: + \fi: +% \end{macrocode} +% End of additions. +% \begin{macrocode} + \if:w 1\shift@tag\row@\relax + \rlap{\vbox{% + \normalbaselines + \boxz@ + \vbox to\lineht@{}% + \raise@tag + }}% + \else: + \rlap{\boxz@}% + \fi: + \kern\displaywidth@ + \else: + \kern-\tagshift@ + \if:w 1\shift@tag\row@\relax + \llap{\vtop{% + \raise@tag + \normalbaselines + \setbox\@ne\null + \dp\@ne\lineht@ + \box\@ne + \boxz@ + }}% + \else: + \llap{\boxz@}% + \fi: + \fi: +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\x@calc@shift@lf} +% This corrects a bug\footnote{See +% \url{http://www.latex-project.org/cgi-bin/ltxbugs2html?pr=amslatex/3614}} +% in \pkg{amsmath} that could cause a non-positive value of the dimension +% \cs{@mathmargin} to cause an +% \begin{verbatim} +% ! Arithmetic overflow. +% <recently read> \@tempcntb +% \end{verbatim} +% when in \mode{fleqn,leqno} mode. Not very comprehensible for the user. +% \begin{macrocode} +\def\x@calc@shift@lf{% + \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. +% \begin{macrocode} + \if_num:w \@tempcntb=0 + \else: + \global\divide\alignsep@\@tempcntb % original line + \fi: +% \end{macrocode} +% Addition end. +% \begin{macrocode} + \if_dim:w \alignsep@<\minalignsep\relax + \global\alignsep@\minalignsep\relax + \fi: + \fi: + \if_dim:w \tag@width\row@>\@tempdima + \saveshift@1% + \else: + \saveshift@0% + \fi:}% +% \end{macrocode} +% \end{macro} +% \begin{macrocode} +} +% \end{macrocode} +% End of bug fixing. +% +% \subsection{Making environments safer} +% +% \begin{macro}{\aligned@a} +% Here we make the \pkg{amsmath} inner environments disallow spaces +% before their optional positioning specifier. +% \begin{macrocode} +\MaybeMHPrecedingSpacesOff +\renewcommand\aligned@a[1][c]{\start@aligned{#1}\m@ne} +\MHPrecedingSpacesOn +% \end{macrocode} +% \end{macro} +% +% This is the end of the \pkg{mathtools} package. +% \begin{macrocode} +%</package> +% \end{macrocode} +% +% \Finale +\endinput |