
\ifdefined \minimmathloaded
    \message{(skipped)}
    \expandafter\endinput \fi
\chardef\minimmathloaded=\catcode`:
\catcode`:=11

\input minim-alloc

% \mathdef c {expansion}
\protected\def\mathdef#1#2{%
    \protected\def\mathdef:tmp{#2}%
    \mathcode`#1="8000\relax
    \letcharcode`#1=\mathdef:tmp}
% \mathlet c \csname
\let\mathlet = \mathdef

% sensible defaults
\matheqdirmode = 1 % short skips also in rtl
\mathdisplayskipmode = 1
%
% not set here, but maybe relevant:
%
% \mathsurroundskip    = ...
% \mathitalicsmode     = 1
% \mathscriptboxmode   = 2
% \matheqnogapstep     = 1000 % default value
% \predisplaygapfactor = 2000 % default value

% 1 Global style transformations

% first, helper functions for parsing arguments

\def\math:parselist#1#2#3#4{% \function \argwrap {list} {arg}
    \edef\math:expandedlist{{#3}}%
    \def\math:listaction##1{#1{##1}{#2{#4}}}%
    \expandafter\splitcommalist
        \expandafter\math:parseitem
            \math:expandedlist}

\def\math:parseitem#1{\math:getrange#1--\math:getrange}
\def\math:getrange#1-#2-{\def\math:tmp{#2}%
    \ifx\math:tmp\empty \math:singleargument{#1}\fi
    \math:rangeargument{#1}{#2}}
\def\math:singleargument#1#2\math:getrange{\fi%
    \math:listaction{#1}}
\def\math:rangeargument#1#2#3\math:getrange{%
    \math:listaction{\the\numexpr(#1)@\the\numexpr(#2)}}

\def\math:simplequote#1{#1}
\def\math:tonumber#1{\the\numexpr(#1)\relax}

% then, the user interface

\protected\def\mathcls{\math:parselist\math:mathcls\math:simplequote}
\protected\def\mathfam{\math:parselist\math:mathfam\math:tonumber}
\protected\def\mathmap{\math:parselist\math:mathmap\math:simplequote}

% defined from the lua side: \usemathvariant, \usemathdefault, \mathstyle

% 1 Local style transformations

% We use the variable class, but not the family mechanism
\fam = -1
\let\setfam=\fam

% for backwards compatibility with plain.tex
\newcount\math:famcount
\protected\def\fam{%
    \afterassignment\math:fam
    \math:famcount}
\def\math:fam{%
    \ifcase\math:famcount
        \mathstyle{up}\or
        \mathstyle{it}\or
        \mathstyle{cal}\or
        \or % plain family 3 is \tenex
        \mathstyle{it}\or
        \mathstyle{sf}\or % slanted math not in unicode
        \mathstyle{bf}\or
        \mathstyle{tt}\fi}

% style switches
\protected\def\mit#1{{\mathstyle{it}#1}}
\protected\def\mup#1{{\mathstyle{up}#1}}
\protected\def\mbf#1{{\mathstyle{bf}#1}}
\protected\def\mbfit#1{{\mathstyle{bfit}#1}}
\protected\def\mbb#1{{\mathstyle{bb}#1}}
\protected\def\frak#1{{\mathstyle{frak}#1}}
\protected\def\bffrak#1{{\mathstyle{bffrak}#1}}
\protected\def\scr#1{{\mathstyle{scr}#1}}     \let\mcal  = \scr
\protected\def\bfscr#1{{\mathstyle{bfscr}#1}} \let\bfcal = \bfscr

% 1 Processing the character table

\newcount \radicalfam    \radicalfam    = 0
\newcount \accentfam     \accentfam     = 0
\newcount \extensiblefam \extensiblefam = 0

\protected\def\math:accent{\ifmmode% spec num char
    \expandafter\math:mathaccent\else
    \expandafter\math:textaccent\fi}
\def\math:mathaccent#1#2#3{\Umathaccent #1"0 \accentfam #2 }
\def\math:textaccent#1#2#3#4{#4#3}% might be a normal combining accent

\protected\def\math:stack#1#2#3{% spec num char
    \withoptions[]{\math:stack:{#1}{#2}{#3}}}
\def\math:stack:#1#2#3[#4]#5{%
    {\mathop{\math:accent{#1}{#2}{#3}{#5}}%
        \ifx\math:stack#4\math:stack\else \limits
            \ifx\math:stack#1\math:stack^\else_\fi{#4}\fi}}

\protected\def\math:radical{\ifmmode% num char
    \expandafter\math:mathradical\else
    \expandafter\math:textradical\fi}
\def\math:mathradical#1#2{\Uradical\radicalfam #1 }
\def\math:textradical#1#2{#2}

% We initiate the processing here instead of from the lua side, because the lua 
% file will be executed again inside \everyjob. We are only setting parameters 
% here that will be saved to the format file, so we need not repeat it.

\directlua{%
    local m = require('minim-math')
    local file = kpse.find_file('minim-math-table', 'lua')
    local table = loadfile(file)()
    for _, t in ipairs(table) do
        m.add_mathchar(t)
    end
}

% 1 Fixing a few characters

% fixing a math cs (prevents expansion loops)
\def\explicitmathchar#1{%
    \expandafter\Umathcharnumdef
        \expandafter#1%
            \expandafter\Umathcodenum
                \expandafter`#1}

% special characters must be explicit
\explicitmathchar\lbrace    \let\{=\lbrace
\explicitmathchar\rbrace    \let\}=\rbrace
\explicitmathchar\percent
\explicitmathchar\mathdollar
\explicitmathchar\octothorpe
\explicitmathchar\ampersand

% decimal comma settings
\explicitmathchar \comma
\Umathchardef \ordcomma "0"0"2C
\protected\def\smartcomma{%
    \futurelet\smartcomma:next\smartcomma:do}
\def\smartcomma:do{\let\smartcomma:c\comma
    \ifx0\smartcomma:next\let\smartcomma:c\ordcomma\fi
    \ifx1\smartcomma:next\let\smartcomma:c\ordcomma\fi
    \ifx2\smartcomma:next\let\smartcomma:c\ordcomma\fi
    \ifx3\smartcomma:next\let\smartcomma:c\ordcomma\fi
    \ifx4\smartcomma:next\let\smartcomma:c\ordcomma\fi
    \ifx5\smartcomma:next\let\smartcomma:c\ordcomma\fi
    \ifx6\smartcomma:next\let\smartcomma:c\ordcomma\fi
    \ifx7\smartcomma:next\let\smartcomma:c\ordcomma\fi
    \ifx8\smartcomma:next\let\smartcomma:c\ordcomma\fi
    \ifx9\smartcomma:next\let\smartcomma:c\ordcomma\fi
    \smartcomma:c}

\protected\def\decimalcomma  {\Umathcode`\, = 0 \Umathcharfam`\, `\,}
\protected\def\nodecimalcomma{\Umathcode`\, = 6 \Umathcharfam`\, `\,}
\protected\def\smartdecimalcomma{\mathlet,\smartcomma}


% set the colon to how it used to be
\Umathcode`\:="3"0"2236 % \ratio
\Umathchardef\colon "6"0"3A

% ldot as a punctuation mark
\Umathchardef\ldotp "6"0"2E
\let \period = \ldotp

% remapping two characters
\mathlet * \ast
\mathlet - \minus

% interpret the normal middle dot as the middle dot operator
\mathlet · \cdot
\Umathchardef\cdotp "6"0"B7

% move a macro over
\protected\def\*{\discretionary{\thinspace
    \the\textfont\Umathcharfam`\×\Uchar`\×}{}{}}

% some aliases
\let\neq  = \ne
\let\le   = \leq
\let\ge   = \geq
\let\owns = \ni
\let\gets = \leftarrow
\let\to   = \rightarrow
\let\land = \wedge
\let\lor  = \vee
\let\lnot = \neg

% replace \mathhexbox macros
\protected\def\mathcharbox#1{\leavevmode
    \hbox{$\mathsurround0pt\relax#1$}}
\protected\def\dag{\mathcharbox†}
\protected\def\ddag{\mathcharbox‡}
\protected\def\S{\mathcharbox§}
\protected\def\P{\mathcharbox¶}
\protected\def\Orb{\mathcharbox◯}

% wide accents are default
\let\widehat   = \hat
\let\widetilde = \tilde
\let\overline  = \overbar
\let\underline = \underbar

% integrals
\let\intlimits=\nolimits

\explicitmathchar\intop
\explicitmathchar\iintop
\explicitmathchar\iiintop
\explicitmathchar\ointop
\explicitmathchar\oiintop
\explicitmathchar\oiiintop
\explicitmathchar\intclockwiseop
\explicitmathchar\varointclockwiseop
\explicitmathchar\ointctrclockwiseop

\edef\int              {\intop\intlimits}
\edef\iint             {\iintop\intlimits}
\edef\iiint            {\iiintop\intlimits}
\edef\oint             {\ointop\intlimits}
\edef\oiint            {\oiintop\intlimits}
\edef\oiiint           {\oiiintop\intlimits}
\edef\intclockwise     {\intclockwiseop\intlimits}
\edef\varointclockwise {\varointclockwiseop\intlimits}
\edef\ointctrclockwise {\ointctrclockwiseop\intlimits}

\mathlet ∫ \int
\mathlet ∬ \iint
\mathlet ∭ \iiint
\mathlet ∮ \oint
\mathlet ∯ \oiint
\mathlet ∰ \oiiint
\mathlet ∱ \intclockwise
\mathlet ∲ \varointclockwise
\mathlet ∳ \ointctrclockwise

% 1 Roots

\protected\def\sqrt{\sqrt:make{\Uradical\radicalfam"221A}}
\protected\def\root#1\of{\sqrt:make{\Uroot\radicalfam"221A{#1}}}
\def\sqrt:open#1#2{#1{#2}} % braces are necessary
\def\sqrt:close#1{\mathpalette{\sqrt:closed{#1}}}
\def\sqrt:closed#1#2#3{% root style content
    \setbox0=\hbox{$#2\Uradical\radicalfam"221A{#3}$}%
    #2#1{#3\mkern2mu}\kern-\Umathradicalrule#2%
    \raise\dimexpr\ht0-1\Umathradicalkern#2-.5\Umathradicalrule#2\hbox
        {\vrule height0pt depth.2\ht0 width\Umathradicalrule#2}%
    \kern\Umathradicalkern#2}

\protected\def\normalroots{\let\sqrt:make\sqrt:open}
\protected\def\closedroots{\let\sqrt:make\sqrt:close}

\normalroots

\let\of=\relax
\mathlet √ \sqrt
\mathdef ∛ {\root3\of}
\mathdef ∜ {\root4\of}

% 1 Dots

% \vdots, \ddots, \adots
\newdimen\mathdots:pt
\newbox\mathdots:box
\def\mathdots:init#1#2{%
    \mathdots:pt=.1\fontdimen6#20\relax
    \setbox\mathdots:box=\hbox{$#1.$}%
    \ht\mathdots:box=\mathdots:pt}
\def\mathdots:choice#1{\mathinner{\mathchoice
    {\mathdots:init\displaystyle\textfont#1}
    {\mathdots:init\textstyle\textfont#1}
    {\mathdots:init\scriptstyle\scriptfont#1}
    {\mathdots:init\scriptscriptstyle\scriptscriptfont#1}}}
\protected\def\texvdots{\mathdots:choice{\vbox{%
    \baselineskip4\mathdots:pt\lineskiplimit0pt\relax \kern6\mathdots:pt
    \copy\mathdots:box \copy\mathdots:box \copy\mathdots:box}}}
\protected\def\texddots{\mathdots:choice{\mkern1mu
    \raise7\mathdots:pt \vbox{\kern7\mathdots:pt\copy\mathdots:box}\mkern2mu
    \raise4\mathdots:pt \copy\mathdots:box\mkern2mu
    \raise1\mathdots:pt \copy\mathdots:box\mkern1mu}}
\protected\def\texadots{\mathdots:choice{\mkern1mu
    \raise1\mathdots:pt \copy\mathdots:box\mkern2mu
    \raise4\mathdots:pt \copy\mathdots:box\mkern2mu
    \raise7\mathdots:pt \vbox{\kern7\mathdots:pt\copy\mathdots:box}\mkern1mu}}

% \ldots and \cdots are unchanged from plain.tex
\protected\edef\texldots{\ldots}
\protected\edef\texcdots{\cdots}

% \traditionaldots
\protected\def\traditionaldots{%
    \mathlet \⋮ \texvdots \let\vdots = \texvdots
    \mathlet \⋯ \texcdots \let\cdots = \texcdots
    \mathlet \⋰ \texadots \let\adots = \texadots
    \mathlet \⋱ \texddots \let\ddots = \texddots
    \mathlet \… \texldots \let\ldots = \texldots}

% \unicodedots
\protected\def\unicodedots{%
    \Umathcode `\⋮ = "3"0"22EE \let\vdots = \unicodevdots
    \Umathcode `\⋯ = "0"0"22EF \let\cdots = \unicodecdots
    \Umathcode `\⋰ = "3"0"22F0 \let\adots = \unicodeadots
    \Umathcode `\⋱ = "3"0"22F1 \let\ddots = \unicodeddots
    \Umathcode `\… = "3"0"2026 \let\ldots = \unicodeellipsis}

\traditionaldots

% 1 Primes

% primes
\mathdef'{\math:prime{}}
\mathdef`{\math:bprime{}}
\def\math:prime#1{%
    \nextifx'{\math:prime:plus{#1}}%
        {^\csname#1prime\endcsname}}
\def\math:prime:plus#1'{%
    \math:prime{#1p}}
\def\math:bprime#1{%
    \nextifx`{\math:bprime:plus{#1}}%
        {^\csname b#1prime\endcsname}}
\def\math:bprime:plus#1`{%
    \math:bprime{#1p}}
% \pprime etc.
\let\pprime=\dprime
\let\ppprime=\trprime
\let\pppprime=\qprime
\let\bprime=\backprime
\let\bpprime=\backdprime
\let\bppprime=\backtrprime

% 1 Superscripts and subscripts

\edef\math:tmp{%
    \mathdef\Uchar"00B2{^2}
    \mathdef\Uchar"00B3{^3}
    \mathdef\Uchar"00B9{^1}
    \mathdef\Uchar"2070{^0}
    \mathdef\Uchar"2071{^i}
    \mathdef\Uchar"2074{^4}
    \mathdef\Uchar"2075{^5}
    \mathdef\Uchar"2076{^6}
    \mathdef\Uchar"2077{^7}
    \mathdef\Uchar"2078{^8}
    \mathdef\Uchar"2079{^9}
    \mathdef\Uchar"207A{^+}
    \mathdef\Uchar"207B{^-}
    \mathdef\Uchar"207C{^=}
    \mathdef\Uchar"207D{^(}
    \mathdef\Uchar"207E{^)}
    \mathdef\Uchar"207F{^n}
    \mathdef\Uchar"1D62{_i}
    \mathdef\Uchar"1D63{_r}
    \mathdef\Uchar"1D64{_u}
    \mathdef\Uchar"1D65{_v}
    \mathdef\Uchar"1D66{_β}
    \mathdef\Uchar"1D67{_γ}
    \mathdef\Uchar"1D68{_ρ}
    \mathdef\Uchar"1D69{_φ}
    \mathdef\Uchar"1D6A{_χ}
    \mathdef\Uchar"2080{_0}
    \mathdef\Uchar"2081{_1}
    \mathdef\Uchar"2082{_2}
    \mathdef\Uchar"2083{_3}
    \mathdef\Uchar"2084{_4}
    \mathdef\Uchar"2085{_5}
    \mathdef\Uchar"2086{_6}
    \mathdef\Uchar"2087{_7}
    \mathdef\Uchar"2088{_8}
    \mathdef\Uchar"2089{_9}
    \mathdef\Uchar"208A{_+}
    \mathdef\Uchar"208B{_-}
    \mathdef\Uchar"208C{_=}
    \mathdef\Uchar"208D{_(}
    \mathdef\Uchar"208E{_)}
    \mathdef\Uchar"2090{_a}
    \mathdef\Uchar"2091{_e}
    \mathdef\Uchar"2092{_o}
    \mathdef\Uchar"2093{_x}
    \mathdef\Uchar"2094{_ə}
    \mathdef\Uchar"2095{_h}
    \mathdef\Uchar"2096{_k}
    \mathdef\Uchar"2097{_l}
    \mathdef\Uchar"2098{_m}
    \mathdef\Uchar"2099{_n}
    \mathdef\Uchar"209A{_p}
    \mathdef\Uchar"209B{_s}
    \mathdef\Uchar"209C{_t}
    \mathdef\Uchar"2C7C{_j}}
\math:tmp

% 1 Long arrows

\def\extend#1#2#3{\withoptions[]{\extend:#1{#2}{#3}}}
\def\extend:#1#2#3[#4]#5{\mathrel{% char left right below above
    \mathpalette\extend:choose{#1{#2}{#3}{#4}{#5}}}}
\def\extend:choose#1#2{\extend:choose:#1#2}
\def\extend:choose:#1#2#3#4#5#6{% style char left right below above
    \setbox0=\hbox{$#1#5$}\setbox2=\hbox{$#1#6$}%
    \ifdim \wd0 < \wd2
        \mathop{\Uoverdelimiter  \extensiblefam `#2
            {\mkern#3mu#6\mkern#4mu}}\limits_{#5}\else
        \mathop{\Uunderdelimiter \extensiblefam `#2
            {\mkern#3mu#5\mkern#4mu}}\limits^{#6}\fi}
 
\protected\def\xleftarrow {\extend←73}
\protected\def\xrightarrow{\extend→37}

\protected\def\xLeftarrow {\extend⇐73}
\protected\def\xRightarrow{\extend⇒37}

\protected\def\xleftrightarrow{\extend↔77}
\protected\def\xLeftrightarrow{\extend⇔77}

\protected\def\xmapsto    {\extend↦47}
\protected\def\xmapsfrom  {\extend↤74}

\protected\def\xhookrightarrow {\extend↪67}
\protected\def\xhookleftarrow  {\extend↩76}

\protected\def\xleftrightarrows  {\extend⇆77}
\protected\def\xleftleftarrows   {\extend⇇73}
\protected\def\xrightrightarrows {\extend⇉37}

\protected\def\xeq{\extend=11}

\let \→ \xrightarrow
\let \⇒ \xRightarrow
\let \← \xleftarrow
\let \⇐ \xLeftarrow
\let \↔ \xleftrightarrow
\let \⇔ \xLeftrightarrow
\let \↦ \xmapsto
\let \↤ \xmapsfrom

% 1 Miscellaneous mathematical functions

% \stackrel {super} {rel}
\protected\def\stackrel#1#2{\mathrel{\mathop{#2}\limits^{#1}}}
% \stackbin {super} {bin}
\protected\def\stackbin#1#2{\mathbin{\mathop{#2}\limits^{#1}}}

% \text {text}
\newcount\textfam
\textfam=0
\protected\def\text#1{{\mathchoice
    {\hbox{\the\textfont\textfam#1}}%
    {\hbox{\the\textfont\textfam#1}}%
    {\hbox{\the\scriptfont\textfam#1}}%
    {\hbox{\the\scriptscriptfont\textfam#1}}}}

% some definitions with vertical lines
\def\bra#1{\left⟨#1\right\vert}
\def\ket#1{\left\vert#1\right⟩}
\def\braket#1#2{\left⟨#1\middle\vert#2\right⟩}
\def\norm#1{\left\vert#1\right\vert} \let \abs=\norm
\def\Norm#1{\left\Vert#1\right\Vert}
\def\ceil#1{\left⌈#1\right⌉}
\def\floor#1{\left⌊#1\right⌋}

% a slightly smaller unary minus
\def\unaryminus{\mathord{\mathpalette\unaryminus:make{}}}
\def\unaryminus:make#1#2{%
    \setbox0 = \hbox{$#1-$}
    \kern .75\wd0
    \pdfextension save
    \pdfextension setmatrix{.75 0 0 1} 
    \kern -\wd0 \box0
    \pdfextension restore}

% a smaller inverse-function sign
\protected\def\inv{^{\scriptscriptstyle\unaryminus1}}%

% upright multiletter symbols
\def\mord#1{\mathord{\mathstyle{up}#1}}
\def\mop #1{\mathop {\mathstyle{up}#1}\nolimits}
\def\mlop#1{\mathop {\mathstyle{up}#1}\limits}

% \frac, \tfrac, \dfrac
\protected\def\frac#1#2{\Ustack{#1\over#2}}
\protected\def\tfrac#1#2{{\textstyle{#1\over#2}}}
\protected\def\dfrac#1#2{{\displaystyle{#1\over#2}}}

% make a few plain macros \protected
\def\minim:protect#1{\protected\edef#1{\expandafter\unexpanded\expandafter{#1}}}
\minim:protect\smash
\minim:protect\dotfill

% 1 Operators

\def\newmathop#1{\protected\expandafter\def
    \csname#1\endcsname{\mathop{\mathstyle{up}#1}\nolimits}}
\def\newlargemathop#1{\protected\expandafter\def
    \csname#1\endcsname{\mathop{\mathstyle{up}#1}}}

% ported operators
\newlargemathop {lim}
\newlargemathop {gcd} \newlargemathop {lcm}
\newlargemathop {max} \newlargemathop {min}
\newlargemathop {sup} \newlargemathop {inf}
\newlargemathop {det}
\newlargemathop {Pr}
\newmathop {log} \newmathop {lg}     \newmathop {ln}
\newmathop {sin} \newmathop {arcsin} \newmathop {sinh}
\newmathop {cos} \newmathop {arccos} \newmathop {cosh}
\newmathop {tan} \newmathop {arctan} \newmathop {tanh}
\newmathop {cot} \newmathop {coth}
\newmathop {sec} \newmathop {csc}
\newmathop {arg}
\newmathop {ker}
\newmathop {dim}
\newmathop {hom}
\newmathop {exp}
\newmathop {deg}

\protected\def\limsup{\mathop{\mathstyle{up}lim\,sup}}
\protected\def\liminf{\mathop{\mathstyle{up}lim\,inf}}

\let\para=\parallel

% additional operators
\newmathop {Tr} \newmathop {tr} \newmathop{Span}
\newmathop {GL} \newmathop {SL}
\newmathop {SU} \newmathop {U}
\newmathop {SO} \newmathop {O}
\newmathop {Sp}
\newmathop {im}
\newmathop {End} \newmathop {Aut}
\newmathop {Dom} \newmathop {Codom}

% 1 Displayed equations

% \display
\protected\def\display{\display:true}
% \displaynr {nr}
\protected\def\displaynr{\display:true\display:nrtrue
    \nextifcat\bgroup\display:specialnr\relax}

% \leftdisplaystrue
\newif\ifleftdisplays
% \setdisplaynr {...}
\newtoks\setdisplaynr
% \equationnumber
\newcount\equationnumber \equationnumber = 0
\setdisplaynr{\global\advance\equationnumber1(\the\equationnumber)}

\newif\ifdisplay:
\newif\ifdisplay:nr
\newtoks\display:specialnr
\display:specialnr{\the\setdisplaynr}

% \[ ... \]
\protected\def\[#1\]{%
    \ifdisplay:\expandafter\startdisplay\else\Ustartmath\fi
    \tagging:tagformula{#1}#1\relax
    \global\expandafter\display:false
    \ifdisplay:\expandafter\stopdisplay\else\Ustopmath\fi}
\protected\def\]{\errmessage{Unmatched \string\]}}
\ifdefined \tagging:tagformula \else
    \let\tagging:tagformula=\ignore \fi

\protected\def\startdisplay{%
    % if the display starts a paragraph, omit baselineskip
    % and ensure that the long \beforedisplayskip is used
    \ifvmode \nointerlineskip
        \noindent \hbox to .5\hsize{\hss}\fi
    \Ustartdisplaymath
    % compatibility with minim-pdf
    \csname tagging:indisplaytrue\endcsname
    % for left-aligned equations, force manual placement
    \ifleftdisplays\muskip0mu\fi}
\protected\def\stopdisplay{%
    \ifleftdisplays
        \hskip\displaywidth minus\displaywidth\fi
    \global\expandafter\display:nrfalse
        \ifdisplay:nr
            \eqno\the\display:specialnr
            \global\display:specialnr{\the\setdisplay:nr}\fi
    \Ustopdisplaymath
    \ignorespaces}


%  standard mappings

\mathstyle{clear}
\mathmap{latin, greek, Latin}{it}

% map ħ (h-with-stroke) to ℏ (planck-constant)
\mathdef ħ {ℏ}

% \reqno
\let\reqno = \eqno

\let\math:tmp=\undefined
\catcode`:=\minimmathloaded

