%D \module %D [ file=math-ini, %D version=2008.01.02, %D title=\CONTEXT\ Math Macros, %D subtitle=Initializations, %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 / Initializations} %D This module provides namespaces for math fonts, thereby %D permitting mixed usage of math fonts. Although not strictly %D needed, we also provide a family name mapping mechanism as %D used in the (original) AMS math definition files, but here %D these names can recursively be remapped and if needed, %D dynamically be changed. We've tried to minimize the number %D of definition commands and use plain \TEX\ definitions as %D fallback. We've tried to follow a couple of conventions %D from plain and AMS math in order to achieve backward %D compatinility. We also kept an eye on future usage of these %D modules in the perspective of MathML and unicode fonts. \unprotect %D We move these definitions into the format: % test [[\char948 \cldcontext{utf.char(948)}]] % test $[[\char948 \cldcontext{utf.char(948)}]]$ \registerctxluafile{math-ini}{1.001} \registerctxluafile{math-dim}{1.001} \registerctxluafile{math-act}{1.001} \registerctxluafile{math-ext}{1.001} \registerctxluafile{math-vfu}{1.001} \registerctxluafile{math-ttv}{1.001} \registerctxluafile{math-map}{1.001} \registerctxluafile{math-ren}{1.001} \registerctxluafile{math-noa}{1.001} \registerctxluafile{math-tag}{1.001} \registerctxluafile{math-fbk}{1.001} \definesystemattribute[mathalphabet] [public] \definesystemattribute[mathsize] [public] \definesystemattribute[mathpunctuation][public] \definesystemattribute[mathgreek] [public] \definesystemattribute[mathalternate] [public] \definesystemattribute[mathrendering] [public] \definesystemattribute[mathcategory] [public] \definesystemattribute[mathmode] [public] \definesystemattribute[mathitalics] [public] \definesystemattribute[displaymath] [public] \appendtoks \attribute\mathmodeattribute\plusone \to \everydisplay \appendtoks \attribute\mathmodeattribute\plusone \to \everybeforedisplayformula \appendtoksonce \attribute\displaymathattribute\plusone \to \everybeforedisplayformula \setnewconstant\defaultmathfamily \zerocount % 255 %D Some measures (maybe spac-mth): % \def\mathskipsmall {\mskip\thinmuskip} % \def\mathskipmedium{\mskip\medmuskip} % \def\mathskipbig {\mskip\thickmuskip} %D \macros %D {setupmathematics} %D %D Configuration for integrals. (If needed we can speed this up and make it %D installable; no processaction is needed then). \installcorenamespace{mathematics} \installswitchcommandhandler \??mathematics {mathematics} \??mathematics \unexpanded\def\startmathematics % no grouping, if ever then also an optional second {\doifnextoptionalelse\math_mathematics_start_yes\math_mathematics_start_nop} \unexpanded\def\math_mathematics_start_yes[#1]% {\pushmacro\currentmathematics \edef\currentmathematics{#1}% check for valid \the\everyswitchmathematics} \unexpanded\def\math_mathematics_start_nop {\pushmacro\currentmathematics \let\currentmathematics\empty \the\everyswitchmathematics} \unexpanded\def\stopmathematics {\popmacro\currentmathematics \the\everyswitchmathematics} \definemathematics[\v!default] % not needed, but nicer when nesting back to normal % Normally this is applied to only one character. % % $ABC$ $\cal ABC$ $\mathaltcal ABC$ % todo: only in mmode \unexpanded\def\mathgreekupright{\attribute\c_math_greek_attribute22 } \unexpanded\def\mathgreekitalic {\attribute\c_math_greek_attribute33 } \unexpanded\def\mathgreekdefault{\attribute\c_math_greek_attribute\attributeunsetvalue} \let\mathgreeknormal\mathgreekupright \let\mathgreeknone \mathgreekdefault \unexpanded\def\setmathattribute#1#2{\ifmmode\ctxcommand{setmathattribute("#1","#2")}\fi} \unexpanded\def\setmathalphabet #1{\ifmmode\ctxcommand{setmathalphabet("#1")}\fi} \unexpanded\def\setmathstyle #1{\ifmmode\ctxcommand{setmathstyle("#1")}\fi} \unexpanded\def\setmathalternate #1{\ifmmode\ctxcommand{setmathalternate(\number\defaultmathfamily,"#1")}\fi} \installcorenamespace{mathstylealternate} % might become a setuphandler \unexpanded\def\setmathstylealterternate#1% {\ifcsname\??mathstylealternate\fontclass:#1\endcsname \expandafter\setmathalternate\csname\??mathstylealternate\fontclass:#1\endcsname \else\ifcsname\??mathstylealternate#1\endcsname \expandafter\setmathalternate\csname\??mathstylealternate#1\endcsname \fi\fi} \unexpanded\def\setupmathrendering % the name might change {\dodoubleargument\math_setup_rendering} \def\math_setup_rendering[#1][#2]% {\ifsecondargument \getparameters[\??mathstylealternate#1:][#2]% \else \getparameters[\??mathstylealternate][#1]% \fi} \unexpanded\def\mathaltcal{\setmathalternate{cal}\cal} % ss01 in xits \let\mathalternate\setmathalternate % obsolete \unexpanded\def\mr {\setmathattribute\s!regular\s!tf\setmathstylealterternate\s!tf} \unexpanded\def\mathdefault {\setmathattribute\s!regular\s!it\setmathstylealterternate\s!it} \unexpanded\def\mathscript {\setmathalphabet \s!script \setmathstylealterternate\s!script} \unexpanded\def\mathfraktur {\setmathalphabet \s!fraktur \setmathstylealterternate\s!fraktur} \unexpanded\def\mathblackboard{\setmathalphabet \s!blackboard \setmathstylealterternate\s!blackboard} \unexpanded\def\mathrm {\setmathattribute\s!rm\s!tf \setmathstylealterternate\s!tf} \unexpanded\def\mathss {\setmathattribute\s!ss\s!tf \setmathstylealterternate\s!tf} \unexpanded\def\mathtt {\setmathattribute\s!tt\s!tf \setmathstylealterternate\s!tf} \unexpanded\def\mathtf {\setmathstyle\s!tf \setmathstylealterternate\s!tf} \unexpanded\def\mathsl {\setmathstyle\s!it \setmathstylealterternate\s!it} % no sl \unexpanded\def\mathit {\setmathstyle\s!it \setmathstylealterternate\s!it} \unexpanded\def\mathbf {\setmathstyle\s!bf \setmathstylealterternate\s!bf} \unexpanded\def\mathbs {\setmathstyle\s!bi \setmathstylealterternate\s!bi} % no sl \unexpanded\def\mathbi {\setmathstyle\s!bi \setmathstylealterternate\s!bi} \let\tfmath\mathtf % maybe a grouped command \let\slmath\mathsl \let\itmath\mathit \let\bfmath\mathbf \let\bsmath\mathbs \let\bimath\mathbi \let\Bbb\mathblackboard \unexpanded\def\frak {\ifmmode\expandafter\mathfraktur \fi} \unexpanded\def\cal {\ifmmode\expandafter\mathscript \fi} \unexpanded\def\bbd {\ifmmode\expandafter\mathblackboard\fi} \unexpanded\def\blackboard{\ifmmode\expandafter\mathblackboard\fi} \unexpanded\def\fraktur {\ifmmode\expandafter\mathfraktur \fi} \unexpanded\def\gothic {\ifmmode\expandafter\mathfraktur \fi} \unexpanded\def\mathcal #1{{\mathscript #1}} % for AMS compatibility \unexpanded\def\mathfrak#1{{\mathfraktur #1}} % for AMS compatibility \unexpanded\def\mathbb #1{{\mathblackboard#1}} % for AMS compatibility \let\normalmr\mr \let\normaltf\tf \unexpanded\def\tf{\ifmmode\mathtf\else\normaltf\fi} \let\normalbf\bf \unexpanded\def\bf{\ifmmode\mathbf\else\normalbf\fi} \let\normalit\it \unexpanded\def\it{\ifmmode\mathit\else\normalit\fi} \let\normalsl\sl \unexpanded\def\sl{\ifmmode\mathsl\else\normalsl\fi} \let\normalbi\bi \unexpanded\def\bi{\ifmmode\mathbi\else\normalbi\fi} \let\normalbs\bs \unexpanded\def\bs{\ifmmode\mathbs\else\normalbs\fi} \let\normalrm\rm \unexpanded\def\rm{\ifmmode\mathrm\else\normalrm\fi} \let\normalss\ss \unexpanded\def\ss{\ifmmode\mathss\else\normalss\fi} \let\normaltt\tt \unexpanded\def\tt{\ifmmode\mathtt\else\normaltt\fi} \unexpanded\def\mr{\ifmmode \normalmr\fi} \prependtoks \mathdefault \to \everymathematics %D We could set the rendering attribute at the \LUA\ end but as there %D can be many small math snippets we keep track of the state at the %D \TEX\ end (mapping is export safe). %D %D \starttyping %D \startformula %D \reals {\mathbf R} \utfchar{"0211D} \utfchar{"1D411} %D \stopformula %D %D \setupmathematics %D [symbolset=blackboard-to-bold] %D %D \startformula %D \reals {\mathbf R} \utfchar{"0211D} \utfchar{"1D411} %D \stopformula %D \stoptyping \newcount\c_math_renderings_attribute \appendtoks \c_math_renderings_attribute\ctxcommand{mathrenderset("\mathematicsparameter\c!symbolset")}\relax \to \everysetupmathematics % only in mathematics \appendtoks \ifcase\c_math_renderings_attribute\else \attribute\mathrenderingattribute\c_math_renderings_attribute \fi \to \everymathematics \setupmathematics [\c!symbolset=] %D \macros %D {boldsymbol} %D %D To be done. \let\mathboldsymbol\relax % yet unsupported, will be \unexpanded\def\boldsymbol {\mathortext\mathboldsymbol\bold} %D Helpers: \def\utfmathclass #1{\ctxcommand{utfmathclass (\!!bs#1\!!es)}} \def\utfmathstretch#1{\ctxcommand{utfmathstretch(\!!bs#1\!!es)}} \def\utfmathcommand#1{\ctxcommand{utfmathcommand(\!!bs#1\!!es)}} \def\utfmathfiller #1{\ctxcommand{utfmathfiller (\!!bs#1\!!es)}} \unexpanded\def\doifelseutfmathaccent#1{\ctxcommand{doifelseutfmathaccent(\!!bs#1\!!es)}} %D Not used that much: \installcorenamespace{mathcodecommand} \unexpanded\def\mathlimop#1{\mathop{#1}} %no \limits \unexpanded\def\mathbox #1{\dontleavehmode\hbox\Ustartmath\mathsurround\zeropoint#1\Ustopmath} \unexpanded\def\mathnolop#1{\mathop{#1}\nolimits} \let\mathnothing\firstofoneunexpanded \let\mathalpha \firstofoneunexpanded \setnewconstant\mathordcode \zerocount \letvalue{\??mathcodecommand ord}\mathord \setnewconstant\mathopcode \plusone \letvalue{\??mathcodecommand op}\mathop \setnewconstant\mathbincode \plustwo \letvalue{\??mathcodecommand bin}\mathbin \setnewconstant\mathrelcode \plusthree \letvalue{\??mathcodecommand rel}\mathrel \setnewconstant\mathopencode \plusfour \letvalue{\??mathcodecommand open}\mathopen \setnewconstant\mathclosecode \plusfive \letvalue{\??mathcodecommand close}\mathclose \setnewconstant\mathpunctcode \plussix \letvalue{\??mathcodecommand punct}\mathpunct \setnewconstant\mathalphacode \plusseven \letvalue{\??mathcodecommand alpha}\mathalpha \setnewconstant\mathinnercode \zerocount \letvalue{\??mathcodecommand inner}\mathinner \setnewconstant\mathnothingcode \zerocount \letvalue{\??mathcodecommand nothing}\mathnothing \setnewconstant\mathlimopcode \plusone \letvalue{\??mathcodecommand limop}\mathlimop \setnewconstant\mathnolopcode \plusone \letvalue{\??mathcodecommand nolop}\mathnolop \setnewconstant\mathboxcode \zerocount \letvalue{\??mathcodecommand box}\mathbox \setnewconstant\mathchoicecode \zerocount %letvalue{\??mathcodecommand choice}\mathnothing \setnewconstant\mathaccentcode \pluseight \setnewconstant\mathradicalcode \plusnine \def\mathcodenumber #1{\the\csname math#1code\endcsname} \unexpanded\def\mathcodecommand#1{\csname\??mathcodecommand#1\endcsname} % \startlines % $\mathopnolimits{\rm d}x$ % $\mathopnolimits{\kern\zeropoint \rm d}x$ % $\mathcodecommand{nolop}{\rm d}x$ % $\mathcodecommand{nolop}{\kern\zeropoint\rm d}x$ % \blank % $\mathcodecommand{nolop}{\mr d}x$ % $\mathcodecommand{nolop}{\kern\zeropoint\mr d}x$ % $\mathop{\kern\zeropoint\mr d}x$ % $\mathopnolimits{\kern\zeropoint d}x$ % \stoplines \installcorenamespace{mathcommand} \unexpanded\def\definemathcommand {\dotripleempty\math_define_command} \def\math_define_command[#1][#2][#3]#4% command class args meaning {\ifthirdargument \edef\nofmathcommandarguments{#3}% \ifx\nofmathcommandarguments\v!one \setuvalue{\??mathcommand#1}##1{\mathcodecommand{#2}{#4{##1}}}% \else\ifx\nofmathcommandarguments\v!two \setuvalue{\??mathcommand#1}##1##2{\mathcodecommand{#2}{#4{##1}{##2}}}% \else \setuvalue{\??mathcommand#1}{\mathcodecommand{#2}{#4}}% \fi\fi \else\ifsecondargument \setuvalue{\??mathcommand#1}{\mathcodecommand{#2}{#4}}% \else \setuvalue{\??mathcommand#1}{\mathcodecommand{nothing}{#4}}% \fi\fi \letcsnamecsname\csname#1\endcsname\csname\??mathcommand#1\endcsname} \unexpanded\def\mathcommand#1% {\csname\??mathcommand#1\endcsname} %D Moved from font-ini.mkiv: %D %D \macros %D {mf,mbox,enablembox,mathop} %D %D Todo: \unexpanded\def\mf {\csname\fontalternative\endcsname} \let\normalmathop\mathop \unexpanded\def\mathop {\normalmathop \bgroup \let\rm\mf \let\nexttoken=} % this one too: \letvalue{\??mathcodecommand op}\mathop ? \unexpanded\def\normalmbox {\normalhbox\bgroup\mf \dowithnextboxcs\math_mbox_finish\normalhbox} \def\math_mbox_finish {\flushnextbox \egroup} \unexpanded\def\mbox % we cannot add \dontleavehmode ... else no \setbox0\mbox possible {\ifmmode\normalmbox\else\normalhbox\fi} \unexpanded\def\enablembox {\appendtoks\math_enable_mbox\to \everymathematics} {\everymathematics\expandafter{\the\everymathematics\math_enable_mbox}} \def\math_enable_mbox {\ifdefined\normalhbox\else\let\normalhbox\hbox\fi % ? \let\hbox\mbox} %D The next hack is needed needed for sine, cosine etc. \let\mathfunction\firstofoneunexpanded \let\math_tags_function \firstofoneunexpanded \let\math_tags_functionlabeltext\mathlabeltext \let\math_tags_mo\firstofoneunexpanded \let\math_tags_mi\firstofoneunexpanded \unexpanded\def\math_tags_mn#1{\begingroup\mr#1\endgroup} \unexpanded\def\math_tags_ms#1{\begingroup\mr#1\endgroup} \unexpanded\def\mfunction #1{{\mr\math_tags_function{#1}}} \unexpanded\def\mfunctionlabeltext#1{{\mr\math_tags_functionlabeltext{#1}}} % Once this is stable we can store the number at the tex end which is % faster. Functions getnumbers >= 1000. \expanded\def\math_tags_mathfunction_indeed #1{\ctxcommand{taggedmathfunction("#1",false,\ifconditional\c_apply_function true\else false\fi)}} \expanded\def\math_tags_mathfunctionlabeltext_indeed#1{\ctxcommand{taggedmathfunction("#1",true ,\ifconditional\c_apply_function true\else false\fi)}} \expanded\def\math_tags_mo_indeed#1{\begingroup \attribute\mathcategoryattribute\plusone #1\endgroup} \expanded\def\math_tags_mi_indeed#1{\begingroup \attribute\mathcategoryattribute\plustwo #1\endgroup} \expanded\def\math_tags_mn_indeed#1{\begingroup\mr\attribute\mathcategoryattribute\plusthree#1\endgroup} \expanded\def\math_tags_ms_indeed#1{\begingroup\mr\attribute\mathcategoryattribute\plusfour #1\endgroup} \newconditional\c_apply_function \unexpanded\def\math_tags_apply#1#2% {\begingroup \settrue\c_apply_function #1% \endgroup \begingroup % todo: auto () #2% \endgroup} \appendtoks \let\math_tags_function \math_tags_mathfunction_indeed \let\math_tags_functionlabeltext\math_tags_mathfunctionlabeltext_indeed \let\math_tags_mo \math_tags_mo_indeed \let\math_tags_mi \math_tags_mi_indeed \let\math_tags_mn \math_tags_mn_indeed \let\math_tags_ms \math_tags_ms_indeed \to \everyenableelements \appendtoks \let\mo \math_tags_mo \let\mi \math_tags_mi \let\mn \math_tags_mn \let\ms \math_tags_ms \let\apply\math_tags_apply \to\everymathematics % \def\mlimitsfunction #1{\mathlimopcomm{{\mr#1}} % \def\mnolimitsfunction#1{\mathnolopcomm{{\mr#1}} %D Taco posted this solution as response to a mail by Olivier, so %D let's integrate it here. \def\currentmscaledstyle{rm} % will be plugged into the typeface text=ss option \unexpanded\def\math_function_style_opnolimits #1{\mathop{\mscaledtext{#1}}\nolimits} \unexpanded\def\math_function_style_mfunction #1{\mscaledtext{\math_tags_function{#1}}} \unexpanded\def\math_function_style_mfunctionlabeltext#1{\mscaledtext{\math_tags_functionlabeltext{#1}}} \unexpanded\def\setmathfunctionstyle#1% rm ss tt (can be made faster if needed) {\doifsomething{#1} {\def\currentmscaledstyle{#1}% \let\mathopnolimits \math_function_style_opnolimits \let\mfunction \math_function_style_mfunction \let\mfunctionlabeltext\math_function_style_mfunctionlabeltext}} \unexpanded\def\mscaledtext#1% {\mathchoice {\hbox{\csname\currentmscaledstyle\endcsname\tf #1}} {\hbox{\csname\currentmscaledstyle\endcsname\tf #1}} {\hbox{\csname\currentmscaledstyle\endcsname\tfx #1}} {\hbox{\csname\currentmscaledstyle\endcsname\tfxx#1}}} %D We can force the way functions are typeset by manipulating the text %D option: %D %D \starttyping %D \definetypeface[iwona][ss][sans][iwona][default][encoding=texnansi] %D \definetypeface[iwona][mm][math][iwona][default][encoding=texnansi,text=ss] %D \stoptyping %D %D This hooks into the math handler with: % no longer supported this way, has to be done with \setupmathematics % % \appendtoks % \setmathfunctionstyle\currentmathtextstyle % \to \everybodyfont %D Usage: %D %D \starttyping %D \setmathfunctionstyle\fontstyle % or {rm} or {ss} or .. %D \rm test $\sin{(x^{\sin(x^{\sin(x)})})}$ test %D \ss test $\sin{(x^{\sin(x^{\sin(x)})})}$ test %D \tt test $\sin{(x^{\sin(x^{\sin(x)})})}$ test %D \stoptyping %D Some goodies: \unexpanded\def\Angstrom{\nomathematics{\Aring}} %D \macros %D {nonknuthmode, donknuthmode} %D %D The underscore is frequently used in manuals but unfortunately \TEX\ prefers %D it to be a math specific character. And since computer modern fonts didn't %D have an underscore, one had to use commands to fake one. Nowadays we do %D have underscores in latin modern, and since all other fonts have them, we %D decided to get away from the restriction to use the underscore character in %D text mode. %D %D \starttyping %D \def\test#1{#1} %D %D \nonknuthmode $x_2$ x_2 \test{$x_2$} \test{x_2} %D %D \donknuthmode $x_2$ x_2 \test{$x_2$} \test{x_2} %D \stoptyping %D %D The result is as expected: the first line typesets ok, while the second %D one triggers an error message. \setnewconstant\activemathcharcode "8000 \newtoks\activatedmathcharacters \def\activatemathcharacter#1% {\appendtoks \global\mathcode#1=\activemathcharcode \to \activatedmathcharacters} \def\activatemathcharacters {\the\activatedmathcharacters} % \setnewconstant\primeasciicode 39 % ' \activatemathcharacter\circumflexasciicode \activatemathcharacter\underscoreasciicode \activatemathcharacter\ampersandasciicode \activatemathcharacter\primeasciicode % not used: % % \mathcode\spaceasciicode\activemathcharcode % % not used: % % \bgroup % \catcode\underscoreasciicode\activecatcode % \doglobal\appendtoks % \mathcode\underscoreasciicode\activemathcharcode % \let_\activemathunderscore % \to \everymathematics % \egroup % Here follows some plain legacy: primes. % % The \let\prime\math_prime_indeed might become an obsolete as we have % \doubleprime and \tripleprime and collapsing can nicely handle the % script then. % % Collapsing to 0x2033 and 0x2034 happens elsewhere. % \switchtobodyfont[modern] % \switchtobodyfont[cambria] % \switchtobodyfont[xits] % \switchtobodyfont[minion] % \setupbodyfont[dejavu] % % \startbuffer % \def\SampleLine#1{% % \NC#1 % \NC\switchtobodyfont[#1]$f^2$ % 1 % \NC\switchtobodyfont[#1]$f\prime^2$ % 2 % \NC\switchtobodyfont[#1]$f\prime\prime^2$ % 3 % \NC\switchtobodyfont[#1]$f\prime\prime\prime^2$ % 4 % \NC\switchtobodyfont[#1]$f{\prime}^2$ % 5 % \NC\switchtobodyfont[#1]$f{\prime\prime}^2$ % 6 % \NC\switchtobodyfont[#1]$f{\prime\prime\prime}^2$ % 7 % \NC\switchtobodyfont[#1]$f'(x)$ % 8 % \NC\switchtobodyfont[#1]$f''(x)$ % 9 % \NC\switchtobodyfont[#1]$f'''(x)$ % 10 % \NC\NR % } % % \starttabulate[|Tl|Tc|Tc|Tc|Tc|Tc|Tc|Tc|Tc|Tc|Tc|] % \NC\NC1\NC2\NC3\NC4\NC5\NC6\NC7\NC8\NC9\NC10\NC\NR % \SampleLine{modern} % \SampleLine{cambria} % \SampleLine{xits} % \SampleLine{minion} % \stoptabulate % \stopbuffer % % \typebuffer \getbuffer % most math fonts have messed up primes, just test this: $\prime^{\prime^{\prime}}$ { \catcode\circumflexasciicode\othercatcode \global\let\othercircumflextoken ^ } { \catcode\circumflexasciicode\superscriptcatcode \global\let\superscriptcircumflextoken^ } \ifdefined \prime \else \Umathchardef\prime "0 "0 "2032 \fi \let\math_prime_indeed_normal\prime \appendtoks \let\math_prime_indeed_normal\prime % gets defined later \let\mathfontprime\prime % for tracing \let\prime\math_prime_indeed % so this is needed \to \everydump \unexpanded\def\math_prime_indeed {\iffontchar\textfont\zerocount"FE325\relax ^\bgroup \expandafter\math_prime_indeed_virtual % virtual mess (using funny signal) \else % \expandafter\math_prime_indeed_normal % gets collapsed \expandafter\math_prime_indeed_crapped % gets collapsed \fi} \def\math_prime_indeed_crapped {{^{\math_prime_indeed_normal}}} \let\prime\math_prime_indeed \def\math_prime_indeed_virtual {\math_prime_indeed_normal \futurelet\nexttoken\math_prime_indeed_choice} \installcorenamespace{mathprime} \def\math_prime_indeed_choice {\csname\??mathprime \ifx '\nexttoken a\else \ifx \math_prime_indeed_normal\nexttoken a\else \ifx \prime\nexttoken a\else \ifx\superscriptcircumflextoken\nexttoken b\else \ifx\othercircumflextoken \nexttoken b\else c\fi\fi\fi\fi\fi \endcsname} \setvalue{\??mathprime a}#1{\math_prime_indeed_virtual} \setvalue{\??mathprime b}#1#2{#2\egroup} \setvalue{\??mathprime c}{\egroup} \let\activemathprime\math_prime_indeed \bgroup \catcode\primeasciicode\activecatcode \global\everymathematics\expandafter{\the\everymathematics\let'\math_prime_indeed} % todo: do this at the lua end \egroup \bgroup \catcode\underscoreasciicode\activecatcode \catcode\circumflexasciicode\activecatcode \catcode\ampersandasciicode \activecatcode \doglobal \appendtoks \let _\normalsubscript \let ^\normalsuperscript \let &\normalmathaligntab % use \def when it's \aligntab \to \everymathematics \egroup \newtoks\everydonknuthmode \newtoks\everynonknuthmode \newconditional \knuthmode \let\nonknuthmode\relax \let\donknuthmode\relax % \def\nonknuthmode % {\pushcatcodetable % \setcatcodetable\ctxcatcodes % \the\everynonknuthmode % \let\nonknuthmode\relax % \popcatcodetable} % % \def\donknuthmode % {\pushcatcodetable % \setcatcodetable\ctxcatcodes % \the\everydonknuthmode % \popcatcodetable} % % \bgroup % % \catcode\underscoreasciicode\activecatcode % \catcode\circumflexasciicode\activecatcode % \catcode\ampersandasciicode \activecatcode % % \global \everynonknuthmode {\appendtoks % \let_\normalsubscript % \let^\normalsuperscript % \let&\normalmathaligntab % use \def when it's \aligntab % \to \everymathematics} % % \egroup % % \appendtoks % \setfalse\knuthmode % \catcode\underscoreasciicode\othercatcode % \catcode\circumflexasciicode\othercatcode % \catcode\ampersandasciicode \othercatcode % \to \everynonknuthmode % % \appendtoks % \settrue\knuthmode % \catcode\underscoreasciicode\subscriptcatcode % \catcode\circumflexasciicode\superscriptcatcode % \catcode\ampersandasciicode \alignmentcatcode % \to \everydonknuthmode % % \appendtoks % \startextendcatcodetable\ctxcatcodes % \catcode\underscoreasciicode\othercatcode % \catcode\circumflexasciicode\othercatcode % \catcode\ampersandasciicode \othercatcode % \stopextendcatcodetable % \to \everynonknuthmode % % \appendtoks % \startextendcatcodetable\ctxcatcodes % \catcode\underscoreasciicode\subscriptcatcode % \catcode\circumflexasciicode\superscriptcatcode % \catcode\ampersandasciicode \alignmentcatcode % \stopextendcatcodetable % \to \everydonknuthmode %D Even more drastic (this code will move as nonknuthmode is default now) % \unexpanded\def\enableasciimode % {\ctxlua{resolvers.macros.enablecomment()}% % \glet\enableasciimode\relax} % % \unexpanded\def\asciimode % {\catcodetable\txtcatcodes % \enableasciimode % \nonknuthmode} % % \unexpanded\def\startasciimode % {\pushcatcodetable % \catcodetable\txtcatcodes % \enableasciimode % \nonknuthmode} % % \unexpanded\def\stopasciimode % {\popcatcodetable % \ifconditional\knuthmode\else\donknuthmode\fi} \unexpanded\def\enableasciimode {\ctxlua{resolvers.macros.enablecomment()}% \glet\enableasciimode\relax} \unexpanded\def\asciimode {\catcodetable\txtcatcodes \enableasciimode} \unexpanded\def\startasciimode {\pushcatcodetable \catcodetable\txtcatcodes \enableasciimode} \unexpanded\def\stopasciimode {\popcatcodetable} %D Needed for unicode: \def\nulloperator{\mathortext{\mathop{\emptyhbox}}{\emptyhbox}} %D Memory saver: \appendtoks \ifx\currentmathematics\empty \doifelse{\mathematicsparameter\c!compact}\v!yes\enabledirectives\disabledirectives[math.virtual.optional]% \fi \to \everysetupmathematics \setupmathematics [\c!compact=no] %D Arabic: \newconditional\c_math_right_to_left \appendtoks \doifelse{\mathematicsparameter\c!align}{r2l}\settrue\setfalse\c_math_right_to_left \to \everyswitchmathematics \unexpanded\def\math_basics_synchronize_direction {\mathdir T\ifconditional\c_math_right_to_left R\else L\fi T} \appendtoks \math_basics_synchronize_direction %to \everymathematics % comes too late and I'm not in the mood for a mixed mode kludge now \to \everyswitchmathematics %D Delayed: greek. %D %D \starttyping %D \usetypescript[cambria]\setupbodyfont[cambria] %D \startTEXpage %D $\alpha \mathgreekupright \alpha \mathgreekitalic \alpha$ %D \stopTEXpage %D \stoptyping % [lc uc] normal (upright) = 2, italic = 3, none = 0/1 % We can move the setting to the lua end and use abstract numbers instead % if funny ones here. \installcorenamespace{mathgreek} \newconstant\c_math_greek_attribute \setvalue{\??mathgreek\v!normal :\v!normal}{22} \setvalue{\??mathgreek\v!normal :\v!italic}{23} \setvalue{\??mathgreek\v!normal :\v!none }{21} \setvalue{\??mathgreek\v!italic :\v!normal}{32} \setvalue{\??mathgreek\v!italic :\v!italic}{33} \setvalue{\??mathgreek\v!italic :\v!none }{31} \setvalue{\??mathgreek\v!none :\v!normal}{12} \setvalue{\??mathgreek\v!none :\v!italic}{13} \letvalue{\??mathgreek\v!none :\v!none }\attributeunsetvalue \appendtoks \edef\p_lcgreek_ucgreek{\mathematicsparameter\s!lcgreek:\mathematicsparameter\s!ucgreek}% \c_math_greek_attribute\csname\??mathgreek \ifcsname\??mathgreek\p_lcgreek_ucgreek\endcsname\p_lcgreek_ucgreek\else\v!none\fi \endcsname\relax \to \everyswitchmathematics \appendtoks \attribute\mathgreekattribute\c_math_greek_attribute \to \everymathematics \setupmathematics [\s!lcgreek=\v!italic, \s!ucgreek=\v!normal] % was: none %D Math italics (experiment) % we need keys \installcorenamespace{mathitalics} \setnewconstant\c_math_italics_attribute\attributeunsetvalue \letvalue{\??mathitalics 1}\plusone % fontitalics \letvalue{\??mathitalics 2}\plustwo % fontdata \letvalue{\??mathitalics 3}\plusthree % quad based \letvalue{\??mathitalics 4}\plusfour % combination of 1 and 3 \letvalue{\??mathitalics\v!none}\attributeunsetvalue \def\math_italics_initialize {\ifnum\c_math_italics_attribute=\attributeunsetvalue \else \ctxcommand{setmathitalics()}% one time \global\let\math_italics_initialize\relax \fi} \appendtoks \edef\p_italics{\mathematicsparameter\s!italics}% \c_math_italics_attribute\csname\??mathitalics \ifcsname\??mathitalics\p_italics\endcsname\p_italics\else\v!none\fi \endcsname\relax % \math_italics_initialize \to \everyswitchmathematics % only in mathematics \appendtoks \math_italics_initialize \attribute\mathitalicsattribute\c_math_italics_attribute \to \everymathematics \setupmathematics [\s!italics=4] % looks nicer but can generate bogus csnames % % \setvalue{\??mathitalics1}{\math_italics_initialize\c_math_italics_attribute\plusone } % fontitalics % \setvalue{\??mathitalics2}{\math_italics_initialize\c_math_italics_attribute\plustwo } % fontdata % \setvalue{\??mathitalics3}{\math_italics_initialize\c_math_italics_attribute\plusthree} % quad based % \setvalue{\??mathitalics4}{\math_italics_initialize\c_math_italics_attribute\plusfour } % combination of 1 and 3 % % \appendtoks % \c_math_italics_attribute\attributeunsetvalue % \csname\??mathitalics\mathematicsparameter\s!italics\endcsname % \to \everyswitchmathematics % only in mathematics %D \macros %D {enablemathpunctuation,disablemathpunctuation} %D %D \startbuffer %D \enablemathpunctuation$(1,2) (1, 2) (1{,}2) \hbox{foo, not bar}$ %D \stopbuffer %D %D \typebuffer %D %D \blank{\getbuffer}\blank \newconditional\automathpunctuation \unexpanded\def\enablemathpunctuation {\settrue \automathpunctuation} \unexpanded\def\disablemathpunctuation{\setfalse\automathpunctuation} \appendtoks \doifelse{\mathematicsparameter\v!autopunctuation}\v!yes\settrue\setfalse\automathpunctuation \to \everyswitchmathematics \appendtoks \ifconditional\automathpunctuation\attribute\mathpunctuationattribute\plusone\fi \to \everymathematics \setupmathematics [\v!autopunctuation=\v!no] %D \macros %D {mathstyle} %D %D If one want to be sure that something is typeset in the %D appropriate style, \type {\mathstyle} can be used: %D %D \starttyping %D \mathstyle{something} %D \stoptyping % \def\mathstyle#1% % {\mathchoice % {\displaystyle #1}% % {\textstyle #1}% % {\scriptstyle #1}% % {\scriptscriptstyle#1}} % % We now have a primitive operation for this. As the % macro overloads a new primitive introduced in \LUATEX, % we need to use \type {\normalmathstyle} when we consult % the current math style. % % \let \mathstyle \Ustack % spoils cramped % % \let \mathstyle \firstofoneargument % % 0 = display % 1 = crampeddisplay % 2 = text % 3 = crampedtext % 4 = script % 5 = crampedscript % 6 = scriptscript % 7 = crampedscriptscript \def\uncramped#1% {{\ifcase\normalmathstyle \or \displaystyle \or \or \textstyle \or \or \scriptstyle \or \or \scriptscriptstyle \fi #1}} \def\cramped#1% {{\ifcase\normalmathstyle \crampeddisplaystyle \or \or % 0 -> 1 \crampedtextstyle \or \or % 2 -> 3 \crampedscriptstyle \or \or % 4 -> 5 \crampedscriptscriptstyle \fi % 6 -> 7 #1}} \def\triggermathstyle#1% #1 is number {\ifcase#1\relax \displaystyle \or \crampeddisplaystyle \or \textstyle \or \crampedtextstyle \or \scriptstyle \or \crampedscriptstyle \or \scriptscriptstyle \or \crampedscriptscriptstyle \else % error \fi} \def\mathstylefont#1% #1 is number (\normalmathstyle) {\ifcase#1\relax \textfont \or \textfont \or \textfont \or \textfont \or \scriptfont \or \scriptfont \or \scriptscriptfont \or \scriptscriptfont \else \textfont \fi\zerocount} %D A plain inheritance: \def\mathpalette#1#2% {\mathchoice {#1\displaystyle {#2}}% {#1\textstyle {#2}}% {#1\scriptstyle {#2}}% {#1\scriptscriptstyle{#2}}} %D Often we can use: %D %D \startbuffer %D $x^{\mathstylehbox{x^{\mathstylehbox{x}}}}$ %D \stopbuffer %D %D \typebuffer \getbuffer \unexpanded\def\mathstylehbox#1% {\normalexpanded{\hbox\bgroup $\triggermathstyle\normalmathstyle}\mathsurround\zeropoint#1$\egroup} \unexpanded\def\mathstylevbox#1% {\normalexpanded{\vbox\bgroup $\triggermathstyle\normalmathstyle}\mathsurround\zeropoint#1$\egroup} \unexpanded\def\mathstylevcenter#1% {\normalexpanded{\vcenter\bgroup $\triggermathstyle\normalmathstyle}\mathsurround\zeropoint#1$\egroup} \unexpanded\def\mathstylevcenteredhbox#1% {\normalexpanded{\vcenter\bgroup\hbox\bgroup $\triggermathstyle\normalmathstyle}\mathsurround\zeropoint#1$\egroup\egroup} \unexpanded\def\mathstylevcenteredvbox#1% {\normalexpanded{\vcenter\bgroup\vbox\bgroup $\triggermathstyle\normalmathstyle}\mathsurround\zeropoint#1$\egroup\egroup} %D Something similar can be used in the (re|)|definition %D of \type {\text}. This version is a variation on the one %D in the math module (see \type{m-math} and|/|or \type %D {m-newmat}). \unexpanded\def\mathtext {\mathortext\math_text_choice\hbox} \def\math_text_choice#1% {\mathchoice {\math_text_choice_indeed\displaystyle\textface {#1}}% {\math_text_choice_indeed\textstyle \textface {#1}}% {\math_text_choice_indeed\textstyle \scriptface {#1}}% {\math_text_choice_indeed\textstyle \scriptscriptface{#1}}} \def\math_text_choice_indeed#1#2#3% no \everymath ! %{\hbox{\everymath{#1}\switchtobodyfont [#2]#3}} % 15 sec {\hbox{\everymath{#1}\setcurrentfontbody{#2}#3}} % 3 sec (no math) %D Safeguard against redefinitions: \appendtoks \let\_\normalunderscore % is textunderscore or fakeunderscore \to \everymathematics %D Because we may overload \type {\text} in other (structuring) %D macros, we say: \appendtoks \let\text\mathtext \to \everymathematics %D The next code is derived from plain \TEX. The names will change! \newcount\interdisplaylinepenalty \interdisplaylinepenalty\plushundred % Actually, not using an if saves one macro so there is no penalty % for splitting up this macro. % % \newif\ifdt@p % % \def\displ@y % {\global\dt@ptrue % \openup\displayopenupvalue % was \openup\jot % \everycr % {\noalign % {\ifdt@p % \global\dt@pfalse % \ifdim\prevdepth>-\thousandpoint % \vskip-\lineskiplimit % \vskip\normallineskiplimit % \fi % \else % \penalty\interdisplaylinepenalty % \fi}}} \newtoks\mathdisplayaligntweaks \appendtoks \resetdisplaymatheq % moved to here \to \mathdisplayaligntweaks \unexpanded\def\math_display_align_hack % I don't like the global, maybe we should push and pop {\global\let\math_display_align_hack_indeed\math_display_align_hack_remove_skip \openup\displayopenupvalue % was \openup\jot \everycr{\noalign{\math_display_align_hack_indeed}}} \def\math_display_align_hack_remove_skip {\ifdim\prevdepth>-\thousandpoint \vskip\dimexpr-\lineskiplimit+\normallineskiplimit\relax \fi \global\let\math_display_align_hack_indeed\math_display_align_hack_insert_penalty} \def\math_display_align_hack_insert_penalty {\penalty\interdisplaylinepenalty} \appendtoks \math_display_align_hack \to \mathdisplayaligntweaks %D Text in math: \unexpanded\def\mathortext {\ifmmode \expandafter\firstoftwoarguments \else \expandafter\secondoftwoarguments \fi} % \defineactivecharacter _ {\mathortext{_}{\_}} text_text $a^2$ % force text mode, will be overloaded later \ifdefined\text\else \let\text\hbox \fi \unexpanded\def\mathoptext#1{\mathop{\text{#1}}} % for a while: \def\Umathbotaccent{\Umathaccent bottom } \protect \endinput