diff options
Diffstat (limited to 'tex/context/base/mkiv/math-ali.mkxl')
-rw-r--r-- | tex/context/base/mkiv/math-ali.mkxl | 1898 |
1 files changed, 0 insertions, 1898 deletions
diff --git a/tex/context/base/mkiv/math-ali.mkxl b/tex/context/base/mkiv/math-ali.mkxl deleted file mode 100644 index e5c693f98..000000000 --- a/tex/context/base/mkiv/math-ali.mkxl +++ /dev/null @@ -1,1898 +0,0 @@ -%D \module -%D [ file=math-ali, -%D version=2008.10.20, -%D title=\CONTEXT\ Math Macros, -%D subtitle=Math Alignments, -%D author={Hans Hagen, Taco Hoekwater \& Aditya Mahajan}, -%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 / Math Alignments} - -\unprotect - -%D The code here has been moved from other files. Beware: the \MKII\ and \MKIV\ code -%D is not gathered in files with the same name. In the meantime this code has been -%D adapted to \MKIV\ but more is possible. The code is somewhat complicated by the -%D fact that alignments are tricky with rspect to tagging. - -% export: -% -% alignment : ok -% cases : -% matrix : ok -% substack : - -%D \macros -%D {definemathalignment, setupmathalignment, startmathalignment} -%D -%D Modules may provide additional alignment features. The following mechanisms are -%D provided by the core. - -\newtoks\t_math_align_a -\newtoks\t_math_align_b -\newtoks\t_math_align_c - -\newskip\d_math_eqalign_distance - -\protected\def\math_eqalign_distance - {\relax - \ifdim\d_math_eqalign_distance>\zeropoint - % \hskip\d_math_eqalign_distance - \tabskip\d_math_eqalign_distance - \fi - \mathalignmentparameter\c!separator - \relax} - -\def\displayopenupvalue{.25\bodyfontsize} - -\def\math_build_eqalign - {\scratchtoks\emptytoks - \d_math_eqalign_distance\mathalignmentparameter\c!distance\relax - \scratchcounterone\mathalignmentparameter\c!m - \scratchcountertwo\mathalignmentparameter\c!n - \etoksapp\scratchtoks{\the\t_math_align_a}% - \scratchcounter\plusone - \dorecurse{\numexpr\scratchcounterone*\scratchcountertwo-\plusone\relax} - {\ifnum\scratchcounter=\scratchcountertwo - \scratchcounter\plusone - \etoksapp\scratchtoks{\math_eqalign_distance}% - \else - \advance\scratchcounter\plusone - \fi - \etoksapp\scratchtoks{\the\t_math_align_b}}% - \etoksapp\scratchtoks{\the\t_math_align_c}} - -\def\math_math_in_eqalign#1% - {\startforceddisplaymath - \tabskip\zeropoint - \everycr\emptytoks - {{}#1{}}% - \stopforceddisplaymath} - -\def\math_text_in_eqalign#1% - {\startimath - \tabskip\zeropoint - \everycr\emptytoks - #1% - \stopimath} - -\def\eqalign#1% why no halign here, probably because of displaywidth - {\emptyhbox - \mskip\thinmuskip - \vcenter - {\math_openup\displayopenupvalue % was: \openup\jot - \mathsurround\zeropoint - \ialign{% - \strut - \hfil - \startforceddisplaymath{\alignmark\alignmark}\stopforceddisplaymath - \aligntab - \startforceddisplaymath{{}\alignmark\alignmark{}}\stopforceddisplaymath - \hfil\crcr - #1\crcr}% - }% - \mskip\thinmuskip} - -% preamble is scanned for tabskips so we need the span to prevent an error message - -\setnewconstant\eqalignmode\plusone - -% use zeroskipplusfill - -\def\math_prepare_r_eqalign_no - {\t_math_align_a - {\strut - \tabskip\zeropoint - \alignmark\alignmark % for picking up the number - \aligntab - \math_first_in_eqalign - \hfil - \math_left_of_eqalign - \span - \math_math_in_eqalign{\alignmark\alignmark}% - \math_right_of_eqalign - \tabskip\zeropoint}% - \t_math_align_b - {\aligntab - \math_next_in_eqalign - \math_left_of_eqalign - \span - \math_math_in_eqalign{\alignmark\alignmark}% - \math_right_of_eqalign - \tabskip\zeropoint}% - \ifnum\mathraggedstatus=\plusone - \t_math_align_c - {\hfil - \aligntab - \span - \math_text_in_eqalign{\alignmark\alignmark}% - \tabskip\zeropoint}% - \orelse\ifnum\mathraggedstatus=\plusthree - \t_math_align_c - {\hfil - \tabskip\zeropoint\s!plus 1\s!fill - \aligntab - \span - \math_text_in_eqalign{\alignmark\alignmark}% - \tabskip\zeropoint}% - \else - \t_math_align_c - {\hfil - \tabskip\centering - \aligntab - \span - \llap{\math_text_in_eqalign{\alignmark\alignmark}}% - \tabskip\zeropoint}% - \fi - \math_build_eqalign - \the\mathdisplayaligntweaks - \tabskip\centering} - -\def\math_prepare_l_eqalign_no % \checkeddisplaymath - {\t_math_align_a - {\strut - \tabskip\zeropoint - \alignmark\alignmark % for picking up the number - \aligntab - \math_first_in_eqalign - \hfil - \math_left_of_eqalign - \span - \math_math_in_eqalign{\alignmark\alignmark}% - \math_right_of_eqalign - \tabskip\zeropoint}% - \t_math_align_b - {\aligntab - \math_next_in_eqalign - \math_left_of_eqalign - \span - \math_math_in_eqalign{\alignmark\alignmark}% - \math_right_of_eqalign - \tabskip\zeropoint}% - \ifnum\mathraggedstatus=\plusone - \t_math_align_c - {\hfil - \aligntab - \kern-\displaywidth - \span - \rlap{\math_text_in_eqalign{\alignmark\alignmark}}% - \tabskip\displaywidth}% - \orelse\ifnum\mathraggedstatus=\plusthree - \t_math_align_c - {\hfil - \tabskip\zeropoint\s!plus 1\s!fill - \aligntab - \kern-\displaywidth - \span - \math_rlap{\math_text_in_eqalign{\alignmark\alignmark}}% - \tabskip\displaywidth}% - \else - \t_math_align_c - {\hfil - \tabskip\centering - \aligntab - \kern-\displaywidth - \span - \rlap{\math_text_in_eqalign{\alignmark\alignmark}}% - \tabskip\displaywidth}% - \fi - \math_build_eqalign - \the\mathdisplayaligntweaks - \tabskip\centering} - -\def\math_halign_checked - {\halign \ifcase\eqalignmode \or to \checkeddisplaywidth \fi} - -\def\math_both_eqalign_no_normal#1#2% - {\ifmmode - \the\mathdisplayaligntweaks - \vcenter\bgroup - \enforced\let\math_finish_eqalign_no\egroup - \else - \enforced\let\math_finish_eqalign_no\relax - \fi - #1% - \math_halign_checked\expandafter\bgroup\the\scratchtoks\crcr#2\crcr\egroup - \math_finish_eqalign_no} - -\installcorenamespace {mathalignlocation} - -\setvalue{\??mathalignlocation\v!top }{\let\math_alignment_halign_method\halign\tpack} -\setvalue{\??mathalignlocation\v!bottom}{\let\math_alignment_halign_method\halign\vpack} -\setvalue{\??mathalignlocation\v!center}{\let\math_alignment_halign_method\halign\vcenter} - -\def\math_both_eqalign_no_aligned#1% - {\let\math_alignment_halign_method\math_halign_checked - \ifmmode - \the\mathdisplayaligntweaks - \global\mathnumberstatus\plusone - \ifcase\mathraggedstatus - \def\math_finish_eqalign_no{\crcr\egroup}% - \else % we're in a mathbox - \ifcsname\??mathalignlocation\mathalignmentparameter\c!location\endcsname - \lastnamedcs % top|bottom|center as suggested by HM - \else - \vcenter - \fi - \bgroup - \def\math_finish_eqalign_no{\crcr\egroup\egroup}% - \fi - \fi - #1% - \math_alignment_halign_method\expandafter\bgroup\the\scratchtoks\crcr} - -\def\math_rlap#1% - {\setbox\scratchbox\hbox{#1}% - \ifdim\wd\scratchbox>\d_math_number_correction - \global\d_math_number_correction\wd\scratchbox - \fi - \box\scratchbox - \global\mathnumberstatus\plustwo} - -\def\math_handle_eqalign_no_r_normal {\math_both_eqalign_no_normal \math_prepare_r_eqalign_no} -\def\math_handle_eqalign_no_l_normal {\math_both_eqalign_no_normal \math_prepare_l_eqalign_no} -\def\math_handle_eqalign_no_r_aligned{\math_both_eqalign_no_aligned\math_prepare_r_eqalign_no} -\def\math_handle_eqalign_no_l_aligned{\math_both_eqalign_no_aligned\math_prepare_l_eqalign_no} -\def\math_finish_eqalign_no {\crcr\egroup} - -\let\reqalignno\relax -\let\leqalignno\relax -\let\eqalignno \relax - -%D Here we implement the user interface part. We start with basic math alignments: - -\newcount \c_math_eqalign_column -\newconditional\c_math_eqalign_first - -\newtoks \everymathalignment -\newtoks \everymathalignmentdone - -\permanent\tolerant\protected\def\math_alignment_NN[#1]#*[#2]% - {\aligntab - \strc_formulas_place_number_nested{#1}{#2}} - -\permanent\tolerant\protected\def\math_alignment_NR[#1]#*[#2]% - {\aligntab - \dostoptagged % finish cell - \strc_formulas_place_number_nested{#1}{#2}% - \math_number_right_of_eqalign - \global\settrue\c_math_eqalign_first - \crcr - \dostoptagged} % finish row - -\permanent\protected\def\math_alignment_NC - {\relax - \ifconditional\c_math_eqalign_first - \ifx\p_math_alignment_number\v!auto - \strc_formulas_place_number_nested{+}{}% - \fi - \global\setfalse\c_math_eqalign_first - \fi - \math_number_left_of_eqalign - \aligntab} - -\permanent\protected\def\math_alignment_EQ - {\NC=} - -\noaligned\tolerant\protected\def\math_common_TB[#1]% - {\noalign{\blank[#1]}} - -\installmacrostack\NC % maybe more to shared table definitions -\installmacrostack\NN % maybe more to shared table definitions -\installmacrostack\EQ % maybe more to shared table definitions -\installmacrostack\NR % maybe more to shared table definitions -\installmacrostack\BC % maybe more to shared table definitions -\installmacrostack\EC % maybe more to shared table definitions -\installmacrostack\TB % maybe more to shared table definitions - -\appendtoks - \push_macro_NC - \push_macro_NN - \push_macro_EQ - \push_macro_NR - \push_macro_TB - \enforced\let\NC\math_alignment_NC - \enforced\let\NN\math_alignment_NN - \enforced\let\EQ\math_alignment_EQ - \enforced\let\NR\math_alignment_NR - \enforced\let\TB\math_common_TB - \global\settrue\c_math_eqalign_first -\to \everymathalignment - -\appendtoks - \pop_macro_TB - \pop_macro_NR - \pop_macro_EQ - \pop_macro_NN - \pop_macro_NC -\to \everymathalignmentdone - -\let\math_alignment_snap_start\relax -\let\math_alignment_snap_stop \relax - -% % experimental: -% -% \def\math_alignment_snap_start -% {\ifgridsnapping -% \edef\p_math_alignment_grid{\mathalignmentparameter\c!grid}% -% \ifx\p_math_alignment_grid\v!no\else -% \snaptogrid[\p_math_alignment_grid]\vbox\bgroup -% \fi -% \fi} -% -% \def\math_alignment_snap_stop -% {\ifgridsnapping -% \ifx\p_math_alignment_grid\v!no\else -% \egroup -% \fi -% \fi} -% -% % doesn't work well, so: - -\let\math_alignment_snap_start\relax -\let\math_alignment_snap_stop \relax - -% end of experimental - -\newconditional\c_math_alignment_auto_number - -% \begingroup not permitted ($$...assignments...\halign... ).. check in luametatex - -\permanent\tolerant\protected\def\math_alignment_start[#1]#*[#2]% - {\edef\currentmathalignment{#1}% - \ifarguments\or\or - \setupmathalignment[#1][#2]% bad! ungrouped - \fi - \math_alignment_snap_start - \the\everymathalignment - \c_math_eqalign_column\zerocount - \edef\p_math_alignment_number{\mathalignmentparameter\c!number}% - \processcommacommand - [\mathalignmentparameter\c!align]% - {\advance\c_math_eqalign_column\plusone\math_eqalign_set_column}% takes argument - \global\c_math_eqalign_column\plusone - \dostarttagged\t!math\empty - \dostarttagged\t!mtable\currentmathalignment - \numberedeqalign} - -\def\math_alignment_stop % can be protected - {\math_finish_eqalign_no - \dostoptagged - \dostoptagged - \the\everymathalignmentdone - \math_alignment_snap_stop} - -\installcorenamespace{mathalignment} -\installcorenamespace{mathalignmentvariant} - -\installcommandhandler \??mathalignment {mathalignment} \??mathalignment - -\appendtoks - \setuevalue{\e!start\currentmathalignment}{\math_alignment_start[\currentmathalignment]}% - \setvalue {\e!stop \currentmathalignment}{\math_alignment_stop}% -\to \everydefinemathalignment - -\setupmathalignment - [\c!n=2, - \c!m=1, - \c!distance=\emwidth, - \c!grid=\v!math] - -\definemathalignment[align] % default case (this is what amstex users expect) -\definemathalignment[\v!mathalignment] % prefered case (this is cleaner, less clashing) - -% special case.. in case one mistypes .. - -\ifdefined \startalignment - - \let\align_math_normal_start\startalign - \let\align_math_normal_stop \stopalign - - \let\align_text_normal_start\startalignment - \let\align_text_normal_stop \stopalignment - - \permanent\overloaded\protected\def\startalign - {\ifmmode - \enforced\let\stopalign\align_math_normal_stop % cannot be an unexpanded def ... lookahead in align - \expandafter\align_math_normal_start - \orelse\ifinformula - \enforced\let\stopalign\align_math_normal_stop - \expandafter\align_math_normal_start - \else - \enforced\let\stopalign\align_text_normal_stop - \expandafter\align_text_normal_start - \fi} - - \overloaded\let\stopalign\relax - - \permanent\overloaded\protected\def\startalignment - {\ifmmode - \enforced\let\stopalignment\align_math_normal_stop % cannot be an unexpanded def ... lookahead in align - \expandafter\align_math_normal_start - \orelse\ifinformula - \enforced\let\stopalignment\align_math_normal_stop % cannot be an unexpanded def ... lookahead in align - \expandafter\align_math_normal_start - \else - \enforced\let\stopalignment\align_text_normal_stop - \expandafter\align_text_normal_start - \fi} - - \overloaded\let\stopalignment\relax - -\fi - -% - -\permanent\protected\def\numberedeqalign - {\doifelse{\formulaparameter\c!location}\v!left - \math_handle_eqalign_no_l_aligned - \math_handle_eqalign_no_r_aligned} - -\def\math_first_in_eqalign - {\global\c_math_eqalign_column\plusone - \dostarttagged\t!mtablerow \empty - \dostarttagged\t!mtablecell\empty} - -\def\math_next_in_eqalign - {\global\advance\c_math_eqalign_column\plusone - \dostoptagged % finish cell - \dostarttagged\t!mtablecell\empty} - -\def\math_left_of_eqalign - {\ifcsname\??mathalignmentvariant\number\c_math_eqalign_column\endcsname - \ifcase\lastnamedcs \or \relax \or \hfill \or \hfill \fi - \fi} - -\def\math_right_of_eqalign - {\ifcsname\??mathalignmentvariant\number\c_math_eqalign_column\endcsname - \ifcase\lastnamedcs \or \hfill \or \relax \or \hfill \fi - \fi} - -\newconditional\c_math_alignment_local_number % not used but when true puts in front (todo) - -\def\math_number_right_of_eqalign - {\ifcase\wd\b_strc_formulas_number\else - \ifconditional\c_math_alignment_local_number - \ifcase\c_strc_math_number_location\or\or - \box\b_strc_formulas_number - \fi - \else - \box\b_strc_formulas_number - \fi - \fi} - -\def\math_number_left_of_eqalign - {\ifcase\wd\b_strc_formulas_number\else - \ifconditional\c_math_alignment_local_number - \ifcase\c_strc_math_number_location\or - \box\b_strc_formulas_number - \fi - \fi - \fi} - -\def\math_eqalign_set_column#1% we could just add to the preamble (as with other alignments) - {\expandafter\chardef\csname\??mathalignmentvariant\number\c_math_eqalign_column\expandafter\expandafter\expandafter\endcsname - \ifcsname\??mathalignmentvariant#1\endcsname\lastnamedcs\else\zerocount\fi\relax} - -\letvalue{\??mathalignmentvariant\v!normal}\zerocount -\letvalue{\??mathalignmentvariant\v!left }\plusone -\letvalue{\??mathalignmentvariant\v!right }\plustwo -\letvalue{\??mathalignmentvariant\v!middle}\plusthree - -\permanent\protected\def\math_align_NR_generic[#1][#2]% - {\strc_formulas_place_number_nested{#1}{#2}\crcr} - -%D \starttyping -%D \placeformula[eqn0]\startformula \startalign[n=1] a\NR \stopalign \stopformula See \in[eqn0] -%D \placeformula[eqn1]\startformula \startalign[n=1] a\NR \stopalign \stopformula See \in[eqn1] -%D \placeformula \startformula \startalign[n=1] a\NR[eqn2] \stopalign \stopformula See \in[eqn2] -%D \placeformula[eqn3]\startformula \startalign[n=1] a\NR[+] \stopalign \stopformula See \in[eqn3] -%D \stoptyping - -%D \startbuffer -%D \placeformula \startformula \eqalignno { -%D a &= b & \formulanumber \cr -%D c &= d \cr -%D &= e \cr -%D &= f & \formulanumber -%D } \stopformula -%D \stopbuffer -%D -%D \typebuffer \getbuffer -%D -%D \startbuffer -%D \placeformula \startformula \startalign -%D \NC a \EQ b \NR[+] -%D \NC c \EQ d \NR -%D \NC \EQ f \NR[for:demo-a-1] -%D \NC \EQ g \NR[for:demo-a-2][a] -%D \NC \EQ h \NR[for:demo-a-3][b] -%D \NC \EQ i \NR -%D \stopalign \stopformula -%D \stopbuffer -%D -%D \typebuffer \getbuffer -%D -%D \startbuffer -%D \placeformula \startformula \startalign -%D \NC a \EQ b \NR[+] -%D \NC c \EQ d \NR -%D \NC \EQ f \NR -%D \NC \EQ g \NR -%D \NC \EQ h \NR -%D \NC \EQ i \NR[+] -%D \stopalign \stopformula -%D \stopbuffer -%D -%D \typebuffer \getbuffer -%D -%D \startbuffer -%D \placeformula \startformula \startalign -%D \NC a \NC \eq b \NR[+] -%D \NC c \NC \neq d \NR -%D \NC \NC \neq f \NR[for:demo-b-1] -%D \NC \NC \geq g \NR[for:demo-b-2][a] -%D \NC \NC \leq h \NR[for:demo-b-3][b] -%D \NC \NC \neq i \NR -%D \stopalign \stopformula -%D \stopbuffer -%D -%D \typebuffer \getbuffer -%D -%D \startbuffer -%D \placeformula \startformula \startalign[n=3,align={left,middle,right}] -%D \NC l \NC = \NC r \NR -%D \NC left \NC = \NC right \NR -%D \stopalign \stopformula -%D \stopbuffer -%D -%D \typebuffer \getbuffer -%D -%D \startbuffer -%D \placeformula \startformula \startalign[n=3,align={right,middle,left}] -%D \NC l \NC = \NC r \NR -%D \NC left \NC = \NC right \NR -%D \stopalign \stopformula -%D \stopbuffer -%D -%D \typebuffer \getbuffer -%D -%D \startbuffer -%D \placeformula \startformula \startalign[n=3,align={middle,middle,middle}] -%D \NC l \NC = \NC r \NR -%D \NC left \NC = \NC right \NR -%D \stopalign \stopformula -%D \stopbuffer -%D -%D \typebuffer \getbuffer -%D -%D \startbuffer -%D \placeformula -%D \startformula -%D \startalign[n=3,align={middle,middle,middle}] -%D \NC a \NC = \NC b \NR[+] -%D \NC 2a \NC = \NC 2b \NR -%D \stopalign -%D \stopformula -%D \stopbuffer -%D -%D \typebuffer \getbuffer -%D -%D \startbuffer -%D \placeformula -%D \startformulas -%D \setupmathalignment[n=3,align={middle,middle,middle}]% -%D \startformula -%D \startalign -%D \NC a \NC = \NC b \NR[+] -%D \NC 2a \NC = \NC 2b \NR -%D \stopalign -%D \stopformula -%D \startformula -%D \startalign -%D \NC a \NC = \NC b \NR[+] -%D \NC 2a \NC = \NC 2b \NR -%D \stopalign -%D \stopformula -%D \stopformulas -%D \stopbuffer -%D -%D \typebuffer \getbuffer -%D -%D \startbuffer -%D \placeformula -%D \startformulas -%D \dorecurse{5}{\startformula -%D \startalign[n=3,align={middle,middle,middle}] -%D \NC a \NC = \NC b \NR[+] -%D \NC 2a \NC = \NC 2b \NR -%D \stopalign -%D \stopformula} -%D \stopformulas -%D \stopbuffer -%D -%D \typebuffer \getbuffer - -%D \macros -%D {definemathcases, setupmathcases, startmathcases} -%D -%D Another wish \unknown - -\installcorenamespace{mathcases} - -\installcommandhandler \??mathcases {mathcases} \??mathcases - -\setupmathcases - [\c!distance=\emwidth, - \c!strut=\v!yes, % new - \c!numberdistance=2.5\emwidth, - \c!left={\left\{\mskip\thinmuskip}, - \c!right={\right.}] - -\appendtoks - \setuevalue{\e!start\currentmathcases}{\math_cases_start[\currentmathcases]}% - \setvalue {\e!stop \currentmathcases}{\math_cases_stop}% -\to \everydefinemathcases - -\permanent\protected\def\math_cases_NC_zero - {\math_cases_NC} - -\permanent\protected\def\math_cases_MC_zero - {\math_cases_NC - \ifmmode\else - \startimath - \enforced\let\math_cases_end_math\stopimath - \fi} - -\let\math_cases_end_math\relax - -\permanent\protected\def\math_cases_NR_zero - {\unskip - \math_cases_end_math - \aligntab - \global\enforced\let\math_cases_NC\math_cases_NC_first - \dodirectdoubleempty\math_cases_NR} - -\permanent\protected\def\math_cases_NC_first - {\global\enforced\let\math_cases_NC\math_cases_NC_second} - -\permanent\protected\def\math_cases_NC_second - {\math_cases_end_math\aligntab} - -\let\math_cases_NR\math_align_NR_generic - -\installmacrostack\math_cases_NC - -\permanent\tolerant\protected\def\math_cases_start[#1]#*[#2]% - {\begingroup - \edef\currentmathcases{#1}% - \ifarguments\or\or - \setupcurrentmathcases[#2]% - \fi - \edef\p_strut{\mathcasesparameter\c!strut}% - \ifx\p_strut\v!yes - \enforced\let\math_cases_strut\strut - \else - \enforced\let\math_cases_strut\relax - \fi - \mathcasesparameter\c!left - \vcenter\bgroup - \push_macro_math_cases_NC - \enforced\let\endmath\relax - \enforced\let\NC\math_cases_NC_zero - \enforced\let\MC\math_cases_MC_zero - \enforced\let\NR\math_cases_NR_zero - \enforced\let\TB\math_common_TB - \global\enforced\let\math_cases_NC\math_cases_NC_first - \normalbaselines - \mathsurround\zeropoint - \everycr\emptytoks - \tabskip\zeropoint - \global\c_math_eqalign_column\plusone - \halign\bgroup - \startimath - \mathcasesparameter\c!style - \alignmark\alignmark - \stopimath - \hfil - \aligntab - \hskip\mathcasesparameter\c!distance\relax - \pop_macro_math_cases_NC - \math_cases_strut % looks better - \alignmark\alignmark - \hfil - \aligntab - \hskip\mathcasesparameter\c!numberdistance\relax - \let\formuladistance\!!zeropoint - \span\math_text_in_eqalign{\alignmark\alignmark}% - \crcr} % todo: number - -% When we have just protected we get an extra row but we can no flag -% this as a proper alignment related command which means that uit gets -% expanded. - -\noaligned\permanent\protected\def\math_cases_stop - {\crcr - \egroup - \pop_macro_math_cases_NC - \egroup - \mathcasesparameter\c!right - \endgroup} - -\definemathcases[cases] -\definemathcases[\v!mathcases] - -%D \startbuffer -%D \placeformula \startformula \startcases -%D \NC 2 \NC $ y > 0 $ \NR -%D \NC 7 \NC $ x = 7 $ \NR[+] -%D \NC 4 \NC otherwise \NR -%D \stopcases \stopformula -%D \stopbuffer -%D -%D \typebuffer \getbuffer -%D -%D \startbuffer -%D \placeformula \startformula x \startcases -%D \NC 2 \NC $ y > 0 $ \NR[+] -%D \NC 7 \NC $ x = 7 $ \NR -%D \NC 4 \NC otherwise \NR -%D \stopcases \stopformula -%D \stopbuffer -%D -%D \typebuffer \getbuffer -%D -%D \startbuffer -%D \placeformula \startformula \startcases -%D \NC 2 \NC $ y > 0 $ \NR -%D \NC 7 \NC $ x = 7 $ \NR -%D \NC 4 \NC otherwise \NR -%D \stopcases \stopformula -%D \stopbuffer -%D -%D \typebuffer \getbuffer -%D -%D \startbuffer -%D \placeformula \startformula x \startcases -%D \NC 2 \NC $ y > 0 $ \NR -%D \NC 7 \NC $ x = 7 $ \NR -%D \NC 4 \NC otherwise \NR -%D \stopcases \stopformula -%D \stopbuffer -%D -%D \typebuffer \getbuffer - -%D \macros -%D {definemathmatrix, setupmathmatrix, startmathmatrix} -%D -%D Yet another one \unknown. This time we implement the lot a bit -%D different which is a side effect of getting the tagging right. In -%D retrospect the main alignment could be done this way but \unknown - -\installcorenamespace{mathmatrix} - -\installcommandhandler \??mathmatrix {mathmatrix} \??mathmatrix - -\setupmathmatrix - [\c!distance=\emwidth, - \c!left=, - \c!right=, - \c!align=\v!middle] - -\appendtoks - \setuevalue{\e!start\currentmathmatrix}{\math_matrix_start[\currentmathmatrix]}% - \setvalue {\e!stop \currentmathmatrix}{\math_matrix_stop}% no u else lookahead problem -\to \everydefinemathmatrix - -\def\math_matrix_start_table - {\global\c_math_eqalign_column\zerocount - \dostarttagged\t!math\empty - \dostarttagged\t!mtable\empty} - -\def\math_matrix_stop_table - {\dostoptagged - \dostoptagged} - -\def\math_matrix_start_row - {\noalign{\global\c_math_eqalign_column\zerocount}% - \dostarttagged\t!mtablerow\empty} - -\def\math_matrix_stop_row - {\dostoptagged} - -\protected\def\math_matrix_start_cell - {\dostarttagged\t!mtablecell\empty - \hss - \math_left_of_eqalign - \startimath - \math_matrix_set_style - \tabskip\zeropoint - \everycr\emptytoks} - -\protected\def\math_matrix_stop_cell - {\stopimath - \math_right_of_eqalign - \hss - \dostoptagged} - -% We could construct a preamble with alignment and such embedded but the number -% of matrices with many rows is normally so low that it doesn't pay of at all. - -\protected\def\math_matrix_distance - {\relax - \ifdim\d_math_eqalign_distance>\zeropoint - \hskip\d_math_eqalign_distance - \fi - \relax} - -\def\math_matrix_preamble - {\math_matrix_strut - \global\advance\c_math_eqalign_column\plusone - \math_matrix_start_cell - \alignmark\alignmark - \math_matrix_stop_cell - \aligntab - \aligntab - \math_matrix_distance - \global\advance\c_math_eqalign_column\plusone - \math_matrix_start_cell - \alignmark\alignmark - \math_matrix_stop_cell} - -\newconditional\c_math_matrix_first - -\permanent\protected\def\math_matrix_NR - {\aligntab\omit - \math_matrix_stop_row - \math_matrix_pickup - \crcr - \math_matrix_start_row} - -\permanent\protected\def\math_matrix_NC - {\ifconditional\c_math_matrix_first - \expandafter\math_matrix_NC_yes - \else - \expandafter\math_matrix_NC_nop - \fi} - -\permanent\protected\def\math_matrix_pickup{\global\settrue \c_math_matrix_first} -\permanent\protected\def\math_matrix_NC_yes{\global\setfalse\c_math_matrix_first} -\permanent\protected\def\math_matrix_NC_nop{\aligntab} % avoids lookahead - -% \def\math_matrix_stop_wrapup -% {\crcr -% \strut -% \crcr -% \noalign{\vskip-\struthtdp}} - -\def\math_matrix_start_processing - {\dontleavehmode - \bgroup - \tabskip\zeropoint - \math_matrix_pickup - \enforced\let\NR\math_matrix_NR - \enforced\let\NC\math_matrix_NC - \enforced\let\MC\math_matrix_NC - \enforced\let\TB\math_common_TB - % - \enforced\let\endmath\relax - % - \setbox\nextbox\vbox\bgroup - \math_matrix_start_table - \halign \bgroup - % preamble - \span\math_matrix_preamble - % done - \crcr - \math_matrix_start_row} - -\def\math_matrix_stop_processing - {%\math_matrix_stop_wrapup % optional - \math_matrix_stop_row - \egroup - \math_matrix_stop_table - \egroup - \mathmatrixleft - \math_matrix_finish_nextbox - \mathmatrixright - \egroup} - -\let\math_matrix_strut \strut -\let\math_matrix_set_style\relax - -\def\math_matrix_check_settings - {\edef\p_strut{\mathmatrixparameter\c!strut}% - \ifx\p_strut\v!no - \enforced\let\math_matrix_strut\relax - \else - \enforced\let\math_matrix_strut\strut - \ifx\p_strut\v!yes\else - \spacing\p_strut - \fi - \fi - \d_math_eqalign_distance\mathmatrixparameter\c!distance\relax - \edef\math_matrix_set_style{\mathmatrixparameter\c!style}} - -\def\math_matrix_set_defaults - {\normalbaselines % hm, spacing ? - \mathsurround\zeropoint - \tabskip\zeropoint} - -\def\math_matrix_set_columns_step - {\advance\c_math_eqalign_column\plusone - %\c_math_matrix_columns\c_math_eqalign_column - \math_eqalign_set_column} - -\def\math_matrix_set_columns - {\c_math_eqalign_column\zerocount - \rawprocesscommacommand[\mathmatrixparameter\c!align]\math_matrix_set_columns_step} - -\newcount\c_math_eqalign_column_saved - -% \installglobalmacrostack\c_math_matrix_first - -\tolerant\protected\def\math_matrix_start[#1]#*[#2]% - {\begingroup - \globalpushmacro\c_math_matrix_first % hm, does that work? - \c_math_eqalign_column_saved\c_math_eqalign_column - \globalpushmacro\c_math_eqalign_first - \edef\currentmathmatrix{#1}% - \setupcurrentmathmatrix[#2]% - \math_matrix_check_settings - \math_matrix_set_defaults - \math_matrix_set_columns - \math_matrix_start_processing} - -\def\math_matrix_stop - {\math_matrix_stop_processing - \globalpushmacro\c_math_eqalign_first - \global\c_math_eqalign_column\c_math_eqalign_column_saved - \globalpopmacro\c_math_matrix_first - \endgroup} - -% vcenter: -% -% delta = (height(v) + depth(v))/2 -% axis = math_axis_size(cur_size) -% height(v) = delta + axis -% depth(v) = delta - axis - -\installcorenamespace{mathmatrixalignlocation} - -\let\mathmatrixleft \empty % experimental hook -\let\mathmatrixright\empty % experimental hook - -\setvalue{\??mathmatrixalignlocation\v!top }{\raise\dimexpr(\nextboxdp-\nextboxht)/2 +\mathaxisheight\mathstyle\relax} -\setvalue{\??mathmatrixalignlocation\v!high }{\raise\dimexpr(\nextboxdp-\nextboxht)/2\relax} -\setvalue{\??mathmatrixalignlocation\v!center}{\relax} -\setvalue{\??mathmatrixalignlocation\v!lohi} {\relax} -\setvalue{\??mathmatrixalignlocation\v!normal}{\relax} -\setvalue{\??mathmatrixalignlocation\v!bottom}{\lower\dimexpr(\nextboxdp-\nextboxht)/2 +\mathaxisheight\mathstyle\relax} -\setvalue{\??mathmatrixalignlocation\v!low }{\lower\dimexpr(\nextboxdp-\nextboxht)/2\relax} - -\def\math_matrix_finish_nextbox - {\begincsname\??mathmatrixalignlocation\mathmatrixparameter\c!location\endcsname\hbox\bgroup - \normalstartimath - \mathmatrixparameter\c!left - \vcenter{\box\nextbox}% - \mathmatrixparameter\c!right - \normalstopimath - \egroup} - -\definemathmatrix[matrix] -\definemathmatrix[\v!mathmatrix] - -%D \startbuffer -%D \placeformula \startformula[-] \startmatrix -%D \NC 1 \NC x \NC a \NR -%D \NC 2 \NC y \NC b \NR -%D \NC 3 \NC z \NC c \NR -%D \stopmatrix \stopformula -%D \stopbuffer -%D -%D \typebuffer \getbuffer -%D -%D \definemathmatrix[bmatrix][left={\left[\mskip\thinmuskip},right={\mskip\thinmuskip\right]},strut=1.25] -%D -%D \startbuffer -%D \placeformula \startformula[-] \startbmatrix -%D \NC 1 \NC x \NC a \NR -%D \NC 2 \NC y \NC b \NR -%D \NC 3 \NC z \NC c \NR -%D \stopbmatrix \stopformula -%D \stopbuffer -%D -%D \typebuffer \getbuffer -%D -%D Taco added some code (dedicated to Aditya Mahajan) that gives more -%D control over aligments: - -%D \startbuffer -%D \startformula -%D \startmatrix -%D \NC a + x \NC = \NC a + d \NR -%D \NC y \NC = \NC d \NR -%D \stopmatrix -%D \stopformula -%D \stopbuffer -%D -%D \typebuffer \getbuffer - -%D \startbuffer -%D \startformula -%D \startmatrix [distance=3pt,align={right,left}] -%D \NC a + x \NC = a + d \NR -%D \NC y \NC = d \NR -%D \stopmatrix -%D \stopformula -%D \stopbuffer -%D -%D \typebuffer \getbuffer - -%D \startbuffer -%D \startformula -%D \startmatrix [left=\left(,right=\right)] -%D \NC a + x \NR -%D \NC y \NR -%D \stopmatrix -%D \stopformula -%D \stopbuffer -%D -%D \typebuffer \getbuffer -%D -%D A bit more complex code: -%D -%D \startbuffer -%D \startformula -%D \text{Let }{\cal R} = \bigcup_{P_{X_1},P_{X_2}} -%D \left\{ (R_1, R_2) : -%D \startmatrix[distance=1em,align={left,left,right}] -%D \NC R_1 \NC < I(X_1 ; Y \mid X_2) \NC R_1 \NR -%D \NC \hfill Q_2 \NC < I(X_2 ; Y \mid X_1) \NC R_2 \NR -%D \NC R_1 + R_2 \NC < I(X_1 ; Y) \NC R_1 + R_2 \NR -%D \stopmatrix -%D \right\} -%D \stopformula -%D \stopbuffer -%D -%D \typebuffer \getbuffer - -%D \macros -%D {startmatrices} -%D -%D Just a handy keystroke safer: - -\permanent\protected\def\startmatrices - {\begingroup - \setupmathmatrix} - -\permanent\protected\def\stopmatrices - {\endgroup} - -%D \startbuffer -%D \startformula -%D \startmatrix[left={\left(},right={\right)}] -%D \NC A \NC B \NR \NC C \NC D \NR -%D \stopmatrix -%D = -%D \startmatrix[left={\left(},right={\right)},location=low] -%D \NC A \NC B \NR \NC C \NC D \NR -%D \stopmatrix -%D = -%D \startmatrix[left={\left(},right={\right)},location=high] -%D \NC A \NC B \NR \NC C \NC D \NR -%D \stopmatrix -%D \stopformula -%D \stopbuffer -%D -%D \typebuffer \getbuffer -%D -%D \startbuffer -%D \startformula -%D \startmatrices[left={\left(},right={\right)}] -%D \startmatrix -%D \NC A \NC B \NR \NC C \NC D \NR -%D \stopmatrix -%D = -%D \startmatrix[location=bottom] -%D \NC A \NC B \NR \NC C \NC D \NR -%D \stopmatrix -%D = -%D \startmatrix[location=top] -%D \NC A \NC B \NR \NC C \NC D \NR -%D \stopmatrix -%D \stopmatrices -%D \stopformula -%D \stopbuffer -%D -%D \typebuffer % does not run well: \getbuffer - -%D Handy for the \type {m-matrix} module: - -\permanent\tolerant\protected\def\startnamedmatrix[#1]#*[#2]% - {\begingroup - \edef\currentmathmatrix{#1}% - \setupcurrentmathmatrix[#2]% - \math_matrix_start[\currentmathmatrix]} - -\permanent\protected\def\stopnamedmatrix - {\math_matrix_stop - \endgroup} - -%D The following code is derived from Aditya's simplematrix prototype but -%D adapted to regular mathmatrices (which saves some code so it can go into -%D the core): - -\def\math_matrix_simple_row#1% - {\rawprocesscommalist[#1]\math_matrix_simple_col - \toksapp\scratchtoks{\NR}} - -\def\math_matrix_simple_col#1% - {\toksapp\scratchtoks{\NC#1}} - -\permanent\tolerant\protected\def\math_matrix_simple[#1]#*[#2]#:#3% - {\begingroup - \edef\currentmathmatrix{#1}% - \setupcurrentmathmatrix[#2]% - \scratchtoks\emptytoks - \processlist[];\math_matrix_simple_row[#3]% - \math_matrix_start[\currentmathmatrix]% - \the\scratchtoks - \math_matrix_stop - \endgroup} - -%D We hook it into the normal mathmatrix code: - -\appendtoks - \edef\p_simplecommand{\mathmatrixparameter\c!simplecommand}% - \ifempty\p_simplecommand\else - \setuevalue{\p_simplecommand}{\math_matrix_simple[\currentmathmatrix]}% - \fi -\to \everydefinemathmatrix - -%D And predefine some matrices: - -\definemathmatrix[matrix:parentheses][\c!left={\left(\mskip\thinmuskip},\c!right={\mskip\thinmuskip\right)},\c!align=\v!middle] -\definemathmatrix[matrix:brackets] [\c!left={\left[\mskip\thinmuskip},\c!right={\mskip\thinmuskip\right]},\c!align=\v!middle] -\definemathmatrix[matrix:bars] [\c!left={\left|\mskip\thinmuskip},\c!right={\mskip\thinmuskip\right|},\c!align=\v!middle] - -\definemathmatrix[thematrix][matrix:parentheses][\c!simplecommand=thematrix] - -%D \startbuffer -%D \startformula -%D \thematrix{1,2,3,4;5,6,7,8;9,10,11,12} -%D \stopformula -%D \stopbuffer -%D -%D \typebuffer \getbuffer -%D -%D \startbuffer -%D \startformula -%D \startthematrix -%D \NC 1\NC 2\NC 3\NC 4\NR -%D \NC 5\NC 6\NC 7\NC 8\NR -%D \NC 9\NC10\NC11\NC12\NR -%D \stopthematrix -%D \stopformula -%D \stopbuffer -%D -%D \typebuffer \getbuffer - -%D \macros -%D {startintertext} -%D -%D Preliminary feature: -%D -%D {\em example code} -%D -%D The intertext commands have to be expandable (in aligment lookahead) so -%D we cannot use \type {\protected}. - -\permanent\def\startintertext#1\stopintertext - {\noalign{\math_intertext{#1}}} - -\permanent\let\stopintertext\relax - -\permanent\def\intertext#1% - {\noalign{\math_intertext{#1}}} - -\protected\def\math_intertext#1% - {\penalty\postdisplaypenalty - \afterdisplayspace - \vbox{\forgetall\noindent#1\par}% - \penalty\predisplaypenalty - \beforedisplayspace} - -%D \macros -%D {substack} -%D -%D Preliminary code: -%D -%D \startbuffer -%D \startformula -%D \sum_{% -%D \startsubstack -%D i = 1 \NR -%D i \neq n \NR -%D i \neq m -%D \stopsubstack -%D }a_i -%D \stopformula -%D \stopbuffer -%D -%D \getbuffer which was typed as \typebuffer -%D -%D Notice that these macros give the correct spacing for -%D subscripts. Compare for example -%D -%D \startbuffer -%D \startformula -%D \sum_{\startsubstack a \NR b \NR \stopsubstack} -%D \text{ and } -%D \sum_{\scriptstyle a \atop \scriptstyle} -%D \stopformula -%D \stopbuffer -%D -%D \typebuffer which gives \getbuffer - -% no tagging yet : how is it supposed to be coded? - -\permanent\protected\def\startsubstack - {\begingroup - \vcenter\bgroup - \baselineskip\mathstacktotal - \lineskip\mathstackvgap - \lineskiplimit\lineskip - \mathsurround\zeropoint - \everycr\emptytoks - \enforced\let\NC\relax - \enforced\let\MC\relax - \enforced\let\NR\crcr - \halign\bgroup\hfil\normalstartimath\scriptstyle\alignmark\alignmark\normalstopimath\hfil\crcr} - -\noaligned\permanent\protected\def\stopsubstack - {\crcr - \egroup - \egroup - \endgroup} - -% %D \macros -% %D {bordermatrix} -% %D -% %D In \PLAIN\ \TEX\ the width of a parenthesis is stored in -% %D the \DIMENSION\ \type{\mathparentwd}. This value is derived from -% %D the width of \type{\tenrm B}, so let's take care of it now: -% -% \ifx\mathparentwd\undefined \newdimen\mathparentwd \fi -% -% \let\normalbordermatrix\bordermatrix % move that code to here instead -% -% \protected\def\bordermatrix -% {\begingroup -% \setbox\scratchbox\hbox{\mr\char"239C}% -% \global\mathparentwd\wd\scratchbox -% \endgroup -% \normalbordermatrix} -% -% \def\bordermatrix -% {\begingroup -% \mr -% \global\mathparentwd\fontcharwd\font"239C\relax -% \endgroup -% \normalbordermatrix} - -%D \macros{overset, underset} -%D -%D The macros \type{\overset} and \type{\underset} are provided by -%D \AMS\ packages in \LATEX. These macro allows you to place a symbol -%D above or below another symbol, irrespective of whether the other -%D symbol is a relation or something else, and without influencing the -%D spacing. For most cases there is a better way to do such things -%D (declaring a math command with limop option, or using accents), but -%D occasionally these macros can be useful, for example: -%D -%D \startbuffer -%D \startformula -%D \overset{*}{X} \underset{*}{X} -%D \stopformula -%D \stopbuffer -%D \typebuffer \getbuffer -%D -%D Use these macros sparingly. Remember, \TEX\ was designed for -%D mathematics, so there is usually a proper method for typesetting -%D common math notation. -%D -%D These macros are a cleaner version of \type {\binrel@} and -%D \type {\binrel@@} macros in \AMSTEX\ packages. - -\def\math_binrel_apply#1% - {\begingroup - \setbox\scratchbox\hbox - {\thinmuskip 0mu - \medmuskip -1mu - \thickmuskip -1mu - \setbox\scratchbox\hbox{\normalstartimath#1\mathsurround\zeropoint\normalstopimath}% - \kern-\wd\scratchbox - \normalstartimath{}#1{}\mathsurround\zeropoint\normalstopimath}% - \ifdim\wd\scratchbox<\zeropoint - \endgroup - \expandafter\mathbin - \orelse\ifdim\wd\scratchbox>\zeropoint - \endgroup - \doubleexpandafter\mathrel - \else - \endgroup - \doubleexpandafter\firstofoneargument - \fi} - -\permanent\protected\def\overset#1#2% - {\math_binrel_apply{#2}{\mathop{\kern\zeropoint#2}\limits\normalsuperscript{#1}}} - -\permanent\protected\def\underset#1#2% - {\math_binrel_apply{#2}{\mathop{\kern\zeropoint#2}\limits\normalsubscript {#1}}} - -%D The following code comes from \type {math-str.mkiv}. -%D -%D Here we implement a basic math alignment mechanism. Numbers are also handled. The macros -%D \type {\startinnermath} and \type {\stopinnermath} can be overloaded in specialized -%D modules. - -\installcorenamespace{mathinnerstart} -\installcorenamespace{mathinnerstop} - -% \protected\def\startinnermath{\csname\??mathinnerstart\formulaparameter\c!align\endcsname} -% \protected\def\stopinnermath {\csname\??mathinnerstop \formulaparameter\c!align\endcsname} - -\permanent\protected\def\startinnermath{\expandnamespaceparameter\??mathinnerstart\formulaparameter\c!align\v!normal} -\permanent\protected\def\stopinnermath {\expandnamespaceparameter\??mathinnerstop \formulaparameter\c!align\v!normal} - -\permanent\protected\def\mathinnerstrut - {\doif{\formulaparameter\c!strut}\v!yes\strut} - -\permanent\protected\def\defineinnermathhandler#1#2#3% - {\setvalue{\??mathinnerstart#1}{#2}% - \setvalue{\??mathinnerstop #1}{#3}} - -\installtextracker - {formulas.boxes} - {\enforced\let\math_hbox\ruledhbox} - {\enforced\let\math_hbox\hbox} - -\let\math_hbox\hbox - -\newconstant\mathraggedstatus % normal left center right -\newconstant\mathnumberstatus % nothing normal shift_right - -\newdimen\d_math_number_correction - -\def\math_box_llapped_math_no - {\ifcase\mathraggedstatus\or - \box\b_strc_formulas_number - \or - \llap{\box\b_strc_formulas_number}% - \or - \llap{\box\b_strc_formulas_number}% - \fi} - -\def\math_box_rlapped_math_no - {\ifcase\mathraggedstatus\or - \rlap{\box\b_strc_formulas_number}% - \or - \rlap{\box\b_strc_formulas_number}% - \or - \box\b_strc_formulas_number - \fi} - -\newconditional\c_strc_math_has_number -\newconditional\c_strc_math_display_overflow -\newconstant \c_strc_math_number_location -\newdimen \d_strc_math_number_width -\newdimen \d_strc_math_display_width -\newbox \b_strc_math_display -\newconstant \c_strc_formulas_frame_mode -\newdimen \d_strc_math_indent -\newconditional\c_strc_math_indent - -\newdimen\d_strc_math_framed_width - -\setvalue{\??formulaoption\v!frame}% - {\edef\p_frame{\formulaparameter\c!frame}% - \ifx\p_frame\v!number - \c_strc_formulas_frame_mode\plustwo % inside frame - \else - \c_strc_formulas_frame_mode\plusone % outside frame - \fi} - -% mode: 0=no frame | 1=number inside frame | 2=number outside frame - -\def\strc_math_flush_aligned - {\ifcase\c_strc_math_vertical - \ifcase\mathraggedstatus\or\hfill\or\hfill\fi - \box\b_strc_math_display - \ifcase\mathraggedstatus\or\or\hfill\or\hfill\fi - \else - \ifconditional\c_strc_math_indent - \ifzeropt\d_strc_math_indent\else - \hangafter\plusone - \hangindent\d_strc_math_indent - \fi - \fi - \edef\p_interlinespace{\formulaparameter\c!interlinespace}% - \ifempty\p_interlinespace\else\baselineskip\p_interlinespace\fi - \global\d_strc_math_indent\zeropoint - \ifcase\mathraggedstatus\or\raggedleft\or\raggedcenter\or\raggedright\fi - \unhbox\b_strc_math_display - \fi} - -\def\strc_math_flush_box_normal - {\ifcase\c_strc_math_vertical - \hbox to \displaywidth\bgroup - \strc_math_flush_aligned - \egroup - \else - \strc_math_flush_aligned - \fi} - -\def\strc_math_flush_box_framed_common - {\d_strc_math_framed_width\displaywidth - \setformulaframedparameter\c!align{\formulaparameter\c!align}% - \letformulaframedparameter\c!strut\v!no - \d_framed_formula\ht\b_strc_math_display - \ifcase\mathraggedstatus\or\hfill\or\hfill \fi - \inheritedformulaframedframed{\box\b_strc_math_display}% - \ifcase\mathraggedstatus\or \or\hfill\or\hfill\fi} - -\def\strc_math_flush_box_framed_display - {\let\currentformulaframed\currentformula - \letformulaframedparameter\c!location\v!formula - \setformulaframedparameter\c!width{\d_strc_math_framed_width}% - \strc_math_flush_box_framed_common} - -\def\strc_math_flush_box_framed_fit_inline - {\let\currentformulaframed\currentformula - \letformulaframedparameter\c!location\empty - \letformulaframedparameter\c!width\v!fit - \strc_math_flush_box_framed_common} - -\def\strc_math_flush_box_framed_fit_display - {\let\currentformulaframed\currentformula - \letformulaframedparameter\c!location\v!formula - \letformulaframedparameter\c!width\v!fit - \strc_math_flush_box_framed_common} - -% combiners - -\def\strc_math_flush_box - {\ifcase\c_strc_formulas_frame_mode - \strc_math_flush_box_normal - \else - \strc_math_flush_box_framed_display - \fi} - -\def\strc_math_number_right_normal - {\strc_math_flush_aligned - \hss % hss makes room for number - \math_box_llapped_math_no} - -\def\strc_math_number_left_normal - {\math_box_rlapped_math_no - \strc_math_flush_aligned - \hss} % hss makes room for number - -\def\strc_math_number_right_normal_outside - {\ifconditional\c_strc_formulas_tight - \strc_math_flush_box_framed_fit_display - \else - \strc_math_flush_box_framed_display - \fi - \hss % hss makes room for number - \math_box_llapped_math_no} - -\def\strc_math_number_left_normal_outside - {\math_box_rlapped_math_no - \hss % hss makes room for number - \ifconditional\c_strc_formulas_tight - \strc_math_flush_box_framed_fit_display - \else - \strc_math_flush_box_framed_display - \fi} - -\def\strc_math_number_right_normal_inside - {\setbox\b_strc_math_display\hpack to \dimexpr\displaywidth-\d_framed_locator_lo-\d_framed_locator_ro\relax\bgroup - \strc_math_flush_aligned - \hss - \math_box_llapped_math_no - \egroup - \strc_math_flush_box_framed_fit_inline} - -\def\strc_math_number_left_normal_inside - {\setbox\b_strc_math_display\hpack to \dimexpr\displaywidth-\d_framed_locator_lo-\d_framed_locator_ro\relax\bgroup - \math_box_rlapped_math_no - \hss - \strc_math_flush_aligned - \egroup - \strc_math_flush_box_framed_fit_inline} - -\def\strc_math_number_right_overflow - {\vpack\bgroup - \strc_math_flush_box - \par - \hpack to \displaywidth\bgroup - \hss - \math_box_llapped_math_no - \egroup - \egroup} - -\def\strc_math_number_left_overflow - {\vpack\bgroup - \hpack to \displaywidth\bgroup - \math_box_rlapped_math_no - \hss - \egroup - \strc_math_flush_box - \egroup} - -\def\strc_math_number_right_overflow_outside - {\vpack\bgroup - \strc_math_flush_box_framed_fit_inline - %\hskip\zeropoint % nicely breaks the line without introducing funny vertical spacing ... why o why - \hpack to \displaywidth\bgroup - \hss - \math_box_llapped_math_no - \egroup - \egroup} - -\def\strc_math_number_left_overflow_outside - {\vpack\bgroup - \hpack to \dimexpr\displaywidth-\d_framed_locator_lo\relax\bgroup - \math_box_rlapped_math_no - \hss - \egroup - \hskip\zeropoint % nicely breaks the line without introducing funny vertical spacing ... why o why - \strc_math_flush_box_framed_fit_inline - \egroup} - -\def\strc_math_number_right_overflow_inside - {\setbox\b_strc_math_display\vpack\bgroup - \box\b_strc_math_display - \hpack to \displaywidth\bgroup - \hss - \math_box_llapped_math_no - \hskip\d_framed_locator_ro - \egroup - \egroup - \strc_math_flush_box_framed_fit_inline} - -\def\strc_math_number_left_overflow_inside - {\setbox\b_strc_math_display\vpack\bgroup - \hpack to \displaywidth\bgroup - % \hskip\d_framed_locator_lo - \math_box_rlapped_math_no - \hss - \egroup - \box\b_strc_math_display - \egroup - \strc_math_flush_box_framed_fit_inline} - -% checkers - -\def\strc_math_number_check - {\d_strc_math_display_width\wd\b_strc_math_display - \ifconditional\c_strc_formulas_tight - \ifdim\d_strc_math_display_width>\displaywidth - \settrue\c_strc_math_display_overflow - \else - \displaywidth\d_strc_math_display_width - \setfalse\c_strc_math_display_overflow - \fi - \else - \ifdim\d_strc_math_display_width>\displaywidth - \settrue\c_strc_math_display_overflow - \else - \setfalse\c_strc_math_display_overflow - \fi - \fi} - -\def\strc_math_number_check_outside - {\d_strc_math_display_width\naturalwd\b_strc_math_display - \ifdim\dimexpr\d_strc_math_display_width+\d_framed_locator_lo+\d_framed_locator_ro\relax>\displaywidth - \settrue\c_strc_math_display_overflow - \else - \setfalse\c_strc_math_display_overflow - \fi - % still ok? - \ifnum\mathraggedstatus=\plustwo - \d_strc_math_framed_width\dimexpr\displaywidth-2\wd\b_strc_formulas_number\relax - \else - \d_strc_math_framed_width\dimexpr\displaywidth- \wd\b_strc_formulas_number\relax - \fi} - -\let\strc_math_number_check_inside\strc_math_number_check_outside - -% offsets - -\def\strc_math_number_check_offsets - {\begingroup - \setbox\scratchbox\hbox - {\inheritedformulaframedframed - {\pack_framed_locator_set_lo\pack_framed_locator_set_ro}}% - \endgroup} - -% tracing - -\def\strc_math_traced_state_yes - {\llap{\setbox\scratchbox\hbox{\infofont - \ifcase\mathraggedstatus unset\or right\or middle\or left\fi - \space - \ifcase\c_strc_formulas_frame_mode no\or out\or in\fi - \space - \ifconditional\c_strc_math_display_overflow overflow\else fit\fi - \quad}\ht\scratchbox\zeropoint\dp\scratchbox\zeropoint\box\scratchbox}} - -\let\strc_math_traced_state\relax - -\installtextracker - {formulas.framed} - {\let\strc_math_traced_state\strc_math_traced_state_yes} - {\let\strc_math_traced_state\relax} - -% packaging - -\protected\def\strc_math_box_start#1% - {\hsize\displaywidth % \checkeddisplaymath - \global\mathnumberstatus\plusone - \mathraggedstatus#1\relax - % - \global\d_math_number_correction\zeropoint - % - \edef\p_location{\formulaparameter\c!location}% - \useformulacolorparameter\c!color - \c_strc_math_number_location\ifx\p_location\v!left\plusone\orelse\ifx\p_location\v!right\plustwo\else\zerocount\fi - % - %\strc_formulas_place_number % not here as we can have inner alignment numbers - \dontcomplain - \setbox\b_strc_math_display\math_hbox\bgroup % \checkeddisplaymath - \mathinnerstrut - \startforceddisplaymath} - -\def\strc_math_flush_number_no - {\ifcase\c_strc_math_vertical - \ifconditional\c_strc_math_display_overflow - \ifcase\c_strc_formulas_frame_mode - \strc_math_flush_box_normal - \else - \strc_math_flush_box_framed_fit_inline - \fi - \else - \ifcase\c_strc_formulas_frame_mode - %\ifconditional\c_strc_formulas_tight - % \strc_math_flush_box_normal - %\else - \strc_math_flush_box_normal - %\fi - \else - \ifconditional\c_strc_formulas_tight - \strc_math_flush_box_framed_fit_inline - \else - \strc_math_flush_box_framed_display - \fi - \fi - \fi - \else - \strc_math_flush_box - \fi} - -\def\strc_math_flush_number_left - {\ifcase\c_strc_math_vertical - \ifconditional\c_strc_math_display_overflow - \ifcase\c_strc_formulas_frame_mode - \strc_math_number_left_overflow - \or - \strc_math_number_left_overflow_outside - \or - \strc_math_number_left_overflow_inside - \fi - \else - \ifcase\c_strc_formulas_frame_mode - \strc_math_number_left_normal - \or - \strc_math_number_left_normal_outside - \or - \strc_math_number_left_normal_inside - \fi - \fi - \else - \box\b_strc_formulas_number - \hfill - \strc_math_flush_aligned - \fi} - -\def\strc_math_flush_number_right - {\ifcase\c_strc_math_vertical - \ifconditional\c_strc_math_display_overflow - \ifcase\c_strc_formulas_frame_mode - \strc_math_number_right_overflow - \or - \strc_math_number_right_overflow_outside - \or - \strc_math_number_right_overflow_inside - \fi - \else - \ifcase\c_strc_formulas_frame_mode - \strc_math_number_right_normal - \or - \strc_math_number_right_normal_outside - \or - \strc_math_number_right_normal_inside - \fi - \fi - \else - \strc_math_flush_aligned - \hfill - \box\b_strc_formulas_number - \fi} - -\protected\def\strc_math_box_stop - {\stopforceddisplaymath - \egroup - % check number - \d_strc_math_number_width\wd\b_strc_formulas_number - % - \ifcase\mathnumberstatus - \setfalse\c_strc_math_has_number - \or\ifzeropt\d_strc_math_number_width - \setfalse\c_strc_math_has_number - \else - \settrue\c_strc_math_has_number - \fi\fi - % preroll left and right offsets - \ifcase\c_strc_formulas_frame_mode - % no frame - \else - \strc_math_number_check_offsets - \fi - \ifcase\c_strc_formulas_frame_mode - \strc_math_number_check - \or - \strc_math_number_check_outside - \else - \strc_math_number_check_inside - \fi - \noindent % \noindentation % not \dontleavehmode - \hskip\d_strc_formulas_display_margin_left % was kern but that doesn't indent - \strc_math_traced_state - \ifcase\c_strc_math_vertical - \hbox to \displaywidth \bgroup - \or - \vbox \bgroup \hsize\displaywidth - \or - \bgroup \hsize\displaywidth - \fi - \ifcase\mathnumberstatus - \strc_math_flush_box - \or % status 1 - \ifcase\c_strc_math_number_location - \strc_math_flush_box - \or % number left - \ifzeropt\wd\b_strc_formulas_number - \strc_math_flush_number_no - \else - \strc_math_flush_number_left - \fi - \else % number right - \ifzeropt\wd\b_strc_formulas_number - \strc_math_flush_number_no - \else - \strc_math_flush_number_right - \fi - \fi - \or % status 2 - \hskip\d_math_number_correction % probably no longer used - \strc_math_flush_box - \hss - \else - \strc_math_flush_box - \fi - \ifcase\c_strc_math_vertical - \or - \or - \par - \fi - \egroup} - -\defineinnermathhandler\v!left {\strc_math_box_start\plusone }{\strc_math_box_stop} -\defineinnermathhandler\v!middle {\strc_math_box_start\plustwo }{\strc_math_box_stop} -\defineinnermathhandler\v!right {\strc_math_box_start\plusthree}{\strc_math_box_stop} -\defineinnermathhandler\v!flushleft {\strc_math_box_start\plusthree}{\strc_math_box_stop} -\defineinnermathhandler\v!center {\strc_math_box_start\plustwo }{\strc_math_box_stop} -\defineinnermathhandler\v!flushright{\strc_math_box_start\plusone }{\strc_math_box_stop} -\defineinnermathhandler\v!normal {\strc_math_box_start\plustwo }{\strc_math_box_stop} - -%D Some inline math tweak. - -\appendtoks - \ifcase\mathnestinglevel\or - % 4=disable 6=only when no spaces - \mathsurroundskip\mathematicsparameter\c!textdistance\relax - \ifzeropt\mathsurroundskip - \ifzeropt\gluestretch\mathsurroundskip - \ifzeropt\glueshrink\mathsurroundskip - \mathsurroundmode\plussix - \else - \mathsurroundskip\zeropoint - \mathsurroundmode\plusfour - \fi - \else - \mathsurroundmode\plussix - \fi - \else - \mathsurroundmode\plussix - \fi - \else - \mathsurroundmode\plusfour - \mathsurroundskip\zeropoint - \fi -\to \everymathematics - -\setupmathematics - [\c!textdistance=\zeropoint] - -%D This is an experiment. No fancy spacing and alignments here. If we ever -%D go that route it might result in incompatible rendering. - -\permanent\protected\def\startsplitformula - {\ifhmode - \par - \fi - \begingroup - \beforedisplayspace - % subset of \everydisplay: - \c_attr_mathmode\plusone - \settrue \indisplaymath - % end of subset - \informulatrue} - -\permanent\protected\def\stopsplitformula - {\afterdisplayspace - \endgroup} - -\protect \endinput - -% \placeformula \startformula[-] \startmatrix -% \NC 1 \NC x \NC a \NR -% \NC 2 \NC y \NC b \NR -% \NC 3 \NC z \NC c \NR -% \stopmatrix \stopformula - -% \definemathmatrix[bordermatrix][left={\left[\mskip\thinmuskip},right={\mskip\thinmuskip\right]}] - -% \placeformula \startformula[-] \startbordermatrix -% \NC 1 \NC x \NC a \NR -% \NC 2 \NC y \NC b \NR -% \NC 3 \NC z \NC c \NR -% \stopbordermatrix \stopformula |