%D \module %D [ file=pack-rul, % was core-rul, %D version=2022.02.23, %D title=\CONTEXT\ Packaging Macros, %D subtitle=Ruled Math, %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 Packaging Macros / Ruled Math} %D This is a by product of the math improvement activity by Mikael Sundqvist and %D myself. More might end up here and more control might be added. \unprotect % todo \v!mathframed % todo \v!mathstrikeout \newconditional\c_framed_math_framed \installtextracker {framed.math} {\settrue \c_framed_math_framed} {\setfalse\c_framed_math_framed} \integerdef\c_framed_math_last_left \zerocount \integerdef\c_framed_math_last_right\zerocount \installglobalmacrostack\c_framed_math_last_left \installglobalmacrostack\c_framed_math_last_right \installcorenamespace{mathframed} \defineframed[\??mathframed] \setupframed[\??mathframed][\c!location=\v!middle] \tolerant\permanent\protected\def\definemathframed[#1]#*[#2]#*[#3]% {\ifarguments\or \defineframed[#1][\??mathframed]% \or \defineframed[#1][\??mathframed][#2]% \or \defineframed[#1][#2][#3]% \fi \tolerant\frozen\protected\defcsname#1\endcsname{\math_framed{#1}}} \definemathframed[mathframed] % \def\math_framed#1#*[#2]#:#3% % {\begingroup % \ifconditional\c_framed_math_framed % \defineboxanchor[temp]% % \fi % \setmathatomrule\mathbegincode\mathbincode\allmathstyles\mathbegincode\mathbincode % hm % \normalexpanded % {\setbox\scratchbox\hpack % \ifconditional\c_framed_math_framed % \s!source \namedboxanchor{temp} % \fi % \s!ymove \Umathaxis\Ustyle\mathstyle % \bgroup % \localframedwithsettings % [#1][#2]% % {\startimath % \Ustyle\mathstyle % #3% % \stopimath % \integerdef\c_framed_math_last_left \lastleftclass % \integerdef\c_framed_math_last_right\lastrightclass % \push_macro_c_framed_math_last_left % \push_macro_c_framed_math_last_right % }% % \egroup}% % \pop_macro_c_framed_math_last_left % \pop_macro_c_framed_math_last_right % \mathatom % \s!class \mathexplicitcode % \ifnum\c_framed_math_last_left <\zerocount\else\s!leftclass \c_framed_math_last_left \fi % \ifnum\c_framed_math_last_right<\zerocount\else\s!rightclass\c_framed_math_last_right\fi % \bgroup % \ifconditional\c_framed_math_framed % \setboxanchor[temp][\c!corner={\v!left ,\v!bottom},\c!location={\v!right,\v!height}]% % \hpack{\smallinfofont\the\c_framed_math_last_left}% % \setboxanchor[temp][\c!corner={\v!right,\v!bottom},\c!location={\v!left ,\v!height}]% % \hpack{\smallinfofont\the\c_framed_math_last_right}% % \fi % \box\scratchbox % \egroup % \endgroup} \dimensiondef\d_math_framed_offset\zeropoint \def\math_framed#1#*[#2]#:#3% {\begingroup \ifconditional\c_framed_math_framed \defineboxanchor[temp]% \fi \setmathatomrule\mathbegincode\mathbincode\allmathstyles\mathbegincode\mathbincode % hm % \scratchdimen\Umathaxis\Ustyle\mathstyle % \edef\currentframed{#1}% \setbox\scratchbox\hbox{\localframedwithsettings[#1][#2]% {\strut\global\dimensiondef\d_math_framed_offset\dimexpr \framedoffset/2 % +2\d_framed_linewidth \relax}}% % \setbox\scratchbox\hpack\bgroup \startimath \Ustyle\mathstyle #3% \stopimath \normalexpanded{\aftergrouped{% \integerdef\c_framed_math_last_left \the\lastleftclass \integerdef\c_framed_math_last_right\the\lastrightclass }}% \egroup % \boxymove\scratchbox\dimexpr \scratchdimen -\d_math_framed_offset/2 \relax % \setbox\scratchbox\hpack \localframedwithsettings [#1][#2]% {\box\scratchbox}% % \boxymove\scratchbox\scratchdimen % \ifconditional\c_framed_math_framed \boxsource\scratchbox \namedboxanchor{temp}% test \fi % \mathatom \s!class \mathexplicitcode \ifnum\c_framed_math_last_left <\zerocount\else\s!leftclass \c_framed_math_last_left \fi \ifnum\c_framed_math_last_right<\zerocount\else\s!rightclass\c_framed_math_last_right\fi \bgroup \ifconditional\c_framed_math_framed \setboxanchor[temp][\c!corner={\v!left ,\v!bottom},\c!location={\v!right,\v!height}]% \hpack{\smallinfofont\the\c_framed_math_last_left}% \setboxanchor[temp][\c!corner={\v!right,\v!bottom},\c!location={\v!left ,\v!height}]% \hpack{\smallinfofont\the\c_framed_math_last_right}% \fi \box\scratchbox \egroup \endgroup} \defineoverlay[mathstrikeout][\useMPgraphic{\framedparameter{mp}}] \definemathframed [mathstrikeout] [\c!offset=\v!overlay, \c!mp=mathstrikeout, \c!rulethickness=1.5\linewidth, \c!background={\v!foreground,mathstrikeout}, %\c!color=darkgreen, \c!textstyle=\txx, \c!mathstyle=\s!script, \c!frame=\v!off, \c!arrow=\v!yes] \definemathframed [mathcrossout] [mathstrikeout] [\c!mp=mathcrossout, strike:location=bottom] \permanent\protected\def\mathstrikeoutlabel {\iftok{\framedparameter{strike:math}}\emptytoks \useframedstyleandcolor\c!textstyle\c!color \framedparameter{strike:text}% \else \startimath \dousecolorparameter{\framedparameter\c!color}% mathcolor \usemathstyleparameter\framedparameter\c!mathstyle \framedparameter{strike:math}% \stopimath \fi} \startuseMPgraphic{mathstrikeout} path arr ; arr := (llcorner OverlayBox -- urcorner OverlayBox) ; if "\framedparameter{arrow}" = "yes" : drawarrow else : draw fi arr withpen pencircle scaled OverlayLineWidth withcolor OverlayColor ; label.top("\mathstrikeoutlabel", point 1 of arr) withcolor OverlayColor ; % draw OverlayBox % dashed evenly % withpen pencircle scaled .5OverlayLineWidth % withcolor OverlayColor % ; setbounds currentpicture to OverlayBox ; \stopuseMPgraphic \startuseMPgraphic{mathcrossout} draw ( (llcorner OverlayBox -- urcorner OverlayBox) && (ulcorner OverlayBox -- lrcorner OverlayBox) ) withpen pencircle scaled OverlayLineWidth withcolor OverlayColor ; if "\framedparameter{strike:location}" = "bottom" : label.bot("\mathstrikeoutlabel", center bottomboundary currentpicture) else : label.top("\mathstrikeoutlabel", center topboundary currentpicture) fi withcolor OverlayColor ; setbounds currentpicture to OverlayBox ; \stopuseMPgraphic %D \starttyping %D \enabletrackers[framed.math] %D %D \startTEXpage[offset=10pt,width=40dk] %D \showmakeup[mathglue] %D \def\MyTest#1% %D {$ x #1 x $\quad %D $ x \mathframed[offset=0pt]{#1} x $\quad %D $\displaystyle x #1 x $\quad %D $\displaystyle x \mathframed[offset=0pt]{#1} x $} %D \MyTest{>}\blank %D \MyTest{+}\blank %D \MyTest{!}\blank %D \MyTest{+\frac{1}{2}+}\blank %D \MyTest{\frac{1}{2}}\blank %D \stopTEXpage %D \stoptyping %D From the list: %D \starttyping %D \startformula[spaceinbetween=.5\lineheight] %D \left\{ %D \mparagraph{Quaternion algebras\par over $\blackboard{Q}$ up to isomorphism} %D \right\} %D \alignhere \leftrightarrow %D \left\{ %D \mparagraph %D [foregroundcolor=darkred,offset=.1ex,frame=on] %D {Finite subset of places of $\blackboard{Q}$\par of even cardinality} %D \right\} %D \breakhere \leftrightarrow %D \left\{ %D \mparagraph{more text} %D \right\} %D \breakhere \leftrightarrow %D \left\{ %D \mparagraph[foregroundcolor=darkblue]{and more text} %D \right\} %D \stopformula %D \stoptyping \permanent\tolerant\protected\def\mparagraph[#1]#*#:#2% {\vcenter class \mathconstructcode \bgroup % \mathwrappedcode would be like fraction \framed[\c!offset=\v!overlay,\c!frame=\v!overlay,\c!align=\v!middle,#1]{#2}% \egroup} %D Moved from pack-rul.mkxl to here: %D \macros %D {mframed, minframed} %D %D See mkii and mkiv files for some history on this already rather old mechanism; it %D dates from the real beginning. In the meantime we used anchoring, and now we're %D doing it more \LMTX ish. % mframed xx\mframed {x^2 + \frac{2}{x} + \sqrt{\frac{2}{\sqrt{\frac{2}{x}}}}} \input tufte % inmframed xx\inmframed{x^2 + \frac{2}{x} + \sqrt{\frac{2}{\sqrt{\frac{2}{x}}}}} \input tufte % mcframed xx\mcframed {x^2 + \frac{2}{x} + \sqrt{\frac{2}{\sqrt{\frac{2}{x}}}}} \input tufte % mtframed xx\mtframed {x^2 + \frac{2}{x} + \sqrt{\frac{2}{\sqrt{\frac{2}{x}}}}} \input tufte \newinteger\c_framed_mstyle \installcorenamespace{mathframed} \installframedcommandhandler \??mathframed {mathframed} \??mathframed \newtoks \t_pack_framed_mathframed \newdimension\d_pack_framed_mathframed \appendtoks \frozen\protected\instance\edefcsname\currentmathframed\endcsname{\pack_framed_mathframed[\currentmathframed]}% \to \everydefinemathframed \tolerant\protected\def\pack_framed_mathframed[#1]#*[#2]#:#3% needs testing ! {\begingroup \edef\currentmathframed{#1}% \setupcurrentmathframed[#2]% \c_framed_mstyle\normalmathstyle \edef\m_framed_location{\mathframedparameter\c!location}% \ifx\m_framed_location\v!mathematics \inheritedmathframedframed\bgroup \setbox\scratchbox\hbox\bgroup \Ustartmath \triggermathstyle\c_framed_mstyle \the\t_pack_framed_mathframed \mathatom \mathunspacedcode\bgroup #3% \egroup \Ustopmath \egroup \global\d_pack_framed_mathframed\dp\scratchbox \dontleavehmode\box\scratchbox \egroup \else \inheritedmathframedframed\bgroup \hbox\bgroup \Ustartmath \triggermathstyle\c_framed_mstyle #3% \Ustopmath \egroup \egroup \fi \endgroup} \appendtoks \c_strc_math_ragged_status \plustwo \c_strc_formulas_check_width\zerocount \to \t_pack_framed_mathframed \installframedlocator \v!mathematics {} {\pack_framed_locator_set_lo \ifzeropt\d_framed_locator_lo\else \lower\dimexpr\d_framed_locator_lo+\d_pack_framed_mathframed\relax \fi \box\b_framed_normal} \definemathframed[mframed] \definemathframed[inmframed][\c!location=\v!low] \definemathframed[mcframed] [\c!location=\v!mathematics] % centered \definemathframed[mtframed] [\c!location=\v!mathematics,\c!offset=\v!overlay,\c!frame=\v!overlay] % tight %D So instead of the rather versatile \type {\framed}, we use \type {\mframed}: %D %D \startbuffer %D \startformula %D x \times \mframed{y} \times y^{z_z} %D x \times \inmframed{y} \times y^{z_z} %D \stopformula %D \stopbuffer %D %D \typebuffer \getbuffer %D %D And: %D %D \startbuffer %D \startformula %D x \times \mframed{y} \times y^{\mframed{z}_{\mframed{z}}} %D \stopformula %D \stopbuffer %D %D \typebuffer \getbuffer %D %D As usual, one can specify in what way the text should be framed. One should be %D aware of the fact that, inorder to preserve the proper spacing, the \type %D {offset} is set to \type {overlay} and \type {frameoffset} is used used instead. %D %D \startbuffer %D \startformula %D x \times y^{\mframed[framecolor=red]{z}_{z}} %D \stopformula %D \stopbuffer %D %D \typebuffer \getbuffer %D %D For inline use, we also provide the \type {\inmframed} alternative: we want $x %D \times \inmframed{y}$ in inline math, right? \protect