math-frc.mkiv / last modification: 2020-01-30 14:16
%D \module
%D   [       file=math-frc,
%D        version=2013.04.06, % 2007.07.19,
%D          title=\CONTEXT\ Math Macros,
%D       subtitle=Fractions,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

\writestatus{loading}{ConTeXt Math Macros / Fractions}

\unprotect

%D I need to check it all again as there was a bug in luatex with dimensions that could
%D resulted in side effects that made me mess with spacing.

\unexpanded\def\topstrut{\vrule\s!width\zeropoint\s!height\strutht\s!depth\zeropoint\relax}
\unexpanded\def\botstrut{\vrule\s!width\zeropoint\s!height\zeropoint\s!depth\strutdp\relax}

\unexpanded\def\mathtopstrut{\setbox\scratchbox\mathstylehbox{(}\vrule\s!width\zeropoint\s!height\ht\scratchbox\s!depth\zeropoint\relax}
\unexpanded\def\mathbotstrut{\setbox\scratchbox\mathstylehbox{(}\vrule\s!width\zeropoint\s!height\zeropoint\s!depth\dp\scratchbox\relax}

%D This module is reimplemented in \MKIV\ style.

\registerctxluafile{math-frc}{}

%D \macros
%D   {frac, xfrac, xxfrac}
%D
%D This is another one Tobias asked for. It replaces the primitive \type
%D {\over}. We also take the opportunity to handle math style restoring,
%D which makes sure units and chemicals come out ok. The \type {\frac}
%D macro kind of replaces the awkward \type {\over} primitive. Say that
%D we have the following formulas:
%D
%D \startbuffer[sample]
%D test $\frac  {1}{2}$ test $$1 + \frac  {1}{2} = 1.5$$
%D test $\xfrac {1}{2}$ test $$1 + \xfrac {1}{2} = 1.5$$
%D test $\xxfrac{1}{2}$ test $$1 + \xxfrac{1}{2} = 1.5$$
%D \stopbuffer
%D
%D \typebuffer[sample]
%D
%D With the most straightforward definitions, we get:
%D
%D \startbuffer[code]
%D \def\dofrac#1#2#3{\relax\mathematics{{{#1{#2}}\over{#1{#3}}}}}
%D
%D \def\frac  {\dofrac\mathstyle}
%D \def\xfrac {\dofrac\scriptstyle}
%D \def\xxfrac{\dofrac\scriptscriptstyle}
%D \stopbuffer
%D
%D \typebuffer[code] \getbuffer[code,sample]
%D
%D Since this does not work well, we can try:
%D
%D \startbuffer[code]
%D \def\xfrac #1#2{\hbox{$\dofrac\scriptstyle      {#1}{#2}$}}
%D \def\xxfrac#1#2{\hbox{$\dofrac\scriptscriptstyle{#1}{#2}$}}
%D \stopbuffer
%D
%D \typebuffer[code] \getbuffer[code,sample]
%D
%D This for sure looks better than:
%D
%D \startbuffer[code]
%D \def\xfrac #1#2{{\scriptstyle      \dofrac\relax{#1}{#2}}}
%D \def\xxfrac#1#2{{\scriptscriptstyle\dofrac\relax{#1}{#2}}}
%D \stopbuffer
%D
%D \typebuffer[code] \getbuffer[code,sample]
%D
%D So we stick to the next definitions (watch the local overloading of
%D \type {\xfrac}).
%D
%D In the meantime, in \LUATEX, we have better control over styles so the
%D following macros are different from the \MKII\ ones.

% obsolete, is now c!mathstyle
%
% 0=auto, 1=displaystyle, 2=textstyle, 3=scriptstyle, 4=scriptscriptstyle, 5=mathstyle
%
% $\mathfracmode0 \frac{1}{2}$
% $\mathfracmode1 \frac{1}{2}$
% $\mathfracmode2 \frac{1}{2}$
% $\mathfracmode3 \frac{1}{2}$
% $\mathfracmode4 \frac{1}{2}$
% $\mathfracmode5 \frac{1}{2}$
%
% we keep the constant for a while

\setnewconstant\mathfracmode\zerocount

\installcorenamespace{mathfractions}
\installcorenamespace{mathfractionstyle}
\installcorenamespace{mathfractionalternative}

\installcommandhandler \??mathfractions {mathfraction} \??mathfractions

\let\setupmathfractions\setupmathfraction

% color only applies to rule, use regular color for rest

\setupmathfractions
  [\c!mathstyle=,
   \c!alternative=\v!inner,
   \c!margin=\zeropoint,
   \c!rulethickness=.25\exheight,
   \c!left=0x2E,
   \c!right=0x2E,
   \c!strut=\v!yes,
   \c!topdistance=,
   \c!bottomdistance=,
   \c!rule=\v!auto]

\appendtoks
    \setuevalue{\currentmathfraction}{\math_frac{\currentmathfraction}}%
\to \everydefinemathfraction

% Sometimes users want control over the distances:

\let\math_fraction_set_distance\relax

\appendtoks
    \math_fraction_set_distance
\to \everymathematics

% why only displaystyle .. a bit weak

\unexpanded\def\math_fraction_set_distance_top
  {\Umathfractionnumup    \displaystyle\m_math_fraction_distance_top
   \relax}

\unexpanded\def\math_fraction_set_distance_bot
  {\Umathfractiondenomdown\displaystyle\m_math_fraction_distance_bot
   \relax}

\unexpanded\def\math_fraction_set_distance_all
  {\Umathfractionnumup    \displaystyle\m_math_fraction_distance_top
   \Umathfractiondenomdown\displaystyle\m_math_fraction_distance_bot
   \relax}

\appendtoks
    \ifx\currentmathfraction\empty
      \edef\m_math_fraction_distance_top{\mathfractionparameter\c!topdistance}%
      \edef\m_math_fraction_distance_bot{\mathfractionparameter\c!bottomdistance}%
      \ifx\m_math_fraction_distance_top\empty
        \ifx\m_math_fraction_distance_bot\empty
          \let\math_fraction_set_distance\relax
        \else
          \let\math_fraction_set_distance\math_fraction_set_distance_bot
        \fi
      \else
        \ifx\m_math_fraction_distance_bot\empty
          \let\math_fraction_set_distance\math_fraction_set_distance_top
        \else
          \let\math_fraction_set_distance\math_fraction_set_distance_all
        \fi
      \fi
    \fi
\to \everysetupmathfraction

% So far for control.

\installcorenamespace{mathfractionstrut}

\def\math_frac_no_strut
  {\let\m_fractions_strut_top\relax
   \let\m_fractions_strut_bot\relax}

\setvalue{\??mathfractionstrut\v!yes}%
  {\let\m_fractions_strut_top\mathstrut
   \let\m_fractions_strut_bot\mathstrut}

\setvalue{\??mathfractionstrut\v!math}%
  {\let\m_fractions_strut_top\mathstrut
   \let\m_fractions_strut_bot\mathstrut}

\letvalue{\??mathfractionstrut\v!no}\math_frac_no_strut

\setvalue{\??mathfractionstrut\v!tight}%
  {\let\m_fractions_strut_top\mathbotstrut  % indeed swapped name
   \let\m_fractions_strut_bot\mathtopstrut} % indeed swapped name

\math_frac_no_strut

\newdimen\d_math_fraction_margin

\unexpanded\def\math_frac#1%
  {\begingroup
   \edef\currentmathfraction{#1}%
   %
   \edef\p_math_fraction_fences{\mathfractionparameter\c!fences}%
   \ifx\p_math_fraction_fences\empty \else
     \math_fenced_fenced_start\p_math_fraction_fences
   \fi
   %
   \d_math_fraction_margin\mathfractionparameter\c!margin
   %
   \edef\p_math_fractions_color{\mathfractionparameter\c!color}%
   %
   \edef\p_math_fractions_strut{\mathfractionparameter\c!strut}%
   \ifcsname\??mathfractionstrut\p_math_fractions_strut\endcsname
     \lastnamedcs
   \else
     \math_frac_no_strut
   \fi
   %
   \ifx\p_math_fractions_color\empty
     \expandafter\math_frac_normal
   \else
     \expandafter\math_frac_colored
   \fi}

\unexpanded\def\math_frac_wrapup
  {\ifx\p_math_fraction_fences\empty \else
     \math_fenced_fenced_stop\p_math_fraction_fences
   \fi
   \endgroup}

\unexpanded\def\math_frac_colored#1#2%
  {\savecolor
   \colo_helpers_activate\p_math_fractions_color
   \math_frac_normal{\restorecolor#1}{\restorecolor#2}}

\unexpanded\def\math_frac_normal
  {\expandnamespaceparameter\??mathfractionalternative\mathfractionparameter\c!alternative\v!inner}

% we use utfchar anyway so we can as well do all at the lua end

\def\math_frac_no_delim{0x2E}

\def\math_frac_command
  {\clf_mathfraction
     {\mathfractionparameter\c!rule}%
     \ifx\p_math_fraction_fences\empty
       \mathfractionparameter\c!left \space
       \mathfractionparameter\c!right\space
     \else
       \math_frac_no_delim\space
       \math_frac_no_delim\space
     \fi
     \dimexpr\mathfractionparameter\c!rulethickness\relax
   \relax}

% Having a \withmarginornot{#1}{#2} makes not much sense nor do 4 tests or 4 redundant
% kerns (longer node lists plus possible interference). A split in normal and margin
% also makes testing easier. When left and right margins are needed we might merge the
% variants again. After all, these are not real installers.

% the denominator is in cramped!

\setvalue{\??mathfractionalternative\v!inner}%
  {\ifcase\d_math_fraction_margin
      \expandafter\math_fraction_inner_normal
   \else
      \expandafter\math_fraction_inner_margin
   \fi}

\setvalue{\??mathfractionalternative\v!outer}%
  {\ifcase\d_math_fraction_margin
      \expandafter\math_fraction_outer_normal
   \else
      \expandafter\math_fraction_outer_margin
   \fi}

\setvalue{\??mathfractionalternative\v!both}%
  {\ifcase\d_math_fraction_margin
      \expandafter\math_fraction_both_normal
   \else
      \expandafter\math_fraction_both_margin
   \fi}

% todo: store first state and reuse second time

\def\math_fraction_inner_normal#1#2%
  {\Ustack{%
     {%
       {\usemathstyleparameter\mathfractionparameter{\m_fractions_strut_top#1}}%
       \math_frac_command
       {\usemathstyleparameter\mathfractionparameter{\m_fractions_strut_bot#2}}%
     }%
   }%
   \math_frac_wrapup}

\def\math_fraction_outer_normal#1#2%
  {\Ustack{%
     \usemathstyleparameter\mathfractionparameter
     {%
       {\m_fractions_strut_top#1}%
       \math_frac_command
       {\m_fractions_strut_bot#2}%
     }%
   }%
   \math_frac_wrapup}

\def\math_fraction_both_normal#1#2%
  {\Ustack{%
     \usemathstyleparameter\mathfractionparameter
     {%
       {\usemathstyleparameter\mathfractionparameter\m_fractions_strut_top#1}%
       \math_frac_command
       {\usemathstyleparameter\mathfractionparameter\m_fractions_strut_bot#2}%
     }%
   }%
   \math_frac_wrapup}

\def\math_fraction_inner_margin#1#2%
  {\Ustack{%
     {%
       {\kern\d_math_fraction_margin
        \usemathstyleparameter\mathfractionparameter{\m_fractions_strut_top#1}%
        \kern\d_math_fraction_margin}%
       \math_frac_command
       {\kern\d_math_fraction_margin
        \usemathstyleparameter\mathfractionparameter{\m_fractions_strut_bot#2}%
        \kern\d_math_fraction_margin}%
     }%
   }%
   \math_frac_wrapup}

\def\math_fraction_outer_margin#1#2%
  {\Ustack{%
     \usemathstyleparameter\mathfractionparameter
     {%
       {\kern\d_math_fraction_margin
        \m_fractions_strut_top#1%
        \kern\d_math_fraction_margin}%
       \math_frac_command
       {\kern\d_math_fraction_margin
        \m_fractions_strut_bot#2%
        \kern\d_math_fraction_margin}%
     }%
   }%
   \math_frac_wrapup}

\def\math_fraction_both_margin#1#2%
  {\Ustack{%
     \usemathstyleparameter\mathfractionparameter
     {%
       {\kern\d_math_fraction_margin
        \usemathstyleparameter\mathfractionparameter\m_fractions_strut_top#1%
        \kern\d_math_fraction_margin}%
       \math_frac_command
       {\kern\d_math_fraction_margin
        \usemathstyleparameter\mathfractionparameter\m_fractions_strut_bot#2%
        \kern\d_math_fraction_margin}%
     }%
   }%
   \math_frac_wrapup}

\definemathfraction[xfrac] [\c!alternative=\v!inner,\c!mathstyle=\s!script]
\definemathfraction[xxfrac][\c!alternative=\v!inner,\c!mathstyle=\s!scriptscript]

\let\normalxfrac\xfrac

\unexpanded\def\xfrac#1#2{\normalxfrac{\let\xfrac\xxfrac#1}{\let\xfrac\xxfrac#2}}

%D Spacing:

\unexpanded\def\nomathfractiongaps     {\normalexpanded{\math_no_fraction_gaps     \triggermathstyle\mathstyle}} % maybe collect settings
\unexpanded\def\overlaymathfractiongaps{\normalexpanded{\math_overlay_fraction_gaps\triggermathstyle\mathstyle}} % maybe collect settings

\unexpanded\def\math_no_fraction_gaps#1%
  {\Umathfractionnumup    #1\zeropoint
   \Umathfractiondenomdown#1\zeropoint}

\unexpanded\def\math_overlay_fraction_gaps#1%
  {\Umathfractionnumup    #1\zeropoint
   \Umathfractionnumvgap  #1\zeropoint
   %Umathfractionrule     #1\zeropoint
   \Umathfractiondenomvgap#1\zeropoint
   \Umathfractiondenomdown#1\zeropoint}

\installcorenamespace{mathfractiondistance}

\letvalue{\??mathfractiondistance\v!none   }\nomathfractiongaps
\letvalue{\??mathfractiondistance\v!no     }\nomathfractiongaps
\letvalue{\??mathfractiondistance\v!overlay}\overlaymathfractiongaps

\setupmathfractions
  [\c!distance=\v!none]

\appendtoks
    \edef\p_distance{\rootmathfractionparameter\c!distance}%
    \ifx\p_distance\empty\else
        \ifcsname\??mathfractiondistance\p_distance\endcsname
            \lastnamedcs
        \fi
    \fi
\to \everymathematics

% theshold is new!

\let\math_fraction_set_threshold_inline \relax
\let\math_fraction_set_threshold_display\relax

\appendtoks
    \math_fraction_set_threshold_inline
    \math_fraction_set_threshold_display
\to \everymathematics

\appendtoks
    \ifx\currentmathfraction\empty
      \edef\p_threshold{\mathfractionparameter\c!inlinethreshold}%
      \ifx\p_threshold\empty
        \let\math_fraction_set_threshold_inline\relax
      \else\ifx\p_threshold\v!auto
        \let\math_fraction_set_threshold_inline\relax
      \else
        \let\math_fraction_set_threshold_inline\math_fraction_set_theshold_inline
      \fi\fi
      \edef\p_threshold{\mathfractionparameter\c!displaythreshold}%
      \ifx\p_threshold\empty
        \let\math_fraction_set_threshold_display\relax
      \else\ifx\p_threshold\v!auto
        \let\math_fraction_set_threshold_display\relax
      \else
        \let\math_fraction_set_threshold_display\math_fraction_set_theshold_display
      \fi\fi
    \fi
\to \everysetupmathfraction

\def\math_fraction_set_theshold_inline
  {\edef\p_threshold{\mathfractionparameter\c!inlinethreshold}%
   \Umathfractiondelsize\textstyle        \p_threshold\dimexpr\textface\relax
   \Umathfractiondelsize\scriptstyle      \p_threshold\dimexpr\scriptface\relax
   \Umathfractiondelsize\scriptscriptstyle\p_threshold\dimexpr\scriptscriptface\relax}

\def\math_fraction_set_theshold_display
  {\edef\p_threshold{\mathfractionparameter\c!displaythreshold}%
   \Umathfractiondelsize\displaystyle     \p_threshold\dimexpr\textface\relax}

%D \macros
%D   {dfrac, tfrac, frac, dbinom, tbinom, binom}
%D
%D \startbuffer
%D $\dfrac {1}{2} \tfrac {1}{2} \frac {1}{2}$
%D $\dbinom{1}{2} \tbinom{1}{2} \binom{1}{2}$
%D \stopbuffer
%D
%D \typebuffer
%D \getbuffer

% $$
%     {{a}\over{b}} +
%     {{a}\overwithdelims(){b}} +
%     {{a}\atopwithdelims(){b}} +
%     {{a}\abovewithdelims()\zeropoint{b}} +
%     \left({{a}\over{b}}\right)
% $$

% \dorecurse {10} { % weird
%     $$ {{a}\abovewithdelims()#1pt{b}} $$
% }

\definemathfraction[i:frac] [\c!alternative=\v!inner,\c!mathstyle=]  % was script and then small but nothing needed
\definemathfraction[i:tfrac][\c!alternative=\v!inner,\c!mathstyle=\s!text] % was script (before luatex fix)
\definemathfraction[i:sfrac][\c!alternative=\v!inner,\c!mathstyle=\s!scriptscript]
\definemathfraction[i:dfrac][\c!alternative=\v!inner,\c!mathstyle=\s!display]

\definemathfraction[d:frac] [\c!alternative=\v!inner,\c!mathstyle=\s!cramped] % was cramped,text
\definemathfraction[d:tfrac][\c!alternative=\v!both ,\c!mathstyle={\s!cramped,\s!text}] % was cramped,script (before luatex fix)
\definemathfraction[d:sfrac][\c!alternative=\v!both ,\c!mathstyle={\s!cramped,\s!scriptscript}]
\definemathfraction[d:dfrac][\c!alternative=\v!inner,\c!mathstyle=\s!display]

%D \unexpanded\def\ShowMathFractions#1#2%
%D   {\dontleavehmode
%D    \begingroup
%D    \showmathstruts
%D    \mathematics{x+\tfrac{#1}{#2}+1+\frac{#1}{#2}+2+\sfrac{#1}{#2}+g}%
%D    \endgroup}
%D
%D The default \type {tfrac}, \type {frac} and \type \sfrac} look like this:
%D
%D \blank
%D \ShowMathFractions{a}{a}\par
%D \ShowMathFractions{1}{x}\par
%D \ShowMathFractions{a}{b}\par
%D \ShowMathFractions{1}{b}\par
%D \blank

\unexpanded\def\frac {\csname\inlineordisplaymath id:frac\endcsname}
\unexpanded\def\tfrac{\csname\inlineordisplaymath id:tfrac\endcsname}
\unexpanded\def\sfrac{\csname\inlineordisplaymath id:sfrac\endcsname}
\unexpanded\def\dfrac{\csname\inlineordisplaymath id:dfrac\endcsname}

\definemathfraction[ams]            [\c!strut=\v!no,\c!alternative=\v!outer]
\definemathfraction[i:ams:frac][ams][\c!mathstyle={\s!cramped,\s!text}]
\definemathfraction[d:ams:frac][ams][\c!mathstyle={\s!cramped,\s!display}]

\unexpanded\def\ctxfrac{\csname\inlineordisplaymath id:frac\endcsname}
\unexpanded\def\amsfrac{\csname\inlineordisplaymath id:ams:frac\endcsname}

% \appendtoks
%     \doifelse{\mathfractionparameter\c!option}{ams}%
%       {\let\frac\amsfrac}%
%       {\let\frac\ctxfrac}%
% \to \everysetupmathfraction

\appendtoks
    \doifelse{\mathematicsparameter\c!fractions}{ams}%
      {\let\frac\amsfrac}%
      {\let\frac\ctxfrac}%
\to \everysetupmathematics

% \definemathfraction[ddfrac][\c!mathstyle=\s!display]
% \definemathfraction[ttfrac][\c!mathstyle=\s!text]
% \definemathfraction[ssfrac][\c!mathstyle=\s!script]

% \unexpanded\def\binom #1#2{{\Ustack      {{#1}\normalabovewithdelims()\zeropoint{#2}}}}
% \unexpanded\def\dbinom#1#2{{\displaystyle{{#1}\normalabovewithdelims()\zeropoint{#2}}}}
% \unexpanded\def\tbinom#1#2{{\textstyle   {{#1}\normalabovewithdelims()\zeropoint{#2}}}}

\definemathfraction
  [binom]
  [\c!alternative=\v!outer,
   \c!rule=\v!no,
   \c!left=0x28,
   \c!right=0x29,
   \c!mathstyle=\s!auto]

\definemathfraction
  [dbinom]
  [binom]
  [\c!mathstyle=\s!display]

\definemathfraction
  [tbinom]
  [binom]
  [\c!mathstyle=\s!text]

%D \macros
%D   {cfrac}
%D
%D \startbuffer
%D $\cfrac{12}{3} \cfrac[l]{12}{3} \cfrac[c]{12}{3} \cfrac[r]{12}{3}$
%D $\cfrac{1}{23} \cfrac[l]{1}{23} \cfrac[c]{1}{23} \cfrac[r]{1}{23}$
%D \stopbuffer
%D
%D \typebuffer
%D
%D \getbuffer
%D
%D Now we can align every combination we want:
%D
%D \startbuffer
%D $\cfrac{12}{3} \cfrac[l]{12}{3} \cfrac[c]{12}{3} \cfrac[r]{12}{3}$
%D $\cfrac{1}{23} \cfrac[l]{1}{23} \cfrac[c]{1}{23} \cfrac[r]{1}{23}$
%D $\cfrac[cl]{12}{3} \cfrac[cc]{12}{3} \cfrac[cr]{12}{3}$
%D $\cfrac[lc]{1}{23} \cfrac[cc]{1}{23} \cfrac[rc]{1}{23}$
%D \stopbuffer
%D
%D \typebuffer
%D
%D \getbuffer

\unexpanded\def\cfrac
  {\doifelsenextoptionalcs\math_cfrac_yes\math_cfrac_nop}

\def\math_cfrac_nop    {\math_cfrac_indeed[cc]}
\def\math_cfrac_yes[#1]{\math_cfrac_indeed[#1cc]}

\def\math_cfrac_indeed[#1#2#3]#4#5%
  {{\displaystyle
    \frac
      {\strut
       \ifx r#1\hfill\fi#4\ifx l#1\hfill\fi}%
      {\ifx r#2\hfill\fi#5\ifx l#2\hfill\fi}%
    \kern-\nulldelimiterspace}}

%D \macros
%D   {splitfrac, splitdfrac}
%D
%D Occasionally one needs to typeset multi||line fractions.
%D These commands use \tex{genfrac} to create such fractions.
%D
%D \startbuffer
%D \startformula
%D      a=\frac{
%D          \splitfrac{xy + xy + xy + xy + xy}
%D                    {+ xy + xy + xy + xy}
%D        }
%D        {z}
%D      =\frac{
%D          \splitdfrac{xy + xy + xy + xy + xy}
%D                    {+ xy + xy + xy + xy}
%D        }
%D        {z}
%D \stopformula
%D \stopbuffer
%D
%D \typebuffer \getbuffer
%D
%D These macros are based on Michael J.~Downes posting on
%D comp.text.tex on 2001/12/06 but adapted a bit.

\unexpanded\def\splitfrac #1#2%
  {{\textstyle   {{\textstyle#1\quad\hfill}\normalabove\zeropoint{\textstyle\hfill\quad\mathstrut#2}}}}

\unexpanded\def\splitdfrac#1#2%
  {{\displaystyle{{          #1\quad\hfill}\normalabove\zeropoint{          \hfill\quad\mathstrut#2}}}}

%D For testing:

% \unexpanded\def\ShowMathFractions#1#2%
%  {\mathematics{x+\tfrac{#1}{#2}+1+\frac{#1}{#2}+2+\sfrac{#1}{#2}+g}}

%D More fracking (for Alan):

\def\s!vfrac{vfrac}

\unexpanded\def\math_frac_colored_vulgar#1#2%
  {\savecolor
   \colo_helpers_activate\p_math_fractions_color
   {\restorecolor#1}\Uskewed/{\restorecolor#2}}

\unexpanded\def\math_frac_normal_vulgar#1#2%
  {{#1}\Uskewed/{#2}}

\unexpanded\def\vfrac#1#2%
  {\bgroup
   \edef\p_math_fractions_color{\namedmathfractionparameter\s!vfrac\c!color}%
   \ifx\p_math_fractions_color\empty
     \expandafter\math_frac_normal_vulgar
   \else
     \expandafter\math_frac_colored_vulgar
   \fi
   {#1}%
   {#2}%
   \egroup}

\appendtoks
    \edef\p_hfactor{\namedmathfractionparameter\s!vfrac\c!hfactor}%
    \edef\p_vfactor{\namedmathfractionparameter\s!vfrac\c!vfactor}%
    \Umathskewedfractionhgap\textstyle        \p_hfactor\fontemwidth \mathstylefont\textstyle
    \Umathskewedfractionhgap\scriptstyle      \p_hfactor\fontemwidth \mathstylefont\scriptstyle
    \Umathskewedfractionhgap\scriptscriptstyle\p_hfactor\fontemwidth \mathstylefont\scriptscriptstyle
    \Umathskewedfractionvgap\textstyle        \p_vfactor\fontexheight\mathstylefont\textstyle
    \Umathskewedfractionvgap\scriptstyle      \p_vfactor\fontexheight\mathstylefont\scriptstyle
    \Umathskewedfractionvgap\scriptscriptstyle\p_vfactor\fontexheight\mathstylefont\scriptscriptstyle
\to \everysetupmathfraction

\setupmathfraction
  [\s!vfrac]
  [\c!hfactor=.2,
   \c!vfactor=.1]

\protect \endinput

% I have no clue what \mthfrac and \mthsqrt are supposed to do but
% I guess that it can be done with tweaking luatex's math parameters.
% Otherwise I'll write something from scratch.

% \def\math_stylebuilders_frac#1#2#3#4#5#6#7%
%   {\begingroup
%    \mathsurround\zeropoint
%    \setbox0\hbox{$#1 #6$}%
%    \setbox2\hbox{$#1 #7$}%
%    \dimen0\wd\ifdim\wd2>\wd0 2\else 0\fi
%    \setbox4\hbox to \dimen0{\leaders\hbox{#4}\hss#5}%
%    \mathord{\vcenter{{\offinterlineskip
%      \hbox to \dimen0{\hss\box0\hss}%
%      \kern\ht4%
%      \hbox to \dimen0{\hss\copy4\hss}%
%      \kern\ht4%
%      \hbox to \dimen0{\hss\box2\hss}}}}%
%    \endgroup}
%
% \def\math_stylebuilders_sqrt#1#2#3#4#5%
%   {\begingroup
%    \mathsurround\zeropoint
%    \setbox0\hbox{$#1 #5$}%
%    \ht0\dimexpr1.05\ht0+\onepoint\relax
%    \dp0\dimexpr1.05\dp0+\onepoint\relax
%    \setbox4\hbox to \wd0{\mr#2\leaders\hbox{#3}\hfill#4}%
%    \delimitershortfall\zeropoint
%    \nulldelimiterspace\zeropoint
%    \setbox2\hbox{$\left\delimiter"0270370 \vrule \s!height\ht0 \s!depth \dp0 \s!width\zeropoint\right.$}% is this the right code point?
%    \mathord{\vcenter{\hbox{\copy2\rlap{\raise\dimexpr\ht2-\ht4\relax\copy4}\copy0}}}%
%    \endgroup}
%
% \def\mthfrac#1#2#3#4#5{\mathchoice
%   {\math_stylebuilders_frac\displaystyle     \textface        {#1}{#2}{#3}{#4}{#5}}%
%   {\math_stylebuilders_frac\textstyle        \textface        {#1}{#2}{#3}{#4}{#5}}%
%   {\math_stylebuilders_frac\scriptstyle      \scriptface      {#1}{#2}{#3}{#4}{#5}}%
%   {\math_stylebuilders_frac\scriptscriptstyle\scriptscriptface{#1}{#2}{#3}{#4}{#5}}}
%
% \def\mthsqrt#1#2#3{\mathchoice
%   {\math_stylebuilders_sqrt\displaystyle     \textface{#1}{#2}{#3}}%
%   {\math_stylebuilders_sqrt\textstyle        \textface{#1}{#2}{#3}}%
%   {\math_stylebuilders_sqrt\scriptstyle      \textface{#1}{#2}{#3}}%
%   {\math_stylebuilders_sqrt\scriptscriptstyle\textface{#1}{#2}{#3}}}

% \unexpanded\def\mthfrac#1#2#3{[mthfrac: #1 #2 #3]}
% \unexpanded\def\mthsqrt#1#2#3{[mthsqrt: #1 #2 #3]}

% used for prototyping \Uskewed
%
% \unexpanded\def\skewedfractiona#1#2{%
%     \raise
%         \Umathskewedfractionvgap\textstyle
%         \hbox\bgroup
%             $\scriptstyle#1\hskip\dimexpr\Umathskewedfractionhgap\scriptstyle/2\relax$%
%         \egroup
%         \hbox to \zeropoint\bgroup
%             \hss$\textstyle/$\hss
%         \egroup
%     \lower
%         \Umathskewedfractionvgap\textstyle
%         \hbox\bgroup
%             $\hskip\dimexpr\Umathskewedfractionhgap\scriptstyle/2\relax\scriptstyle#2$%
%         \egroup
% }
%
% \unexpanded\def\skewedfractionb#1#2{%
%     \raise
%         \Umathskewedfractionvgap\textstyle
%         \hbox\bgroup
%             $\scriptstyle#1\hskip\dimexpr\Umathskewedfractionhgap\textstyle/2\relax$%
%         \egroup
%         \hbox to \zeropoint\bgroup
%             \hss$\textstyle/$\hss
%         \egroup
%     \lower
%         \Umathskewedfractionvgap\textstyle
%         \hbox\bgroup
%             $\hskip\dimexpr\Umathskewedfractionhgap\textstyle/2\relax\scriptstyle#2$%
%         \egroup
% }
%
% $\skewedfractiona{1}{2}$
% $\skewedfractionb{1}{2}$