%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. % todo : mathclass=\mathnothingcode, % todo also accept string \writestatus{loading}{ConTeXt Math Macros / Fractions} \unprotect %D This module is reimplemented in \MKIV\ style. \registerctxluafile{math-frc}{autosuffix} %D \macros %D {frac, xfrac, xxfrac} %D %D This is another one Tobias asked for. It replaces the primitive \type {\over}. We %D also take the opportunity to handle math style restoring, which makes sure units %D and chemicals come out ok. The \type {\frac} macro kind of replaces the awkward %D \type {\over} primitive. Say that 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 following %D macros are different from the \MKII\ ones. \installcorenamespace{mathfractions} \installcorenamespace{mathfractionstyle} \installcorenamespace{mathfractionalternative} \installcommandhandler \??mathfractions {mathfraction} \??mathfractions \aliased\let\setupmathfractions\setupmathfraction % color only applies to rule, use regular color for rest \integerdef\math_frac_no_delim "2E % or just \zerocount \setupmathfractions [\c!mathstyle=, \c!method=\v!vertical, \c!mathnumeratorstyle=\mathfractionparameter\c!mathstyle, \c!mathdenominatorstyle=\mathfractionparameter\c!mathstyle, \c!mathmeaning=\currentglobalmathfraction, \c!mathclass=\mathfractioncode, \c!alternative=\v!inner, \c!margin=\zeropoint, % \c!rulethickness=.1\exheight, % was .25 for above / atop \c!rulethickness=\v!font, \c!left="2E, \c!right="2E, \c!middle="2F, \c!color=, \c!topcolor=\mathfractionparameter\c!textcolor, \c!bottomcolor=\mathfractionparameter\c!textcolor, \c!textcolor=\mathfractionparameter\c!color, \c!symbolcolor=\mathfractionparameter\c!color, \c!strut=\v!yes, \c!topdistance=, \c!bottomdistance=, \c!source=\zerocount, \c!hfactor=\plusfivehundred,% skewed \c!vfactor=\plusonehundredtwentyfive,% skewed \c!rule=\v!auto] %D We now default to nice bars: \integerdef\fractionbarextenderuc \privatecharactercode{fraction bar extender} \setupmathfractions [\c!rule=\v!symbol, \c!symbol=\fractionbarextenderuc] \appendtoks \instance\frozen\protected\edefcsname\currentmathfraction\endcsname{\math_frac{\currentmathfraction}}% \to \everydefinemathfraction % Sometimes users want control over the distances: % So far for control. % no : \ruledhbox{\m{\frac[strut=no] {28}{8\times29}}} \par % tight : \ruledhbox{\m{\frac[strut=tight]{28}{8\times29}}} \par % yes : \ruledhbox{\m{\frac[strut=yes] {28}{8\times29}}} \par % math : \ruledhbox{\m{\frac[strut=math] {28}{8\times29}}} \par % text : \ruledhbox{\m{\frac[strut=text] {28}{8\times29}}} \par \installcorenamespace{mathfractionstrut} \def\math_frac_no_strut {\enforced\let\m_fractions_strut_top\relax \enforced\let\m_fractions_strut_bot\relax} \defcsname\??mathfractionstrut\v!yes\endcsname {\enforced\let\m_fractions_strut_top\mathstrut \enforced\let\m_fractions_strut_bot\mathstrut} \defcsname\??mathfractionstrut\v!math\endcsname {\enforced\let\m_fractions_strut_top\mathstrut \enforced\let\m_fractions_strut_bot\mathstrut} \letcsname\??mathfractionstrut\v!no\endcsname\math_frac_no_strut \defcsname\??mathfractionstrut\v!tight\endcsname {\enforced\let\m_fractions_strut_top\mathdepthstrut \enforced\let\m_fractions_strut_bot\mathheightstrut} \defcsname\??mathfractionstrut\v!text\endcsname {\enforced\let\m_fractions_strut_top\strut \enforced\let\m_fractions_strut_bot\strut} \math_frac_no_strut \newdimension\d_math_fraction_margin \def\math_fraction_margin_kern_indeed{\kern\d_math_fraction_margin} \let\math_fraction_margin_kern\relax %D \starttyping %D $\Uover{2}{3} ^4$ % double script error but no longer because we use the prescripts %D ${\over{2}{3}}^4$ % no issue anyway because we wrap in {} (goes unnoticed) %D $\frac {2}{3} ^4$ % we wrap in \mathfrac so we can also use prescripts %D \stoptyping \installlocalcurrenthandler\??mathfractions {mathfraction} \tolerant\protected\def\math_frac#1#*[#S#2]%% {\beginmathgroup % \setlocalmathfractioncurrent{#1}% \edef\currentmathfraction{#1}% % \ifparameter#2\or\setupcurrentmathfraction[#2]\fi % \edef\p_math_fraction_fences{\mathfractionparameter\c!fences}% \dostarttagged\t!mfractionstack{\mathfractionparameter\c!mathmeaning}% % \math_atom_by_parameter\mathfractionparameter\bgroup \ifempty\p_math_fraction_fences \else \math_fenced_fenced_start\p_math_fraction_fences \fi % \d_math_fraction_margin{\mathfractionparameter\c!margin}% \ifcase\d_math_fraction_margin \let\math_fraction_margin_kern\relax \else \let\math_fraction_margin_kern\math_fraction_margin_kern_indeed \fi % \edef\p_math_fractions_strut{\mathfractionparameter\c!strut}% \ifcsname\??mathfractionstrut\p_math_fractions_strut\endcsname \lastnamedcs \else \math_frac_no_strut \fi % % This only adds a level of structure so that we don't get the everthing tagged % fractionstack. \dostarttagged\t!mfraction\currentglobalmathfraction \expandnamespaceparameter\??mathfractionalternative\mathfractionparameter\c!alternative\v!inner} \protected\def\math_frac_wrapup {\ifempty\p_math_fraction_fences \else \math_fenced_fenced_stop\p_math_fraction_fences \fi \dostoptagged \egroup \dostoptagged \endmathgroup} % 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 normally in cramped mode! % % See \MKIV\ for the old (more messy) implementation where we have to fight the over % related syntax (we now use a lmtx primitive). % timestamp: 01/2022 : (re)watching eNerd⁓ - Time Capsule 2020 a.k.a. Farewell Party % for Normalcy (UHD) with the soekris/neumanns combination % Todo: \Umathfrac for all of them as we're keyword driven anyway. \installcorenamespace{fractionmethods} \defcsname\??fractionmethods\v!vertical \v!no \v!none\endcsname{\Uatop} \defcsname\??fractionmethods\v!vertical \v!no \endcsname{\Uatopwithdelims \Umathchar\zerocount\fam\scratchcounterone \Umathchar\zerocount\fam\scratchcountertwo} \defcsname\??fractionmethods\v!vertical \v!yes \v!none\endcsname{\Uabove} \defcsname\??fractionmethods\v!vertical \v!yes \endcsname{\Uabovewithdelims \Umathchar\zerocount\fam\scratchcounterone \Umathchar\zerocount\fam\scratchcountertwo} \defcsname\??fractionmethods\v!vertical \v!hidden \v!none\endcsname{\Uabove} \defcsname\??fractionmethods\v!vertical \v!hidden \endcsname{\Uabovewithdelims \Umathchar\zerocount\fam\scratchcounterone \Umathchar\zerocount\fam\scratchcountertwo} \defcsname\??fractionmethods\v!vertical \v!auto \v!none\endcsname{\Uover} \defcsname\??fractionmethods\v!vertical \v!auto \endcsname{\Uoverwithdelims \Umathchar\zerocount\fam\scratchcounterone \Umathchar\zerocount\fam\scratchcountertwo} \defcsname\??fractionmethods\v!vertical \v!symbol \v!none\endcsname{\Ustretched \Umathchar\zerocount\fam\scratchcounterthree} \defcsname\??fractionmethods\v!vertical \v!symbol \endcsname{\Ustretchedwithdelims \Umathchar\zerocount\fam\scratchcounterone \Umathchar\zerocount\fam\scratchcountertwo \Umathchar\zerocount\fam\scratchcounterthree} \defcsname\??fractionmethods\v!horizontal \v!none\endcsname{\Uskewed \Umathchar\zerocount\fam\scratchcounterthree \s!hfactor {\mathfractionparameter\c!hfactor}} \defcsname\??fractionmethods\v!horizontal \endcsname{\Uskewedwithdelims \Umathchar\zerocount\fam\scratchcounterone \Umathchar\zerocount\fam\scratchcountertwo \Umathchar\zerocount\fam\scratchcounterthree \s!hfactor {\mathfractionparameter\c!hfactor}} \defcsname\??fractionmethods\v!line \v!none\endcsname{\Uskewed \Umathchar\zerocount\fam\scratchcounterthree \s!noaxis \relaxedspace \s!hfactor {\mathfractionparameter\c!hfactor}} \defcsname\??fractionmethods\v!line \endcsname{\Uskewedwithdelims \Umathchar\zerocount\fam\scratchcounterone \Umathchar\zerocount\fam\scratchcountertwo \Umathchar\zerocount\fam\scratchcounterthree \s!noaxis \relaxedspace \s!hfactor {\mathfractionparameter\c!hfactor}} \def\math_frac_common {\edef\p_method {\mathfractionparameter\c!method}% \edef\p_rule {\mathfractionparameter\c!rule}% \edef\p_thickness {\mathfractionparameter\c!rulethickness}% \scratchcounterone \mathfractionparameter\c!left \relax \scratchcountertwo \mathfractionparameter\c!right \relax \scratchcounterthree \ifx\p_method\v!horizontal \mathfractionparameter\c!middle % \orelse\ifx\p_method\v!mp % \mathfractionparameter\c!middle \orelse\ifx\p_method\v!line \mathfractionparameter\c!middle \else \mathfractionparameter\c!symbol \fi \relax % \ifcstok{\mathfractionparameter\c!mathstyle}\s!identity \frozen\Umathnumeratorvariant \allmathstyles\mathstylevariantidentity \frozen\Umathdenominatorvariant\allmathstyles\mathstylevariantidentity \resetmathfractionparameter\c!mathstyle \fi % \ifcstok{\mathfractionparameter\c!plugin}\v!mp \edef\p_mp{\mathfractionparameter\c!mp}% \ifempty\p_mp\else \clf_set_extensible_data mp {\p_mp} left \scratchcounterthree right \scratchcounterthree middle \scratchcounterthree \relax \fi \else \lettonothing\p_mp \fi % \ifcsname \??fractionmethods \p_method \ifx\p_method\v!horizontal % \orelse\ifx\p_method\v!mp \orelse\ifx\p_method\v!line \orelse\ifcsname\??fractionmethods\p_method\p_rule\endcsname % \v!vertical \p_rule \else \v!auto \fi \ifnum\scratchcounterone=\math_frac_no_delim \ifnum\scratchcountertwo=\math_frac_no_delim \v!none \fi \fi \endcsname \lastnamedcs \else \csname\??fractionmethods\v!vertical\v!auto\endcsname \fi \usedsymbolcolorparameterattributes{\mathfractionparameter\c!symbolcolor}% \s!thickness \ifx\p_thickness\v!font \zeropoint \s!font\relaxedspace \else {\p_thickness}% \fi \s!class \math_class_by_parameter\mathfractionparameter\c!mathclass \s!vfactor {\mathfractionparameter\c!vfactor}% \s!source {\namedboxanchor{\mathfractionparameter\c!source}}% \ifempty\p_mp\else \s!usecallback\relaxedspace \fi} \installcorenamespace{mathalignsimple} % this should move to math-ali \defcsname\??mathalignsimple\v!right \endcsname#1{#1\hfill} \defcsname\??mathalignsimple\v!flushleft \endcsname#1{#1\hfill} \defcsname\??mathalignsimple\v!left \endcsname#1{\hfill#1} \defcsname\??mathalignsimple\v!flushright\endcsname#1{\hfill#1} \defcsname\??mathalignsimple\v!middle \endcsname#1{\hfill#1\hfill} \protected\def\math_frac_aligned_top{\begincsname\??mathalignsimple\mathfractionparameter\c!topalign \endcsname} \protected\def\math_frac_aligned_bot{\begincsname\??mathalignsimple\mathfractionparameter\c!bottomalign\endcsname} % \protected\def\math_frac_aligned_top{\begincsname\??mathalignsimple\mathfractionparameter\c!align\endcsname} % \protected\def\math_frac_aligned_bot{\begincsname\??mathalignsimple\mathfractionparameter\c!align\endcsname} \protected\defcsname\??mathfractionalternative\v!inner\endcsname#1#2% {%\beginmathgroup \math_frac_common {\usemathfractioncolorparameter\c!topcolor \math_fraction_margin_kern \usemathstyleparameter\mathfractionparameter\c!mathnumeratorstyle \m_fractions_strut_top\math_frac_aligned_top{#1}% \math_fraction_margin_kern}% {\usemathfractioncolorparameter\c!bottomcolor \math_fraction_margin_kern \usemathstyleparameter\mathfractionparameter\c!mathdenominatorstyle \m_fractions_strut_bot\math_frac_aligned_bot{#2}% \math_fraction_margin_kern}% %\endmathgroup \math_frac_wrapup} \protected\defcsname\??mathfractionalternative\v!outer\endcsname#1#2% {\beginmathgroup \usemathstyleparameter\mathfractionparameter\c!mathstyle \math_frac_common {\usemathfractioncolorparameter\c!topcolor \math_fraction_margin_kern \m_fractions_strut_top\math_frac_aligned_top{#1}% \math_fraction_margin_kern}% {\usemathfractioncolorparameter\c!bottomcolor \math_fraction_margin_kern \m_fractions_strut_bot\math_frac_aligned_bot{#2}% \math_fraction_margin_kern}% \endmathgroup \math_frac_wrapup} \protected\defcsname\??mathfractionalternative\v!both\endcsname#1#2% {\beginmathgroup \usemathstyleparameter\mathfractionparameter\c!mathstyle \math_frac_common {\usemathfractioncolorparameter\c!topcolor \math_fraction_margin_kern \usemathstyleparameter\mathfractionparameter\c!mathnumeratorstyle \m_fractions_strut_top\math_frac_aligned_top{#1}% \math_fraction_margin_kern}% {\usemathfractioncolorparameter\c!bottomcolor \math_fraction_margin_kern \usemathstyleparameter\mathfractionparameter\c!mathdenominatorstyle \m_fractions_strut_bot\math_frac_aligned_bot{#2}% \math_fraction_margin_kern}% \endmathgroup \math_frac_wrapup} \nulldelimiterspace\zeropoint % was 1.2pt \definemathfraction[xfrac] [\c!alternative=\v!inner,\c!mathstyle=\s!script] \definemathfraction[xxfrac][\c!alternative=\v!inner,\c!mathstyle=\s!scriptscript] \aliased\let\normalxfrac\xfrac \permanent\protected\def\xfrac#1#2{\normalxfrac{\enforced\let\xfrac\xxfrac#1}{\enforced\let\xfrac\xxfrac#2}} %D Spacing (sensitive for definition of \triggermathstyle: \installcorenamespace{mathfractiondistance} \defcsname\??mathfractiondistance\v!none\endcsname {\Umathfractionnumup \allmathstyles\zeropoint \Umathfractiondenomdown\allmathstyles\zeropoint} \defcsname\??mathfractiondistance\v!no\endcsname {\Umathfractionnumup \allmathstyles\zeropoint \Umathfractiondenomdown\allmathstyles\zeropoint} \defcsname\??mathfractiondistance\v!overlay\endcsname {\Umathfractionnumup \allmathstyles\zeropoint \Umathfractionnumvgap \allmathstyles\zeropoint \Umathfractiondenomvgap\allmathstyles\zeropoint \Umathfractiondenomdown\allmathstyles\zeropoint} \defcsname\??mathfractiondistance\v!top\endcsname {\Umathfractionnumvgap \allmathstyles{\mathfractionparameter\c!topdistance}% \relax} \defcsname\??mathfractiondistance\v!bottom\endcsname {\Umathfractiondenomvgap\allmathstyles{\mathfractionparameter\c!bottomdistance}% \relax} \defcsname\??mathfractiondistance\v!both\endcsname {\Umathfractionnumvgap \allmathstyles{\mathfractionparameter\c!topdistance}% \Umathfractiondenomvgap\allmathstyles{\mathfractionparameter\c!bottomdistance}% \relax} \setupmathfractions [\c!distance=\v!none, \c!topdistance=\zeropoint, \c!bottomdistance=\zeropoint] % we need to keep it local, so not everybodyfont \appendtoks \edef\p_distance{\rootmathfractionparameter\c!distance}% \ifempty\p_distance\else \begincsname\??mathfractiondistance\p_distance\endcsname \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 \ifempty\currentmathfraction \edef\p_threshold{\mathfractionparameter\c!inlinethreshold}% \ifempty\p_threshold \let\math_fraction_set_threshold_inline\math_fraction_set_threshold_inline_auto \orelse\ifx\p_threshold\v!auto \let\math_fraction_set_threshold_inline\math_fraction_set_threshold_inline_auto \else \let\math_fraction_set_threshold_inline\math_fraction_set_threshold_inline_ratio \fi \edef\p_threshold{\mathfractionparameter\c!displaythreshold}% \ifempty\p_threshold \let\math_fraction_set_threshold_display\math_fraction_set_threshold_display_auto \orelse\ifx\p_threshold\v!auto \let\math_fraction_set_threshold_display\math_fraction_set_threshold_display_auto \else \let\math_fraction_set_threshold_display\math_fraction_set_threshold_display_ratio \fi \fi \to \everysetupmathfraction \def\math_fraction_set_threshold_inline_auto {\Umathfractiondelsize\allmathstyles\maxdimen} \def\math_fraction_set_threshold_display_auto {\Umathfractiondelsize\alldisplaystyles\maxdimen} % \dimexpr#1*\plusthousand/\glyphscale\relax \def\math_fraction_set_threshold_inline_ratio % watch the reverse compensation {\edef\p_threshold{\mathfractionparameter\c!inlinethreshold}% \Umathfractiondelsize\alltextstyles \p_threshold\glyphscaled\textface \Umathfractiondelsize\allscriptstyles \p_threshold\glyphscaled\scriptface \Umathfractiondelsize\allscriptscriptstyles\p_threshold\glyphscaled\scriptscriptface} \def\math_fraction_set_threshold_display_ratio % watch the reverse compensation {\edef\p_threshold{\mathfractionparameter\c!displaythreshold}% \Umathfractiondelsize\alldisplaystyles\p_threshold\glyphscaled\textface} \setupmathfractions [\c!inlinethreshold=1.2, % no unit but fraction \c!displaythreshold=\v!auto, % no unit but fraction \c!threshold=.25\exheight] \appendtoks \Umathskeweddelimitertolerance\allmathstyles\mathfractionparameter\c!threshold \to \everymathematics % else original lost: \to \everybodyfont %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=\v!small] \definemathfraction[i:tfrac][\c!alternative=\v!inner,\c!mathstyle=\s!script] \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] \definemathfraction[d:tfrac][\c!alternative=\v!inner,\c!mathstyle={\s!cramped,\s!script}] \definemathfraction[d:sfrac][\c!alternative=\v!inner,\c!mathstyle={\s!cramped,\s!scriptscript}] \definemathfraction[d:dfrac][\c!alternative=\v!both,\c!mathstyle=\s!display] %D \protected\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 %D There is no real need to support ams styling any longer so we removed the %D related code. \permanent\protected\def\frac {\csname\inlineordisplaymath id:frac\endcsname} \permanent\protected\def\tfrac{\csname\inlineordisplaymath id:tfrac\endcsname} \permanent\protected\def\sfrac{\csname\inlineordisplaymath id:sfrac\endcsname} \permanent\protected\def\dfrac{\csname\inlineordisplaymath id:dfrac\endcsname} \definemathfraction [d:binom] [d:frac] [\c!rule=\v!no, \c!mathmeaning=binom, % \c!mathstyle=\s!display, \c!left="28, \c!right="29] \definemathfraction [i:binom] [i:frac] [\c!rule=\v!no, \c!mathmeaning=binom, %\c!mathstyle=\s!text, \c!left="28, \c!right="29] \permanent\protected\def\binom{\csname\inlineordisplaymath id:binom\endcsname} \definemathfraction [dbinom] [d:binom] [\c!mathstyle=\s!display] \definemathfraction [tbinom] [i: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 % % we forget about this ams one ... no one uses it anyway % % \permanent\protected\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}% % \ifzeropt\nulldelimiterspace\else % \kern-\nulldelimiterspace % \fi}} % % instead we predefine one: \definemathfraction [cfrac] [\c!mathstyle=\v!text] % so users can do this: % % \setupmathfraction % [cfrac] % [topalign=flushright] % % or define an child instance that presets it. %D \macros %D {splitfrac, splitdfrac} %D %D Occasionally one needs to typeset multi||line fractions. These commands use \type %D {\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 \defcsname\??mathalignsimple\v!split:\v!flushleft\endcsname#1% {#1% \ifchkdimension\mathfractionparameter\c!distance\or\hkern\lastchkdimension\fi \hfill} \defcsname\??mathalignsimple\v!split:\v!flushright\endcsname#1% {\hfill \ifchkdimension\mathfractionparameter\c!distance\or\hkern\lastchkdimension\fi \mathatom \s!class \mathordcode \s!unroll {}% prevents +/- seen as sign, unroll prevents empty box #1} \definemathfraction [splitfrac] [\c!mathnumeratorstyle=\v!text, \c!mathdenominatorstyle=\v!text, \c!topalign=\v!split:\v!flushleft, \c!bottomalign=\v!split:\v!flushright, \c!distance=\emwidth, \c!rule=\v!no] \definemathfraction [splitdfrac] [splitfrac] [\c!mathnumeratorstyle=\v!display, \c!mathdenominatorstyle=\v!display] %D More fracking: %D %D \starttyping %D \m {\mathaxisbelow\vfrac {1}{x}} %D \m {\mathaxisbelow\vfrac[method=line]{1}{x}} %D \stoptyping \definemathfraction [\s!vfrac] [\c!method=\v!horizontal] % \definemathfraction % [hfrac] % for ton's asciimath % [\c!method=\v!line] %D And a cheat (for Mikael): % \definemathfraction % [afrac] % [\c!mathclass=\mathrelationcode, % \c!rule=\v!symbol, % \c!middle="2192] %D New stretched fraction with middle symnbol: % \enableexperiments[math.arrows] % enforce construction of these in math-act % % { % tweak = "addarrows", % list = { [0x3D] = { squeeze = .85, yoffset = .0975 } } -- bonum % }, \definemathfraction [relfraction] [\c!mathclass=\mathrelationcode, \c!margin=.25\emwidth, \c!rule=\v!symbol] \definemathfraction [bartext] [relfraction] [\c!middle="203E] \definemathfraction [leftarrowtext] [relfraction] [\c!middle="2190] \definemathfraction [rightarrowtext] [relfraction] [\c!middle="2192] \definemathfraction [twoheadleftarrowtext] [relfraction] [\c!middle="219E] \definemathfraction [twoheadrightarrowtext] [relfraction] [\c!middle="21A0] \definemathfraction [reltext] [relfraction] [\c!middle="002D] \definemathfraction [equaltext] [relfraction] [\c!middle="003D] \definemathfraction [mapstotext] [relfraction] [\c!middle="21A6] \definemathfraction [hookleftarrowtext] [relfraction] [\c!middle="21A9] \definemathfraction [hookrightarrowtext] [relfraction] [\c!middle="21AA] \definemathfraction [leftharpoondowntext] [relfraction] [\c!middle="21BD] \definemathfraction [leftharpoonuptext] [relfraction] [\c!middle="21BC] \definemathfraction [rightharpoondowntext] [relfraction] [\c!middle="21C1] \definemathfraction [rightharpoonuptext] [relfraction] [\c!middle="21C0] \definemathfraction [rightoverleftarrowtext] [relfraction] [\c!middle="21C4] \definemathfraction [leftrightharpoonstext] [relfraction] [\c!middle="21CB] \definemathfraction [rightleftharpoonstext] [relfraction] [\c!middle="21CC] \definemathfraction [triplereltext] [relfraction] [\c!middle="2261] \definemathfraction [leftrightarrowtext] [relfraction] [\c!middle="27F7] \definemathfraction [rightleftarrowtext] [relfraction] [\c!middle="27F7] \definemathfraction [Leftarrowtext] [relfraction] [\c!middle="27F8] \definemathfraction [Rightarrowtext] [relfraction] [\c!middle="27F9] \definemathfraction [Leftrightarrowtext] [relfraction] [\c!middle="27FA] \definemathfraction [Rightleftarrowtext] [relfraction] [\c!middle="27FA] \protect \endinput