From 18499e46a49b8ccf4346686d1cf626ada33935b8 Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Mon, 23 Nov 2020 19:48:34 +0100 Subject: 2020-11-23 18:39:00 --- tex/context/base/mkxl/math-fen.mkxl | 829 ++++++++++++++++++++++++++++++++++++ 1 file changed, 829 insertions(+) create mode 100644 tex/context/base/mkxl/math-fen.mkxl (limited to 'tex/context/base/mkxl/math-fen.mkxl') diff --git a/tex/context/base/mkxl/math-fen.mkxl b/tex/context/base/mkxl/math-fen.mkxl new file mode 100644 index 000000000..f18d72c85 --- /dev/null +++ b/tex/context/base/mkxl/math-fen.mkxl @@ -0,0 +1,829 @@ +%D \module +%D [ file=math-fen, +%D version=2012.02.18, +%D title=\CONTEXT\ Math Macros, +%D subtitle=Fences, +%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 / Fences} + +\unprotect + +% maybe always "method=auto" for: +% +% \switchtobodyfont[cambria] +% \ruledhbox{$f(x)$} +% \ruledhbox{\mathdelimitersmode6$f\left(x\right)$} +% \ruledhbox{\mathdelimitersmode7$f\left(x\right)$} +% \ruledhbox{$f\left(\frac{1}{x}\right)$} + +% todo: mathstyle + +% \definemathfence [fancybracket] [bracket] [command=yes,color=blue] +% +% test $|x|$ test \par +% test $||x||$ test (okay) \par +% test $a\left|\frac{1}{b}\right|c$ test \par +% test $a\left||\frac{1}{b}\right||c$ test (not okay) \par +% +% \setupmathfences [color=red] +% +% test $a\fenced[bar]{\frac{1}{b}}c$ test \par +% test $a\fenced[doublebar]{\frac{1}{b}}c$ test \par +% test $a\fenced[bracket]{\frac{1}{b}}c$ test \par +% test $a\fancybracket{\frac{1}{b}}c$ test \par + +\installcorenamespace{mathfences} + +\installcommandhandler \??mathfences {mathfence} \??mathfences + +\aliased\let\setupmathfences\setupmathfence + +\setupmathfences + [\c!method=, % maybe always \v!auto + \c!left=, + \c!right=, + \c!middle=, + \c!mathstyle=, + \c!color=, + \c!command=, + \c!mathclass=, + \c!factor=\v!auto] + +\appendtoks + \edef\p_command{\mathfenceparameter\c!command}% + \ifx\p_command\v!yes + \setuevalue\currentmathfence{\math_fenced_fenced[\currentmathfence]}% + \fi +\to \everydefinemathfence + +% we need the direct use of \Udelimiter because of { etc + +%D So we can do: +%D +%D \starttyping +%D $ a + \fenced[bar][size=1] {\frac {b} {c}} + d $ +%D $ a + \fenced[bar][size=2] {\frac {b} {c}} + d $ +%D $ a + \fenced[bar][size=3] {\frac {b} {c}} + d $ +%D $ a + \fenced[bar][size=4] {\frac {b} {c}} + d $ +%D $ a + \fenced[bar][size=big] {\frac {b} {c}} + d $ +%D $ a + \fenced[bar][size=Big] {\frac {b} {c}} + d $ +%D $ a + \fenced[bar][size=bigg]{\frac {b} {c}} + d $ +%D $ a + \fenced[bar][size=Bigg]{\frac {b} {c}} + d $ +%D $ a + \fenced[bar][factor=1] {\frac {b} {c}} + d $ +%D $ a + \fenced[bar][factor=2] {\frac {b} {c}} + d $ +%D $ a + \fenced[bar][factor=4] {\frac {b} {c}} + d $ +%D $ a + \fenced[bar] {\frac {b} {c}} + d $ +%D \stoptyping + +\newconditional\c_math_fenced_mirror \settrue \c_math_fenced_mirror +\newconditional\c_math_fenced_sized \setfalse\c_math_fenced_sized + +\installcorenamespace {mathfencesize} + +\setvalue{\??mathfencesize big}{1} +\setvalue{\??mathfencesize Big}{2} +\setvalue{\??mathfencesize bigg}{3} +\setvalue{\??mathfencesize Bigg}{4} + +\def\math_fenced_force_size#1#2% + {\c_attr_mathsize\numexpr + #1*\plushundred + +\ifcsname\??mathfencesize#2\endcsname\lastnamedcs\else#2\fi + \relax} + +\protected\def\math_fenced_inject#1#2#3#4% + {\ifx#1\empty + #2.% + \else + \edef\p_mathclass{\mathfenceparameter\c!mathclass}% + \ifconditional\c_math_fenced_sized + \let\p_factor\v!fixed + \else + \edef\p_factor{\mathfenceparameter\c!factor}% + \fi + \ifempty\p_factor + \ifempty\p_mathclass + #2% + \else + #3% + \s!class\p_mathclass + \fi + \orelse\ifx\p_factor\v!auto + \ifempty\p_mathclass + #2% + \else + #3% + \s!class\p_mathclass + \fi + \orelse\ifx\p_factor\v!none + #3% + \s!height\zeropoint + \s!depth\zeropoint + \ifempty\p_mathclass\else + \s!class\p_mathclass + \fi + \s!axis + % #2% + \else + \scratchdimen\ifx\p_factor\v!fixed\scaledpoint\else\dimexpr\p_factor\bodyfontsize/2\relax\fi + #3% + \s!height\scratchdimen + \s!depth\scratchdimen + \ifempty\p_mathclass\else + \s!class\p_mathclass + \fi + \s!axis + \fi + \Udelimiter#4\fam#1\relax + \fi} + +\permanent\def\math_fenced_left + {\edef\p_left + {\ifconditional\c_math_fenced_mirror + \ifconditional\c_math_right_to_left + \mathfenceparameter\c!right + \else + \mathfenceparameter\c!left + \fi + \else + \mathfenceparameter\c!left + \fi}% + \math_fenced_color_push + \math_fenced_inject\p_left\normalleft\Uleft\plusfour + \math_fenced_color_pop} + +\permanent\def\math_fenced_middle + {\edef\p_middle{\mathfenceparameter\c!middle}% + \mskip\thinmuskip + \math_fenced_color_push + \math_fenced_inject\p_middle\normalmiddle\Umiddle\plusfour + \math_fenced_color_pop + \mskip\thinmuskip} + +\permanent\def\math_fenced_right + {\edef\p_right + {\ifconditional\c_math_fenced_mirror + \ifconditional\c_math_right_to_left + \mathfenceparameter\c!left + \else + \mathfenceparameter\c!right + \fi + \else + \mathfenceparameter\c!right + \fi}% + \math_fenced_color_push + \math_fenced_inject\p_right\normalright\Uright\plusfive + \math_fenced_color_pop} + +\def\math_fenced_color_do_push{\pushcolor[\p_math_fenced_color]} +\let\math_fenced_color_do_pop \popcolor + +\let\math_fenced_color_push\donothing +\let\math_fenced_color_pop \donothing + +\aliased\let\fence \relax +\aliased\let\fenced\relax + +\newcount\c_math_fenced_nesting + +\protected\def\math_fenced_fenced_common + {\startusemathstyleparameter\mathfenceparameter + \enforced\let\fence\math_fenced_middle + \edef\p_math_fenced_color{\mathfenceparameter\c!color}% + \ifempty\p_math_fenced_color + \let\math_fenced_color_push\donothing + \let\math_fenced_color_pop \donothing + \else + \let\math_fenced_color_push\math_fenced_color_do_push + \let\math_fenced_color_pop \math_fenced_color_do_pop + \fi} + +\protected\def\math_fenced_fenced_start#1% + {\advance\c_math_fenced_nesting\plusone + \begingroup + \edef\currentmathfence{#1}% + \math_fenced_fenced_common + \math_fenced_left} + +\protected\def\math_fenced_fenced_stop#1% + {\edef\currentmathfence{#1}% + \math_fenced_right + \stopusemathstyleparameter + \endgroup + \advance\c_math_fenced_nesting\minusone} + +\tolerant\protected\def\math_fenced_fenced[#1]#*[#2]% + {\advance\c_math_fenced_nesting\plusone + \begingroup + \edef\currentmathfence{#1}% + \ifparameter#2\or\setupcurrentmathfence[#2]\fi + \math_fenced_fenced_common + \edef\p_size{\mathfenceparameter\c!size}% + \ifempty\p_size + \expandafter\math_fenced_fenced_indeed_adapt + \else + \expandafter\math_fenced_fenced_indeed_fixed + \fi} + +\protected\def\math_fenced_fenced_indeed_finish + {\stopusemathstyleparameter + \endgroup + \advance\c_math_fenced_nesting\minusone} + +\protected\def\math_fenced_fenced_indeed_fixed#1% + {\math_fenced_force_size\bigmathdelimitervariant\p_size + \settrue\c_math_fenced_sized + \math_fenced_left + \setfalse\c_math_fenced_sized + #1% + \settrue\c_math_fenced_sized + \math_fenced_right + \setfalse\c_math_fenced_sized + \math_fenced_fenced_indeed_finish} + +\protected\def\math_fenced_fenced_indeed_adapt#1% + {\setfalse\c_math_fenced_sized + \math_fenced_left + #1% + \setfalse\c_math_fenced_sized + \math_fenced_right + \math_fenced_fenced_indeed_finish} + +\appendtoks + \enforced\let\fenced\math_fenced_fenced +\to \everymathematics + +% todo: | in mathmode letter +% +% \appendtoks +% \let\bar\letterbar +% \to \everymathematics +% +% but then we don't have it in embedded text too so ... + +\definemathfence [parenthesis] [\c!left="0028,\c!right="0029] +\definemathfence [bracket] [\c!left="005B,\c!right="005D] +\definemathfence [brace] [\c!left="007B,\c!right="007D] +\definemathfence [bar] [\c!left="007C,\c!right="007C] +\definemathfence [doublebar] [\c!left="2016,\c!right="2016] +\definemathfence [triplebar] [\c!left="2980,\c!right="2980] +\definemathfence [angle] [\c!left="27E8,\c!right="27E9] +\definemathfence [doubleangle] [\c!left="27EA,\c!right="27EB] +\definemathfence [solidus] [\c!left="2044,\c!right="2044] +\definemathfence [ceiling] [\c!left="2308,\c!right="2309] +\definemathfence [floor] [\c!left="230A,\c!right="230B] +\definemathfence [moustache] [\c!left="23B0,\c!right="23B1] +\definemathfence [uppercorner] [\c!left="231C,\c!right="231D] +\definemathfence [lowercorner] [\c!left="231E,\c!right="231F] +\definemathfence [group] [\c!left="27EE,\c!right="27EF] +\definemathfence [openbracket] [\c!left="27E6,\c!right="27E7] + +\definemathfence [nothing] + +\definemathfence [mirrored] % \v!mirrored + +\definemathfence [mirroredparenthesis] [mirrored] [\c!right="0028,\c!left="0029] +\definemathfence [mirroredbracket] [mirrored] [\c!right="005B,\c!left="005D] +\definemathfence [mirroredbrace] [mirrored] [\c!right="007B,\c!left="007D] +\definemathfence [mirroredbar] [mirrored] [\c!right="007C,\c!left="007C] +\definemathfence [mirroreddoublebar] [mirrored] [\c!right="2016,\c!left="2016] +\definemathfence [mirroredtriplebar] [mirrored] [\c!right="2980,\c!left="2980] +\definemathfence [mirroredangle] [mirrored] [\c!right="27E8,\c!left="27E9] +\definemathfence [mirroreddoubleangle] [mirrored] [\c!right="27EA,\c!left="27EB] +\definemathfence [mirroredsolidus] [mirrored] [\c!right="2044,\c!left="2044] +\definemathfence [mirroredceiling] [mirrored] [\c!right="2308,\c!left="2309] +\definemathfence [mirroredfloor] [mirrored] [\c!right="230A,\c!left="230B] +\definemathfence [mirroredmoustache] [mirrored] [\c!right="23B0,\c!left="23B1] +\definemathfence [mirroreduppercorner] [mirrored] [\c!right="231C,\c!left="231D] +\definemathfence [mirroredlowercorner] [mirrored] [\c!right="231E,\c!left="231F] +\definemathfence [mirroredgroup] [mirrored] [\c!right="27EE,\c!left="27EF] +\definemathfence [mirroredopenbracket] [mirrored] [\c!right="27E6,\c!left="27E7] + +\definemathfence [mirrorednothing] [mirrored] + +%D A bonus: + +\pushoverloadmode + +\immutable\protected\def\Lparenthesis {\math_fenced_fenced_start{parenthesis}} \immutable\protected\def\Rparenthesis {\math_fenced_fenced_stop {parenthesis}} +\immutable\protected\def\Lbracket {\math_fenced_fenced_start{bracket}} \immutable\protected\def\Rbracket {\math_fenced_fenced_stop {bracket}} +\immutable\protected\def\Lbrace {\math_fenced_fenced_start{brace}} \immutable\protected\def\Rbrace {\math_fenced_fenced_stop {brace}} +\immutable\protected\def\Langle {\math_fenced_fenced_start{angle}} \immutable\protected\def\Rangle {\math_fenced_fenced_stop {angle}} +\immutable\protected\def\Ldoubleangle {\math_fenced_fenced_start{doubleangle}} \immutable\protected\def\Rdoubleangle {\math_fenced_fenced_stop {doubleangle}} +\immutable\protected\def\Lbar {\math_fenced_fenced_start{bar}} \immutable\protected\def\Rbar {\math_fenced_fenced_stop {bar}} +\immutable\protected\def\Ldoublebar {\math_fenced_fenced_start{doublebar}} \immutable\protected\def\Rdoublebar {\math_fenced_fenced_stop {doublebar}} +\immutable\protected\def\Ltriplebar {\math_fenced_fenced_start{triplebar}} \immutable\protected\def\Rtriplebar {\math_fenced_fenced_stop {triplebar}} +\immutable\protected\def\Lsolidus {\math_fenced_fenced_start{solidus}} \immutable\protected\def\Rsolidus {\math_fenced_fenced_stop {solidus}} +\immutable\protected\def\Lfloor {\math_fenced_fenced_start{floor}} \immutable\protected\def\Rfloor {\math_fenced_fenced_stop {floor}} +\immutable\protected\def\Lceiling {\math_fenced_fenced_start{ceiling}} \immutable\protected\def\Rceiling {\math_fenced_fenced_stop {ceiling}} +\immutable\protected\def\Lmoustache {\math_fenced_fenced_start{moustache}} \immutable\protected\def\Rmoustache {\math_fenced_fenced_stop {moustache}} +\immutable\protected\def\Luppercorner {\math_fenced_fenced_start{uppercorner}} \immutable\protected\def\Ruppercorner {\math_fenced_fenced_stop {uppercorner}} +\immutable\protected\def\Llowercorner {\math_fenced_fenced_start{lowercorner}} \immutable\protected\def\Rlowercorner {\math_fenced_fenced_stop {lowercorner}} +\immutable\protected\def\Lgroup {\math_fenced_fenced_start{group}} \immutable\protected\def\Rgroup {\math_fenced_fenced_stop {group}} +\immutable\protected\def\Lopenbracket {\math_fenced_fenced_start{openbracket}} \immutable\protected\def\Ropenbracket {\math_fenced_fenced_stop {openbracket}} +\immutable\protected\def\Lnothing {\math_fenced_fenced_start{nothing}} \immutable\protected\def\Rnothing {\math_fenced_fenced_stop {nothing}} + +\immutable\protected\def\Lparenthesismirrored {\math_fenced_fenced_stop {mirroredparenthesis}} \immutable\protected\def\Rparenthesismirrored {\math_fenced_fenced_start{mirroredparenthesis}} +\immutable\protected\def\Lbracketmirrored {\math_fenced_fenced_stop {mirroredbracket}} \immutable\protected\def\Rbracketmirrored {\math_fenced_fenced_start{mirroredbracket}} +\immutable\protected\def\Lbracemirrored {\math_fenced_fenced_stop {mirroredbrace}} \immutable\protected\def\Rbracemirrored {\math_fenced_fenced_start{mirroredbrace}} +\immutable\protected\def\Langlemirrored {\math_fenced_fenced_stop {mirroredangle}} \immutable\protected\def\Ranglemirrored {\math_fenced_fenced_start{mirroredangle}} +\immutable\protected\def\Ldoubleanglemirrored {\math_fenced_fenced_stop {mirroreddoubleangle}} \immutable\protected\def\Rdoubleanglemirrored {\math_fenced_fenced_start{mirroreddoubleangle}} +\immutable\protected\def\Lbarmirrored {\math_fenced_fenced_stop {mirroredbar}} \immutable\protected\def\Rbarmirrored {\math_fenced_fenced_start{mirroredbar}} +\immutable\protected\def\Ldoublebarmirrored {\math_fenced_fenced_stop {mirroreddoublebar}} \immutable\protected\def\Rdoublebarmirrored {\math_fenced_fenced_start{mirroreddoublebar}} +\immutable\protected\def\Ltriplebarmirrored {\math_fenced_fenced_stop {mirroredtriplebar}} \immutable\protected\def\Rtriplebarmirrored {\math_fenced_fenced_start{mirroredtriplebar}} +\immutable\protected\def\Lsolidusmirrored {\math_fenced_fenced_stop {mirroredsolidus}} \immutable\protected\def\Rsolidusmirrored {\math_fenced_fenced_start{mirroredsolidus}} +\immutable\protected\def\Lfloormirrored {\math_fenced_fenced_stop {mirroredfloor}} \immutable\protected\def\Rfloormirrored {\math_fenced_fenced_start{mirroredfloor}} +\immutable\protected\def\Lceilingmirrored {\math_fenced_fenced_stop {mirroredceiling}} \immutable\protected\def\Rceilingmirrored {\math_fenced_fenced_start{mirroredceiling}} +\immutable\protected\def\Lmoustachemirrored {\math_fenced_fenced_stop {mirroredmoustache}} \immutable\protected\def\Rmoustachemirrored {\math_fenced_fenced_start{mirroredmoustache}} +\immutable\protected\def\Luppercornermirrored {\math_fenced_fenced_stop {mirroreduppercorner}} \immutable\protected\def\Ruppercornermirrored {\math_fenced_fenced_start{mirroreduppercorner}} +\immutable\protected\def\Llowercornermirrored {\math_fenced_fenced_stop {mirroredlowercorner}} \immutable\protected\def\Rlowercornermirrored {\math_fenced_fenced_start{mirroredlowercorner}} +\immutable\protected\def\Lgroupmirrored {\math_fenced_fenced_stop {mirroredgroup}} \immutable\protected\def\Rgroupmirrored {\math_fenced_fenced_start{mirroredgroup}} +\immutable\protected\def\Lopenbracketmirrored {\math_fenced_fenced_stop {mirroredopenbracket}} \immutable\protected\def\Ropenbracketmirrored {\math_fenced_fenced_start{mirroredopenbracket}} +\immutable\protected\def\Lnothingmirrored {\math_fenced_fenced_stop {mirrorednothing}} \immutable\protected\def\Rnothingmirrored {\math_fenced_fenced_start{mirrorednothing}} + +\definemathfence [interval] [\c!left="2997,\c!right="2998] +\definemathfence [openinterval] [interval] [\c!left="2998,\c!right="2998] +\definemathfence [leftopeninterval] [interval] [\c!left="2997,\c!right="2997] +\definemathfence [rightopeninterval] [interval] [\c!left="2998,\c!right="2998] + +\immutable\protected\def\Linterval {\math_fenced_fenced_start{interval}} +\immutable\protected\def\Lointerval {\math_fenced_fenced_start{openinterval}} +\immutable\protected\def\Llointerval {\math_fenced_fenced_start{leftopeninterval}} +\immutable\protected\def\Lrointerval {\math_fenced_fenced_start{rightopeninterval}} + +\immutable\protected\def\Rinterval {\math_fenced_fenced_stop {interval}} +\immutable\protected\def\Rointerval {\math_fenced_fenced_stop {openinterval}} +\immutable\protected\def\Rlointerval {\math_fenced_fenced_stop {leftopeninterval}} +\immutable\protected\def\Rrointerval {\math_fenced_fenced_stop {rightopeninterval}} + +% \startformula +% \left{ \frac{1}{a} \right} +% \left[ \frac{1}{b} \right] +% \left( \frac{1}{c} \right) +% \left< \frac{1}{d} \right> +% \left| \frac{1}{e} \right| +% \stopformula + +\popoverloadmode + +\installcorenamespace{mathleft} +\installcorenamespace{mathright} +\installcorenamespace{mathmiddle} + +\pushoverloadmode + +\protected\def\left {\afterassignment\math_left \let\nexttoken} +\protected\def\right {\afterassignment\math_right \let\nexttoken} +\protected\def\middle{\afterassignment\math_middle\let\nexttoken} + +\popoverloadmode + +\let\leftorright\relax + +\newconditional\c_math_fenced_done +\newconditional\c_math_fenced_unknown \settrue\c_math_fenced_unknown + +\protected\def\installmathfencepair#1#2#3#4% + {\letcsname\??mathleft \normalmeaning#1\endcsname#2% + \letcsname\??mathright\normalmeaning#3\endcsname#4} + +\def\math_unknown_left {\setfalse\c_math_fenced_done\ifconditional\c_math_fenced_unknown\normalleft \nexttoken\fi} +\def\math_unknown_right {\setfalse\c_math_fenced_done\ifconditional\c_math_fenced_unknown\normalright \nexttoken\fi} +\def\math_unknown_middle{\setfalse\c_math_fenced_done\ifconditional\c_math_fenced_unknown\normalmiddle\nexttoken\fi} + +\letvalue{\??mathleft \s!unknown}\math_unknown_left +\letvalue{\??mathright \s!unknown}\math_unknown_right +\letvalue{\??mathmiddle\s!unknown}\math_unknown_middle + +\def\math_left + {\settrue\c_math_fenced_done + \ifcsname\??mathleft\normalmeaning\nexttoken\endcsname + \expandafter\lastnamedcs + \else + \expandafter\math_unknown_left + \fi} + +\def\math_right + {\settrue\c_math_fenced_done + \ifcsname\??mathright\normalmeaning\nexttoken\endcsname + \expandafter\lastnamedcs + \else + \expandafter\math_unknown_right + \fi} + +\def\math_middle + {\settrue\c_math_fenced_done + \ifcsname\??mathmiddle\normalmeaning\nexttoken\endcsname + \expandafter\lastnamedcs + \else + \expandafter\math_unknown_middle + \fi} + +\protected\def\lfence#1% + {\settrue\c_math_fenced_done + \let\nexttoken#1% + \ifcsname\??mathleft\normalmeaning\nexttoken\endcsname + \expandafter\lastnamedcs + \else + \expandafter\math_unknown_left + \fi} + +\protected\def\rfence#1% + {\settrue\c_math_fenced_done + \let\nexttoken#1% + \ifcsname\??mathright\normalmeaning\nexttoken\endcsname + \expandafter\lastnamedcs + \else + \expandafter\math_unknown_right + \fi} + +\protected\def\mfence#1% + {\settrue\c_math_fenced_done + \let\nexttoken#1% + \ifcsname\??mathmiddle\normalmeaning\nexttoken\endcsname + \expandafter\lastnamedcs + \else + \expandafter\math_unknown_middle + \fi} + +\normalexpanded{\installmathfencepair {|\detokenize {|}} \Ldoublebar {|\detokenize {|}} \Rdoublebar} +\normalexpanded{\installmathfencepair {|\detokenize{||}} \Ltriplebar {|\detokenize{||}} \Rtriplebar} + +\installmathfencepair \bgroup \Lbrace \egroup \Rbrace +\installmathfencepair \egroup \Rbracemirrored \bgroup \Lbracemirrored + +\installmathfencepair \letteropenbrace \Lbrace \letterclosebrace \Rbrace % as we escape in mp textexts + +\installmathfencepair . \Lnothing . \Rnothing +\installmathfencepair . \Rnothingmirrored . \Lnothingmirrored + +\installmathfencepair [ \Lbracket ] \Rbracket +\installmathfencepair ] \Rbracketmirrored [ \Lbracketmirrored + +\installmathfencepair ( \Lparenthesis ) \Rparenthesis +\installmathfencepair ) \Rparenthesismirrored ( \Lparenthesismirrored + +\installmathfencepair < \Langle > \Rangle +\installmathfencepair > \Ranglemirrored < \Langlemirrored + +\installmathfencepair / \Lsolidus / \Rsolidus +%installmathfencepair / \Rsolidusmirrored / \Lsolidusmirrored + +\installmathfencepair | \Lbar | \Rbar +%installmathfencepair | \Rbarmirrored | \Lbarmirrored + +\installmathfencepair ⌊ \Lfloor ⌋ \Rfloor +\installmathfencepair ⌋ \Rfloormirrored ⌊ \Lfloormirrored +\installmathfencepair ⌈ \Lceiling ⌉ \Rceiling +\installmathfencepair ⌉ \Rceilingmirrored ⌈ \Lceilingmirrored + +\installmathfencepair ⟨ \Langle ⟩ \Rangle +\installmathfencepair ⟩ \Ranglemirrored ⟨ \Langlemirrored + +\installmathfencepair ⟪ \Ldoubleangle ⟫ \Rdoubleangle +\installmathfencepair ⟫ \Rdoubleanglemirrored ⟪ \Ldoubleanglemirrored + +\installmathfencepair ‖ \Ldoublebar ‖ \Rdoublebar +%installmathfencepair ‖ \Rdoublebarmirrored ‖ \Ldoublebarmirrored + +\installmathfencepair ⦀ \Ltriplebar ⦀ \Rtriplebar +%installmathfencepair ⦀ \Rtriplebarmirrored ⦀ \Ltriplebarmirrored + +% \installmathfencepair { \Lbrace } \Rbrace +% \installmathfencepair } \Rbracemirrored { \Lbracemirrored + +\installmathfencepair ⦗ \Linterval ⦘ \Rinterval + +\appendtoks + \ignorediscretionaries % so $\mtext{a|b}$ works, this is ok because it's an \hbox +\to \everymathematics + +% We unofficial support some synonyms as we need them for some fuzzy web related math. + +% The names in char-def.lua (historic mess): + +\pushoverloadmode + +\aliased\let\lbrack \lbracket +\aliased\let\rbrack \rbracket +\aliased\let\lceiling \lceil +\aliased\let\rceiling \rceil +\aliased\let\lparenthesis\lparent +\aliased\let\rparenthesis\rparent +\aliased\let\lparen \lparent +\aliased\let\rparen \rparent + +% Just defined: + +\aliased\let\Lceil \Lceiling +\aliased\let\Rceil \Rceiling +\aliased\let\Lparent\Lparenthesis +\aliased\let\Rparent\Rparenthesis +\aliased\let\Lparen \Lparenthesis +\aliased\let\Rparen \Rparenthesis + +\installmathfencepair \lbrace \Lbrace \rbrace \Rbrace +\installmathfencepair \lbracket \Lbracket \rbracket \Rbracket +\installmathfencepair \lbrack \Lbracket \rbracket \Rbracket +\installmathfencepair \lparenthesis \Lparenthesis \rparenthesis \Rparenthesis +\installmathfencepair \lparent \Lparenthesis \rparent \Rparenthesis +\installmathfencepair \lparen \Lparenthesis \rparen \Rparenthesis +\installmathfencepair \langle \Langle \rangle \Rangle +\installmathfencepair \llangle \Ldoubleangle \rrangle \Rdoubleangle +%installmathfencepair \lbar \Lbar \rbar \Rbar +\installmathfencepair \lVert \Ldoublebar \rVert \Rdoublebar +\installmathfencepair \vert \Lbar \vert \Rbar +\installmathfencepair \solidus \Lsolidus \solidus \Rsolidus +\installmathfencepair \lfloor \Lfloor \rfloor \Rfloor +\installmathfencepair \lceiling \Lceiling \rceiling \Rceiling +\installmathfencepair \lceil \Lceiling \rceil \Rceiling + +\installmathfencepair \ulcorner \Luppercorner \urcorner \Ruppercorner +\installmathfencepair \llcorner \Llowercorner \lrcorner \Rlowercorner +\installmathfencepair \lmoustache \Lmoustache \rmoustache \Rmoustache +\installmathfencepair \llbracket \Lopenbracket \rrbracket \Ropenbracket +\installmathfencepair \lgroup \Lgroup \rgroup \Rgroup + +\installmathfencepair \linterval \Linterval \rinterval \Rinterval +%installmathfencepair \linterv \Linterval \rinterv \Rinterval +\installmathfencepair \lointerval \Linterval \rointerval \Rinterval +\installmathfencepair \llointerval \Llointerval \rlointerval \Rlointerval +\installmathfencepair \lrointerval \Lrointerval \rrointerval \Rrointerval + +\aliased\let\textlbar\lbar \aliased\let\mathlbar\Lbar +\aliased\let\textrbar\lbar \aliased\let\mathrbar\Rbar + +\immutable\protected\def\lbar{\mathortext\mathlbar\textlbar} +\immutable\protected\def\rbar{\mathortext\mathrbar\textrbar} + +% \setupmathfences[color=darkgreen] + +\permanent\protected\def\{{\mathortext\lbrace \letterleftbrace } % or maybe a chardef +\permanent\protected\def\}{\mathortext\rbrace \letterrightbrace } % or maybe a chardef +\permanent\protected\def\[{\mathortext\lbracket \letterleftbracket } % or maybe a chardef +\permanent\protected\def\]{\mathortext\rbracket \letterrightbracket } % or maybe a chardef +\permanent\protected\def\({\mathortext\lparenthesis\letterleftparenthesis } % or maybe a chardef +\permanent\protected\def\){\mathortext\rparenthesis\letterrightparenthesis} % or maybe a chardef +\permanent\protected\def\|{\mathortext\vert \letterbar } % or maybe a chardef +%permanent\protected\def\/{\mathortext\solidus \letterslash } % or maybe a chardef + +\installmathfencepair \{ \Lbrace \} \Rbrace +\installmathfencepair \[ \Lbracket \] \Rbracket +\installmathfencepair \( \Lparenthesis \) \Rparenthesis +\installmathfencepair \< \Langle \> \Rangle +\installmathfencepair \| \Lbar \| \Rbar + +\popoverloadmode + +%D As we have overloaded \type {\left} and \type {\right} we also need a more +%D clever version of the following: + +% methods: +% +% 1: none +% 2: lua +% 3: tex + +% variants: +% +% 1: step 1 +% 2: step 2 +% 3: htdp * 1.33^n +% 4: size * 1.33^n + +\setnewconstant\bigmathdelimitermethod \plusone +\setnewconstant\bigmathdelimitervariant\plusthree + +\protected\def\plainbigdelimiters % traditional method + {\bigmathdelimitermethod\plustwo} + +\plainbigdelimiters % is default for the moment but not so nice + +% \setconstant\bigmathdelimitermethod\plusone + +\installcorenamespace{mathbig} + +\setvalue{\??mathbig1}{0.85} +\setvalue{\??mathbig2}{1.15} +\setvalue{\??mathbig3}{1.45} +\setvalue{\??mathbig4}{1.75} + +\protected\def\choosemathbig#1#2% so we accept \big{||} as well + {{\naturalhbox\bgroup + \startimath + \ifcase\bigmathdelimitermethod + \math_fenced_step#2\relax + \or + \math_fenced_force_size\bigmathdelimitervariant{#1}\relax + \math_fenced_step#2\relax + \else + \math_fenced_step#2{\vpack to\csname\??mathbig#1\endcsname\bodyfontsize{}}% + \fi + \nulldelimiterspace\zeropoint\relax + \mathsurround\zeropoint + \stopimath + \egroup}} + +% needs testing: +% +% \protected\def\choosemathbig#1#2% so we accept \big{||} as well +% {{\naturalhbox\bgroup +% \startimath +% \ifcase\bigmathdelimitermethod +% \Uvextensible#2\relax +% \or +% \math_fenced_force_size\bigmathdelimitervariant{#1}\relax +% \Uvextensible#2\relax +% \else +% \scratchdimen.5\dimexpr\csname\??mathbig\number#1\endcsname\bodyfontsize+1.1\exheight\relax +% \Uvextensible\s!axis \s!depth \scratchdimen \s!height \scratchdimen #2\relax +% \fi +% \nulldelimiterspace\zeropoint\relax +% \mathsurround\zeropoint +% \stopimath +% \egroup}} + +\def\math_fenced_step#1#2% + {\setfalse\c_math_fenced_unknown + \setfalse\c_math_fenced_done + \left#1\relax + \ifconditional\c_math_fenced_done + #2% + \right.\relax + \else + \left.\relax + #2% + \setfalse\c_math_fenced_done + \right#1\relax + \ifconditional\c_math_fenced_done + \else + \right.\relax + \fi + \fi} + +\protected\def\mathdelimiterstep#1#2% + {\begingroup + \math_fenced_force_size\plusone{#1}% + \math_fenced_step#2\relax + \endgroup} + +\definemathcommand [big] {\choosemathbig1} +\definemathcommand [Big] {\choosemathbig2} +\definemathcommand [bigg] {\choosemathbig3} +\definemathcommand [Bigg] {\choosemathbig4} + +\definemathcommand [bigl] [open] [one] {\big} +\definemathcommand [bigm] [rel] [one] {\big} +\definemathcommand [bigr] [close] [one] {\big} +\definemathcommand [Bigl] [open] [one] {\Big} +\definemathcommand [Bigm] [rel] [one] {\Big} +\definemathcommand [Bigr] [close] [one] {\Big} +\definemathcommand [biggl] [open] [one] {\bigg} +\definemathcommand [biggm] [rel] [one] {\bigg} +\definemathcommand [biggr] [close] [one] {\bigg} +\definemathcommand [Biggl] [open] [one] {\Bigg} +\definemathcommand [Biggm] [rel] [one] {\Bigg} +\definemathcommand [Biggr] [close] [one] {\Bigg} + +% \definemathfence [integral] [\c!left="222B] +% +% \protected\def\Lintegral {\math_fenced_fenced_start{integral}} +% \protected\def\Rintegral {\math_fenced_fenced_stop {integral}} +% +% \installmathfencepair \lintegral \Lintegral \rintegral \Rintegral +% +% \left\lintegral +% \vrule height 3cm depth 3cm +% \right\rintegral + +%definemathfence [fancybracket] [bracket] [command=yes,color=red] + +% experimental accents: +% +% \definemathoverextensible [top] [hoed] ["FE302] +% \definemathoverextensible [top] [slang] ["FE303] + +%D The nested fences recovery code is needed for mathml and the original +%D code can still be found in the mkiv file. + +\definesystemattribute[mathautofence][public] + +\let\math_fences_normal_left \left +\let\math_fences_normal_right \right +\let\math_fences_normal_middle\middle +\let\math_fences_normal_both \leftorright + +\protected\def\math_fences_auto_left #1{\c_attr_mathautofence\plusone #1\c_attr_mathautofence\attributeunsetvalue} +\protected\def\math_fences_auto_right #1{\c_attr_mathautofence\plustwo #1\c_attr_mathautofence\attributeunsetvalue} +\protected\def\math_fences_auto_middle#1{\c_attr_mathautofence\plusthree#1\c_attr_mathautofence\attributeunsetvalue} +\protected\def\math_fences_auto_both #1{\c_attr_mathautofence\plusfour #1\c_attr_mathautofence\attributeunsetvalue} + +\permanent\let\autofenceopen \math_fences_auto_left % for testing +\permanent\let\autofenceclose \math_fences_auto_right % for testing +\permanent\let\autofenceleft \math_fences_auto_left % for testing +\permanent\let\autofenceright \math_fences_auto_right % for testing +\permanent\let\autofencemiddle\math_fences_auto_middle % for testing +\permanent\let\autofenceboth \math_fences_auto_both % for testing + +% fences are used not that often (i.e. no performance issue) so we can use a state +% instead of \let ... also some state variable can come in handy in the future + +\newconditional\c_math_fences_auto + +\protected\def\enableautofences + {\clf_enableautofences + \glet\clf_enableautofences\relax % onlyonce anyway + \protected\gdef\enableautofences{\settrue\c_math_fences_auto}% + \enableautofences} + +\protected\def\disableautofences + {\setfalse\c_math_fences_auto} + +\protected\def\math_fences_used_left + {\ifconditional\c_math_fences_auto + \expandafter\math_fences_auto_left + \else + \expandafter\math_fences_normal_left + \fi} + +\protected\def\math_fences_used_right + {\ifconditional\c_math_fences_auto + \expandafter\math_fences_auto_right + \else + \expandafter\math_fences_normal_right + \fi} + +\protected\def\math_fences_used_middle + {\ifconditional\c_math_fences_auto + \expandafter\math_fences_auto_middle + \else + \expandafter\math_fences_normal_middle + \fi} + +\protected\def\math_fences_used_both + {\ifconditional\c_math_fences_auto + \expandafter\math_fences_auto_both + \else + \expandafter\math_fences_normal_both + \fi} + +\permanent\let\left \math_fences_used_left +\permanent\let\right \math_fences_used_right +\permanent\let\middle \math_fences_used_middle +\permanent\let\leftorright\math_fences_used_both + +% wrappers + +\permanent\protected\def\startcheckedfences + {\begingroup + \enableautofences} + +\permanent\protected\def\stopcheckedfences + {\endgroup} + +% \appendtoks + % maybe: safeguard against overloading + % + % \let\left \math_fences_used_left + % \let\right \math_fences_used_right + % \let\middle \math_fences_used_middle + % \let\leftorright\math_fences_used_both +% \to \everymathematics + +\appendtoks + \ifempty\currentmathfence + \doifelse{\mathfenceparameter\c!state}\v!auto\enableautofences\disableautofences + \fi +\to \everysetupmathfence + +\newconstant\c_math_fences_delimiters_mode \c_math_fences_delimiters_mode"16 % \numexpr"02+"04+"10\relax + +%protected\def\enableautofencemode {\mathdelimitersmode\plussix} % the shift (1) is too fragile +\protected\def\enableautofencemode {\mathdelimitersmode\c_math_fences_delimiters_mode} + +\protected\def\disableautofencemode{\mathdelimitersmode\zerocount} + +\appendtoks + \ifempty\currentmathfence + \doifelse{\mathfenceparameter\c!method}\v!auto\enableautofencemode\disableautofencemode + \fi +\to \everysetupmathfence + +% some day default: \setupmathfences[\c!state=\v!auto] + +%D The next characters were used for constructing nicer extensibles but +%D nowadays we have real characters. + +\immutable\Umathchardef\braceld\zerocount \defaultmathfamily "FF07A +\immutable\Umathchardef\bracerd\zerocount \defaultmathfamily "FF07B +\immutable\Umathchardef\bracelu\zerocount \defaultmathfamily "FF07C +\immutable\Umathchardef\braceru\zerocount \defaultmathfamily "FF07D + +\protect -- cgit v1.2.3