From 59415e976c1d0180e39d8bef7eb761131d2a727c Mon Sep 17 00:00:00 2001 From: Takuya Kitazawa Date: Mon, 12 Dec 2022 11:41:19 -0800 Subject: [PATCH] Add missing packages to resolve whedon compilation errors --- paper/dsfont.sty | 9 + paper/enumitem.sty | 1909 +++++++++++++++++++++++++++++++++++++++++++ paper/mathtools.sty | 1839 +++++++++++++++++++++++++++++++++++++++++ paper/mhsetup.sty | 178 ++++ 4 files changed, 3935 insertions(+) create mode 100644 paper/dsfont.sty create mode 100644 paper/enumitem.sty create mode 100644 paper/mathtools.sty create mode 100644 paper/mhsetup.sty diff --git a/paper/dsfont.sty b/paper/dsfont.sty new file mode 100644 index 0000000..8be0422 --- /dev/null +++ b/paper/dsfont.sty @@ -0,0 +1,9 @@ +\ProvidesPackage{dsfont} + [1995/08/01 v0.1 Double stroke roman fonts] + +\def\ds@whichfont{dsrom} +\DeclareOption{sans}{\def\ds@whichfont{dsss}} +\ProcessOptions\relax + +\DeclareMathAlphabet{\mathds}{U}{\ds@whichfont}{m}{n} +\endinput diff --git a/paper/enumitem.sty b/paper/enumitem.sty new file mode 100644 index 0000000..1cb7888 --- /dev/null +++ b/paper/enumitem.sty @@ -0,0 +1,1909 @@ +% +% Copyright (C) 2003-2019 Javier Bezos http://www.texnia.com +% +% This file may be distributed and/or modified under the conditions of +% the MIT License. A version can be found at the end of this file. +% +% Repository: https://github.com/jbezos/enumitem +% +% Release +% ~~~~~~~ + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{enumitem}[2019/06/20 v3.9 Customized lists] + +% Notes +% ~~~~~ +% +% The tag enit@ is used through the style +% +% To do: +% ~~~~~~ +% - ref*, for adding stuff in the same fashion as label* +% - labelled descriptions (ie, label, title, body) +% - A true nextline (far from trivial and perhaps solved with +% labelled descriptions). +% - Improved \AddEnumerateCounter +% - Compatibility with interfaces and zref-enumitem +% - "Pausing" somehow inline boxed text. +% - \@enumctr <-> \@listctr? +% - Define keys with values +% - Revise @nobreak +% - bottomsep +% - \SetEnumerateCounter - must define syntax +% - option verbose +% - collect sizes in \SetEnumitemSizes? +% - series=explicit / resume +% - package option inlinenew, to define "new" inline lists +% +% +=============================+ +% | EMULATING KEYVAL | +% +=============================+ +% +% "Thanks" to xkeyval, which uses the same macro names as keyval :-(, +% the latter has to be replicated in full here to ensure it works as +% intended. The original work is by David Carlisle, under license LPPL. +% Once the code is here, it could be optimized by adapting it to the +% specific needs of enumitem (to do). + +\def\enitkv@setkeys#1#2{% + \def\enitkv@prefix{enitkv@#1@}% + \let\@tempc\relax + \enitkv@do#2,\relax,} + +\def\enitkv@do#1,{% + \ifx\relax#1\empty\else + \enitkv@split#1==\relax + \expandafter\enitkv@do\fi} + +\def\enitkv@split#1=#2=#3\relax{% + \enitkv@@sp@def\@tempa{#1}% + \ifx\@tempa\@empty\else + \expandafter\let\expandafter\@tempc + \csname\enitkv@prefix\@tempa\endcsname + \ifx\@tempc\relax + \enitkv@errx{\@tempa\space undefined}% + \else + \ifx\@empty#3\@empty + \enitkv@default + \else + \enitkv@@sp@def\@tempb{#2}% + \expandafter\@tempc\expandafter{\@tempb}\relax + \fi + \fi + \fi} + +\def\enitkv@default{% + \expandafter\let\expandafter\@tempb + \csname\enitkv@prefix\@tempa @default\endcsname + \ifx\@tempb\relax + \enitkv@err{No value specified for \@tempa}% + \else + \@tempb\relax + \fi} + +\def\enitkv@errx#1{\enit@error{#1}\@ehc} + +\let\enitkv@err\enitkv@errx + +\def\@tempa#1{% + \def\enitkv@@sp@def##1##2{% + \futurelet\enitkv@tempa\enitkv@@sp@d##2\@nil\@nil#1\@nil\relax##1}% + \def\enitkv@@sp@d{% + \ifx\enitkv@tempa\@sptoken + \expandafter\enitkv@@sp@b + \else + \expandafter\enitkv@@sp@b\expandafter#1% + \fi}% + \def\enitkv@@sp@b#1##1 \@nil{\enitkv@@sp@c##1}} + +\@tempa{ } + +\def\enitkv@@sp@c#1\@nil#2\relax#3{\enitkv@toks@{#1}\edef#3{\the\enitkv@toks@}} + +\@ifundefined{KV@toks@} + {\newtoks\enitkv@toks@} + {\let\enitkv@toks@\KV@toks@} + +\def\enitkv@key#1#2{% + \@ifnextchar[% + {\enitkv@def{enumitem#1}{#2}}% + {\@namedef{enitkv@enumitem#1@#2}####1}} + +\def\enitkv@def#1#2[#3]{% + \@namedef{enitkv@#1@#2@default\expandafter}\expandafter + {\csname enitkv@#1@#2\endcsname{#3}}% + \@namedef{enitkv@#1@#2}##1} + +% This ends the code copied from keyval (under LPPL). + +% +=============================+ +% | DEFINITIONS | +% +=============================+ +% +% (1) The package uses a token register very often. To be on the +% safe side, instead of \toks@, etc., a new one is declared. +% (2) \enit@inbox is the box storing the items in boxed inline +% lists. +% (3) \enit@outerparindent is used to save the outer parindent +% so that it can be used in the key parindent +% (4) \enit@type has three values: 0 = enum, 1 = item, 2 = desc. +% (5) \enit@calc stores which dimen is to be computed: +% 0=labelindent, 1=labelwidth, 2=labelsep, 3=leftmargin, +% 4=itemindent +% (6) \enit@resuming has four values: 0 = none, 1 = series, +% 2 = resume* series (computed in group enumitem-resume), +% 3 = resume* list (ie, with no value). + +\chardef \enit@iv=4 +\newlength\labelindent +\newdimen \enit@outerparindent +\newtoks \enit@toks +\newbox \enit@inbox + +\newif\ifenit@boxmode +\newif\ifenit@sepfrommargin +\newif\ifenit@lblfrommargin +\newif\ifenit@calcwidest +\newif\ifenit@nextline +\newif\ifenit@boxdesc + +% An alias (calc-savvy): + +\let\c@enit@cnt\@tempcnta + +\def\enit@meaning{\expandafter\strip@prefix\meaning} +\def\enit@noexcs#1{\expandafter\noexpand\csname#1\endcsname} + +\long\def\enit@afterelse#1\else#2\fi{\fi#1} +\long\def\enit@afterfi#1\fi{\fi#1} +\def\enit@ifunset#1{% + \expandafter\ifx\csname#1\endcsname\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi} +\enit@ifunset{ifcsname}% + {}% + {\def\enit@ifunset#1{% + \ifcsname#1\endcsname + \expandafter\ifx\csname#1\endcsname\relax + \enit@afterelse\expandafter\@firstoftwo + \else + \enit@afterfi\expandafter\@secondoftwo + \fi + \else + \expandafter\@firstoftwo + \fi}} + +% Miscelaneous errors +% =================== + +\def\enit@error{\PackageError{enumitem}} + +\def\enit@checkerror#1#2{% + \enit@error{Unknown value '#2' for key '#1'}% + {See the manual for valid values}} + +\def\enit@itemerror{% + \enit@error{Misplaced \string\item}% + {Either there is some text before the first\MessageBreak + item or the last item has no text}} + +\def\enit@noserieserror#1{% + \enit@error{Series '#1' not started}% + {You are trying to continue a series\MessageBreak + which has not been started with 'series'}} + +\def\enit@checkseries#1{% + \ifcase\enit@resuming + \enit@error{Misplaced key '#1'}% + {'series' and 'resume*' must be used\MessageBreak + in the optional argument of lists}% + \fi} + +\def\enit@checkseries@m{% + \ifcase\enit@resuming\else + \enit@error{Uncompatible series settings}% + {'series' and 'resume*' must not be used\MessageBreak + at the same time}% + \fi} + +\let\enit@toodeep\@toodeep + +\def\@toodeep{% + \ifnum\@listdepth>\enit@listdepth\relax + \enit@toodeep + \else + \count@\@listdepth + \global\advance\@listdepth\@ne + \enit@ifunset{@list\romannumeral\the\@listdepth}% + {\expandafter\let + \csname @list\romannumeral\the\@listdepth\expandafter\endcsname + \csname @list\romannumeral\the\count@\endcsname}{}% + \fi} + +% +=============================+ +% | KEYS | +% +=============================+ +% +% Including code executed by keys. +% +% There are 2 keyval groups: enumitem, and enumitem-delayed. +% The latter is used to make sure a prioritary key is the latest one; +% eg, ref, so that the ref format set by label is overriden. So, when +% this key is found in enumitem, nothing is done, except the key/value +% is moved to enumitem-delayed. +% +% A further group (enumitem-resume) catches resume* and series in +% optional arguments in lists. +% +% Vertical spacing +% ================ + +\enitkv@key{}{topsep}{% + \enit@setlength\topsep{#1}} + +\enitkv@key{}{itemsep}{% + \enit@setlength\itemsep{#1}} + +\enitkv@key{}{parsep}{% + \enit@setlength\parsep{#1}} + +\enitkv@key{}{partopsep}{% + \enit@setlength\partopsep{#1}} + +% Horizontal spacing +% ================== +% +% There are 3 cases: *, ! and a value. The latter also +% cancels widest with the sequence key=* ... key=value +% \string is used, just in case some package changes the +% catcodes. + +\def\enit@calcset#1#2#3{% + \if\string*\string#3% + \enit@calcwidesttrue + \let\enit@calc#2% + \else\if\string!\string#3% + \enit@calcwidestfalse + \let\enit@calc#2% + \else + \ifnum\enit@calc=#2% + \enit@calcwidestfalse + \let\enit@calc\z@ + \fi + \enit@setlength#1{#3}% + \fi\fi} + +\def\enitkv@enumitem@widest#1{% + \ifcase\enit@type % enumerate + \expandafter\let\csname enit@cw@\@enumctr\endcsname\relax + \@namedef{enit@widest@\@enumctr}##1{\enit@format{#1}}% + \else % itemize / description + \def\enit@widest@{\enit@format{#1}}% + \fi} + +\def\enitkv@enumitem@widest@default{% + \expandafter\let\csname enit@cw@\@enumctr\endcsname\relax + \expandafter\let\csname enit@widest@\@enumctr\endcsname\relax} + +\enitkv@key{}{widest*}{% + \setcounter{enit@cnt}{#1}% + \expandafter\edef\csname enit@cw@\@enumctr\endcsname + {\the\c@enit@cnt}% + \expandafter\edef\csname enit@widest@\@enumctr\endcsname##1% + {##1{\the\c@enit@cnt}}} + +\enitkv@key{}{labelindent*}{% + \enit@lblfrommargintrue + \ifnum\enit@calc=\z@ + \enit@calcwidestfalse + \fi + \enit@setlength\labelindent{#1}% + \advance\labelindent\leftmargin} + +\enitkv@key{}{labelindent}{% + \enit@lblfrommarginfalse + \enit@calcset\labelindent\z@{#1}} + +\enitkv@key{}{labelwidth}{% + \enit@calcset\labelwidth\@ne{#1}} + +\enitkv@key{}{leftmargin}{% + \edef\enit@c{\the\leftmargin}% + \enit@calcset\leftmargin\thr@@{#1}% + \ifenit@lblfrommargin + \advance\labelindent-\enit@c\relax + \advance\labelindent\leftmargin + \fi} + +\enitkv@key{}{itemindent}{% + \edef\enit@c{\the\itemindent}% + \enit@calcset\itemindent\enit@iv{#1}% + \ifenit@sepfrommargin + \advance\labelsep-\enit@c\relax + \advance\labelsep\itemindent + \fi} + +\enitkv@key{}{listparindent}{% + \enit@setlength\listparindent{#1}} + +\enitkv@key{}{rightmargin}{% + \enit@setlength\rightmargin{#1}} + +% labelsep, from itemindent; labelsep*, from leftmargin + +\enitkv@key{}{labelsep*}{% + \enit@sepfrommargintrue + \ifnum\enit@calc=\tw@ + \enit@calcwidestfalse + \let\enit@calc\z@ + \fi + \enit@setlength\labelsep{#1}% + \advance\labelsep\itemindent} + +\enitkv@key{}{labelsep}{% + \enit@sepfrommarginfalse + \enit@calcset\labelsep\tw@{#1}} + +\enitkv@key{}{left}{% + \enit@setleft#1..\@empty..\@@} + +\def\enit@setleft#1..#2..#3\@@{% + \enit@setlength\labelindent{#1}% + \edef\enit@a{#3}% + \ifx\enit@a\@empty + \enit@calcset\leftmargin\thr@@*% + \else + \enit@setlength\leftmargin{#2}% + \enit@calcset\labelsep\tw@*% + \fi} + +% Series, resume and start +% ======================== + +\enitkv@key{-resume}{series}{% + \enit@checkseries@m + \let\enit@resuming\@ne %%% TODO - default check also \Set..Key + \ifcase\enit@seriesopt + \enit@ifunset{enitkv@enumitem@#1}{}% + {\enit@error + {Invalid series name '#1'}% + {Do not name a series with an existing key}}% + \else % series=override + \global\@namedef{enitkv@enumitem@#1}% with value + {\enit@error + {Key '#1' has been overriden by a series}% + {Change the series name and/or deactivate series=override}}% + \global\@namedef{enitkv@enumitem@#1@default}{}% + \fi + \def\enit@series{#1}} + +\enitkv@key{}{series}{% + \enit@checkseries{series}} + +\def\enitkv@enumitem@resume#1{% + \edef\enit@series{#1}% + \@nameuse{enit@resume@series@#1}\relax} + +\def\enitkv@enumitem@resume@default{% + \@nameuse{enit@resume@\@currenvir}\relax} + +\@namedef{enitkv@enumitem-resume@resume*}#1{% + \enit@checkseries@m + \let\enit@resuming\tw@ + \edef\enit@series{#1}% + \enit@ifunset{enit@resumekeys@series@#1}% + {\enit@noserieserror{#1}}% + {\expandafter\let\expandafter\enit@resumekeys + \csname enit@resumekeys@series@#1\endcsname}} + +\@namedef{enitkv@enumitem-resume@resume*@default}{% + \let\enit@resuming\thr@@ + \expandafter\let\expandafter\enit@resumekeys + \csname enit@resumekeys@\@currenvir\endcsname + \@nameuse{enit@resume@\@currenvir}\relax} + +\enitkv@key{}{resume*}[]{% + \enit@checkseries{resume*}} + +\newcommand\restartlist[1]{% + \enit@ifunset{end#1}% + {\enit@error{Undefined list '#1'}% + {No list has been defined with that name.}}% + {\expandafter\let + \csname enit@resume@#1\endcsname\@empty}} + +\enitkv@key{}{start}[\@ne]{% + \setcounter{\@listctr}{#1}% + \advance\@nameuse{c@\@listctr}\m@ne} + +% Penalties +% ========= + +\enitkv@key{}{beginpenalty}{% + \@beginparpenalty#1\relax} + +\enitkv@key{}{midpenalty}{% + \@itempenalty#1\relax} + +\enitkv@key{}{endpenalty}{% + \@endparpenalty#1\relax} + +% Font/Format +% =========== + +\enitkv@key{}{format}{% + \def\enit@format{#1}} + +\enitkv@key{}{font}{% + \def\enit@format{#1}} + +% Description styles +% ================== + +\enitkv@key{}{style}[normal]{% + \enit@ifunset{enit@style@#1}% + {\enit@checkerror{style}{#1}}% + {\enit@nextlinefalse + \enit@boxdescfalse + \@nameuse{enit@style@#1}% + \edef\enit@descstyle{\enit@noexcs{enit@#1style}}}} + +\def\enit@style@standard{% + \enit@boxdesctrue + \enit@calcset\itemindent\enit@iv!} + +\let\enit@style@normal\enit@style@standard + +\def\enit@style@unboxed{% + \enit@calcset\itemindent\enit@iv!} + +\def\enit@style@sameline{% + \enit@calcset\labelwidth\@ne!} + +\def\enit@style@multiline{% + \enit@align@parleft + \enit@calcset\labelwidth\@ne!} + +\def\enit@style@nextline{% + \enit@nextlinetrue + \enit@calcset\labelwidth\@ne!} + +% Labels and refs +% =============== + +% Aligment +% -------- + +\enitkv@key{}{align}{% + \enit@ifunset{enit@align@#1}% + {\enit@checkerror{align}{#1}}% + {\csname enit@align@#1\endcsname}} + +% \nobreak for unboxed label with color. See below. + +\newcommand\SetLabelAlign[2]{% + \enit@toks{#2}% + \expandafter\edef\csname enit@align@#1\endcsname + {\def\noexpand\enit@align####1{\nobreak\the\enit@toks}}} + +\def\enit@align@right{% + \def\enit@align##1{\nobreak\hss\llap{##1}}} + +\def\enit@align@left{% + \def\enit@align##1{\nobreak##1\hfil}} + +\def\enit@align@parleft{% + \def\enit@align##1{% + \nobreak + \strut\smash{\parbox[t]\labelwidth{\raggedright##1}}}} + +% \enit@ref has three possible definitions: +% (1) \relax, if there is neither label nor ref (ie, use +% LaTeX settings). +% (2) set ref to @itemlabel, if there is label but not ref +% (3) set ref to ref, if there is ref (with or without label) + +\enitkv@key{}{label}{% + \expandafter\def\@itemlabel{#1}% + \def\enit@ref{\expandafter\enit@reflabel\@itemlabel\z@}} + +\enitkv@key{}{label*}{% + \ifnum\enit@depth=\@ne + \expandafter\def\@itemlabel{#1}% + \else % no level 0 + \advance\enit@depth\m@ne + \enit@toks{#1}% + \expandafter\edef\@itemlabel{% + \enit@noexcs{label\enit@prevlabel}% + \the\enit@toks}% + \advance\enit@depth\@ne + \fi + \def\enit@ref{\expandafter\enit@reflabel\@itemlabel\z@}} + +% ref is set by label, except if there is an explicit ref in the same +% hierarchy level. Explicit refs above the current hierarchy level are +% overriden by label (besides ref), too. Since an explicit ref has +% preference, it's delayed. + +\enitkv@key{}{ref}{% + \g@addto@macro\enit@delayedkeys{,ref=#1}} + +\enitkv@key{-delayed}{ref}{% + \def\enit@ref{\enit@reflabel{#1}\@ne}} + +% #2=0 don't "normalize" (ie, already normalized) +% =1 "normalize" (in key ref) +% Used thru \enit@ref + +\def\enit@reflabel#1#2{% + \ifnum\enit@depth=\@ne\else % no level 0 + \advance\enit@depth\@ne + \@namedef{p@\@enumctr}{}% Don't accumulate labels + \advance\enit@depth\m@ne + \fi + \ifcase#2% + \@namedef{the\@enumctr}{{#1}}% + \else + \enit@normlabel{\csname the\@enumctr\endcsname}{#1}% + \fi} + +% \xxx* in counters (refstar) and widest (calcdef) +% ------------------------------------------------ +% \enit@labellist contains a list of +% \enit@elt{widest}\count\@count\enit@sc@@count +% \enit@elt is either \enit@getwidth or \enit@refstar, defined +% below +% The current implementation is sub-optimal -- labels are stored in +% labellist, counters defined again when processing labels, and +% modifying it is almost impossible. + +\let\enit@labellist\@empty + +\newcommand\AddEnumerateCounter{% + \@ifstar\enit@addcounter@s\enit@addcounter} + +\def\enit@addcounter#1#2#3{% + \enit@toks\expandafter{% + \enit@labellist + \enit@elt{#3}}% + \edef\enit@labellist{% + \the\enit@toks + \enit@noexcs{\expandafter\@gobble\string#1}% + \enit@noexcs{\expandafter\@gobble\string#2}% + \enit@noexcs{enit@sc@\expandafter\@gobble\string#2}}} + +\def\enit@addcounter@s#1#2#3{% + \enit@addcounter{#1}{#2}% + {\@nameuse{enit@sc@\expandafter\@gobble\string#2}{#3}}} + +% The 5 basic counters: + +\AddEnumerateCounter\arabic\@arabic{0} +\AddEnumerateCounter\alph\@alph{m} +\AddEnumerateCounter\Alph\@Alph{M} +\AddEnumerateCounter\roman\@roman{viii} +\AddEnumerateCounter\Roman\@Roman{VIII} + +% Inline lists +% ============ +% +% Labels +% ------ + +\enitkv@key{}{itemjoin}{% + \def\enit@itemjoin{#1}} + +\enitkv@key{}{itemjoin*}{% + \def\enit@itemjoin@s{#1}} + +\enitkv@key{}{afterlabel}{% + \def\enit@afterlabel{#1}} + +% Mode +% ---- + +\enitkv@key{}{mode}{% + \enit@ifunset{enit@mode#1}% + {\enit@checkerror{mode}{#1}}% + {\csname enit@mode#1\endcsname}} + +\let\enit@modeboxed\enit@boxmodetrue +\let\enit@modeunboxed\enit@boxmodefalse + +% Short Labels +% ============ + +\let\enit@marklist\@empty + +% shorthand, expansion: + +\newcommand\SetEnumerateShortLabel[2]{% + \let\enit@a\@empty + \def\enit@elt##1##2{% + \def\enit@b{#1}\def\enit@c{##1}% + \ifx\enit@b\enit@c\else + \expandafter\def\expandafter\enit@a\expandafter{% + \enit@a + \enit@elt{##1}{##2}}% + \fi}% + \enit@marklist + \expandafter\def\expandafter\enit@a\expandafter{% + \enit@a + \enit@elt{#1}{#2}}% + \let\enit@marklist\enit@a} + +\SetEnumerateShortLabel{a}{\alph*} +\SetEnumerateShortLabel{A}{\Alph*} +\SetEnumerateShortLabel{i}{\roman*} +\SetEnumerateShortLabel{I}{\Roman*} +\SetEnumerateShortLabel{1}{\arabic*} + +% This is called \enit@first one,two,three,\@nil\@@nil. If there +% are just one element #2 is \@nil, otherwise we have to remove +% the trailing ,\@nil with enit@first@x +% Called with the keys in \enit@c +% Returns enit@toks + +\def\enit@first#1,#2\@@nil{% + \in@{=}{#1}% Quick test, if contains =, it's key=value + \ifin@\else + \enitkv@@sp@def\enit@a{#1}% + \enit@ifunset{enitkv@enumitem@\enit@meaning\enit@a}% + {\ifnum\enit@type=\z@ + \def\enit@elt{\enit@replace\enit@a}% + \enit@marklist % Returns \enit@toks + \else + \enit@toks{#1}% + \fi + \ifx\@nil#2% + \ifx,#1,\else + \edef\enit@c{label=\the\enit@toks}% + \fi + \else + \@temptokena\expandafter{\enit@first@x#2}% + \edef\enit@c{label=\the\enit@toks,\the\@temptokena}% + \fi}% + {}% + \fi + \enit@toks\expandafter{\enit@c}} + +\def\enit@first@x#1,\@nil{#1} + +\def\enit@replace#1#2#3{% + \enit@toks{}% + \def\enit@b##1#2##2\@@nil{% + \ifx\@nil##2% + \addto@hook\enit@toks{##1}% + \else + \edef\enit@a{\the\enit@toks}% + \ifx\enit@a\@empty\else + \enit@error{Extra short label ignored}% + {There are more than one short label}% + \fi + \addto@hook\enit@toks{##1#3}% + \enit@b##2\@@nil + \fi}% + \expandafter\enit@b#1#2\@nil\@@nil + \edef#1{\the\enit@toks}} + +% Pre and post code +% ================= + +\enitkv@key{}{before}{% + \def\enit@before{#1}} + +\enitkv@key{}{before*}{% + \expandafter\def\expandafter\enit@before\expandafter + {\enit@before#1}} + +\enitkv@key{}{after}{% + \def\enit@after{#1}} + +\enitkv@key{}{after*}{% + \expandafter\def\expandafter\enit@after\expandafter + {\enit@after#1}} + +\enitkv@key{}{first}{% + \def\enit@keyfirst{#1}} + +\enitkv@key{}{first*}{% + \expandafter\def\expandafter\enit@keyfirst\expandafter + {\enit@keyfirst#1}} + +% Miscelaneous keys +% ================ + +\enitkv@key{}{nolistsep}[true]{% + \partopsep=\z@skip + \topsep=\z@ plus .1pt + \itemsep=\z@skip + \parsep=\z@skip} + +\enitkv@key{}{nosep}[true]{% + \partopsep=\z@skip + \topsep=\z@skip + \itemsep=\z@skip + \parsep=\z@skip} + +\enitkv@key{}{noitemsep}[true]{% + \itemsep=\z@skip + \parsep=\z@skip} + +\enitkv@key{}{wide}[\parindent]{% + \enit@align@left + \leftmargin\z@ + \labelwidth\z@ + \enit@setlength\labelindent{#1}% + \listparindent\labelindent + \enit@calcset\itemindent\enit@iv!} + +% The following is deprecated in favour of wide: + +\enitkv@key{}{fullwidth}[true]{% + \leftmargin\z@ + \labelwidth\z@ + \def\enit@align##1{\hskip\labelsep##1}} + +% "Abstract" layer +% ================ +% +% Named values +% ------------ + +\newcommand\SetEnumitemValue[2]{% Implicit #3 + \enit@ifunset{enit@enitkv@#1}% + {\enit@ifunset{enitkv@enumitem@#1}% + {\enit@error{Wrong key '#1' in \string\SetEnumitemValue}% + {Perhaps you have misspelled it}}{}% + \expandafter\let\csname enit@enitkv@#1\expandafter\endcsname + \csname enitkv@enumitem@#1\endcsname}{}% + \@namedef{enitkv@enumitem@#1}##1{% + \def\enit@a{##1}% + \enit@ifunset{enit@enitkv@#1@\enit@meaning\enit@a}% + {\@nameuse{enit@enitkv@#1}{##1}}% + {\@nameuse{enit@enitkv@#1\expandafter\expandafter\expandafter}% + \expandafter\expandafter\expandafter + {\csname enit@enitkv@#1@##1\endcsname}}{}}% + \@namedef{enit@enitkv@#1@#2}} + +% Defining keys +% ------------- + +\newcommand\SetEnumitemKey[2]{% + \enit@ifunset{enitkv@enumitem@#1}% + {\enitkv@key{}{#1}[]{\enitkv@setkeys{enumitem}{#2}}}% + {\enit@error{Duplicated key '#1' in \string\SetEnumitemKey}% + {There already exists a key with that name}}} + +% +=============================+ +% | PROCESSING KEYS | +% +=============================+ +% +% Set keys +% ======== +% +% Default definition. Modified below with package option 'sizes'. + +\def\enit@setkeys#1{% + \enit@ifunset{enit@@#1}{}% + {\expandafter\expandafter\expandafter + \enit@setkeys@i\csname enit@@#1\endcsname\@@}} + +% The following is used directly in resumeset: + +\def\enit@setkeys@i#1\@@{% + \let\enit@delayedkeys\@empty + \enit@shl{#1}% is either \enit@toks or returns it + \expandafter\enit@setkeys@ii\the\enit@toks\@@} + +\def\enit@setkeys@ii#1\@@{% + \enitkv@setkeys{enumitem}{#1}% + \enit@toks\expandafter{\enit@delayedkeys}% + \edef\enit@a{% + \noexpand\enitkv@setkeys{enumitem-delayed}{\the\enit@toks}}% + \enit@a} + +% Handling * and ! values +% ======================= +% +% \@gobbletwo removes \c from \c@counter. + +\def\enit@getwidth#1#2#3#4{% + \let#4#3% + \def#3##1{% + \enit@ifunset{enit@widest\expandafter\@gobbletwo\string##1}% if no widest=key + {#1}% + {\csname enit@widest\expandafter\@gobbletwo\string##1\endcsname{#4}}}} + +\def\enit@valueerror#1{\z@ % if after an assignment, but doesn't catch \ifnum + \enit@error{No default \string\value\space for '#1'}% + {You can provide one with widest*}}% + +\let\enit@values\@empty + +\def\enit@calcwidth{% + \ifenit@calcwidest + \ifcase\enit@type % ie, enum + \enit@ifunset{enit@cw@\@enumctr}% + {\@namedef{enit@cv@\@enumctr}{\enit@valueerror\@enumctr}}% + {\edef\enit@values{% + \enit@values + \@nameuse{c@\@enumctr}\@nameuse{enit@cw@\@enumctr}\relax}% + \expandafter + \edef\csname enit@cv@\@enumctr\endcsname + {\@nameuse{c@\@enumctr}}}% + \begingroup + \enit@values + \def\value##1{\csname enit@cv@##1\endcsname}% + \let\enit@elt\enit@getwidth + \enit@labellist + \settowidth\labelwidth{\@itemlabel}% + \xdef\enit@a{\labelwidth\the\labelwidth\relax}% + \endgroup + \enit@a + \or % ie, item + \ifx\enit@widest@\relax + \settowidth\labelwidth{\@itemlabel}% + \else + \settowidth\labelwidth{\enit@widest@}% + \fi + \else % ie, desc + \ifx\enit@widest@\relax + \settowidth\labelwidth{\@itemlabel}% + \else + \settowidth\labelwidth{\makelabel{\enit@widest@}}% + \fi + \advance\labelwidth-\labelsep + \fi + \fi + \advance\dimen@-\labelwidth} + +\def\enit@calcleft{% + \dimen@\leftmargin + \advance\dimen@\itemindent + \advance\dimen@-\labelsep + \advance\dimen@-\labelindent + \ifcase\enit@calc % = 0 = labelindent + \enit@calcwidth + \advance\labelindent\dimen@ + \or % = 1 = labelwidth, so no \enit@calcwidth + \labelwidth\dimen@ + \or % = 2 = labelsep + \enit@calcwidth + \advance\labelsep\dimen@ + \or % = 3 = leftmargin + \enit@calcwidth + \advance\leftmargin-\dimen@ + \or % = 4 =itemindent + \enit@calcwidth + \advance\itemindent-\dimen@ + \fi} + +\def\enit@negwidth{% + \ifdim\labelwidth<\z@ + \PackageWarning{enumitem}% + {Negative labelwidth. This does not make much\MessageBreak + sense,}% + \fi} + +% "Normalizing" labels +% ==================== +% +% Replaces \counter* by \counter{level} (those in \enit@labellist). +% +% #1 is either \csname...\endcsmame or the container \@itemlabel -- +% hence \expandafter + +\def\enit@refstar@i#1#2{% + \if*#2\@empty + \noexpand#1{\@enumctr}% + \else + \noexpand#1{#2}% + \fi}% + +\def\enit@refstar#1#2#3#4{% + \def#2{\enit@refstar@i#2}% + \def#3{\enit@refstar@i#3}} + +\def\enit@normlabel#1#2{% + \begingroup + \def\value{\enit@refstar@i\value}% + \let\enit@elt\enit@refstar + \enit@labellist + \protected@xdef\enit@a{{#2}}% Added braces as \ref is in the + \endgroup + \expandafter\let#1\enit@a} % global scope. + +% Preliminary settings and default values +% ======================================= + +\def\enit@prelist#1#2#3{% + \let\enit@type#1% + \def\enit@depth{#2}% + \edef\enit@prevlabel{#3\romannumeral#2}% + \advance#2\@ne} + +\newcount\enit@count@id + +\def\enit@tagid{% + \global\advance\enit@count@id\@ne + \edef\EnumitemId{\number\enit@count@id}} + +\def\enit@preset#1#2#3{% + \enit@tagid + \enit@sepfrommarginfalse + \enit@calcwidestfalse + \let\enit@widest@\relax + \let\enit@resuming\z@ + \let\enit@series\relax + \enit@boxmodetrue + \def\enit@itemjoin{ }% + \let\enit@itemjoin@s\relax + \let\enit@afterlabel\nobreakspace + \let\enit@before\@empty + \let\enit@after\@empty + \let\enit@keyfirst\@empty + \let\enit@format\@firstofone % and NOT empty + \let\enit@ref\relax + \labelindent\z@skip + \ifnum\@listdepth=\@ne + \enit@outerparindent\parindent + \else + \parindent\enit@outerparindent + \fi + \enit@setkeys{list}% + \enit@setkeys{list\romannumeral\@listdepth}% + \enit@setkeys{#1}% + \enit@setkeys{#1\romannumeral#2}% + \enit@setresume{#3}} + +% keyval "error" in enumitem-resume: all undefined keys (ie, all +% except resume*) are ignored, but is treated like +% resume*= + +\def\enitkv@err@a#1{% + \enit@ifunset{enit@resumekeys@series@\@tempa}{}% + {\@nameuse{enitkv@enumitem-resume@resume*\expandafter}% + \expandafter{\@tempa}}} + +% keyval "error" in the optional argument: all undefined keys are +% passed to the keyval error, but is ignored (already +% processed in enumitem-resume) + +\def\enitkv@err@b#1{% + \enit@ifunset{enit@resumekeys@series@\@tempa}% + {\enit@savekverr{#1}}% + {}} + +% Process keys in optional argument: + +\def\enit@setresume#1{% + \enit@shl{#1}% Returns enit@toks + \edef\enit@savekeys{\the\enit@toks}% + \let\enit@savekverr\enitkv@errx + \let\enitkv@errx\enitkv@err@a + \edef\enit@b{% + \noexpand\enitkv@setkeys{enumitem-resume}{\the\enit@toks}}% + \enit@b + \let\enitkv@errx\enitkv@err@b + \ifcase\enit@resuming\or\or % = 2, resume* series + \expandafter + \enit@setkeys@i\enit@resumekeys,resume=\enit@series\@@ + \or % = 3 + \expandafter + \enit@setkeys@i\enit@resumekeys,resume\@@ + \fi + \expandafter\enit@setkeys@i\enit@savekeys\@@ + \let\enitkv@errx\enit@savekverr} + +% Handling <> sytax for font sizes +% ================================ +% The following code is based on LaTeX (\DeclareFontShape). Only the +% code for <> is preserved (no functions), and a default value can be +% set before the first <>. In addition, here single values take +% precedende over ranges. The original work is by the LaTeX Team, +% under license LPPL. + +\def\enit@ifnot@nil#1{% + \def\enit@a{#1}% + \ifx\enit@a\@nnil + \expandafter\@gobble + \else + \expandafter\@firstofone + \fi} + +\def\enit@remove@to@nnil#1\@nnil{} +\def\enit@remove@angles#1>{\enit@simple@size} + +\def\enit@simple@size#1<{% + \if<#1<% + \expandafter\enit@remove@angles + \else + \def\enit@c{#1}% + \expandafter\enit@remove@to@nnil + \fi} + +\def\enit@extractrange#1<#2>{% + \ifx\enit@c\relax + \def\enit@c{#1}% + \fi + \enit@isrange#2->\@nil#2>} + +\def\enit@isrange#1-#2\@nil{% + \if>#2% + \expandafter\enit@check@single + \else + \expandafter\enit@check@range + \fi} + +\def\enit@check@range#1-#2>#3<#4\@nnil{% + \enit@ifnot@nil{#3}{% + \def\enit@b{\enit@extractrange<#4\@nnil}% + \upper@bound=% + \enit@ifunset{enit@sizefor@#2}{0#2\p@}{\@nameuse{enit@sizefor@#2}\p@}% + %%% usar count@ + \ifdim\upper@bound=\z@ \upper@bound\maxdimen \fi + \ifdim\f@size\p@<\upper@bound + \lower@bound=% + \enit@ifunset{enit@sizefor@#1}{0#1\p@}{\@nameuse{enit@sizefor@#1}\p@}% + \ifdim\f@size\p@<\lower@bound + \else + \enit@simple@size#3<#4\@nnil + \fi + \fi + \enit@b}} + +\def\enit@check@single#1>#2<#3\@nnil{% + \def\enit@b{\enit@extractrange<#3\@nnil}% + \ifdim\f@size\p@= + \enit@ifunset{enit@sizefor@#1}{0#1\p@}{\@nameuse{enit@sizefor@#1}\p@}% + \enit@simple@size#2<#3\@nnil + \let\enit@d\enit@c + \fi + \enit@b} + +\def\enit@try@size@range#1{% + \def\enit@a{#1}% + \let\enit@c\relax % last in range + \let\enit@d\relax % single + \expandafter\enit@extractrange\enit@a <-*>\@nil<\@nnil + \ifx\enit@d\relax\else\let\enit@c\enit@d\fi} + +% \enit@setlength is defined in the options section + +% This ends the code adapted from latex (under LPPL). + +\def\SetEnumitemSize#1#2{% + {\let\selectfont\relax + #2% + \expandafter\xdef\csname enit@sizefor@#1\endcsname{\f@size}}} + +\SetEnumitemSize{script}\scriptsize +\SetEnumitemSize{tiny}\tiny +\SetEnumitemSize{footnote}\footnotesize +\SetEnumitemSize{small}\small +\SetEnumitemSize{normal}\normalsize +\SetEnumitemSize{large}\large +\SetEnumitemSize{Large}\Large +\SetEnumitemSize{LARGE}\LARGE +\SetEnumitemSize{huge}\huge +\SetEnumitemSize{Huge}\Huge + +% +=============================+ +% | LIST TYPES | +% +=============================+ +% +% Displayed lists +% =============== +% #1 #2 implicit + +\def\enit@dylist{% + \enit@align@right + \list} + +\def\enit@endlist{% + \enit@after + \endlist + \ifx\enit@series\relax\else % discards resume*, too + \ifnum\enit@resuming=\@ne % ie, series= + \enit@setresumekeys{series@\enit@series}\global\global + \else % ie, resume=, resume*= (save count, but not keys) + \enit@setresumekeys{series@\enit@series}\@gobblefour\global + \fi + \enit@afterlist + \fi + \ifnum\enit@resuming=\thr@@ % ie, resume* list (save count only) + \enit@setresumekeys\@currenvir\@gobblefour\global + \else + \enit@setresumekeys\@currenvir\@empty\@empty + \fi + \aftergroup\enit@afterlist} + +% #1 = either \@currenvir or series@ +% #2(keys) #3(counter) are \global, \@gobblefour or \@empty + +\def\enit@setresumekeys#1#2#3{% + \enit@toks\expandafter{\enit@savekeys}% + \xdef\enit@afterlist{% + #2\def\enit@noexcs{enit@resumekeys@#1}{\the\enit@toks}% + \ifnum\enit@type=\z@ % ie, enum + #3\def\enit@noexcs{enit@resume@#1}{% + \csname c@\@listctr\endcsname + \the\csname c@\@listctr\endcsname}% + \fi}} + +% Inline lists +% ============ + +% Definition of \@trivlist inside inline lists. So, when +% \@trivlist is found in any displayed list (including quote, +% center, verbatim...) the default \@item is restored. + +\def\enit@intrivlist{% + \enit@changed@itemfalse + \let\@item\enit@outer@item + \let\par\@@par + \let\@trivlist\enit@outer@triv + \@trivlist} + +% Keep track of \@item and \item changes + +\newif\ifenit@changed@item +\enit@changed@itemfalse + +\newif\ifenit@changeditem +\enit@changeditemfalse + +% List +% ---- + +% Arguments, as before: +% \enitdp@, , , +% About @newlist, see @initem. + +\def\enit@inlist#1#2{% + \ifnum\@listdepth>\enit@listdepth\relax + \@toodeep + \else + \global\advance\@listdepth\@ne + \fi + \let\enit@align\@firstofone + \def\@itemlabel{#1}% + \@nmbrlistfalse + \ifenit@changed@item\else + \enit@changed@itemtrue + \let\enit@outer@triv\@trivlist + \let\@trivlist\enit@intrivlist + \@setpar\@empty + \let\enit@outer@item\@item + \fi + #2\relax + \global\@newlisttrue + \ifenit@boxmode + \ifenit@changeditem\else + \enit@changeditemtrue + \let\enit@outeritem\item + \fi + \let\@item\enit@boxitem + \else + \let\@item\enit@noboxitem + \ifx\enit@itemjoin@s\relax\else + \PackageWarning{enumitem}% + {itemjoin* discarded in mode unboxed\MessageBreak}% + \fi + \fi + \let\enit@calcleft\relax + \let\enit@afteritem\relax + \ifenit@boxmode + \global\setbox\enit@inbox\hbox\bgroup\color@begingroup + \let\item\enit@endinbox + \fi + \ignorespaces} + +\def\enit@endinlist{% + \ifenit@boxmode + \unskip + \xdef\enit@afteritem{% + \ifhmode\spacefactor\the\spacefactor\relax\fi}% + \color@endgroup + \egroup + \ifdim\wd\enit@inbox=\z@ + \enit@itemerror + \else + \ifenit@noinitem\else + \ifhmode\unskip\fi + \enit@ifunset{enit@itemjoin@s}% + {\enit@itemjoin}% + {\enit@itemjoin@s}% + \fi + \unhbox\@labels + \enit@afterlabel + \unhbox\enit@inbox + \enit@afteritem + \fi + \else + \unskip + \if@newlist + \enit@itemerror + \fi + \fi + \enit@after + \global\advance\@listdepth\m@ne + \global\@inlabelfalse + \if@newlist + \global\@newlistfalse + \@noitemerr + \fi + \ifx\enit@series\relax\else % discards resume* list, too + \ifnum\enit@resuming=\@ne % ie, series + \enit@setresumekeys{series@\enit@series}\global\global + \else % ie, resume, resume* (save count, but not keys) + \enit@setresumekeys{series@\enit@series}\@gobblefour\global + \fi + \enit@afterlist + \fi + \ifnum\enit@resuming=\thr@@ % ie, resume* list (save count only) + \enit@setresumekeys\@currenvir\@gobblefour\global + \else + \enit@setresumekeys\@currenvir\@empty\@empty + \fi + \aftergroup\enit@afterlist} + +% \@item: unboxed +% --------------- + +\def\enit@noboxitem[#1]{% + \if@newlist + \leavevmode % ships pending labels out + \global\@newlistfalse + \else + \ifhmode + \unskip + \enit@itemjoin + \else + \noindent + \fi + \fi + \if@noitemarg + \@noitemargfalse + \if@nmbrlist + \refstepcounter{\@listctr}% after \unskip (hyperref) + \fi + \fi + \mbox{\makelabel{#1}}% + \enit@afterlabel + \ignorespaces} + +% \@item: boxed +% ------------ +% +% We don't want \item to be executed locally, because it sets a flag +% (and hyperref adds another flag, too). So, we redefine it inside +% the box to \enit@endinbox which ends the box and then use the actual +% (outer) \item. labels are stored in another box, to detect empty +% boxes, ie, misplaced \item's. Note the 2nd \item ends collecting +% the 1st item and ships it out, while the 3rd \item ends collecting +% the 2nd item, puts the itemjoin and then ships the 2nd item out. +% The flag enit@noinitem keeps track of that. + +\newif\ifenit@noinitem + +\def\enit@endinbox{% + \unskip + \xdef\enit@afteritem{% + \ifhmode\spacefactor\the\spacefactor\relax\fi}% + \color@endgroup + \egroup + \enit@outeritem} + +\def\enit@boxitem[#1]{% + \if@newlist + \global\@newlistfalse + \ifdim\wd\enit@inbox>\z@ + \enit@itemerror + \fi + \enit@noinitemtrue + \leavevmode % ships pending labels out + \else + \ifdim\wd\enit@inbox=\z@ + \enit@itemerror + \else + \ifenit@noinitem + \enit@noinitemfalse + \else + \ifhmode\unskip\fi + \enit@itemjoin + \fi + \unhbox\@labels + \enit@afterlabel + \unhbox\enit@inbox + \enit@afteritem + \fi + \fi + \if@noitemarg + \@noitemargfalse + \if@nmbrlist + \refstepcounter{\@listctr}% + \fi + \fi + \sbox\@labels{\makelabel{#1}}% + \let\enit@afteritem\relax + \setbox\enit@inbox\hbox\bgroup\color@begingroup + \let\item\enit@endinbox + \hskip1sp % in case the first thing is \label + \ignorespaces} + +% Pause item +% ---------- +% +% To do. +% +% The three types +% =============== +% +% enumerate and enumerate* +% ------------------------ +% +% The following has 4 arguments, which in enumerate are: +% \@enumdepth, enum, \thr@@, . +% In user defined environments they are: +% \enitdp@, , , + +\def\enit@enumerate{% + \let\enit@list\enit@dylist + \enit@enumerate@i} + +\@namedef{enit@enumerate*}{% + \let\enit@list\enit@inlist + \enit@enumerate@i} + +\def\enit@enumerate@i#1#2#3#4{% + \ifnum#1>#3\relax + \enit@toodeep + \else + \enit@prelist\z@{#1}{#2}% + \edef\@enumctr{#2\romannumeral#1}% + \expandafter + \enit@list + \csname label\@enumctr\endcsname + {\usecounter\@enumctr + \let\enit@calc\z@ + \def\makelabel##1{\enit@align{\enit@format{##1}}}% + \enit@preset{#2}{#1}{#4}% + \enit@normlabel\@itemlabel\@itemlabel + \enit@ref + \enit@calcleft + \enit@before + \enit@negwidth}% + \enit@keyfirst + \fi} + +\let\enit@endenumerate\enit@endlist +\@namedef{enit@endenumerate*}{\enit@endinlist} + +% itemize and itemize* +% -------------------- +% +% The following has 4 arguments, which in itemize are: +% \@itemdepth, item, \thr@@, . +% In user defined environments they are: +% \enitdp@, , , + +\def\enit@itemize{% + \let\enit@list\enit@dylist + \enit@itemize@i} + +\@namedef{enit@itemize*}{% + \let\enit@list\enit@inlist + \enit@itemize@i} + +\def\enit@itemize@i#1#2#3#4{% + \ifnum#1>#3\relax + \enit@toodeep + \else + \enit@prelist\@ne{#1}{#2}% + \edef\@itemitem{label#2\romannumeral#1}% + \expandafter + \enit@list + \csname\@itemitem\endcsname + {\let\enit@calc\z@ + \def\makelabel##1{\enit@align{\enit@format{##1}}}% + \enit@preset{#2}{#1}{#4}% + \enit@calcleft + \enit@before + \enit@negwidth}% + \enit@keyfirst + \fi} + +\let\enit@enditemize\enit@endlist +\@namedef{enit@enditemize*}{\enit@endinlist} + +% description and description* +% ---------------------------- +% +% Make sure \descriptionlabel exists: + +\providecommand*\descriptionlabel[1]{% + \hspace\labelsep + \normalfont\bfseries#1} + +\@namedef{enit@description*}{% + \let\enit@list\enit@inlist + \enit@description@i} + +\def\enit@description{% + \let\enit@list\enit@dylist + \enit@description@i} + +\def\enit@description@i#1#2#3#4{% + \ifnum#1>#3\relax + \enit@toodeep + \else + \enit@list{}% + {\let\enit@type\tw@ + \advance#1\@ne + \labelwidth\z@ + \enit@align@left + \let\makelabel\descriptionlabel + \enit@style@standard + \enit@preset{#2}{#1}{#4}% + \enit@calcleft + \let\enit@svlabel\makelabel + \def\makelabel##1{% + \labelsep\z@ + \ifenit@boxdesc + \enit@svlabel{\enit@align{\enit@format{##1}}}% + \else + \nobreak + \enit@svlabel{\enit@format{##1}}% + \aftergroup\enit@postlabel + \fi}% + \enit@before + \enit@negwidth}% + \enit@keyfirst + \fi} + +\let\enit@enddescription\enit@endlist +\@namedef{enit@enddescription*}{\enit@endinlist} + +% trivlist +% ======== + +\def\enit@trivlist{% + \let\enit@type\tw@ + \parsep\parskip + \csname @list\romannumeral\the\@listdepth\endcsname + \@nmbrlistfalse + \enit@tagid + \enit@setglobalkeys % ie, list and list + \enit@setkeys{trivlist}% + \enit@setkeys{trivlist\romannumeral\@listdepth}% + \@trivlist + \labelwidth\z@ + \leftmargin\z@ + \itemindent\z@ + \let\@itemlabel\@empty + \def\makelabel##1{##1}} + +% Description styles +% ================== +% +% the next definition is somewhat tricky because labels are boxed. +% That's fine when the label is just placed at the begining of a line +% of text, but when the box is placed without horizontal material, +% leading is killed. So, we need change somehow \box to \unhbox, but +% I don't want to modify \@item. The code below presumes \@item has +% not been changed and arguments gobble the part setting \@labels, +% which is replaced by a new one. +% +% The default value in description is itemindent=!, but some styles +% (those whose item text begin at a fixed place, ie, nextline, +% multiline and sameline) change it to labelwidth=!. +% +% We must be careful with the group and the whatsit added by color to +% boxes. Alignment is applied here and some adjustments in skips are +% necessary to get proper line breaks (including a \nobreak at the +% beginning of \enit@align, ie, after the first whatsit, see above). +% To "pass" the inner group added by color to the box, \enit@postlabel +% ckecks if the following is }. ie, \egroup -- if not, the box has +% not reached yet its end. + +\def\enit@postlabel{% + \@ifnextchar\egroup + {\aftergroup\enit@postlabel}% + {\enit@postlabel@i}} + +\def\enit@postlabel@i#1#2#3#4#5{% + \def\enit@lblpenalty{\penalty\z@\hskip\skip@}% + \ifenit@nextline + \ifdim\wd\@tempboxa>\labelwidth + \def\enit@lblpenalty{\newline\@nobreaktrue}% + \fi + \fi + \everypar{% + \@minipagefalse + \global\@newlistfalse + \if@inlabel + \global\@inlabelfalse + {\setbox\z@\lastbox + \ifvoid\z@ + \kern-\itemindent + \fi}% + \unhbox\@labels + \skip@\lastskip % Save last \labelsep + \unskip % Remove it + \enit@lblpenalty % Restore it, after penalty + \fi + \if@nobreak + \@nobreakfalse + \clubpenalty\@M + \else + \clubpenalty\@clubpenalty + \everypar{}% + \fi}% + \def\enit@a{#1#2#3#4}% + \def\enit@b{\global\setbox\@labels\hbox}% + \ifx\enit@a\enit@b\else + \enit@error{Non standard \string\item}% + {A class or a package has redefined \string\item\MessageBreak + and I do not know how to continue}% + \fi + \global\setbox\@labels\hbox{% + \unhbox\@labels + \hskip\itemindent + \hskip-\labelwidth + \hskip-\labelsep + \ifdim\wd\@tempboxa>\labelwidth + \enit@align{\unhbox\@tempboxa}\unskip % Removes (typically) \hfil + \else + \leavevmode\hbox to\labelwidth{\enit@align{\unhbox\@tempboxa}}% + \fi + \hskip\labelsep}} + +% +=============================+ +% | (RE)DEFINING LISTS | +% +=============================+ +% +% Set keys/values +% =============== +% Remember \romannumeral0 expands to nothing. +% #1 = list name, #2 = level, #3 = flag if star, #4 = keys/values + +\let\enit@keys@sizes\relax + +\def\enit@saveset#1#2#3#4{% + \setcounter{enit@cnt}{#2}% + \ifx\enit@forsize\@empty + \ifcase#3% + \expandafter + \def\csname enit@@#1\romannumeral\c@enit@cnt\endcsname{#4}% + \or + \expandafter\let\expandafter\enit@b + \csname enit@@#1\romannumeral\c@enit@cnt\endcsname + \ifx\enit@b\relax + \let\enit@b\@empty + \fi + \expandafter\def + \csname enit@@#1\romannumeral\c@enit@cnt\expandafter\endcsname + \expandafter{\enit@b,#4}% + \fi + \else + \ifcase#3% + \enit@ifunset{enit@@#1\romannumeral\c@enit@cnt}% + {\expandafter\let + \csname enit@@#1\romannumeral\c@enit@cnt\endcsname\@empty}% + {}% + \expandafter\let\expandafter\enit@b + \csname enit@@#1\romannumeral\c@enit@cnt @@sizes\endcsname + \ifx\enit@b\relax + \let\enit@b\@empty + \fi + \toks@\expandafter{\enit@b}% + \edef\enit@b{\the\toks@\enit@forsize\enit@keys@sizes}% + \expandafter\def + \csname enit@@#1\romannumeral\c@enit@cnt @@sizes\expandafter\endcsname + \expandafter{\enit@b{#4}}% + \else + \enit@error{* and \string<\string> are not compatible}% + {Use either * or angles, but not both.}% + \fi + \fi} + +% TODO: more robust tests (catch wrong key names, but not easy) + +% Internally, LaTeX uses a short name for enumerate (enum) +% and itemize (item). To be consistent with this convention, +% a couple of macros provide a "translation". I'm not very +% happy with the current implementation. + +\def\enit@shortenumerate{enum} +\def\enit@shortitemize{item} + +\newcommand\setlist{% + \@ifstar{\enit@setlist\@ne}{\enit@setlist\z@}} + +\def\enit@setlist#1{% + \@ifnextchar<% + {\enit@setlist@q#1}% + {\let\enit@forsize\@empty\enit@setlist@n#1}} + +% Default definitions. Modified below with option 'sizes': + +\def\enit@setlist@q#1<#2>{% + \enit@error + {Activate this feature with options 'sizes'}% + {Size dependent setting with \string<\string> must be\MessageBreak + explicitly activated with the package option 'sizes'}} + +\def\enit@setlist@n#1{% + \@ifnextchar[{\enit@setlist@x#1}{\enit@setlist@i#1\@empty}} + +% Let's accept \setlist[]*{}, too, because an error in <=3.5.1 + +\def\enit@setlist@x#1[#2]{% + \@ifstar{\enit@setlist@i\@ne{#2}}{\enit@setlist@i#1{#2}}} + +% #1 list names/levels, #2 keys/values + +% #1 star flag, #2 list names/levels, #3 keys/values + +\def\enit@setlist@i#1#2#3{% + \let\enit@eltnames\relax + \let\enit@b\@empty + \let\enit@eltlevels\relax + \let\enit@c\@empty + \protected@edef\enit@a{#2}% + \@for\enit@a:=\enit@a\do{% the 2nd enit@a is first expanded + \enit@ifunset{enitdp@\enit@meaning\enit@a}% + {\edef\enit@c{\enit@c\enit@eltlevels{\enit@a}}}% + {\enit@ifunset{enit@short\enit@meaning\enit@a}% + \@empty + {\edef\enit@a{\@nameuse{enit@short\enit@a}}}% + \edef\enit@b{\enit@b\enit@eltnames{\enit@a}}}}% + \ifx\enit@b\@empty + \def\enit@b{\enit@eltnames{list}}% + \fi + \ifx\enit@c\@empty + \def\enit@c{\enit@eltlevels{0}}% + \fi + \def\enit@eltnames##1{% + \def\enit@a{##1}% + \enit@c}% + \def\enit@eltlevels##1{% + \enit@saveset\enit@a{##1}#1{#3}}% + \enit@b}% + +% Deprecated: + +\newcommand\setdisplayed[1][0]{\setlist[trivlist,#1]} +\let\enitdp@trivlist\@empty % dummy, let know it exists +\newcommand\setenumerate[1][0]{\setlist[enumerate,#1]} +\newcommand\setitemize[1][0]{\setlist[itemize,#1]} +\newcommand\setdescription[1][0]{\setlist[description,#1]} + +% New lists +% ========= + +% When defining a list, \label... and counters must be defined +% for each level, too: + +\def\enit@xset@itemize{% + \@namedef{label\enit@c\romannumeral\count@}{% + \enit@error{Undefined label}% + {You have defined a list, but labels have + not been setup.\MessageBreak + You can set the label field with \string\setlist.}}} +\@namedef{enit@xset@itemize*}{\enit@xset@itemize} + +\def\enit@xset@enumerate{% + \enit@xset@itemize + \enit@ifunset{c@\enit@c\romannumeral\count@}% + {\@definecounter{\enit@c\romannumeral\count@}}{}} +\@namedef{enit@xset@enumerate*}{\enit@xset@enumerate} + +\let\enit@xset@description\@empty +\@namedef{enit@xset@description*}{\enit@xset@description} + +\newcommand\newlist{\enit@newlist\newenvironment} +\newcommand\renewlist{\enit@newlist\renewenvironment} + +% , , , + +\def\enit@newlist#1#2#3#4{% + \enit@ifunset{enit@xset@#3}% + {\enit@error{Unknown list type '#3')}% + {Valid types are: + enumerate, itemize, description,\MessageBreak + enumerate*, itemize*, description*}}% + {}% + \setcounter{enit@cnt}{#4}% + \count@\@ne + \enit@ifunset{enit@short#2}% + {\def\enit@c{#2}}% + {\edef\enit@c{\csname enit@short#2\endcsname}}% + \loop + \@nameuse{enit@xset@#3}% Uses \enit@c + \ifnum\count@<\c@enit@cnt + \advance\count@\@ne + \repeat + \enit@ifunset{enitdp@#2}% + {\expandafter\newcount\csname enitdp@#2\endcsname}{}% + \csname enitdp@#2\endcsname\z@ + \advance\c@enit@cnt\m@ne + \edef\enit@a{% + \noexpand#1{#2}[1][]% + {\enit@noexcs{enit@#3}% + \enit@noexcs{enitdp@#2}% + {\enit@c}% + {\the\c@enit@cnt}% + {####1}}% + {\enit@noexcs{enit@end#3}}}% + \enit@a} + +% Changing the default nesting limit +% ---------------------------------- + +\newcommand\setlistdepth{\def\enit@listdepth} +\setlistdepth{5} + +% +=============================+ +% | PACKAGE OPTIONS | +% +=============================+ + +\newif\ifenit@loadonly + +\DeclareOption{ignoredisplayed}{\let\enit@trivlist\trivlist} +\DeclareOption{includedisplayed}{% + \def\enit@setglobalkeys{% + \enit@setkeys{list}% + \enit@setkeys{list\romannumeral\@listdepth}}} +\let\enit@setglobalkeys\relax + +\DeclareOption{loadonly}{\enit@loadonlytrue} + +\DeclareOption{shortlabels} + {\def\enit@shl#1{% + \ifnum\enit@type=\tw@ + \enit@toks{#1}% + \else + \def\enit@c{#1}% + \enit@first#1,\@nil\@@nil % Returns enit@toks + \fi}} + +\DeclareOption{inline} + {\newenvironment{enumerate*}[1][]% + {\@nameuse{enit@enumerate*}\enitdp@enumerate{enum}\thr@@{#1}} + {\@nameuse{enit@endenumerate*}} + \newenvironment{itemize*}[1][]% + {\@nameuse{enit@itemize*}\enitdp@itemize{item}\thr@@{#1}} + {\@nameuse{enit@enditemize*}} + \newenvironment{description*}[1][]% + {\@nameuse{enit@description*}\enitdp@description{description}\@M{#1}} + {\@nameuse{enit@enddescription*}}} + +\def\enit@setlength{\setlength} +\DeclareOption{sizes} + {\def\enit@setlength#1#2{% + \enit@try@size@range{#2}% Returns \enit@c + \setlength#1{\enit@c}}% + \def\enit@setkeys#1{% + \enit@ifunset{enit@@#1}{}% + {\let\enit@c\@empty + \enit@ifunset{enit@@#1@@sizes}{}% + {\expandafter\let\expandafter\enit@a\csname enit@@#1@@sizes\endcsname + \expandafter\enit@try@size@range\expandafter{\enit@a}% + \def\enit@keys@sizes{\def\enit@c}% + \enit@c + \let\enit@keys@sizes\relax}% + \expandafter\expandafter\expandafter + \enit@setkeys@i + \csname enit@@#1\expandafter\endcsname + \expandafter,\enit@c\@@}}% + \def\enit@setlist@q#1<#2>{% + \def\enit@forsize{<#2>}% + \enit@setlist@n#1}} + +\chardef\enit@seriesopt\z@ +\DeclareOption{series=override}{\chardef\enit@seriesopt\tw@} + +\let\enit@shl\enit@toks + +\ProcessOptions + +\let\trivlist\enit@trivlist + +% If there is no loadonly, redefine the basic lists: + +\ifenit@loadonly\else + +\let\enitdp@enumerate\@enumdepth +\renewenvironment{enumerate}[1][] + {\enit@enumerate\enitdp@enumerate{enum}\thr@@{#1}} + {\enit@endenumerate} + +\let\enitdp@itemize\@itemdepth +\renewenvironment{itemize}[1][] + {\enit@itemize\enitdp@itemize{item}\thr@@{#1}} + {\enit@enditemize} + +\newcount\enitdp@description +\renewenvironment{description}[1][] + {\enit@description\enitdp@description{description}\@M{#1}} + {\enit@enddescription} + +\fi + +% +=============================+ +% | TOOLS | +% +=============================+ + +\def\enit@drawrule#1#2#3#4{% + \rlap{% + \ifdim#1>0pt\relax + \vrule width #1 height #2 depth -#3\relax + \else\ifdim#1=0pt\relax + % + \else + \hskip#1% + \vrule width -#1 height #2 depth -#4\relax + \fi\fi}} + +\def\DrawEnumitemLabel{% + \begingroup + \item[]% + \hskip-\labelsep + \enit@drawrule\labelsep{4pt}{3pt}{2.3pt}% + \hskip-\labelwidth + \enit@drawrule\labelwidth{6pt}{5pt}{4.3pt}% + \hskip\labelwidth + \hskip\labelsep + % + \hskip-\itemindent + \enit@drawrule\itemindent{2pt}{1pt}{.3pt}% + \rlap{\vrule height 9pt depth .5pt}% + \hskip-\leftmargin + \rlap{\vrule height 9pt depth .5pt}% + \enit@drawrule\labelindent{8pt}{7pt}{6.5pt}% + % \message{\the\labelindent/\the\labelwidth/\the\labelsep/\the\itemindent}% + \endgroup} + +% TODO - option 'verbose' + +% +=============================+ +% | TWO-PASS TOOLS | +% +=============================+ + +% TODO - Not for the moment, because both tools would require to take +% into account series and resume, which is not simple. Also, are they +% applied to all lists, by type, by level, by name, etc.? Document how +% to do it in at least the simplest cases. +% +% - reverse counting +% - automatic widest, based on existing labels. + +\endinput + +MIT License +----------- + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/paper/mathtools.sty b/paper/mathtools.sty new file mode 100644 index 0000000..310f4b9 --- /dev/null +++ b/paper/mathtools.sty @@ -0,0 +1,1839 @@ +%% +%% This is file `mathtools.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% mathtools.dtx (with options: `package') +%% +%% This is a generated file. +%% +%% Copyright (C) 2002-2011 by Morten Hoegholm +%% Copyright (C) 2012-2019 by Lars Madsen +%% Copyright (C) 2020- by Lars Madsen, the LaTeX3 project +%% +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.3c 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.3c or later is part of all distributions of +%% LaTeX version 2008/05/04 or later. +%% +%% This work has the LPPL maintenance status "maintained". +%% +%% This Current Maintainer of this work is +%% Lars Madsen and the LaTeX3 project +%% +%% This work consists of the main source file mathtools.dtx +%% and the derived files +%% mathtools.sty, mathtools.pdf, mathtools.ins, mathtools.drv. +%% +\ProvidesPackage{mathtools}% + [2022/02/07 v1.28a mathematical typesetting tools] +\RequirePackage{keyval,calc} +\RequirePackage{mhsetup}[2021/03/18] +\MHInternalSyntaxOn + % 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}}% + }% +} +\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}}% + }% +} +\def\MT_options_name:{mathtools} +\newcommand*\mathtoolsset[1]{\setkeys{\MT_options_name:}{#1}} +\MH_new_boolean:n {fixamsmath} +\DeclareOption{fixamsmath}{ + \MH_set_boolean_T:n {fixamsmath} +} +\DeclareOption{donotfixamsmathbugs}{ + \MH_set_boolean_F:n {fixamsmath} +} +\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 +} +\MH_new_boolean:n {robustify} +\MH_set_boolean_T:n {robustify} +\DeclareOption{nonrobust}{ + \MH_set_boolean_F:n {robustify} +} +\DeclareOption*{ + \PassOptionsToPackage{\CurrentOption}{amsmath} +} +\ExecuteOptions{fixamsmath,disallowspaces} +\ProcessOptions\relax +\MHInternalSyntaxOff +\RequirePackage{amsmath}[2016/11/05] +\MHInternalSyntaxOn +\AtEndOfPackage{\MHInternalSyntaxOff} +\def\MT_true_false_error:{ + \PackageError{mathtools} + {You~ have~ to~ select~ either~ `true'~ or~ `false'} + {I'll~ assume~ you~ chose~ `false'~ for~ now.} +} +\def\MT_define_tagform:nwnn #1[#2]#3#4{ + \@namedef{MT_tagform_#1:n}##1 + {\maketag@@@{#3\ignorespaces#2{##1}\unskip\@@italiccorr#4}} +} +\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.}} +} +\newtagform{default}{(}{)} +\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[]}% + } +} +\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}} } + \MH_if_boolean:nT {show_only_refs}{ + \MH_let:NwN \MT_prev_tagform:n \tagform@ + \def\tagform@##1{\MT_extended_tagform:n {##1}} + } +} +\MH_new_boolean:n {manual_tag} +\MH_new_boolean:n {raw_maketag} +\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} +} +\def\MT_extended_tagform:n #1{ + \MH_set_boolean_F:n {raw_maketag} + \MH_if_meaning:NN \df@label\@empty + \MH_if_boolean:nTF {manual_tag}% this was \MH_if_boolean:nT before + { \MH_if_boolean:nTF {show_manual_tags} + { \MT_prev_tagform:n {#1} } + { \stepcounter{equation} } + }{\kern1sp}% this last {\kern1sp} is new. + \MH_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} + { \global\MH_set_boolean_F:n {manual_tag} \kern1sp } % kern added 2020 + { \MT_prev_tagform:n {#1} } + \@safe@activesfalse + } + } + { + \@safe@activestrue + \@ifundefined{MT_r_\df@label} + { \kern1sp }% kern added 2020 + { \refstepcounter{equation}\MT_prev_tagform:n {#1} } + \@safe@activesfalse + } + \MH_fi: + \global\MH_set_boolean_T:n {raw_maketag} +} +\def\MT_extended_maketag:n #1{ + \ifx\df@label\@empty + \MT_maketag:n {#1} + \MH_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} } + \MH_fi: + \global\MH_set_boolean_F:n {manual_tag} +} +\def\MT_extended_eqref:n #1{ + \protected@write\@auxout{} + {\string\MT@newlabel{#1}} + \textup{\let\df@label\@empty\MT_prev_tagform:n {\ref{#1}}} +} +\EQ_MakeRobust\MT_extended_eqref:n +\newcommand*\refeq[1]{ + \textup{\ref{#1}} +} +\def\MT_extended_refeq:n #1{ + \protected@write\@auxout{} + {\string\MT@newlabel{#1}} + \textup{\ref{#1}} +} +\newcommand*\MT@newlabel[1]{ \global\@namedef{MT_r_#1}{} } +\MH_new_boolean:n {show_only_refs} +\MH_new_boolean:n {show_manual_tags} +\define@key{\MT_options_name:}{showmanualtags}[true]{ + \@ifundefined{MH_boolean_show_manual_tags_#1:} + { \MT_true_false_error: + \@nameuse{MH_boolean_show_manual_tags_false:} + } + { \@nameuse{MH_boolean_show_manual_tags_#1:} } +} +\newcommand*\MT_showonlyrefs_true:{ + \MH_if_boolean:nF {show_only_refs}{ + \MH_set_boolean_T:n {show_only_refs} + \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 + \def\tagform@##1{\MT_extended_tagform:n {##1}} + \MH_let:NwN \eqref \MT_extended_eqref:n + \MH_let:NwN \refeq \MT_extended_refeq:n + } +} +\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:} +} +\renewcommand\nonumber{ + \if@eqnsw + \MH_if_meaning:NN \incr@eqnum\@empty + \MH_if_boolean:nF {show_only_refs} + {\addtocounter{equation}\m@ne} + \MH_fi: + \MH_fi: + \MH_let:NwN \print@eqnum\@empty \MH_let:NwN \incr@eqnum\@empty + \global\@eqnswfalse +} +\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} + +\providecommand\@safe@activestrue{}% +\providecommand\@safe@activesfalse{}% + +\MHInternalSyntaxOn +\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\ }} +\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} +\def\MT_longrightarrow_fill:{% + \arrowfill@\relbar\relbar\longrightarrow} +\def\MT_longleftarrow_fill:{% + \arrowfill@\longleftarrow\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}} +\providecommand*\xlongrightarrow[2][]{% + \ext@arrow 0359\MT_longrightarrow_fill:{#1}{#2}} +\providecommand*\xlongleftarrow[2][]{% + \ext@arrow 3095\MT_longleftarrow_fill:{#1}{#2}} +\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} +\providecommand*\xmapsto[2][]{% + \ext@arrow 0395\MT_mapsto_fill:{#1}{#2}} +\def\MT_mapsto_fill:{% + \arrowfill@{\mapstochar\relbar}\relbar\rightarrow} +\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} +\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} +\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}% + \upbracefill\crcr\noalign{\kern.5\fontdimen5\textfont2}}}}\limits} +\MH_let:NwN \LaTeXoverbrace \overbrace +\def\overbrace#1{\mathop{\vbox{\m@th\ialign{##\crcr + \noalign{\kern.5\fontdimen5\textfont2}% + \downbracefill\crcr + \noalign{\kern.7\fontdimen5\textfont2\nointerlineskip}% + $\hfil\displaystyle{#1}\hfil$\crcr}}}\limits} +\providecommand*\lparen{(} +\providecommand*\rparen{)} + +\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 + } +} +\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 + } +} +\AtBeginDocument{ + \providecommand*\dblcolon{\vcentcolon\mathrel{\mkern-.9mu}\vcentcolon} + \providecommand*\coloneqq{\vcentcolon\mathrel{\mkern-1.2mu}=} + \providecommand*\Coloneqq{\dblcolon\mathrel{\mkern-1.2mu}=} + \providecommand*\coloneq{\vcentcolon\mathrel{\mkern-1.2mu}\mathrel{-}} + \providecommand*\Coloneq{\dblcolon\mathrel{\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{\vcentcolon\mathrel{\mkern-1.2mu}\approx} + \providecommand*\Colonapprox{\dblcolon\mathrel{\mkern-1.2mu}\approx} + \providecommand*\colonsim{\vcentcolon\mathrel{\mkern-1.2mu}\sim} + \providecommand*\Colonsim{\dblcolon\mathrel{\mkern-1.2mu}\sim} +} +\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 +\newcommand*\MT_test_for_tcb_other:nnnnn [1]{ + \MH_if:w t#1\relax + \expandafter\MH_use_choice_i:nnnn + \MH_else: + \MH_if:w c#1\relax + \expandafter\expandafter\expandafter\MH_use_choice_ii:nnnn + \MH_else: + \MH_if:w b#1\relax + \expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter\expandafter + \MH_use_choice_iii:nnnn + \MH_else: + \expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter\expandafter + \MH_use_choice_iv:nnnn + \MH_fi: + \MH_fi: + \MH_fi: +} +\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-\normallineskip} +} +\def\MT_mult_mathcr_atat:w [#1]{% + \MH_if_num:w 0=`{\MH_fi: \iffalse}\MH_fi: + \MH_if_boolean:nT {mult_firstline}{ + \kern\l_MT_mult_left_fdim + \MT_mult_invisible_line: + } + \crcr + \noalign{\vskip#1\relax} + \global\advance\g_MT_multlinerow_int\@ne + \MH_if_num:w \g_MT_multlinerow_int=\l_MT_multline_lastline_fint + \MH_let:NwN \math@cr@@\MT_mult_last_mathcr:w + \MH_fi: +} +\def\MT_mult_firstandlast_mathcr:w [#1]{% + \MH_if_num:w 0=`{\MH_fi: \iffalse}\MH_fi: + \kern\l_MT_mult_left_fdim + \MT_mult_invisible_line: + \noalign{\vskip#1\relax} + \kern\l_MT_mult_right_fdim +} +\def\MT_mult_last_mathcr:w [#1]{ + \MH_if_num:w 0=`{\MH_fi: \iffalse}\MH_fi:\math@cr@@@ + \noalign{\vskip#1\relax} + \kern\l_MT_mult_right_fdim} +\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 +} +\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 +} +\newcommand*\MT_mult_internal:n [1]{ + \MH_if_boolean:nF {outer_mult}{\alignedspace@left} %<-- requires amsmath 2016/11/05 + \MT_next: + \bgroup + \Let@ + \def\l_MT_multline_lastline_fint{0 } + \chardef\dspbrk@context\@ne \restore@math@cr + \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} + \MT_measure_mult:n {#1} + \MH_if_dim:w \l_MT_multwidth_dim<\l_MT_multline_measure_fdim + \MH_setlength:dn \l_MT_multwidth_dim{\l_MT_multline_measure_fdim} + \fi + \MH_set_boolean_T:n {mult_firstline} + \MH_if_num:w \l_MT_multline_lastline_fint=\@ne + \MH_let:NwN \math@cr@@ \MT_mult_firstandlast_mathcr:w + \MH_fi: + \ialign\bgroup + \hfil\strut@$\m@th\displaystyle{}##$\hfil + \crcr + \hfilneg + #1 +} +\newcommand\MT_measure_mult:n [1]{ + \begingroup + \measuring@true + \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 +} +\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}} + { + \MH_if_meaning:NN \@empty#1\@empty + \MH_else: + \setlength \l_MT_multwidth_dim{#1} + \MH_fi: + } + \MT_start_mult:N \MT_mult_default_pos: +} +\ifx\directlua\@undefined + % THIS IS NORMAL + \newcommand\MultlinedHook{ + \renewenvironment{subarray}[1]{% + \vcenter\bgroup + \Let@ \restore@math@cr \default@tag + \let\math@cr@@\AMS@math@cr@@ % <--- the fix + \baselineskip\fontdimen10 \scriptfont\tw@ + \advance\baselineskip\fontdimen12 \scriptfont\tw@ + \lineskip\thr@@\fontdimen8 \scriptfont\thr@@ + \lineskiplimit\lineskip + \ialign\bgroup\ifx c##1\hfil\fi + $\m@th\scriptstyle####$\hfil\crcr + }{% + \crcr\egroup\egroup + } + \renewenvironment{crampedsubarray}[1]{% + \vcenter\bgroup + \Let@ \restore@math@cr \default@tag + \let\math@cr@@\AMS@math@cr@@ % <--- the fix + \baselineskip\fontdimen10 \scriptfont\tw@ + \advance\baselineskip\fontdimen12 \scriptfont\tw@ + \lineskip\thr@@\fontdimen8 \scriptfont\thr@@ + \lineskiplimit\lineskip + \ialign\bgroup\ifx c##1\hfil\fi + \span\MT_cramped_internal:Nn \scriptstyle {####}% + \hfil\crcr + }{% + \crcr\egroup\egroup + } + % from mathtools + \def\MT_smallmatrix_begin:N ##1{% + \Let@\restore@math@cr\default@tag + \let\math@cr@@\AMS@math@cr@@ % <--- the fix + \baselineskip6\ex@ \lineskip1.5\ex@ \lineskiplimit\lineskip + \csname MT_smallmatrix_##1_begin:\endcsname + } + % from amsmath + \renewenvironment{smallmatrix}{\null\,\vcenter\bgroup + \Let@\restore@math@cr\default@tag + \let\math@cr@@\AMS@math@cr@@ % <--- the fix + \baselineskip6\ex@ \lineskip1.5\ex@ \lineskiplimit\lineskip + \ialign\bgroup\hfil$\m@th\scriptstyle####$\hfil&&\thickspace\hfil + $\m@th\scriptstyle####$\hfil\crcr + }{% + \crcr\egroup\egroup\,% + } + } +\else + % THIS IS LUALATEX + \newcommand\MultlinedHook{ + % from amsmath + \renewenvironment{subarray}[1]{% + \vcenter\bgroup + \Let@ \restore@math@cr \default@tag + \let\math@cr@@\AMS@math@cr@@ % <--- the fix + \baselineskip \Umathstacknumup \scriptstyle + \advance\baselineskip \Umathstackdenomdown \scriptstyle + \lineskip \Umathstackvgap \scriptstyle + \lineskiplimit \lineskip + \ialign\bgroup\ifx c##1\hfil\fi + \Ustartmath + \m@th\scriptstyle#### + \Ustopmath + \hfil\crcr + }{% + \crcr\egroup\egroup + } + % from mathtools + \renewenvironment{crampedsubarray}[1]{% + \vcenter\bgroup + \Let@ \restore@math@cr \default@tag + \let\math@cr@@\AMS@math@cr@@ % <--- the fix + \baselineskip \Umathstacknumup \scriptstyle + \advance\baselineskip \Umathstackdenomdown \scriptstyle + \lineskip \Umathstackvgap \scriptstyle + \lineskiplimit \lineskip + \ialign\bgroup\ifx c##1\hfil\fi + \Ustartmath + \crampedscriptstyle{####} + \Ustopmath + \hfil\crcr + }{% + \crcr\egroup\egroup + } + % from mathtools + \def\MT_smallmatrix_begin:N ##1{% + \Let@\restore@math@cr\default@tag + \let\math@cr@@\AMS@math@cr@@ % <--- the fix + \baselineskip6\ex@ \lineskip1.5\ex@ \lineskiplimit\lineskip + \csname MT_smallmatrix_##1_begin:\endcsname + } + % from amsmath + \renewenvironment{smallmatrix}{\null\,\vcenter\bgroup + \Let@\restore@math@cr\default@tag + \let\math@cr@@\AMS@math@cr@@ % <--- the fix + \baselineskip6\ex@ \lineskip1.5\ex@ \lineskiplimit\lineskip + \ialign\bgroup\hfil$\m@th\scriptstyle####$\hfil&&\thickspace\hfil + $\m@th\scriptstyle####$\hfil\crcr + }{% + \crcr\egroup\egroup\,% + } + } +\fi + +\newenvironment{multlined}[1][] + {\MH_group_align_safe_begin: + \MultlinedHook + \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}} + { + \MH_if_meaning:NN \@empty#1\@empty + \MH_else: + \setlength \l_MT_multwidth_dim{#1} + \MH_fi: + } + \MT_multlined_second_arg:w + } + { + \hfilneg \endaligned \MH_group_align_safe_end: + } +\MHPrecedingSpacesOn +\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, +} +\def\MT_gobblelabel:w #1{} +\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 _nostarscaled_wrapper:nnn}##1##2##3{ + \mathopen{##1}##2\mathclose{##3} + } + \@namedef{MT_delim_\MH_cs_to_str:N #1 _nostarnonscaled_wrapper:nnn}##1##2##3{ + \mathopen##1##2\mathclose##3 + } + } + +\newcommand\reDeclarePairedDelimiterInnerWrapper[3]{ + \@ifundefined{MT_delim_\MH_cs_to_str:N #1 _ #2 _wrapper:nnn}{ + \PackageError{mathtools}{ + Wrapper~not~found~for~\string#1~and~option~'#2'.\MessageBreak + Either~\string#1~is~ not~ defined,~or~ you~ are~using~ the~ + \MessageBreak + 'nostar'~ option,~which~ is~ no~ longer~ supported.~ + \MessageBreak + Please~ use~ 'nostarnonscaled'~ or~ 'nostarscaled~ + \MessageBreak instead.~ + }{See the manual} + }{ + \@namedef{MT_delim_\MH_cs_to_str:N #1 _ #2 _wrapper:nnn}##1##2##3{ + #3 + } + } +} + +\def\MT_etb_ifdefempty_x:nnn #1{ + \expandafter\expandafter\expandafter + \MT_etb_ifblank:nnn + \expandafter\expandafter\expandafter{% + \expandafter\strip@prefix\meaning#1} +} +\def\MT_etb_ifblank:nnn #1{ + \expandafter\ifx\expandafter\relax\detokenize\expandafter{\@gobble#1?}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi +} + +\newcommand*\DeclarePairedDelimiter[3]{% + \@ifdefinable{#1}{ + \MT_delim_default_inner_wrappers:n{#1} % define the wrappers + \@namedef{MT_delim_\MH_cs_to_str:N #1 _star:}##1 + { \@nameuse{MT_delim_\MH_cs_to_str:N #1 _star_wrapper:nnn}% + {\left#2}{##1}{\right#3} }% + \@xp\@xp\@xp + \newcommand + \@xp\csname MT_delim_\MH_cs_to_str:N #1 _nostar:\endcsname + [2][\\@gobble] + { + \def\@tempa{\\@gobble} + \def\@tempb{##1} + \ifx\@tempa\@tempb + \@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostarnonscaled_wrapper:nnn}% + {#2} + {##2} + {#3} + \else + \MT_etb_ifblank:nnn {##1}{ + \@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostarnonscaled_wrapper:nnn}% + {#2} + {##2} + {#3} + }{ + \@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostarscaled_wrapper:nnn}% + {\@nameuse {\MH_cs_to_str:N ##1 l} #2} + {##2} + {\@nameuse {\MH_cs_to_str:N ##1 r} #3} + } + \fi + } + \DeclareRobustCommand{#1}{ + \@ifstar + {\@nameuse{MT_delim_\MH_cs_to_str:N #1 _star:}} + {\@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostar:}} + } + } +} +\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 + } + +\def\@MHempty{} +\newcommand\MT_delim_inner_generator:nnnnnnn [7]{ + \@xp\@xp\@xp + \newcommand + \@xp\csname MT_delim_\MH_cs_to_str:N #1 _nostar_inner:\endcsname + [#2] + { + #3 + \def\@tempa{\@MHempty} + \@xp\def\@xp\@tempb\@xp{\delimsize} + \ifx\@tempa\@tempb + \@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostarnonscaled_wrapper:nnn} + {#4}{#7}{#5} + \else + \MT_etb_ifdefempty_x:nnn {\delimsize}{ + \@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostarnonscaled_wrapper:nnn} + {#4}{#7}{#5} + }{ + \@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostarscaled_wrapper:nnn} + { + \@xp\@xp\@xp\csname\@xp\MH_cs_to_str:N \delimsize l\endcsname #4 + } + {#7} + { + \@xp\@xp\@xp\csname\@xp\MH_cs_to_str:N \delimsize r\endcsname #5 + } + } + \fi + #6 + \endgroup + } +} + +\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:} + } + \MT_delim_inner_generator:nnnnnnn {#1}{#2}{#3}{#4}{#5}{#6}{#7} + \DeclareRobustCommand{#1}{ + \@ifstar + {\@nameuse{MT_delim_\MH_cs_to_str:N #1 _star:}} + {\@nameuse{MT_delim_\MH_cs_to_str:N #1 _nostar:}} + } + } +} + +\def\DeclarePairedDelimiterX#1[#2]#3#4#5{ + \DeclarePairedDelimiterXPP{#1}[#2]{}{#3}{#4}{}{#5} +} + +\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 + \strut@#2 \strut@ + #3 + \crcr +} +\def\MH_end_cases:{\crcr\egroup + \restorecolumn@ + \egroup + \MH_group_align_safe_end: +} +\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} +} +\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}{.} +\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} +\MaybeMHPrecedingSpacesOff +\newenvironment{matrix*}[1][c] + {\MT_matrix_begin:N #1} + {\MT_matrix_end:} +\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} +\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:} +\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 +\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=\, +} + +\MHPrecedingSpacesOn +\newcommand*\smashoperator[2][lr]{ + \@ifundefined{MT_smop_smash_#1:NNNNN}{ + \PackageError{mathtools}{Opt~ arg~ '#1'~ for~ \@backslashchar smashoperator~ + is~ not~ supported.\MessageBreak Use~ l,~r~or~lr~ (default)}{} + }{ + \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 + } +} +\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} +\MH_new_boolean:n {smop_one} +\MH_new_boolean:n {smop_two} +\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} + \MH_if_meaning:NN \MT_smop_arg_A: \MT_smop_mathop:n + \MH_if_meaning:NN \MT_smop_arg_C:\MT_smop_limits: + \def\MT_smop_final_arg_A:{#1{#2}}% + \MH_if_meaning:NN \MT_smop_arg_D: \@nnil + \MH_else: + \MH_set_boolean_T:n {smop_one} + \MH_let:NwN \MT_smop_final_arg_B: \MT_smop_arg_D: + \MH_let:NwN \MT_smop_final_arg_C: \MT_smop_arg_E: + \MH_if_meaning:NN \MT_smop_arg_F: \@nnil + \MH_else: + \MH_set_boolean_T:n {smop_two} + \MH_let:NwN \MT_smop_final_arg_D: \MT_smop_arg_F: + \edef\MT_smop_final_arg_E: + {\expandafter\MT_smop_remove_nil_vi:N \MT_smop_arg_G: } + \MH_fi: + \MH_fi: + \MH_else: + \def\MT_smop_final_arg_A:{#1{#2}}% + \MH_if_meaning:NN \MT_smop_arg_D: \@nnil + \MH_else: + \MH_set_boolean_T:n {smop_one} + \MH_let:NwN \MT_smop_final_arg_B: \MT_smop_arg_C: + \MH_let:NwN \MT_smop_final_arg_C: \MT_smop_arg_D: + \MH_if_meaning:NN \MT_smop_arg_F: \@nnil + \MH_else: + \MH_set_boolean_T:n {smop_two} + \MH_let:NwN \MT_smop_final_arg_D: \MT_smop_arg_E: + \MH_let:NwN \MT_smop_final_arg_E: \MT_smop_arg_F: + \MH_fi: + \MH_fi: + \MH_fi: + \MH_else: + \MH_if_meaning:NN \MT_smop_arg_B:\MT_smop_limits: + \def\MT_smop_final_arg_A:{#1}% + \MH_if_meaning:NN \MT_smop_arg_D: \@nnil + \MH_else: + \MH_set_boolean_T:n {smop_one} + \MH_let:NwN \MT_smop_final_arg_B: \MT_smop_arg_C: + \MH_let:NwN \MT_smop_final_arg_C: \MT_smop_arg_D: + \MH_if_meaning:NN \MT_smop_arg_F: \@nnil + \MH_else: + \MH_set_boolean_T:n {smop_two} + \MH_let:NwN \MT_smop_final_arg_D: \MT_smop_arg_E: + \MH_let:NwN \MT_smop_final_arg_E: \MT_smop_arg_F: + \MH_fi: + \MH_fi: + \MH_else: + \def\MT_smop_final_arg_A:{#1}% + \MH_if_meaning:NN \MT_smop_arg_C: \@nnil + \MH_else: + \MH_set_boolean_T:n {smop_one} + \MH_let:NwN \MT_smop_final_arg_B: \MT_smop_arg_B: + \MH_let:NwN \MT_smop_final_arg_C: \MT_smop_arg_C: + \MH_if_meaning:NN \MT_smop_arg_D: \@nnil + \MH_else: + \MH_set_boolean_T:n {smop_two} + \MH_let:NwN \MT_smop_final_arg_D: \MT_smop_arg_D: + \MH_let:NwN \MT_smop_final_arg_E: \MT_smop_arg_E: + \MH_fi: + \MH_fi: + \MH_fi: + \MH_fi: + \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 +} +\def\MT_smop_needed_args:NNNNN #1#2#3#4#5{% + \displaystyle #1 + \MH_if_boolean:nT {smop_one}{ + \limits#2{\MT_cramped_clap_internal:Nn \scriptstyle{#3}} + \MH_if_boolean:nT {smop_two}{ + #4{\MT_cramped_clap_internal:Nn \scriptstyle{#5}} + } + } +} +\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 +} +\def\MT_smop_smash_l:NNNNN #1#2#3#4#5{ + \MT_smop_needed_args:NNNNN #1#2#3#4#5\kern\@tempdima +} +\def\MT_smop_smash_r:NNNNN #1#2#3#4#5{ + \kern\@tempdima\MT_smop_needed_args:NNNNN #1#2#3#4#5 +} +\def\MT_smop_smash_lr:NNNNN #1#2#3#4#5{ + \MT_smop_needed_args:NNNNN #1#2#3#4#5 +} +\MH_let:NwN \MT_smop_smash_rl:NNNNN \MT_smop_smash_lr:NNNNN +\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 +} +\newcommand*\adjustlimits[6]{ + \sbox\z@{$\m@th \displaystyle #1$} + \sbox\tw@{$\m@th \displaystyle #4$} + \@tempdima=\dp\z@ \advance\@tempdima-\dp\tw@ + \MH_if_dim:w \@tempdima>\z@ + \mathop{#1}\limits#2{#3} + \MH_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}} + } + \MH_fi: + \MH_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}} + } + \MH_else: + \mathop{#4}\limits#5{#6} + \MH_fi: +} +\newcommand\SwapAboveDisplaySkip{% + \noalign{\vskip-\abovedisplayskip\vskip\abovedisplayshortskip} +} + +\newcommand\MoveEqLeft[1][2]{\kern #1em & \kern -#1em} +\newcommand\Aboxed[1]{\let\bgroup{\romannumeral-`}\@Aboxed#1&&\ENDDNE} +\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}% +} +\newcommand\MakeAboxedCommand[2]{ + % #1: command to create + % #2: box command to use + \newcommand#1[1]{\let\bgroup{\romannumeral-`}% + \@nameuse{@@\MH_cs_to_str:N #1}##1&&\ENDDNE} + \@namedef{@@\MH_cs_to_str:N #1}##1&##2&##3\ENDDNE{% + \settowidth\@tempdimc{#2{}}% + \ifnum0=`{}\fi \setbox \z@ + \hbox{$\displaystyle##1{}\m@th$\kern0.5\@tempdimc}% + \edef\@tempa{\kern\wd\z@&\kern-\the\wd\z@% + \fboxsep\the\fboxsep \fboxrule \the\fboxrule}% + \@tempa% + #2{\m@th$\displaystyle ##1##2$}% + } +} + +\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 + \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 +\newcommand\vdotswithin[1]{% + {\mathmakebox[\widthof{\ensuremath{{}#1{}}}][c]{{\vdots}}}} +\newlength\origjot +\setlength\origjot{\jot} +\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}} +\setkeys{\MT_options_name:}{ + shortvdotsadjustabove=2.15\origjot, + shortvdotsadjustbelow=\origjot +} +\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 +} +\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 +\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 + } +} + +\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 +} +\def\MH_nuparrow: {% + \mathrel{\mathpalette\MH_nrotarrow:NN\nrightarrow} } +\def\MH_ndownarrow: {% + \mathrel{\mathpalette\MH_nrotarrow:NN\nleftarrow} } +\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:}} } +\def\MH_bigtimes_scaler:N #1{% + \vcenter{\hbox{#1$\m@th\mkern-2mu\times\mkern-2mu$}}} +\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 +} +\def\MH_csym_bigtimes: {\mathop{\MH_bigtimes_inner:}\displaylimits} +\AtBeginDocument{ + \providecommand\bigtimes{\MH_csym_bigtimes:} +} +\MH_let:NwN \MT_orig_intertext: \intertext@ +\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}} +\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 + \ifdim\@totalleftmargin=\z@ + \linewidth + \else + -\maxdimen + \fi + =\columnwidth + \else \parshape\@ne \@totalleftmargin \linewidth + \fi + \noindent\ignorespaces##1\par}% + \penalty\predisplaypenalty\vskip\abovedisplayskip% + \vskip-\lineskiplimit % CCS + \vskip\normallineskiplimit % CCS + \vskip\l_MT_below_intertext_sep + }% + }% + % also activate \shortintertext, such that is is only available when + % \intertext is + \MH_let:NwN \shortintertext \shortintertext@ +} +\def\MT_orig_intertext_true: { + \MH_let:NwN \intertext@ \MT_orig_intertext: + \MH_let:NwN \shortintertext \shortintertext@ +} +\def\MT_orig_intertext_false: { \MH_let:NwN \intertext@ \MT_intertext: } +\define@key{\MT_options_name:}{original-intertext}[true]{ + \@nameuse{MT_orig_intertext_#1:} +} +\setkeys{\MT_options_name:}{ + original-intertext=false +} +\def\MT_orig_shortintertext:n #1{% + \ifvmode\else\\\@empty\fi + \noalign{% + \penalty\postdisplaypenalty\vskip\abovedisplayshortskip + \vbox{\normalbaselines + \MH_if_dim:w + \MH_if_dim:w \@totalleftmargin=\z@ + \linewidth + \MH_else: + -\maxdimen + \MH_fi: + =\columnwidth + \MH_else: + \parshape\@ne \@totalleftmargin \linewidth + \MH_fi: + \noindent\ignorespaces#1\par}% + \penalty\predisplaypenalty\vskip\abovedisplayshortskip% + }% +} +\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}} +\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}} +\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}} +\setkeys{\MT_options_name:}{ + aboveshortintertextdim=3pt, + belowshortintertextdim=3pt +} +\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 + \MH_if_dim:w + \MH_if_dim:w \@totalleftmargin=\z@ + \linewidth + \MH_else: + -\maxdimen + \MH_fi: + =\columnwidth + \MH_else: + \parshape\@ne \@totalleftmargin \linewidth + \MH_fi: + \noindent\ignorespaces#1\par}% + \penalty\predisplaypenalty\vskip\abovedisplayshortskip% + \vskip-\lineskiplimit + \vskip\normallineskiplimit + \vskip\l_MT_below_shortintertext_sep + }% +} +\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 } +\newcommand{\shortintertext}{\@amsmath@err{\Invalid@@\shortintertext}\@eha} +\define@key{\MT_options_name:}{original-shortintertext}[true]{ + \@nameuse{MT_orig_shortintertext_#1:} +} +\setkeys{\MT_options_name:}{ + original-shortintertext=false +} +\providecommand*\clap[1]{\hb@xt@\z@{\hss#1\hss}} +\providecommand*\mathllap[1][\@empty]{ + \relax\ifx\@empty#1\@empty + \expandafter \mathpalette \expandafter \MT_mathllap:Nn + \else + \expandafter \MT_mathllap:Nn \expandafter #1 + \fi +} +\providecommand*\mathrlap[1][\@empty]{ + \relax\ifx\@empty#1\@empty + \expandafter \mathpalette \expandafter \MT_mathrlap:Nn + \else + \expandafter \MT_mathrlap:Nn \expandafter #1 + \fi +} +\providecommand*\mathclap[1][\@empty]{ + \relax\ifx\@empty#1\@empty + \expandafter \mathpalette \expandafter \MT_mathclap:Nn + \else + \expandafter \MT_mathclap:Nn \expandafter #1 + \fi +} +\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}$}} +\providecommand*\mathmbox{\mathpalette\MT_mathmbox:nn} +\def\MT_mathmbox:nn #1#2{\mbox{$\m@th#1#2$}} +\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]}} +\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} +\def\mathsm@sh#1#2{% + \setbox\z@\hbox{$\m@th#1{#2}$}{}\finsm@sh} +\providecommand*\cramped[1][\@empty]{ + \relax\ifx\@empty#1\@empty + \expandafter \mathpalette \expandafter \MT_cramped_internal:Nn + \else + \expandafter \MT_cramped_internal:Nn \expandafter #1 + \fi +} +\def\MT_cramped_internal:Nn #1#2{ + %% \sbox\z@{$\m@th#1\kern-\nulldelimiterspace\radical\z@{#2}$} + \setbox\z@\hbox{$\m@th#1\kern-\nulldelimiterspace\radical\z@{#2}$} + \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@ + \ifvmode\leavevmode\fi + {}\box\z@ +} +\ifx\directlua\@undefined\else + \def\MT_cramped_internal:Nn #1#2{ + { + \ensuremath { + \use:c { cramped \cs_to_str:N #1 } #2 + } + } + } +\fi + +\providecommand*\crampedllap[1][\@empty]{ + \relax\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]{ + \relax\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]{ + \relax\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}} +} +\ifx\directlua\@undefined +\newenvironment{crampedsubarray}[1]{% + \vcenter\bgroup + \Let@ \restore@math@cr \default@tag + \baselineskip\fontdimen10 \scriptfont\tw@ + \advance\baselineskip\fontdimen12 \scriptfont\tw@ + \lineskip\thr@@\fontdimen8 \scriptfont\thr@@ + \lineskiplimit\lineskip + \ialign\bgroup\ifx c#1\hfil\fi + %%$\m@th\scriptstyle\kern-\nulldelimiterspace\radical\z@{##}$% <-- changed line + \span\MT_cramped_internal:Nn \scriptstyle {##}% + \hfil\crcr +}{% + \crcr\egroup\egroup +} +\else +\newenvironment{crampedsubarray}[1]{% + \vcenter\bgroup + \Let@ \restore@math@cr \default@tag + \baselineskip \Umathstacknumup \scriptstyle + \advance\baselineskip \Umathstackdenomdown \scriptstyle + \lineskip \Umathstackvgap \scriptstyle + \lineskiplimit \lineskip + \ialign\bgroup\ifx c#1\hfil\fi + \Ustartmath + \crampedscriptstyle{##} + \Ustopmath + \hfil\crcr +}{% + \crcr\egroup\egroup +} +\fi +\newcommand{\crampedsubstack}[1]{\crampedsubarray{c}#1\endcrampedsubarray} +\newcommand{\MT_prescript_inner:}[4]{ + \@mathmeasure\z@#4{\MT_prescript_sup:{#1}} + \@mathmeasure\tw@#4{\MT_prescript_sub:{#2}} + \MH_if_dim:w \wd\tw@>\wd\z@ + \setbox\z@\hbox to\wd\tw@{\hfil\unhbox\z@} + \MH_else: + \setbox\tw@\hbox to\wd\z@{\hfil\unhbox\tw@} + \MH_fi: + \mathop{} + \mathopen{\vphantom{\MT_prescript_arg:{#3}}}^{\box\z@}\sb{\box\tw@} + \MT_prescript_arg:{#3} +} +\DeclareRobustCommand{\prescript}[3]{ + \mathchoice + {\MT_prescript_inner:{#1}{#2}{#3}{\scriptstyle}} + {\MT_prescript_inner:{#1}{#2}{#3}{\scriptstyle}} + {\MT_prescript_inner:{#1}{#2}{#3}{\scriptscriptstyle}} + {\MT_prescript_inner:{#1}{#2}{#3}{\scriptscriptstyle}} +} +\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={}, +} +\ifx\e@alloc\@undefined% kernel thus older than 2015 + \def\@DeclareMathSizes #1#2#3#4#5{% + \@defaultunits\dimen@ #2pt\relax\@nnil + \MH_if:w $#3$% + \MH_let:cN {S@\strip@pt\dimen@}\math@fontsfalse + \MH_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@ + }% + \MH_fi: + } +\fi +\def\MT_mathic_true: { + \MH_if_boolean:nF {math_italic_corr}{ + \MH_set_boolean_T:n {math_italic_corr} + \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 + \MH_if_dim:w \fontdimen\@ne\font>\z@ + \MH_if_dim:w \lastskip>\z@ + \skip@\lastskip\unskip + \MH_if_num:w \lastpenalty>\z@ + \count@\lastpenalty\unpenalty + \MH_fi: + \@@italiccorr + \MH_if_num:w \count@>\z@ + \penalty\count@ + \MH_fi: + \hskip\skip@ + \MH_else: + \@@italiccorr + \MH_fi: + \MH_fi: + \MH_fi: + $\MH_fi: + } + } +} +\def\MT_mathic_false: { + \MH_if_boolean:nT {math_italic_corr}{ + \MH_set_boolean_F:n {math_italic_corr} + \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:} } +} +\newenvironment{spreadlines}[1]{ + \setlength{\jot}{#1} + \ignorespaces +}{ \ignorespacesafterend } +\MaybeMHPrecedingSpacesOff +\newenvironment{MT_gathered_env}[1][c]{% + \RIfM@\else + \nonmatherr@{\begin{\@currenvir}}% + \fi + %\null\,% + \alignedspace@left% + \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 +\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}{} +\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}% +} +\MH_if_boolean:nT {fixamsmath}{ +\def\place@tag{% + \iftagsleft@ + \kern-\tagshift@ + \if@fleqn + \MH_if_num:w \xatlevel@=\tw@ + \kern-\@mathmargin + \MH_fi: + \MH_fi: + \MH_if:w 1\shift@tag\row@\relax + \rlap{\vbox{% + \normalbaselines + \boxz@ + \vbox to\lineht@{}% + \raise@tag + }}% + \MH_else: + \rlap{\boxz@}% + \MH_fi: + \kern\displaywidth@ + \MH_else: + \kern-\tagshift@ + \MH_if:w 1\shift@tag\row@\relax + \llap{\vtop{% + \raise@tag + \normalbaselines + \setbox\@ne\null + \dp\@ne\lineht@ + \box\@ne + \boxz@ + }}% + \MH_else: + \llap{\boxz@}% + \MH_fi: + \MH_fi: +} +\def\x@calc@shift@lf{% + \MH_if_dim:w \eqnshift@=\z@ + \global\eqnshift@\@mathmargin\relax + \alignsep@\displaywidth + \advance\alignsep@-\totwidth@ + \MH_if_num:w \@tempcntb=0 + \MH_else: + \global\divide\alignsep@\@tempcntb % original line + \MH_fi: + \MH_if_dim:w \alignsep@<\minalignsep\relax + \global\alignsep@\minalignsep\relax + \MH_fi: + \MH_fi: + \MH_if_dim:w \tag@width\row@>\@tempdima + \saveshift@1% + \MH_else: + \saveshift@0% + \MH_fi:}% +} +\MaybeMHPrecedingSpacesOff +\renewcommand\aligned@a[1][c]{\start@aligned{#1}\m@ne} +\MHPrecedingSpacesOn +\newbox\xmathstrut@box +\newdimen\xmathstrut@dim +\def\xmathstrut{\@dblarg\xmathstrut@} +\def\xmathstrut@[#1]#2{% + \def\xmathstrut@dp{#1}% + \vphantom{\mathpalette\xmathstrut@do{#2}}% +} +\def\xmathstrut@do#1#2{% + \setbox\xmathstrut@box\hbox{$#1($}%)%emacs + \xmathstrut@dim\dimexpr\ht\xmathstrut@box+\dp\xmathstrut@box\relax + \ht\xmathstrut@box\dimexpr\ht\xmathstrut@box + +#2\xmathstrut@dim + \relax + \dp\xmathstrut@box\dimexpr\dp\xmathstrut@box + +\xmathstrut@dp\xmathstrut@dim + \relax + \box\xmathstrut@box} + +\endinput +%% +%% End of file `mathtools.sty'. diff --git a/paper/mhsetup.sty b/paper/mhsetup.sty new file mode 100644 index 0000000..56b2dc4 --- /dev/null +++ b/paper/mhsetup.sty @@ -0,0 +1,178 @@ +%% +%% This is file `mhsetup.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% mhsetup.dtx (with options: `package') +%% +%% This is a generated file. +%% +%% Copyright (C) 2002-2007,2010 by Morten Hoegholm +%% Copyright (C) 2017-2019 by Lars Madsen +%% Copyright (C) 2020- by Lars Madsen, The LaTeX3 team +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.3c 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.3c or later is part of all distributions of +%% LaTeX version 2008/05/04 or later. +%% +%% This work has the LPPL maintenance status "maintained". +%% +%% This Current Maintainer of this work is Lars Madsen +%% , The LaTeX3 team https://github.com/latex3/mathtools +%% +%% This work consists of the main source file mhsetup.dtx +%% and the derived files +%% mhsetup.sty, mhsetup.pdf, mhsetup.ins, mhsetup.drv. +%% +\ProvidesPackage{mhsetup}% + [2021/03/18 v1.4 programming setup (MH)] +\def\MHInternalSyntaxOn{ + \edef\MHInternalSyntaxOff{% + \catcode`\noexpand\~=\the\catcode`\~\relax + \catcode`\noexpand\ =\the\catcode`\ \relax + \catcode`\noexpand\^^I=\the\catcode`\^^I\relax + \catcode`\noexpand\@=\the\catcode`\@\relax + \catcode`\noexpand\:=\the\catcode`\:\relax + \catcode`\noexpand\_=\the\catcode`\_\relax + \endlinechar=\the\endlinechar\relax + }% + \catcode`\~=10\relax + \catcode`\ =9\relax + \catcode`\^^I=9\relax + \makeatletter + \catcode`\_=11\relax + \catcode`\:=11\relax + \endlinechar=` % + \relax +} +\MHInternalSyntaxOn +\AtEndOfPackage{\MHInternalSyntaxOff} +\let\MH_let:NwN \let +\def\MH_let:cN #1#2{ + \expandafter\MH_let:NwN \csname#1\endcsname#2} +\def\MH_let:cc #1#2{ + \expandafter\MH_let:NwN\csname#1\expandafter\endcsname + \csname#2\endcsname} +\def\MH_new_boolean:n #1{ + \expandafter\@ifdefinable\csname MH_if_boolean_#1:\endcsname{ + \@namedef{MH_boolean_#1_true:} + {\MH_let:cN{MH_if_boolean_#1:}\iftrue} + \@namedef{MH_boolean_#1_false:} + {\MH_let:cN{MH_if_boolean_#1:}\iffalse} + \@nameuse{MH_boolean_#1_false:}% + } +} +\def\MH_set_boolean_F:n #1{ \@nameuse{MH_boolean_#1_false:} } +\def\MH_set_boolean_T:n #1{ \@nameuse{MH_boolean_#1_true:} } +\def\MH_if_boolean:nTF #1{ + \@nameuse{MH_if_boolean_#1:} + \expandafter\@firstoftwo + \MH_else: + \expandafter\@secondoftwo + \MH_fi: +} +\def\MH_if_boolean:nT #1{ + \@nameuse{MH_if_boolean_#1:} + \expandafter\@firstofone + \MH_else: + \expandafter\@gobble + \MH_fi: +} +\def\MH_if_boolean:nF #1{ + \@nameuse{MH_if_boolean_#1:} + \expandafter\@gobble + \MH_else: + \expandafter\@firstofone + \MH_fi: +} +\@ifundefined{MH_if:w}{\MH_let:NwN \MH_if:w =\if}{} +\@ifundefined{MH_if_meaning:NN}{\MH_let:NwN \MH_if_meaning:NN =\ifx}{} +\@ifundefined{MH_else:}{\MH_let:NwN \MH_else:=\else}{} +\@ifundefined{MH_fi:}{\MH_let:NwN \MH_fi:=\fi}{} +\AtBeginDocument{ + \@ifundefined{MH_if_num:w}{\MH_let:NwN \MH_if_num:w =\ifnum}{} + \@ifundefined{MH_if_dim:w}{\MH_let:NwN \MH_if_dim:w =\ifdim}{} + \@ifundefined{MH_if_case:w}{\MH_let:NwN \MH_if_case:w =\ifcase}{} +} +\@ifundefined{MH_or:}{\MH_let:NwN \MH_or:=\or}{} +\def\MH_cs_to_str:N {\expandafter\@gobble\string} +\@ifundefined{eTeXversion} + { + \MH_let:NwN \MH_protected:\relax + \def\MH_setlength:dn{\setlength} + \def\MH_addtolength:dn{\addtolength} + } + { + \MH_let:NwN \MH_protected:\protected + \def\MH_setlength:dn #1#2{#1=\dimexpr#2\relax\relax} + \def\MH_addtolength:dn #1#2{\advance#1 \dimexpr#2\relax\relax} + } + +\def\MH_keyval_alias_with_addon:nnnn #1#2#3#4{ + \@namedef{KV@#1@#2}{\@nameuse{KV@#1@#3}#4} + \@namedef{KV@#1@#2@default}{\@nameuse{KV@#1@#3@default}#4}} +\def\MH_keyval_alias:nnn #1#2#3{ + \MH_keyval_alias_with_addon:nnnn {#1}{#2}{#3}{}} +\def\MH_use_choice_i:nnnn #1#2#3#4{#1} +\def\MH_use_choice_ii:nnnn #1#2#3#4{#2} +\def\MH_use_choice_iii:nnnn #1#2#3#4{#3} +\def\MH_use_choice_iv:nnnn #1#2#3#4{#4} +\long\def\MH_nospace_ifnextchar:Nnn #1#2#3{ + \MH_group_align_safe_begin: % added 2021/01/14 + \MH_let:NwN\reserved@d=~#1 + \def\reserved@a{\MH_group_align_safe_end: #2} % changed 2021/01/14 + \def\reserved@b{\MH_group_align_safe_end: #3} % changed 2021/01/14 + \futurelet\@let@token\MH_nospace_nextchar: +} +\def\MH_nospace_nextchar:{ + \MH_if_meaning:NN \@let@token\reserved@d + \MH_let:NwN \reserved@b\reserved@a + \MH_fi: + \reserved@b +} +\long\def\MH_nospace_testopt:nn #1#2{ + \MH_nospace_ifnextchar:Nnn[ + {#1} + {#1[{#2}]} +} +\def\MH_nospace_protected_testopt:n #1{ + \MH_if_meaning:NN \protect\@typeset@protect + \expandafter\MH_nospace_testopt:nn + \MH_else: + \@x@protect#1 + \MH_fi: +} +\@ifundefined{kernel@ifnextchar} + {\MH_let:NwN \kernel@ifnextchar \@ifnextchar} + {} +\MH_let:NwN \MH_kernel_xargdef:nwwn \@xargdef +\long\def\MH_nospace_xargdef:nwwn #1[#2][#3]#4{ + \@ifdefinable#1{ + \expandafter\def\expandafter#1\expandafter{ + \expandafter + \MH_nospace_protected_testopt:n + \expandafter + #1 + \csname\string#1\endcsname + {#3}} + \expandafter\@yargdef + \csname\string#1\endcsname + \tw@ + {#2} + {#4}}} +\providecommand*\MHPrecedingSpacesOff{ + \MH_let:NwN \@xargdef \MH_nospace_xargdef:nwwn +} +\providecommand*\MHPrecedingSpacesOn{ + \MH_let:NwN \@xargdef \MH_kernel_xargdef:nwwn +} +\def \MH_group_align_safe_begin: {\iffalse{\fi\ifnum0=`}\fi} +\def \MH_group_align_safe_end: {\ifnum0=`{}\fi} +\endinput +%% +%% End of file `mhsetup.sty'.