diff options
Diffstat (limited to 'tex/context/base/mkiv/math-stc.mklx')
-rw-r--r-- | tex/context/base/mkiv/math-stc.mklx | 1390 |
1 files changed, 0 insertions, 1390 deletions
diff --git a/tex/context/base/mkiv/math-stc.mklx b/tex/context/base/mkiv/math-stc.mklx deleted file mode 100644 index 1ee8e85a2..000000000 --- a/tex/context/base/mkiv/math-stc.mklx +++ /dev/null @@ -1,1390 +0,0 @@ -%D \module -%D [ file=math-stc, -%D version=2012.12.29, -%D title=\CONTEXT\ Math Macros, -%D subtitle=Stackers, -%D comment=This replaces math-arr and friends, -%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 / Stackers} - -\unprotect - -%D WARNING: If the code here changes, the export needs to be checked! Stackers are -%D rather special because the order in mathml matters, so we flush in [base under -%D over] order. We also do some analysis at the \TEX\ end (passing the right -%D variant). It's easy in the export to deal with it but in the pdf stream less -%D trivial as we don't actually analyze there. -%D -%D At some point the \MKII\ arrow mechanism has been converted to \MKIV, but we kept -%D most of the logic. We now have a more generic variant dealing with extensibles. -%D There are a few demands than we need to meet: -%D -%D \startitemize -%D \startitem -%D The width of the extensible need to adapt itself automatically. -%D \stopitem -%D \startitem -%D We need to be able to control horizontal and vertical offsets. -%D \stopitem -%D \startitem -%D We best have a math as well as a text variant (which is handy for chemistry). -%D \stopitem -%D \startitem -%D For historic reasons we need to deal with optional arguments in a special -%D (reverse) way. -%D \stopitem -%D \startitem -%D We need alternatives for extensibles on top, in the middle and at the bottom. -%D \stopitem -%D \stopitemize -%D -%D After I had experimented a bit with virtual characters for two headed arrows I -%D discussed the issue with the Gyre folks and we came to the conclusion that it -%D made sense to have real extensibles instead of constructing them out of snippets. -%D After all, \OPENTYPE\ math provides for it. So, in December 2013 beta versions of -%D Latin Modern and Gyre fonts came available that had these! Because we still want -%D to support the traditional Latin Modern Virtual math font those were extended -%D with a couple of virtual extensibles as well. -%D -%D {\em For the moment we still have some mess here: we can deal with known -%D dimensions, but fillers (like \type {\rightarrowfil} don't work with \OPENTYPE\ -%D extensibles yet because there is no way to let them stretch like leaders. At some -%D point \LUATEX\ might provide a auto||fit||to||encapsulated||box and if not I will -%D cook up a \LUA\ based variant.} -%D -%D We could mess with something like \type {$mid\limits^{top}_{bottom}$} but we like -%D a bit more control. At some point we need to add some hacks to get exports -%D working well. -%D -%D In the end we have a more flexible mechanism which also handles text variants. - -%D When wrapping up some math developments I decided to add mp support here as well. -%D A nice evening job with Joe Bonamassa performing live on the big screen (real -%D nice bluray's). See meta-imp-mat.mkiv for examples. - -% possible improvements: -% -% - we could skip the left/right offsets when offset=normal, this saves some access time -% at the lua end and some checking: use \mathhorizontalcode or \mathextensiblecode -% but in practice arrows etc are not used that often - -\installcorenamespace {mathextensiblefallbacks} - -% currently no italic correction ... problem is that we don't know yet if we have an italic -% below so we we need to postpone - -% \def\math_stackers_fallback -% {\hbox to \scratchwidth{\csname\??mathextensiblefallbacks\ifcsname\??mathextensiblefallbacks\number\scratchunicode\endcsname\number\scratchunicode\fi\endcsname}} -% %{\csname\??mathextensiblefallbacks\ifcsname\??mathextensiblefallbacks\number\scratchunicode\endcsname\number\scratchunicode\fi\endcsname } - -\def\math_stackers_fallback - {\mathstylehbox to \scratchwidth{\usemathstackerscolorparameter\c!color - \hss - \hskip\mathstackersparameter\c!topoffset\relax % for manual italic correction - \ifcsname\??mathextensiblefallbacks\number\scratchunicode\endcsname - \lastnamedcs - \else - \Umathchar \fam \zerocount \scratchunicode - \fi - \hss}} - -\def\math_stackers_regular - {\mathstylehbox{\usemathstackerscolorparameter\c!color - \hskip\d_math_stackers_offset_l - \Umathaccent\fam\zerocount\scratchunicode - {\hskip\dimexpr\scratchwidth-\d_math_stackers_offset_l-\d_math_stackers_offset_r}% - \hskip\d_math_stackers_offset_r - }} - -\def\math_stackers_stretch % we don't have that one yet - {\mathstylehbox{\usemathstackerscolorparameter\c!color - \hskip\d_math_stackers_offset_l - \Umathaccent\fam\zerocount\scratchunicode - {\hskip\dimexpr\hsize-\d_math_stackers_offset_l-\d_math_stackers_offset_r}% - \hskip\d_math_stackers_offset_r - }} - -% these delimiters are a unuseable as they don't center for small arguments: -% -% $\Umathaccent 0 0 "2190{x}$ \par $\Umathaccent 0 0 "27F8{x}$\par -% $\Udelimiterunder 0 "2190{x}$ \par $\Udelimiterunder 0 "27F8{x}$\par - -\setvalue{\??mathextensiblefallbacks}% - {\hpack{\vrule\s!width\scratchwidth\s!height.1\mathexheight\s!depth\zeropoint}} - -% \def\math_stackers_with_fallback#codepoint% -% {\begingroup -% \scratchunicode#codepoint\relax -% \ifcase\mathextensiblecode\fam\scratchunicode\relax -% \math_stackers_fallback -% \else -% \math_stackers_stretch -% \fi -% \endgroup} - -%D We don't really need this because we can assume that fonts have the right -%D extensibles. If needed I will make a general virtual extender for \OPENTYPE\ -%D fonts. -%D -%D Because we have quite some control over positioning, we have somewhat extensive -%D tracing built in. - -\let\math_stackers_top \relax -\let\math_stackers_middle\relax -\let\math_stackers_bottom\relax -\let\math_stackers_skip \hskip - -\installtextracker - {math.stackers.texts} - {\let\math_stackers_top \filledhboxb - \let\math_stackers_middle\filledhboxr - \let\math_stackers_bottom\filledhboxg - \let\math_stackers_skip \math_stackers_skip_indeed} - {\let\math_stackers_top \relax - \let\math_stackers_middle\relax - \let\math_stackers_bottom\relax - \let\math_stackers_skip \hskip} - -\def\math_stackers_skip_indeed#amount% - {\filledhboxk{\unsetteststrut\strut\hskip#amount}} % \dontshowstruts - -\let\math_stackers_start_tagged_mid\relax -\let\math_stackers_start_tagged_top\relax -\let\math_stackers_start_tagged_bot\relax -\let\math_stackers_stop_tagged \relax - -\appendtoks - \def\math_stackers_start_tagged_mid{\dostarttagged\t!mstackermid\empty\hbox\bgroup}% - \def\math_stackers_start_tagged_top{\dostarttagged\t!mstackertop\empty\hbox\bgroup}% - \def\math_stackers_start_tagged_bot{\dostarttagged\t!mstackerbot\empty\hbox\bgroup}% - \def\math_stackers_stop_tagged {\egroup\dostoptagged}% -\to \everysetuptagging - -%D We define a full featured command handler. - -\installcorenamespace {mathstackers} - -\installcommandhandler \??mathstackers {mathstackers} \??mathstackers - -\setupmathstackers - [%c!alternative=\v!text, % text | mathematics - \c!left=, - \c!right=, - \c!mathclass=\s!rel, - \c!alternative=\v!normal, - \c!voffset=.25\mathexheight, - \c!hoffset=\zeropoint, - \c!topoffset=\zeropoint, % for manual italic correction - \c!distance=\mathstackersparameter\c!voffset, % distance between symbol and base (can be different from voffset) - \c!minheight=\mathexheight, - \c!mindepth=\zeropoint, - \c!minwidth=.5\mathemwidth, - \c!order=\v!normal, - \c!strut=, - \c!color=, % todo: when I need it - \c!topcommand=, - \c!middlecommand=, - \c!bottomcommand=, - \c!offset=\v!normal, % normal | min | max - \c!location=\v!top] % none | normal | small | medium | big - -%D We assume that the middle characters (that can be an extensible) to sit on -%D top of the baseline by default. - -\installcorenamespace {mathstackerslocation} -\installcorenamespace {mathstackersalternative} - -\letvalue{\??mathstackerslocation\v!top }\plusone % on top of baseline -\letvalue{\??mathstackerslocation\v!high }\plustwo % 25 % down -\letvalue{\??mathstackerslocation\v!middle }\plusthree % centered -\letvalue{\??mathstackerslocation\v!low }\plusfour % 75 % down -\letvalue{\??mathstackerslocation\v!bottom }\plusfive % below baseline -\letvalue{\??mathstackerslocation }\zerocount - -%D First we implement the helper that deals with an extensible in the middle and -%D top and|/|or bottom texts: - -\let\m_math_stackers_text_top \empty -\let\m_math_stackers_text_bottom\empty -\let\m_math_stackers_text_middle\empty - -\def\math_stackers_flushtext#command#text% - {\ifdim\scratchleftoffset >\zeropoint\math_stackers_skip\scratchleftoffset \fi - \ifx\p_strut\v!no \else - \strut - \fi - \mathstackersparameter#command#text% - \ifdim\scratchrightoffset>\zeropoint\math_stackers_skip\scratchrightoffset\fi} - -\def\math_stackers_toptext {\math_stackers_flushtext\c!topcommand \m_math_stackers_text_top } -\def\math_stackers_bottomtext{\math_stackers_flushtext\c!bottomcommand\m_math_stackers_text_bottom} -\def\math_stackers_middletext{\math_stackers_flushtext\c!middlecommand\m_math_stackers_text_middle} - -\def\math_stackers_content - {\ifcase\scratchcounter - \math_stackers_fallback - \or % left - \math_stackers_regular - \or % right - \math_stackers_regular - \or % horizontal - \math_stackers_regular - \else - \math_stackers_fallback - \fi} - -% no checking, we assume sane use - -\letvalue{\??mathstackersalternative\v!normal }\math_stackers_content -\letvalue{\??mathstackersalternative\v!default}\math_stackers_content - -\setupmathstackers - [\c!mp=math:stacker:\number\scratchunicode, - \c!mpheight=\mathcharht\scratchunicode, - \c!mpdepth=\mathchardp\scratchunicode, - \c!mpoffset=.25\mathexheight] - -\setvalue{\??mathstackersalternative\v!mp}% - {\normalexpanded{\math_stackers_mp_box - {\the\dimexpr\mathstackersparameter\c!mpheight}% - {\the\dimexpr\mathstackersparameter\c!mpdepth}% - {\the\dimexpr\mathstackersparameter\c!mpoffset}% - {\the\dimexpr\triggeredmathstyleparameter\Umathfractionrule}% - {\the\dimexpr\triggeredmathstyleparameter\Umathaxis}% - {\the\mathexheight}% - {\the\mathemwidth}% - }} - -\protected\def\math_stackers_mp_box#1#2#3#4#5#6#7% - {\hpack\bgroup % todo: add code key + tag - % we can speed up \mathexheight expansion a bit - \d_overlay_width \scratchwidth - \d_overlay_height #1\relax - \d_overlay_depth #2\relax - \d_overlay_offset #3\relax - \d_overlay_linewidth#4\relax - \edef\overlaylinecolor{\mathstackersparameter\c!color}% - \edef\p_mp{\mathstackersparameter\c!mp}% - \uniqueMPgraphic{\p_mp}{axis=#5,ex=#6,em=#7}% - \egroup} - -\def\math_stackers_check_unicode#codepoint% - {\scratchunicode#codepoint\relax - \scratchhoffset\mathstackersparameter\c!hoffset\relax - \scratchvoffset\mathstackersparameter\c!voffset\relax - \scratchcounter\mathhorizontalcode\fam\scratchunicode\relax % also sets \leftscratchoffset and \rightscratchoffset - \ifx\p_offset\v!max - % heads/tails + hoffset - \orelse\ifx\p_offset\v!min - % heads/tails - hoffset - \advance\scratchleftoffset -\scratchhoffset - \advance\scratchrightoffset-\scratchhoffset - \else % \v!normal - % hoffset - \scratchleftoffset\zeropoint - \scratchrightoffset\zeropoint - \fi - \ifdim\scratchleftoffset<\zeropoint - \scratchleftoffset\zeropoint - \fi - \ifdim\scratchrightoffset<\zeropoint - \scratchrightoffset\zeropoint - \fi} - -\def\math_stackers_normalize_three - {\scratchheight\ht\scratchboxthree - \scratchdepth \dp\scratchboxthree - \scratchtopoffset \scratchheight - \scratchbottomoffset\scratchdepth - \scratchdimen\mathstackersparameter\c!minheight\relax - \ifdim\scratchheight<\scratchdimen - \scratchheight\scratchdimen - \ht\scratchboxthree\scratchheight - \fi - \scratchdimen\mathstackersparameter\c!mindepth\relax - \ifdim\scratchdepth<\scratchdimen - \scratchdepth\scratchdimen - \dp\scratchboxthree\scratchdepth - \fi - \advance\scratchtopoffset -\scratchheight - \advance\scratchbottomoffset-\scratchdepth - \ifdim\scratchtopoffset<\zeropoint - \scratchtopoffset\zeropoint - \fi - \ifdim\scratchbottomoffset<\zeropoint - \scratchbottomoffset\zeropoint - \fi} - -\protected\def\math_stackers_triplet#method#category#codepoint#toptext#bottomtext% - %{\math_stackers_start_group{#category}% - {\begingroup - \edef\currentmathstackers{#category}% - \mathstackersparameter\c!left\relax - \dostarttagged\t!mstacker\currentmathstackers - \ifmmode\math_class_by_parameter\mathstackersparameter\else\dontleavehmode\fi - {\edef\p_offset {\mathstackersparameter\c!offset}% - \edef\p_location {\mathstackersparameter\c!location}% - \edef\p_strut {\mathstackersparameter\c!strut}% - \edef\p_alternative{\mathstackersparameter\c!alternative}% - % \ifx\p_order\v!reverse - % \ifsecondargument - % \edef\m_math_stackers_text_top {#bottomtext}% - % \edef\m_math_stackers_text_bottom{#toptext}% - % \else - % \edef\m_math_stackers_text_top {#toptext}% - % \let\m_math_stackers_text_bottom \empty - % \fi - % \else - % \edef\m_math_stackers_text_top {#toptext}% - % \edef\m_math_stackers_text_bottom{#bottomtext}% - % \fi - \edef\m_math_stackers_text_top {#toptext}% - \edef\m_math_stackers_text_bottom{#bottomtext}% - \ifparameter#bottomtext\or - \edef\p_order{\mathstackersparameter\c!order}% - \ifx\p_order\v!reverse - \swapmacros\m_math_stackers_text_top\m_math_stackers_text_bottom - \fi - \fi - \scratchleftoffset \zeropoint - \scratchrightoffset\zeropoint - \ifcase#method\relax - \math_stackers_check_unicode{#codepoint}% - \else - \edef\m_math_stackers_text_middle{#codepoint}% - \fi - \ifempty\m_math_stackers_text_top - \setbox\scratchboxone\emptyhbox - \else - \setmathsmalltextbox\scratchboxone\hbox{\math_stackers_toptext}% - \fi - \ifempty\m_math_stackers_text_bottom - \setbox\scratchboxtwo\emptyhbox - \else - \setmathsmalltextbox\scratchboxtwo\hbox{\math_stackers_bottomtext}% - \fi - % - \ifcase#method\relax - % e.g. extensible - %\scratchwidth\wd - % \ifdim\wd\scratchboxone>\wd\scratchboxtwo - % \scratchboxone - % \else - % \scratchboxtwo - % \fi - %\relax - \scratchwidth\mathcharwd\scratchunicode - \ifdim\wd\scratchboxone>\scratchwidth - \scratchwidth\wd\scratchboxone - \orelse\ifdim\wd\scratchboxtwo>\scratchwidth - \scratchwidth\wd\scratchboxtwo - \fi - \else - \ifempty\m_math_stackers_text_middle - \setbox\scratchboxthree\emptyhbox - \else - \setmathtextbox\scratchboxthree\hbox{\math_stackers_middletext}% - \fi - \scratchwidth\wd - \ifdim\wd\scratchboxone>\wd\scratchboxtwo - \ifdim\wd\scratchboxone>\wd\scratchboxthree - \scratchboxone - \else - \scratchboxthree - \fi - \orelse\ifdim\wd\scratchboxtwo>\wd\scratchboxthree - \scratchboxtwo - \else - \scratchboxthree - \fi - \relax - \fi - % - \scratchdimen\mathstackersparameter\c!minwidth\relax - \ifdim\scratchwidth<\scratchdimen - \scratchwidth\scratchdimen - \fi - \advance\scratchwidth2\scratchhoffset - % - \ifcase#method\relax - \dostarttagged\t!mstackermid\empty - \setbox\scratchboxthree\csname\??mathstackersalternative\p_alternative\endcsname - \dostoptagged - \fi - % - \ifdim\wd\scratchboxone<\scratchwidth - \setbox\scratchboxone\hpack to \scratchwidth{\hss\unhbox\scratchboxone\hss}% unhboxing makes leaders work - \fi - \ifdim\wd\scratchboxtwo<\scratchwidth - \setbox\scratchboxtwo\hpack to \scratchwidth{\hss\unhbox\scratchboxtwo\hss}% - \fi - \ifdim\wd\scratchboxthree<\scratchwidth - \setbox\scratchboxthree\hpack to \scratchwidth{\hss\unhbox\scratchboxthree\hss}% - \fi - % - \ifcsname\??mathstackerslocation\p_location\endcsname - \ifcase\csname\??mathstackerslocation\p_location\endcsname\relax - \scratchdistance\zeropoint - \or % top - \scratchdistance\zeropoint - \or % high - \scratchdistance.25\htdp\scratchboxthree - \or % centered - \scratchdistance.5\htdp\scratchboxthree - \or % low - \scratchdistance.75\htdp\scratchboxthree - \or % bottom - \scratchdistance\htdp\scratchboxthree - \else - \scratchdistance\zeropoint - \fi - \else - \scratchdistance\p_location\htdp\scratchboxthree - \fi - % - \ifzeropt\scratchdistance\else - \setbox\scratchboxthree\hpack{\lower\scratchdistance\box\scratchboxthree}% - \fi - % - \math_stackers_normalize_three - % analysis - \ifdim\htdp\scratchboxtwo>\zeropoint - \ifdim\htdp\scratchboxone>\zeropoint - \dosettagproperty\s!subtype\t!munderover - \else - \dosettagproperty\s!subtype\t!munder - \fi - \else - \ifdim\htdp\scratchboxone>\zeropoint - \dosettagproperty\s!subtype\t!mover - \else - % brrr - \fi - \fi - % base - \math_stackers_start_tagged_mid - \math_stackers_middle\bgroup - \box\scratchboxthree - \egroup - \math_stackers_stop_tagged - % under - \ifdim\htdp\scratchboxtwo>\zeropoint - \math_stackers_start_tagged_bot - \scratchoffset\scratchvoffset - \kern-\scratchwidth - \math_stackers_bottom\bgroup - \lower\dimexpr\ht\scratchboxtwo+\scratchdepth+\scratchoffset+\scratchbottomoffset\relax - \box\scratchboxtwo - \egroup - \math_stackers_stop_tagged - \fi - % over - \ifdim\htdp\scratchboxone>\zeropoint - \math_stackers_start_tagged_top - \scratchoffset\scratchvoffset - \kern-\scratchwidth - \math_stackers_top\bgroup - \raise\dimexpr\dp\scratchboxone+\scratchheight+\scratchoffset+\scratchtopoffset\relax - \box\scratchboxone - \egroup - \math_stackers_stop_tagged - \fi - % - }% - \dostoptagged - \mathstackersparameter\c!right\relax - \endgroup} - %\math_stackers_stop_group} - -\permanent\tolerant\protected\def\definemathextensible[#1]#*[#2]#*[#3]% category name unicode - {\ifarguments\or\or - \frozen\setuevalue{#1}{\math_stackers_auto_normal\noexpand\currentmathstackers{\number#2}}% - \or - \frozen\setuevalue{#2}{\math_stackers_auto_normal{#1}{\number#3}}% - \fi} - -\tolerant\protected\def\math_stackers_auto_normal#1#2#*[#3]#:#=#*#=% - {\begingroup - \scratchcounter#2\relax - \edef\currentmathstackers{\ifparameter#3\or#3\else#1\fi}% - \math_stackers_triplet\zerocount\currentmathstackers\scratchcounter{#4}{#5}% - \endgroup} - -%D A few direct accessors (in the meantime we redefined \mathextensible so we renamed the -%D following): - -\permanent\tolerant\protected\def\directmathextensible[#category]% - {\begingroup - \math_stackers_handle_extensible{\ifparameter#category\or#category\else\v!mathematics\fi}} % will be defined later on - -\permanent\tolerant\protected\def\directtextextensible[#category]% - {\begingroup - \math_stackers_handle_extensible{\ifparameter#category\or#category\else\v!text\fi}} % will be defined later on - -\aliased\let\mathstacker\directmathextensible -\aliased\let\textstacker\directtextextensible - -\def\math_stackers_handle_extensible#category#codepoint#toptext#bottomtext% - {\math_stackers_triplet\zerocount{#category}{#codepoint}{#toptext}{#bottomtext}% - \endgroup} - -%D The next one deals with under and over extensibles (arrows mostly): - -\installcorenamespace {mathclasses} - -\letvalue{\??mathclasses }\mathord -\letvalue{\??mathclasses rel}\mathrel -\letvalue{\??mathclasses ord}\mathord - -\def\math_class_by_parameter#1% - {\normalexpanded{\noexpand\math_class_by_parameter_indeed{#1\c!mathclass}}} - -\def\math_class_by_parameter_indeed#1% - {\csname\??mathclasses\ifcsname\??mathclasses#1\endcsname#1\fi\endcsname} - -% 1 0 name n 0 | 0 1 name n 0 | 1 1 name n n - -\protected\def\math_stackers_start_group#category% - {\begingroup - \edef\currentmathstackers{#category}% - \edef\p_limits{\mathstackersparameter\c!mathlimits}% - \ifx\p_limits\v!yes - \def\math_stackers_stop_group{\egroup\endgroup\ordlimits}% - \mathop\bgroup - \else - \let\math_stackers_stop_group\endgroup - \fi} - -\newconstant\c_math_stackers_top -\newconstant\c_math_stackers_bottom -\newconstant\c_math_stackers_codepoint -\newconstant\c_math_stackers_extracode -\newdimen \d_math_stackers_offset_l -\newdimen \d_math_stackers_offset_r - -\setupmathstackers[lt=\zeropoint,rt=\zeropoint,lb=\zeropoint,rb=\zeropoint] - -\tolerant\protected\def\math_stackers_make_double#top#bottom#category#codepoint#codeextra#spacer[#settings]#:#text% - {\math_stackers_start_group{#category}% - \c_math_stackers_top #top\relax - \c_math_stackers_bottom #bottom\relax - \c_math_stackers_codepoint#codepoint\relax - \c_math_stackers_extracode#codeextra\relax - \ifparameter#settings\or - \setupcurrentmathstackers[#settings]% - \fi - \mathstackersparameter\c!left\relax - \dostarttagged\t!mstacker\currentmathstackers - \ifmmode\math_class_by_parameter\mathstackersparameter\else\dontleavehmode\fi - {\edef\m_math_stackers_text_middle {#text}% - % - \edef\p_offset {\mathstackersparameter\c!offset}% - \edef\p_location {\mathstackersparameter\c!location}% - \edef\p_strut {\mathstackersparameter\c!strut}% - \edef\p_alternative{\mathstackersparameter\c!alternative}% - % - \scratchleftoffset \zeropoint - \scratchrightoffset\zeropoint - % - \math_stackers_check_unicode\c_math_stackers_codepoint - % - \ifempty\math_stackers_middle - \setbox\scratchboxthree\emptyhbox - \else - \setmathtextbox\scratchboxthree\hbox{\math_stackers_middletext}% - \fi - \scratchwidth\wd\scratchboxthree - % - \scratchdimen\mathstackersparameter\c!minwidth\relax - \ifdim\scratchwidth<\scratchdimen - \scratchwidth\scratchdimen - \fi - \advance\scratchwidth2\scratchhoffset - % - %\scratchunicode\c_math_stackers_codepoint - \ifcase\c_math_stackers_bottom - \d_math_stackers_offset_l\mathstackersparameter{lt}% - \d_math_stackers_offset_r\mathstackersparameter{rt}% - \orelse\ifcase\c_math_stackers_top - \d_math_stackers_offset_l\mathstackersparameter{lb}% - \d_math_stackers_offset_r\mathstackersparameter{rb}% - \else - \d_math_stackers_offset_l\mathstackersparameter{lt}% - \d_math_stackers_offset_r\mathstackersparameter{rt}% - \fi - \setbox\scratchboxtwo\csname\??mathstackersalternative\p_alternative\endcsname - \setbox\scratchboxthree\hpack to \scratchwidth{\hss\box\scratchboxthree\hss}% - % - \ifcase\c_math_stackers_extracode\else - \scratchunicode\c_math_stackers_extracode - \d_math_stackers_offset_l\mathstackersparameter{lb}% - \d_math_stackers_offset_r\mathstackersparameter{rb}% - \setbox\scratchboxone\csname\??mathstackersalternative\p_alternative\endcsname - \fi - % - \math_stackers_normalize_three - % analysis - \ifcase\c_math_stackers_bottom - \ifcase\c_math_stackers_top - \dosettagproperty\s!subtype\t!munderover - \else - \dosettagproperty\s!subtype\t!mover - \fi - \else - \ifcase\c_math_stackers_top - \dosettagproperty\s!subtype\t!munder - \else - % brrr - \fi - \fi - % base - \math_stackers_start_tagged_mid - \math_stackers_middle\bgroup - \box\scratchboxthree - \egroup - \math_stackers_stop_tagged - % - \ifdim\htdp\scratchboxtwo>\zeropoint - \ifcase\c_math_stackers_bottom\else - \kern-\scratchwidth - % under - \math_stackers_start_tagged_bot - \math_stackers_bottom\bgroup - \lower\dimexpr - \scratchdepth - +\ht\scratchboxtwo - +\mathstackersparameter\c!distance % was \c!voffset - \relax - \ifcase\c_math_stackers_top - \box\scratchboxtwo - \else - \box\scratchboxone - \fi - \egroup - \math_stackers_stop_tagged - \fi - \ifcase\c_math_stackers_top\else - \kern-\scratchwidth - % over - \math_stackers_start_tagged_top - \math_stackers_top\bgroup - \raise\dimexpr - \scratchheight - +\dp\scratchboxtwo % new - +\mathstackersparameter\c!distance % was \c!voffset - \relax - \box\scratchboxtwo - \egroup - \math_stackers_stop_tagged - \fi - \fi}% - \dostoptagged - \mathstackersparameter\c!right\relax - \math_stackers_stop_group} - -\permanent\tolerant\protected\def\definemathoverextensible[#1]#*[#2]#*[#3]% - {\ifparameter#3\or - \frozen\setuevalue{#2}{\math_stackers_make_double\plusone \zerocount{#1}{\number#3}{0}}% - \else - \frozen\setuevalue{#1}{\math_stackers_make_double\plusone \zerocount\noexpand\currentmathstackers{\number#2}{0}}% - \fi} - -\permanent\tolerant\protected\def\definemathunderextensible[#1]#*[#2]#*[#3]% - {\ifparameter#3\or - \frozen\setuevalue{#2}{\math_stackers_make_double\zerocount\plusone{#1}{\number#3}{0}}% - \else - \frozen\setuevalue{#1}{\math_stackers_make_double\zerocount\plusone\noexpand\currentmathstackers{\number#2}{0}}% - \fi} - -\permanent\tolerant\protected\def\definemathdoubleextensible[#1]#*[#2]#*[#3]#*[#4]% - {\ifparameter#4\or - \frozen\setuevalue{#2}{\math_stackers_make_double\plusone \plusone{#1}{\number#3}{\number#4}}% - \else - \frozen\setuevalue{#1}{\math_stackers_make_double\plusone \plusone\noexpand\currentmathstackers{\number#2}{\number#3}}% - \fi} - -\permanent\tolerant\protected\def\definemathover[#category]#spacer[#command]#spacer[#topcode]% - {\frozen\setuvalue{#command}{\math_stackers_handle_direct\plusone\zerocount{#category}{#topcode}{0}}} - -\permanent\tolerant\protected\def\definemathunder[#category]#spacer[#command]#spacer[#bottomcode]% - {\frozen\setuvalue{#command}{\math_stackers_handle_direct\zerocount\plusone{#category}{#bottomcode}{0}}} - -\permanent\tolerant\protected\def\definemathdouble[#category]#spacer[#command]#spacer[#topcode]#spacer[#bottomcode]% - {\frozen\setuvalue{#command}{\math_stackers_handle_direct\plusone\plusone{#category}{#topcode}{#bottomcode}}} - -\permanent\tolerant\protected\def\mathover[#category]#spacer[#settings]#:#topcode#text% - {\begingroup - \edef\currentmathstackers{\ifparameter#category\or#category\else\v!top\fi}% - \ifparameter#settings\or - \setupcurrentmathstackers[#settings]% - \fi - \math_stackers_make_double\plusone\zerocount - {\currentmathstackers}% - {#topcode}% - {0}% - {#text}% - \endgroup} - -\permanent\tolerant\protected\def\mathunder[#category]#spacer[#settings]#:#bottomcode#text% - {\begingroup - \edef\currentmathstackers{\ifparameter#category\or#category\else\v!bottom\fi}% - \ifparameter#settings\or - \setupcurrentmathstackers[#settings]% - \fi - \math_stackers_make_double\zerocount\plusone - {\currentmathstackers}% - {#bottomcode}% - {0}% - {#text}% - \endgroup} - -\permanent\tolerant\protected\def\mathdouble[#category]#spacer[#settings]#:#topcode#bottomcode#text% - {\begingroup - \edef\currentmathstackers{\ifparameter#category\or#category\else\v!both\fi}% - \ifparameter#settings\or - \setupcurrentmathstackers[#settings]% - \fi - \math_stackers_make_double\plusone\plusone - {\currentmathstackers}% - {#topcode}% - {#bottomcode}% - {#text}% - \endgroup} - -\def\math_stackers_handle_direct#top#bottom#category#topcode#bottomcode#text% - {\begingroup - \math_stackers_make_double#top#bottom{#category}{#topcode}{#bottomcode}{#text}% - \endgroup} - -%D A relative new one is a combination of accents and text (as needed in mathml): - -\protected\def\math_stackers_make_double_text#where#category#codepoint#text#extra% - {\math_stackers_start_group{#category}% - \mathstackersparameter\c!left\relax - \dostarttagged\t!mstacker\currentmathstackers - \ifmmode\math_class_by_parameter\mathstackersparameter\else\dontleavehmode\fi - {\edef\currentmathstackers{#category}% - % - \edef\p_offset {\mathstackersparameter\c!offset}% - \edef\p_location {\mathstackersparameter\c!location}% - \edef\p_strut {\mathstackersparameter\c!strut}% - \edef\p_alternative{\mathstackersparameter\c!alternative}% - % - \scratchleftoffset \zeropoint - \scratchrightoffset\zeropoint - % - \edef\m_math_stackers_text_middle{#text}% - \math_stackers_check_unicode{#codepoint}% - \scratchunicode#codepoint\relax - % - \ifempty\math_stackers_middle - \setbox\scratchboxthree\emptyhbox - \else - \setmathtextbox\scratchboxthree\hbox{\math_stackers_middletext}% - \fi - % - \ifcase#where\relax - \edef\m_math_stackers_text_top{#extra}% - \ifempty\math_stackers_top - \setbox\scratchboxone\emptyhbox - \else - \setmathsmalltextbox\scratchboxone\hbox{\math_stackers_toptext}% - \fi - \else - \edef\m_math_stackers_text_bottom{#extra}% - \ifempty\math_stackers_bottom - \setbox\scratchboxone\emptyhbox - \else - \setmathsmalltextbox\scratchboxone\hbox{\math_stackers_bottomtext}% - \fi - \fi - % - \scratchwidth\wd - \ifdim\wd\scratchboxone>\wd\scratchboxthree - \scratchboxone - \else - \scratchboxthree - \fi - \relax - \scratchdimen\mathstackersparameter\c!minwidth\relax - \ifdim\scratchwidth<\scratchdimen - \scratchwidth\scratchdimen - \fi - \advance\scratchwidth2\scratchhoffset - % - \ifdim\wd\scratchboxone<\scratchwidth - \setbox\scratchboxone\hpack to \scratchwidth{\hss\unhbox\scratchboxone\hss}% - \fi - \ifdim\wd\scratchboxthree<\scratchwidth - \setbox\scratchboxthree\hpack to \scratchwidth{\hss\unhbox\scratchboxthree\hss}% - \fi - % - \math_stackers_normalize_three - % analysis - \dosettagproperty\s!subtype\t!munderover - % base - \math_stackers_start_tagged_mid - \math_stackers_middle\bgroup - \box\scratchboxthree - \egroup - \math_stackers_stop_tagged - % - \setbox\scratchboxtwo\csname\??mathstackersalternative\p_alternative\endcsname - \kern-\scratchwidth - \ifcase#where\relax - % under - \math_stackers_start_tagged_bot - \math_stackers_bottom\bgroup - \lower\dimexpr - \scratchdepth - +\ht\scratchboxtwo - +\mathstackersparameter\c!distance - \relax - \box\scratchboxtwo % accent - \egroup - \math_stackers_stop_tagged - \kern-\scratchwidth - % over - \math_stackers_start_tagged_top - \math_stackers_top\bgroup - \raise\dimexpr - \scratchheight - +\dp\scratchboxone - +\mathstackersparameter\c!voffset - \relax - \box\scratchboxone % toptext - \egroup - \math_stackers_stop_tagged - \else - % under - \math_stackers_start_tagged_bot - \math_stackers_bottom\bgroup - \lower\dimexpr - \scratchdepth - +\ht\scratchboxone - +\mathstackersparameter\c!voffset - \relax - \box\scratchboxone % bottext - \egroup - \math_stackers_stop_tagged - \kern-\scratchwidth - % over - \math_stackers_start_tagged_top - \math_stackers_top\bgroup - \raise\dimexpr - \scratchheight - +\dp\scratchboxtwo % new - +\mathstackersparameter\c!distance - \relax - \box\scratchboxtwo % accent - \egroup - \math_stackers_stop_tagged - \fi - }% - \dostoptagged - \mathstackersparameter\c!right\relax - \math_stackers_stop_group} - -\permanent\tolerant\protected\def\definemathovertextextensible[#1]#*[#2]#*[#3]% - {\ifparameter#3\or - \frozen\setuevalue{#2}{\math_stackers_make_double_text\plusone{#1}{\number#3}}% - \else - \frozen\setuevalue{#1}{\math_stackers_make_double_text\plusone\noexpand\currentmathstackers{\number#2}}% - \fi} - -\permanent\tolerant\protected\def\definemathundertextextensible[#1]#*[#2]#*[#3]% - {\ifparameter#3\or - \frozen\setuevalue{#2}{\math_stackers_make_double_text\zerocount{#1}{\number#3}}% - \else - \frozen\setuevalue{#1}{\math_stackers_make_double_text\zerocount\noexpand\currentmathstackers{\number#2}}% - \fi} - -\permanent\tolerant\protected\def\mathovertext[#category]% - {\begingroup - \math_stackers_direct_double_text\plusone {\ifargument#category\or#category\else\v!top\fi}} - -\permanent\tolerant\protected\def\mathundertext[#category]% - {\begingroup - \math_stackers_direct_double_text\zerocount{\ifargument#category\or#category\else\v!bottom\fi}} - -\def\math_stackers_direct_double_text#where#category#codepoint#text#extra%% - {\math_stackers_make_double_text#where{#category}{#codepoint}{#text}{#extra}% - \endgroup} - -%D Here is a bonus macro that takes three texts. It can be used to get consistent -%D mixed usage. - -\permanent\tolerant\protected\def\mathtriplet[#category]#:#middletext#toptext#bottomtext% - {\begingroup - \math_stackers_triplet\plusone{\ifargument#category\or#category\else\currentmathstackers\fi}{#middletext}{#toptext}{#bottomtext}% - \endgroup} - -\permanent\tolerant\protected\def\definemathtriplet[#1]#*[#2]#*[#3]% category name default - {\ifarguments\or - \frozen\setuevalue{#1}{\math_stackers_auto_triplet_nop[\noexpand\currentmathstackers]}% - \or - \frozen\setuevalue{#2}{\math_stackers_auto_triplet_nop[#1]}% - \or - \frozen\setuevalue{#2}{\math_stackers_auto_triplet_yes[#1][#3]}% - \fi} - -\tolerant\protected\def\math_stackers_auto_triplet_yes[#1][#2]#*[#3]#:#=#*#=% [#2]% #2 gobble spaces - {\begingroup - \edef\currentmathstackers{#1}% - \def \m_math_stackers_text_middle{#2}% - \ifarguments#3\or\edef\currentmathstackers{#3}\fi - \math_stackers_triplet\plusone\currentmathstackers\m_math_stackers_text_middle{#4}{#5}% - \endgroup} - -\tolerant\protected\def\math_stackers_auto_triplet_nop[#1]#*[#2]#:#=#*#=#*#=% [#2]% #2 gobble spaces% - {\begingroup - \edef\currentmathstackers{#1}% - \ifarguments#2\or\edef\currentmathstackers{#2}\fi - \math_stackers_triplet\plusone\currentmathstackers{#3}{#4}{#5}% - \endgroup} - -%D Definitions: - -\definemathstackers - [\v!mathematics] - [\c!topcommand=\mathematics, - \c!middlecommand=\mathematics, - \c!bottomcommand=\mathematics] - -\definemathstackers - [\s!math] - [\v!mathematics] - -\definemathstackers - [\v!text] - [\v!mathematics] - [\c!topcommand=, - \c!middlecommand=\mathematics, - \c!bottomcommand=] - -\definemathstackers - [\v!reverse] - [\v!mathematics] - [\c!order=\v!reverse] - -\definemathstackers - [\v!both] - [\v!mathematics] - [\c!location=\v!top, % ? - \c!strut=\v!no, - \c!middlecommand=\mathematics, - \c!hoffset=\zeropoint] - -\definemathstackers - [\v!top] - [\v!both] - -\definemathstackers - [\v!bottom] - [\v!both] - -\definemathstackers - [\v!vfenced] - [\v!both] - [\c!mathclass=\s!ord, - \c!mathlimits=\v!yes] - -% these are needed for mathml: - -% \setupmathstackers -% [\v!both] -% [\c!hoffset=1pt, -% \c!voffset=1pt] - -\definemathstackers - [\v!bothtext] - [\v!both] - [\c!strut=\v!yes] - -% These are compatibity definitions, math only. - -% todo: top= bottom= middle= is nicer (compare math-fen) - -%D We save a few definitions that we automatically got from the \type {char-def.lua} -%D database. - -% Be careful in choosing what accents you take (the code below uses a combining -% one): -% -% \startbuffer -% % $\Umathaccent top 0 0 "20D7 {example}$ -% % $\Umathaccent top fixed 0 0 "20D7 {example}$ -% $\Umathaccent 0 0 "20D7 {example}$ -% $\Umathaccent fixed 0 0 "20D7 {example}$ -% $\Umathaccent bottom 0 0 "20D7 {example}$ -% $\Umathaccent bottom fixed 0 0 "20D7 {example}$ -% $\Umathaccent both 0 0 "20D7 -% 0 0 "20D7 {example}$ -% $\Umathaccent both fixed 0 0 "20D7 -% fixed 0 0 "20D7 {example}$ -% $\Umathaccent both 0 0 "20D7 -% fixed 0 0 "20D7 {example}$ -% $\Umathaccent both fixed 0 0 "20D7 -% 0 0 "20D7 {example}$ -% \stopbuffer -% -% \setupbodyfont[modern] \getbuffer -% \setupbodyfont[xits] \getbuffer -% \setupbodyfont[cambria] \getbuffer - -\immutable\protected\def\normaldoublebrace {\Umathaccents 0 \defaultmathfamily "23DE 0 \defaultmathfamily "23DF } -\immutable\protected\def\normaldoubleparent{\Umathaccents 0 \defaultmathfamily "23DC 0 \defaultmathfamily "23DD } - -% let's keep this - -\aliased\let\normaloverbrace \overbrace -\aliased\let\normalunderbrace \underbrace -\aliased\let\normaloverparent \overparent -\aliased\let\normalunderparent \underparent -\aliased\let\normaloverbracket \overbracket -\aliased\let\normalunderbracket \underbracket -\aliased\let\normalunderleftarrow \underleftarrow -\aliased\let\normaloverleftarrow \overleftarrow -\aliased\let\normalunderrightarrow\underrightarrow -\aliased\let\normaloverrightarrow \overrightarrow - -%D Here come the new ones: - -\definemathstackers [\v!none] [\v!mathematics] [\c!hoffset=\zeropoint] -\definemathstackers [\v!normal] [\v!mathematics] [\c!hoffset=0.5\mathemwidth] % the default -\definemathstackers [\v!small] [\v!mathematics] [\c!hoffset=1\mathemwidth] -\definemathstackers [\v!medium] [\v!mathematics] [\c!hoffset=1.5\mathemwidth] -\definemathstackers [\v!big] [\v!mathematics] [\c!hoffset=2\mathemwidth] - -\definemathextensible [\v!reverse] [xrel] ["002D] -\definemathextensible [\v!reverse] [xequal] ["003D] -\definemathextensible [\v!reverse] [xleftarrow] ["2190] % ["27F5] -\definemathextensible [\v!reverse] [xrightarrow] ["2192] % ["27F6] -\definemathextensible [\v!reverse] [xleftrightarrow] ["27F7] -\definemathextensible [\v!reverse] [xLeftarrow] ["27F8] -\definemathextensible [\v!reverse] [xRightarrow] ["27F9] -\definemathextensible [\v!reverse] [xLeftrightarrow] ["27FA] -\definemathextensible [\v!reverse] [xtwoheadleftarrow] ["219E] -\definemathextensible [\v!reverse] [xtwoheadrightarrow] ["21A0] -\definemathextensible [\v!reverse] [xmapsto] ["21A6] -\definemathextensible [\v!reverse] [xhookleftarrow] ["21A9] -\definemathextensible [\v!reverse] [xhookrightarrow] ["21AA] -\definemathextensible [\v!reverse] [xleftharpoondown] ["21BD] -\definemathextensible [\v!reverse] [xleftharpoonup] ["21BC] -\definemathextensible [\v!reverse] [xrightharpoondown] ["21C1] -\definemathextensible [\v!reverse] [xrightharpoonup] ["21C0] -\definemathextensible [\v!reverse] [xrightoverleftarrow] ["21C4] -\definemathextensible [\v!reverse] [xleftrightharpoons] ["21CB] -\definemathextensible [\v!reverse] [xrightleftharpoons] ["21CC] -\definemathextensible [\v!reverse] [xtriplerel] ["2261] - -\definemathextensible [\v!mathematics] [mrel] ["002D] -\definemathextensible [\v!mathematics] [mequal] ["003D] -\definemathextensible [\v!mathematics] [mleftarrow] ["2190] % ["27F5] -\definemathextensible [\v!mathematics] [mrightarrow] ["2192] % ["27F6] -\definemathextensible [\v!mathematics] [mleftrightarrow] ["27F7] -\definemathextensible [\v!mathematics] [mLeftarrow] ["27F8] -\definemathextensible [\v!mathematics] [mRightarrow] ["27F9] -\definemathextensible [\v!mathematics] [mLeftrightarrow] ["27FA] -\definemathextensible [\v!mathematics] [mtwoheadleftarrow] ["219E] -\definemathextensible [\v!mathematics] [mtwoheadrightarrow] ["21A0] -\definemathextensible [\v!mathematics] [mmapsto] ["21A6] -\definemathextensible [\v!mathematics] [mhookleftarrow] ["21A9] -\definemathextensible [\v!mathematics] [mhookrightarrow] ["21AA] -\definemathextensible [\v!mathematics] [mleftharpoondown] ["21BD] -\definemathextensible [\v!mathematics] [mleftharpoonup] ["21BC] -\definemathextensible [\v!mathematics] [mrightharpoondown] ["21C1] -\definemathextensible [\v!mathematics] [mrightharpoonup] ["21C0] -\definemathextensible [\v!mathematics] [mrightoverleftarrow] ["21C4] -\definemathextensible [\v!mathematics] [mleftrightharpoons] ["21CB] -\definemathextensible [\v!mathematics] [mrightleftharpoons] ["21CC] -\definemathextensible [\v!mathematics] [mtriplerel] ["2261] - -\definemathextensible [\v!mathematics] [eleftarrowfill] ["2190] % ["27F5] -\definemathextensible [\v!mathematics] [erightarrowfill] ["2192] % ["27F6] -\definemathextensible [\v!mathematics] [eleftrightarrowfill] ["27F7] -\definemathextensible [\v!mathematics] [etwoheadrightarrowfill] ["27F9] -\definemathextensible [\v!mathematics] [eleftharpoondownfill] ["21BD] -\definemathextensible [\v!mathematics] [eleftharpoonupfill] ["21BC] -\definemathextensible [\v!mathematics] [erightharpoondownfill] ["21C1] -\definemathextensible [\v!mathematics] [erightharpoonupfill] ["21C0] - -\definemathextensible [\v!mathematics] [eoverbarfill] ["FE33E] -\definemathextensible [\v!mathematics] [eunderbarfill] ["FE33F] -\definemathextensible [\v!mathematics] [eoverbracefill] ["FE3DE] -\definemathextensible [\v!mathematics] [eunderbracefill] ["FE3DF] -\definemathextensible [\v!mathematics] [eoverparentfill] ["FE3DC] -\definemathextensible [\v!mathematics] [eunderparentfill] ["FE3DD] -\definemathextensible [\v!mathematics] [eoverbracketfill] ["FE3B4] -\definemathextensible [\v!mathematics] [eunderbracketfill] ["FE3B5] - -\definemathextensible [\v!text] [trel] ["002D] -\definemathextensible [\v!text] [tequal] ["003D] -\definemathextensible [\v!text] [tmapsto] ["21A6] -\definemathextensible [\v!text] [tleftarrow] ["2190] % ["27F5] -\definemathextensible [\v!text] [trightarrow] ["2192] % ["27F6] -\definemathextensible [\v!text] [tleftrightarrow] ["27F7] -\definemathextensible [\v!text] [tLeftarrow] ["27F8] -\definemathextensible [\v!text] [tRightarrow] ["27F9] -\definemathextensible [\v!text] [tLeftrightarrow] ["27FA] -\definemathextensible [\v!text] [ttwoheadleftarrow] ["219E] -\definemathextensible [\v!text] [ttwoheadrightarrow] ["21A0] -\definemathextensible [\v!text] [thookleftarrow] ["21A9] -\definemathextensible [\v!text] [thookrightarrow] ["21AA] -\definemathextensible [\v!text] [tleftharpoondown] ["21BD] -\definemathextensible [\v!text] [tleftharpoonup] ["21BC] -\definemathextensible [\v!text] [trightharpoondown] ["21C1] -\definemathextensible [\v!text] [trightharpoonup] ["21C0] -\definemathextensible [\v!text] [trightoverleftarrow] ["21C4] -\definemathextensible [\v!text] [tleftrightharpoons] ["21CB] -\definemathextensible [\v!text] [trightleftharpoons] ["21CC] -\definemathextensible [\v!text] [ttriplerel] ["2261] - -\definemathoverextensible [\v!top] [overleftarrow] ["2190] % ["27F5] -\definemathoverextensible [\v!top] [overrightarrow] ["2192] % ["27F6] -\definemathoverextensible [\v!top] [overleftrightarrow] ["27F7] -\definemathoverextensible [\v!top] [overtwoheadleftarrow] ["27F8] -\definemathoverextensible [\v!top] [overtwoheadrightarrow] ["27F9] -\definemathoverextensible [\v!top] [overleftharpoondown] ["21BD] -\definemathoverextensible [\v!top] [overleftharpoonup] ["21BC] -\definemathoverextensible [\v!top] [overrightharpoondown] ["21C1] -\definemathoverextensible [\v!top] [overrightharpoonup] ["21C0] - -\definemathunderextensible [\v!bottom] [underleftarrow] ["2190] % ["27F5] -\definemathunderextensible [\v!bottom] [underrightarrow] ["2192] % ["27F6] -\definemathunderextensible [\v!bottom] [underleftrightarrow] ["27F7] -\definemathunderextensible [\v!bottom] [undertwoheadleftarrow] ["27F8] -\definemathunderextensible [\v!bottom] [undertwoheadrightarrow] ["27F9] -\definemathunderextensible [\v!bottom] [underleftharpoondown] ["21BD] -\definemathunderextensible [\v!bottom] [underleftharpoonup] ["21BC] -\definemathunderextensible [\v!bottom] [underrightharpoondown] ["21C1] -\definemathunderextensible [\v!bottom] [underrightharpoonup] ["21C0] - -%D We don't use overline and underline. This is one of the overlooked aspects of -%D unicode cq. opentype math: why treat rules different than e.g. arrows and -%D accents. It is a bit unfortunate that the opportunity to move math to new -%D technologies happened outside the tex domain (and/or some aspects were kept while -%D in fact they were side effects of limitations of traditional fonts). From the -%D unicode aware tex engines' implementation point of view things could have been -%D done a bit nicer but then: the community didn't seem to care too much and just -%D has to follow now. -%D -%D Anyhow, we use a character based approach so that at least we get unicode stuff -%D in the backend (okay, we still need to deal with some cut and paste issues but at -%D least we now know what we deal with. - -% alternatively we can move the original to FE* - -\definemathoverextensible [\v!vfenced] [overbar] ["FE33E] % ["203E] -\definemathunderextensible [\v!vfenced] [underbar] ["FE33F] % ["203E] -\definemathdoubleextensible [\v!vfenced] [doublebar] ["FE33E] ["FE33F] - -\definemathoverextensible [\v!vfenced] [overbrace] ["FE3DE] % ["023DE] -\definemathunderextensible [\v!vfenced] [underbrace] ["FE3DF] % ["023DF] -\definemathdoubleextensible [\v!vfenced] [doublebrace] ["FE3DE] ["FE3DF] - -\definemathoverextensible [\v!vfenced] [overparent] ["FE3DC] % ["023DC] -\definemathunderextensible [\v!vfenced] [underparent] ["FE3DD] % ["023DD] -\definemathdoubleextensible [\v!vfenced] [doubleparent] ["FE3DC] ["FE3DD] - -\definemathoverextensible [\v!vfenced] [overbracket] ["FE3B4] % ["023B4] -\definemathunderextensible [\v!vfenced] [underbracket] ["FE3B5] % ["023B5] -\definemathdoubleextensible [\v!vfenced] [doublebracket] ["FE3B4] ["FE3B5] - -% \protected\def\mathopwithlimits#1#2{\mathop{#1{#2}}\limits} - -%D For mathml: - -\definemathdoubleextensible [\v!both] [overbarunderbar] ["FE33E] ["FE33F] -\definemathdoubleextensible [\v!both] [overbraceunderbrace] ["FE3DE] ["FE3DF] -\definemathdoubleextensible [\v!both] [overparentunderparent] ["FE3DC] ["FE3DD] -\definemathdoubleextensible [\v!both] [overbracketunderbracket] ["FE3B4] ["FE3B5] - -\definemathovertextextensible [\v!bothtext] [overbartext] ["FE33E] -\definemathundertextextensible [\v!bothtext] [underbartext] ["FE33F] -\definemathovertextextensible [\v!bothtext] [overbracetext] ["FE3DE] -\definemathundertextextensible [\v!bothtext] [underbracetext] ["FE3DF] -\definemathovertextextensible [\v!bothtext] [overparenttext] ["FE3DC] -\definemathundertextextensible [\v!bothtext] [underparenttext] ["FE3DD] -\definemathovertextextensible [\v!bothtext] [overbrackettext] ["FE3B4] -\definemathundertextextensible [\v!bothtext] [underbrackettext] ["FE3B5] - -%D Some bonus ones (for the moment here): - -\definemathstackers - [\v!chemistry] - [\c!offset=\v!max, - \c!left=\enspace, - \c!right=\enspace, - \c!hoffset=.5\mathemwidth] - -\definemathextensible [\v!chemistry] [cleftarrow] ["2190] -\definemathextensible [\v!chemistry] [crightarrow] ["2192] -\definemathextensible [\v!chemistry] [crightoverleftarrow] ["21C4] - -% for the moment: - -\def\math_stackers_hacked_fill#1#2#3% - {\mathematics - {\begingroup - \mathsurround\zeropoint - \thickmuskip \zeromuskip - \medmuskip \zeromuskip - \thinmuskip \zeromuskip - #1% - \mkern-7\onemuskip - \cleaders\mathstylehbox{\mkern-2\onemuskip#2\mkern-2\onemuskip}\hfill - \mkern-7\onemuskip - #3% - \endgroup}} - -% These will be defined in char-def as well once we have \leaders<number> - -\immutable\protected\def\rightarrowfill {\math_stackers_hacked_fill \relbar \relbar \rightarrow} -\immutable\protected\def\leftarrowfill {\math_stackers_hacked_fill \leftarrow \relbar \relbar } -\immutable\protected\def\rightoverleftarrowfill{\math_stackers_hacked_fill \ctxdoublearrowfillleftend\ctxdoublearrowfillmiddlepart\ctxdoublearrowfillrightend} -\immutable\protected\def\equalfill {\math_stackers_hacked_fill \Relbar \Relbar \Relbar} -\immutable\protected\def\Rightarrowfill {\math_stackers_hacked_fill \Relbar \Relbar \Rightarrow} -\immutable\protected\def\Leftarrowfill {\math_stackers_hacked_fill \Leftarrow \Relbar \Relbar} -\immutable\protected\def\Leftrightarrowfill {\math_stackers_hacked_fill \Leftarrow \Relbar \Rightarrow} -\immutable\protected\def\leftrightarrowfill {\math_stackers_hacked_fill \leftarrow \relbar \rightarrow} -\immutable\protected\def\mapstofill {\math_stackers_hacked_fill{\mapstochar\relbar} \relbar \rightarrow} -\immutable\protected\def\twoheadrightarrowfill {\math_stackers_hacked_fill \relbar \relbar \twoheadrightarrow} -\immutable\protected\def\twoheadleftarrowfill {\math_stackers_hacked_fill \twoheadleftarrow \relbar \relbar} -\immutable\protected\def\rightharpoondownfill {\math_stackers_hacked_fill \relbar \relbar \rightharpoondown} -\immutable\protected\def\rightharpoonupfill {\math_stackers_hacked_fill \relbar \relbar \rightharpoonup} -\immutable\protected\def\leftharpoondownfill {\math_stackers_hacked_fill \leftharpoondown \relbar \relbar} -\immutable\protected\def\leftharpoonupfill {\math_stackers_hacked_fill \leftharpoonup \relbar \relbar} -\immutable\protected\def\hookleftfill {\math_stackers_hacked_fill \leftarrow \relbar {\relbar\joinrel\rhook}} -\immutable\protected\def\hookrightfill {\math_stackers_hacked_fill{\lhook\joinrel\relbar} \relbar \rightarrow} -\immutable\protected\def\relfill {\math_stackers_hacked_fill \relbar \relbar \relbar} -\immutable\protected\def\triplerelfill {\math_stackers_hacked_fill \equiv \equiv \equiv} - -% \permanent\protected\def\singlebond{{\xrel}} % or \def\singlebond{{\xrel[2]}} -% \permanent\protected\def\doublebond{{\xequal}} -% \permanent\protected\def\triplebond{{\xtriplerel}} - -%D For the moment (needs checking): - -\permanent\tolerant\protected\def\defineextensiblefiller[#1]#*[#2]% - {\immutable\letcsname\??mathextensiblefallbacks\number#2\expandafter\endcsname\csname#1\endcsname - %\immutable\letcsname#1\expandafter\endcsname\csname#1\endcsname - } % huh? - -\defineextensiblefiller [barfill] ["203E] -\defineextensiblefiller [relfill] ["002D] -\defineextensiblefiller [equalfill] ["003D] -\defineextensiblefiller [leftarrowfill] ["2190] -\defineextensiblefiller [rightarrowfill] ["2192] -\defineextensiblefiller [twoheadleftarrowfill] ["219E] -\defineextensiblefiller [twoheadrightarrowfill] ["21A0] -\defineextensiblefiller [mapstofill] ["21A6] -\defineextensiblefiller [hookleftarrowfill] ["21A9] -\defineextensiblefiller [hookrightarrowfill] ["21AA] -\defineextensiblefiller [leftharpoondownfill] ["21BD] -\defineextensiblefiller [leftharpoonupfill] ["21BC] -\defineextensiblefiller [rightharpoondownfill] ["21C1] -\defineextensiblefiller [rightharpoonupfill] ["21C0] -\defineextensiblefiller [rightoverleftarrowfill] ["21C4] -\defineextensiblefiller [leftrightharpoonsfill] ["21CB] -\defineextensiblefiller [rightleftharpoonsfill] ["21CC] -\defineextensiblefiller [triplerelfill] ["2261] -\defineextensiblefiller [leftrightarrowfill] ["27F7] -\defineextensiblefiller [Leftarrowfill] ["27F8] -\defineextensiblefiller [Rightarrowfill] ["27F9] -\defineextensiblefiller [Leftrightarrowfill] ["27FA] -%\defineextensiblefiller[Rightleftarrowfill] [.....] - -% These are fishy ... we need to check this because now these commands relax (there -% are some entries in char-def.) -% -% %definemathoverextensible [overbarfill] ["FE33E] -% %definemathunderextensible [underbarfill] ["FE33F] -% \definemathoverextensible [overbracefill] ["FE3DE] -% \definemathunderextensible [underbracefill] ["FE3DF] -% \definemathoverextensible [overparentfill] ["FE3DC] -% \definemathunderextensible [underparentfill] ["FE3DD] -% \definemathoverextensible [overbracketfill] ["FE3B4] -% \definemathunderextensible [underbracketfill] ["FE3B5] -% -% %defineextensiblefiller [overbarfill] ["FE33E] -% %defineextensiblefiller [underbarfill] ["FE33F] -% \defineextensiblefiller [overbracefill] ["FE3DE] -% \defineextensiblefiller [underbracefill] ["FE3DF] -% \defineextensiblefiller [overparentfill] ["FE3DC] -% \defineextensiblefiller [underparentfill] ["FE3DD] -% \defineextensiblefiller [overbracketfill] ["FE3B4] -% \defineextensiblefiller [underbracketfill] ["FE3B5] - -%D Extra: - -\permanent\protected\edef\singlebond{\mathematics{\mathsurround\zeropoint\char\number"002D\relax}} -\permanent\protected\edef\doublebond{\mathematics{\mathsurround\zeropoint\char\number"003D\relax}} -\permanent\protected\edef\triplebond{\mathematics{\mathsurround\zeropoint\char\number"2261\relax}} - -% \mathchardef\singlebond"002D -% \mathchardef\doublebond"003D -% \mathchardef\triplebond"2261 - -%D Also handy: - -\permanent\tolerant\protected\def\definemathunstacked[#1]#*[#2]#*[#3]% category name unicode - {\ifarguments\or\or - \frozen\setuevalue{#1}{\math_stackers_unstacked_normal\noexpand\currentmathstackers{\number#2}}% - \else - \frozen\setuevalue{#2}{\math_stackers_unstacked_normal{#1}{\number#3}}% - \fi} - -\protected\def\math_stackers_unstacked_normal#category#codepoint% - {\begingroup - \edef\currentmathstackers{#category}% - \edef\p_moffset{\mathstackersparameter\c!moffset}% - \ifempty\p_moffset \else - \mskip\p_moffset\relax - \fi - \ifmmode\math_class_by_parameter\mathstackersparameter\else\dontleavehmode\fi - {\usemathstackerscolorparameter\c!color - \Umathchar\zerocount\defaultmathfamily#codepoint}% - \ifempty\p_moffset \else - \mskip\p_moffset\relax - \fi - \endgroup} - -\definemathstackers [\v!wide] [\c!moffset=\thickmuskip,\c!mathclass=\s!rel] - -\definemathunstacked [\v!wide] [And] ["0026] % \mathrel{\;&\;} -\definemathunstacked [\v!wide] [impliedby] ["27F8] % \mathrel{\;\Longleftarrow\;} -\definemathunstacked [\v!wide] [implies] ["27F9] % \mathrel{\;\Longrightarrow\;} -\definemathunstacked [\v!wide] [iff] ["27FA] % \mathrel{\;\Longleftrightarrow\;} - -% New (an example of using \mathexheight): - -\definemathstackers - [\v!symbol] - [\c!voffset=-.3\mathexheight, - \c!hoffset=\zeropoint, - \c!mathclass=ord, - \c!topoffset=.4\mathemwidth, % poor man's italic correction - \c!middlecommand=\mathematics] - -\definemathover[\v!symbol][interiorset]["2218] - -\protect \endinput - -% \mathrel{\mathop{\hbox to \dimen0{\hss\copy4\hss}} -% \limits\normalsuperscript{\box0}\normalsubscript{\box2}}% - -% $\Uoverdelimiter \defaultmathfamily "2194 {xxxx}$ -% $\Uunderdelimiter\defaultmathfamily "2194 {xxxx}$ -% $\Udelimiterover \defaultmathfamily "2194 {xxxx}$ -% $\Udelimiterunder\defaultmathfamily "2194 {xxxx}$ -% $\Udelimiterover \defaultmathfamily "219A {\Udelimiterunder \defaultmathfamily "219B {xxxx}}$ - -% $a \mathrel{\mathop{\filledhboxr{mid}}}\limits^{\filledhboxg{\strut top}}_{\filledhboxb{\strut bottom}} b$ |