%D \module %D [ file=math-frc, %D version=2007.07.19, %D title=\CONTEXT\ Math Macros, %D subtitle=Fractions, %D author={Hans Hagen \& Taco Hoekwater}, %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 \macros %D {frac, xfrac, xxfrac} %D %D This is another one Tobias asked for. It replaces the %D primitive \type {\over}. We also take the opportunity to %D handle math style restoring, which makes sure units and %D chemicals come out ok. %D The \type {\frac} macro kind of replaces the awkward \type %D {\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 %D overloading of \type {\xfrac}). % \def\dofrac#1#2#3{\relax\mathematics{{{#1{#2}}\over{#1{#3}}}}} \def\dofrac#1#2#3{\relax\mathematics{\Ustack{{#1{#2}}\normalover{#1{#3}}}}} \def\nofrac #1#2{\relax\mathematics{\Ustack{{#1}\normalover{#2}}}} % $\mathfracmode0 \frac{1}{2}$ % $\mathfracmode1 \frac{1}{2}$ % $\mathfracmode2 \frac{1}{2}$ % $\mathfracmode3 \frac{1}{2}$ % $\mathfracmode4 \frac{1}{2}$ % $\mathfracmode5 \frac{1}{2}$ % 0=auto, 1=displaystyle, 2=textstyle, 3=scriptstyle, 4=scriptscriptstyle, 5=mathstyle \setnewconstant\mathfracmode\zerocount \unexpanded\def\frac {\ifcase\mathfracmode \expandafter\nofrac \or \expandafter\dofrac\expandafter\displaystyle \or \expandafter\dofrac\expandafter\textstyle \or \expandafter\dofrac\expandafter\scriptstyle \or \expandafter\dofrac\expandafter\scriptscriptstyle \else \expandafter\dofrac\expandafter\mathstyle \fi} \unexpanded\def\xfrac#1#2% {\begingroup \let\xfrac\xxfrac \dofrac\scriptstyle{#1}{#2}% \endgroup} \unexpanded\def\xxfrac#1#2% {\begingroup \dofrac\scriptscriptstyle{#1}{#2}% \endgroup} %D The \type {xx} variant looks still ugly, so maybe it's %D best to say: \unexpanded\def\xxfrac#1#2% {\begingroup \dofrac\scriptscriptstyle{#1}{\raise.25ex\hbox{$\scriptscriptstyle#2$}}% \endgroup} %D Something low level for scientific calculator notation: \unexpanded\def\scinot#1#2% {#1\times10^{#2}} %D The next macro, \type {\ch}, is \PPCHTEX\ aware. In %D formulas one can therefore best use \type {\ch} instead of %D \type {\chemical}, especially in fractions. % let's see who complains ... \mathstyle is now a primitive % % \unexpanded\def\ch#1% % {\ifdefined\@@chemicalletter % \dosetsubscripts % \mathstyle{\@@chemicalletter{#1}}% % \doresetsubscripts % \else % \mathstyle{\rm#1}% % \fi} % \unexpanded\def\ch#1% % {\ifdefined\@@chemicalletter % \dosetsubscripts % \mathematics{\@@chemicalletter{#1}}% % \doresetsubscripts % \else % \mathematics{\rm#1}% % \fi} %D \macros %D {/} %D %D Just to be sure, we restore the behavior of some typical %D math characters. \bgroup \catcode`\/=\othercatcode \global \let\normalforwardslash/ \catcode`\/=\activecatcode \doglobal\appendtoks\let/\normalforwardslash\to\everymathematics \egroup % to be checked: \unexpanded\def\exmthfont#1% {\symbolicsizedfont#1\plusone{MathExtension}} \def\domthfrac#1#2#3#4#5#6#7% {\begingroup \mathsurround\zeropoint \setbox0\hbox{$#1 #6$}% \setbox2\hbox{$#1 #7$}% \dimen0\wd0 \ifdim\wd2>\dimen0 \dimen0\wd2 \fi \setbox4\hbox to \dimen0{\exmthfont#2#3\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\domthsqrt#1#2#3#4#5% {\begingroup \mathsurround\zeropoint \setbox0\hbox{$#1 #5$}% \dimen0=1.05\ht0 \advance\dimen0 1pt \ht0 \dimen0 \dimen0=1.05\dp0 \advance\dimen0 1pt \dp0 \dimen0 \dimen0\wd0 \setbox4\hbox to \dimen0{\exmthfont#2\leaders\hbox{#3}\hfill#4}% \delimitershortfall=0pt \nulldelimiterspace=0pt \setbox2\hbox{$\left\delimiter"0270370 \vrule height\ht0 depth \dp0 width0pt \right.$}% \mathord{\vcenter{\hbox{\copy2 \rlap{\raise\dimexpr\ht2-\ht4\relax\copy4}\copy0}}}% \endgroup} \unexpanded\def\mthfrac#1#2#3#4#5{\mathchoice {\domthfrac\displaystyle \textface {#1}{#2}{#3}{#4}{#5}} {\domthfrac\textstyle \textface {#1}{#2}{#3}{#4}{#5}} {\domthfrac\scriptstyle \scriptface {#1}{#2}{#3}{#4}{#5}} {\domthfrac\scriptscriptstyle\scriptscriptface{#1}{#2}{#3}{#4}{#5}}} \unexpanded\def\mthsqrt#1#2#3{\mathchoice {\domthsqrt\displaystyle \textface {#1}{#2}{#3}} {\domthsqrt\textstyle \textface {#1}{#2}{#3}} {\domthsqrt\scriptstyle \textface {#1}{#2}{#3}} {\domthsqrt\scriptscriptstyle\textface {#1}{#2}{#3}}} %D Moved from math-new.tex (not that new anyway): %D \macros %D {genfrac} %D %D [TH] The definition of \type {\genfrac} \& co. is not %D trivial, because it allows some flexibility. This is %D supposed to be a user||level command, but will fail quite %D desparately if called outside math mode (\CONTEXT\ redefines %D \type {\over}) %D %D [HH] We clean up this macro a bit and (try) to make it %D understandable. The expansion is needed for generating %D the second argument to \type {\dogenfrac}, which is to %D be a control sequence like \type {\over}. \unexpanded\def\genfrac#1#2#3#4% {\edef\!!stringa {#1#2}% \expanded {\dogenfrac{#4}% \csname \ifx @#3@% \ifx\!!stringa\empty \strippedcsname\normalover \else \strippedcsname\normaloverwithdelims \fi \else \ifx\!!stringa\empty \strippedcsname\normalabove \else \strippedcsname\normalabovewithdelims \fi \fi \endcsname}% {#1#2#3}} \def\dogenfrac#1#2#3#4#5% {{#1{\begingroup#4\endgroup#2#3\relax#5}}} %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 %D \getbuffer \unexpanded\def\dfrac {\genfrac\empty\empty{}\displaystyle} \unexpanded\def\tfrac {\genfrac\empty\empty{}\textstyle} \unexpanded\def\frac {\genfrac\empty\empty{}\donothing} \unexpanded\def\dbinom{\genfrac()\zeropoint\displaystyle} \unexpanded\def\tbinom{\genfrac()\zeropoint\textstyle} \unexpanded\def\binom {\genfrac()\zeropoint\donothing} \unexpanded\def\xfrac {\genfrac\empty\empty{}\scriptstyle} \unexpanded\def\xxfrac{\genfrac\empty\empty{}\scriptscriptstyle} \unexpanded\def\frac#1#2{\mathematics{\genfrac\empty\empty{}\donothing{#1}{#2}}} %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 \definecomplexorsimple\cfrac \def\simplecfrac {\docfrac[cc]} \def\complexcfrac[#1]{\docfrac[#1cc]} \def\docfrac[#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 \unexpanded\def\splitfrac#1#2% {\genfrac\empty\empty\zeropoint\textstyle% {\textstyle#1\quad\hfill}% {\textstyle\hfill\quad\mathstrut#2}} \unexpanded\def\splitdfrac#1#2% {\genfrac\empty\empty\zeropoint\displaystyle% {#1\quad\hfill} {\hfill\quad\mathstrut #2}} %D For thee moment here, but it might move: %D \macros %D {qedsymbol} %D %D [HH] The general Quod Erat Domonstrandum symbol is defined %D in such a way that we can configure it. Because this symbol %D is also used in text mode, we make it a normal text symbol %D with special behavior. \unexpanded\def\qedsymbol#1% {\ifhmode \unskip~\hfill#1\par \else\ifmmode \eqno#1\relax % Do we really need the \eqno here? \else \leavevmode\hbox{}\hfill#1\par \fi\fi} \definesymbol [qed] [\qedsymbol{\mathematics{\square}}] %D \macros %D {QED} %D %D [HH] For compatbility reasons we also provide the \type %D {\QED} command. In case this command is overloaded, we still %D have the symbol available. \symbol[qed] \unexpanded\def\QED{\symbol[qed]} %D \macros %D {mathhexbox} %D %D [TH] \type {\mathhexbox} is also user||level (already %D defined in Plain \TEX). It allows to get a math character %D inserted as if it was a text character. \unexpanded\def\mathhexbox#1#2#3% {\mathtext{$\mathsurround\zeropoint\mathchar"#1#2#3$}} %D \macros %D {boxed} %D %D [HH] Another macro that users expect (slightly adapted): \unexpanded\def\boxed {\ifmmode\expandafter\mframed\else\expandafter\framed\fi} \protect \endinput