summaryrefslogtreecommitdiff
path: root/tex/context/base
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base')
-rw-r--r--tex/context/base/mkii/cont-new.mkii2
-rw-r--r--tex/context/base/mkii/context.mkii2
-rw-r--r--tex/context/base/mkii/mult-cs.mkii10
-rw-r--r--tex/context/base/mkii/mult-fr.mkii15
-rw-r--r--tex/context/base/mkii/mult-pe.mkii14
-rw-r--r--tex/context/base/mkiv/anch-pos.lua13
-rw-r--r--tex/context/base/mkiv/char-def.lua312
-rw-r--r--tex/context/base/mkiv/cont-new.mkiv2
-rw-r--r--tex/context/base/mkiv/context.mkiv2
-rw-r--r--tex/context/base/mkiv/font-osd.lua59
-rw-r--r--tex/context/base/mkiv/font-otc.lua52
-rw-r--r--tex/context/base/mkiv/lang-imp-indic.lua1017
-rw-r--r--tex/context/base/mkiv/lang-imp-serbian.lua113
-rw-r--r--tex/context/base/mkiv/lpdf-pda.xml18
-rw-r--r--tex/context/base/mkiv/lpdf-pdx.xml25
-rw-r--r--tex/context/base/mkiv/lpdf-pua.xml29
-rw-r--r--tex/context/base/mkiv/lpdf-xmp.lua7
-rw-r--r--tex/context/base/mkiv/math-act.lua2
-rw-r--r--tex/context/base/mkiv/math-ini.lua531
-rw-r--r--tex/context/base/mkiv/math-int.mkiv4
-rw-r--r--tex/context/base/mkiv/math-tag.lua3
-rw-r--r--tex/context/base/mkiv/mult-def.lua25
-rw-r--r--tex/context/base/mkiv/mult-low.lua60
-rw-r--r--tex/context/base/mkiv/mult-prm.lua173
-rw-r--r--tex/context/base/mkiv/node-ser.lua2
-rw-r--r--tex/context/base/mkiv/page-str.lua10
-rw-r--r--tex/context/base/mkiv/status-files.pdfbin24745 -> 24667 bytes
-rw-r--r--tex/context/base/mkiv/status-lua.pdfbin257662 -> 258099 bytes
-rw-r--r--tex/context/base/mkiv/strc-pag.lua4
-rw-r--r--tex/context/base/mkiv/syst-ini.mkiv2
-rw-r--r--tex/context/base/mkiv/typo-mar.lua4
-rw-r--r--tex/context/base/mkiv/util-sac.lua36
-rw-r--r--tex/context/base/mkiv/util-sql-tickets.lua2
-rw-r--r--tex/context/base/mkiv/util-sql.lua2
-rw-r--r--tex/context/base/mkiv/util-zip.lua30
-rw-r--r--tex/context/base/mkxl/anch-pos.lmt13
-rw-r--r--tex/context/base/mkxl/attr-ini.lmt10
-rw-r--r--tex/context/base/mkxl/back-exp-imp-mth.lmt27
-rw-r--r--tex/context/base/mkxl/colo-ini.mkxl10
-rw-r--r--tex/context/base/mkxl/cont-new.mkxl2
-rw-r--r--tex/context/base/mkxl/context.mkxl4
-rw-r--r--tex/context/base/mkxl/driv-shp.lmt126
-rw-r--r--tex/context/base/mkxl/font-chk.lmt4
-rw-r--r--tex/context/base/mkxl/font-con.lmt85
-rw-r--r--tex/context/base/mkxl/font-imp-math.lmt42
-rw-r--r--tex/context/base/mkxl/font-imp-sanitize.lmt197
-rw-r--r--tex/context/base/mkxl/font-imp-tracing.lmt7
-rw-r--r--tex/context/base/mkxl/font-lib.mklx2
-rw-r--r--tex/context/base/mkxl/font-mat.mklx2
-rw-r--r--tex/context/base/mkxl/font-ogr.lmt5
-rw-r--r--tex/context/base/mkxl/font-otl.lmt45
-rw-r--r--tex/context/base/mkxl/font-ots.lmt5
-rw-r--r--tex/context/base/mkxl/font-pre.mkxl13
-rw-r--r--tex/context/base/mkxl/font-tfm.lmt2
-rw-r--r--tex/context/base/mkxl/font-vfc.lmt2
-rw-r--r--tex/context/base/mkxl/lang-def.mkxl6
-rw-r--r--tex/context/base/mkxl/lang-tra.lmt160
-rw-r--r--tex/context/base/mkxl/lang-tra.mkxl58
-rw-r--r--tex/context/base/mkxl/libs-imp-zint.lmt64
-rw-r--r--tex/context/base/mkxl/libs-imp-zint.mkxl90
-rw-r--r--tex/context/base/mkxl/lpdf-emb.lmt2
-rw-r--r--tex/context/base/mkxl/lpdf-lmt.lmt11
-rw-r--r--tex/context/base/mkxl/lpdf-rul.lmt24
-rw-r--r--tex/context/base/mkxl/lpdf-xmp.lmt11
-rw-r--r--tex/context/base/mkxl/math-acc.mklx143
-rw-r--r--tex/context/base/mkxl/math-act.lmt634
-rw-r--r--tex/context/base/mkxl/math-ali.mkxl19
-rw-r--r--tex/context/base/mkxl/math-def.mkxl22
-rw-r--r--tex/context/base/mkxl/math-del.mkxl4
-rw-r--r--tex/context/base/mkxl/math-dim.lmt10
-rw-r--r--tex/context/base/mkxl/math-fbk.lmt312
-rw-r--r--tex/context/base/mkxl/math-fen.mkxl473
-rw-r--r--tex/context/base/mkxl/math-frc.lmt136
-rw-r--r--tex/context/base/mkxl/math-frc.mkxl346
-rw-r--r--tex/context/base/mkxl/math-ini.lmt446
-rw-r--r--tex/context/base/mkxl/math-ini.mkxl1050
-rw-r--r--tex/context/base/mkxl/math-int.mkxl99
-rw-r--r--tex/context/base/mkxl/math-lop.mkxl143
-rw-r--r--tex/context/base/mkxl/math-noa.lmt255
-rw-r--r--tex/context/base/mkxl/math-pln.mkxl8
-rw-r--r--tex/context/base/mkxl/math-rad.mklx53
-rw-r--r--tex/context/base/mkxl/math-scr.mkxl2
-rw-r--r--tex/context/base/mkxl/math-spa.lmt83
-rw-r--r--tex/context/base/mkxl/math-stc.mklx147
-rw-r--r--tex/context/base/mkxl/math-tag.lmt4
-rw-r--r--tex/context/base/mkxl/math-vfu.lmt39
-rw-r--r--tex/context/base/mkxl/mlib-int.lmt6
-rw-r--r--tex/context/base/mkxl/mult-aux.mkxl16
-rw-r--r--tex/context/base/mkxl/mult-sys.mkxl15
-rw-r--r--tex/context/base/mkxl/node-bck.mkxl2
-rw-r--r--tex/context/base/mkxl/node-ini.lmt34
-rw-r--r--tex/context/base/mkxl/node-res.lmt13
-rw-r--r--tex/context/base/mkxl/norm-ctx.mkxl116
-rw-r--r--tex/context/base/mkxl/pack-box.mkxl73
-rw-r--r--tex/context/base/mkxl/pack-lyr.mkxl2
-rw-r--r--tex/context/base/mkxl/pack-mat.mkxl84
-rw-r--r--tex/context/base/mkxl/page-bck.mkxl5
-rw-r--r--tex/context/base/mkxl/page-box.mklx11
-rw-r--r--tex/context/base/mkxl/page-flt.mkxl2
-rw-r--r--tex/context/base/mkxl/page-lay.mkxl40
-rw-r--r--tex/context/base/mkxl/page-mbk.mklx200
-rw-r--r--tex/context/base/mkxl/page-one.mkxl1
-rw-r--r--tex/context/base/mkxl/page-sid.mkxl2
-rw-r--r--tex/context/base/mkxl/page-str.lmt320
-rw-r--r--tex/context/base/mkxl/page-str.mkxl2
-rw-r--r--tex/context/base/mkxl/page-txt.mklx6
-rw-r--r--tex/context/base/mkxl/spac-hor.mkxl3
-rw-r--r--tex/context/base/mkxl/spac-par.mkxl4
-rw-r--r--tex/context/base/mkxl/spac-ver.mkxl198
-rw-r--r--tex/context/base/mkxl/strc-flt.mklx2
-rw-r--r--tex/context/base/mkxl/strc-mat.mkxl4
-rw-r--r--tex/context/base/mkxl/strc-ref.mklx16
-rw-r--r--tex/context/base/mkxl/supp-box.lmt34
-rw-r--r--tex/context/base/mkxl/supp-box.mkxl19
-rw-r--r--tex/context/base/mkxl/symb-ini.mkxl2
-rw-r--r--tex/context/base/mkxl/syst-aux.mkxl17
-rw-r--r--tex/context/base/mkxl/syst-fnt.mkxl26
-rw-r--r--tex/context/base/mkxl/syst-ini.mkxl158
-rw-r--r--tex/context/base/mkxl/toks-aux.lmt22
-rw-r--r--tex/context/base/mkxl/trac-vis.lmt87
-rw-r--r--tex/context/base/mkxl/type-imp-bengali.mkxl73
-rw-r--r--tex/context/base/mkxl/type-imp-devanagari.mkxl244
-rw-r--r--tex/context/base/mkxl/type-imp-gujarati.mkxl77
-rw-r--r--tex/context/base/mkxl/type-imp-indic.mkxl800
-rw-r--r--tex/context/base/mkxl/type-imp-kannada.mkxl73
-rw-r--r--tex/context/base/mkxl/type-imp-malayalam.mkxl224
-rw-r--r--tex/context/base/mkxl/type-imp-tamil.mkxl53
-rw-r--r--tex/context/base/mkxl/type-imp-telugu.mkxl74
-rw-r--r--tex/context/base/mkxl/typo-mar.lmt7
-rw-r--r--tex/context/base/mkxl/typo-mar.mkxl2
130 files changed, 8219 insertions, 2989 deletions
diff --git a/tex/context/base/mkii/cont-new.mkii b/tex/context/base/mkii/cont-new.mkii
index acb247396..cad7b57e1 100644
--- a/tex/context/base/mkii/cont-new.mkii
+++ b/tex/context/base/mkii/cont-new.mkii
@@ -11,7 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\newcontextversion{2022.01.21 20:10}
+\newcontextversion{2022.03.12 11:24}
%D This file is loaded at runtime, thereby providing an
%D excellent place for hacks, patches, extensions and new
diff --git a/tex/context/base/mkii/context.mkii b/tex/context/base/mkii/context.mkii
index e1535e159..30265042e 100644
--- a/tex/context/base/mkii/context.mkii
+++ b/tex/context/base/mkii/context.mkii
@@ -20,7 +20,7 @@
%D your styles an modules.
\edef\contextformat {\jobname}
-\edef\contextversion{2022.01.21 20:10}
+\edef\contextversion{2022.03.12 11:24}
%D For those who want to use this:
diff --git a/tex/context/base/mkii/mult-cs.mkii b/tex/context/base/mkii/mult-cs.mkii
index 37e93983e..5af147f70 100644
--- a/tex/context/base/mkii/mult-cs.mkii
+++ b/tex/context/base/mkii/mult-cs.mkii
@@ -281,7 +281,6 @@
\setinterfacevariable{inright}{ivpravo}
\setinterfacevariable{inrightedge}{napravo}
\setinterfacevariable{inrightmargin}{napravyokraj}
-\setinterfacevariable{integral}{integral}
\setinterfacevariable{interaction}{interakce}
\setinterfacevariable{interactionmenu}{interaktivnimenu}
\setinterfacevariable{interactive}{interactive}
@@ -716,6 +715,7 @@
\setinterfaceconstant{bottom}{spodek}
\setinterfaceconstant{bottomafter}{bottomafter}
\setinterfaceconstant{bottombefore}{bottombefore}
+\setinterfaceconstant{bottomcolor}{bottomcolor}
\setinterfaceconstant{bottomcommand}{bottomcommand}
\setinterfaceconstant{bottomdistance}{vzdalenostspodku}
\setinterfaceconstant{bottomframe}{ramecekdole}
@@ -887,6 +887,7 @@
\setinterfaceconstant{header}{zahlavi}
\setinterfaceconstant{headerdistance}{vzdalenostzahlavi}
\setinterfaceconstant{headerstate}{statuszahlavi}
+\setinterfaceconstant{headindenting}{headindenting}
\setinterfaceconstant{headlabel}{popisekhlavicky}
\setinterfaceconstant{headnumber}{cislonadpisu}
\setinterfaceconstant{headseparator}{headseparator}
@@ -918,6 +919,7 @@
\setinterfaceconstant{inputfile}{inputfile}
\setinterfaceconstant{insidesection}{insidesection}
\setinterfaceconstant{instance}{instance}
+\setinterfaceconstant{integral}{integral}
\setinterfaceconstant{intent}{intent}
\setinterfaceconstant{interaction}{interakce}
\setinterfaceconstant{interlinespace}{meziradkovamezera}
@@ -960,6 +962,7 @@
\setinterfaceconstant{leftquote}{citovatvlevo}
\setinterfaceconstant{leftsample}{leftsample}
\setinterfaceconstant{leftsentence}{vetavlevo}
+\setinterfaceconstant{leftsource}{leftsource}
\setinterfaceconstant{leftspeech}{leftspeech}
\setinterfaceconstant{leftstyle}{stylvlevo}
\setinterfaceconstant{leftsubsentence}{podvetavlevo}
@@ -992,7 +995,9 @@
\setinterfaceconstant{marstyle}{stylsnacky}
\setinterfaceconstant{mask}{mask}
\setinterfaceconstant{mathclass}{mathclass}
+\setinterfaceconstant{mathdenominatorstyle}{mathdenominatorstyle}
\setinterfaceconstant{mathlimits}{mathlimits}
+\setinterfaceconstant{mathnumeratorstyle}{mathnumeratorstyle}
\setinterfaceconstant{mathstyle}{mathstyle}
\setinterfaceconstant{max}{max}
\setinterfaceconstant{maxdepth}{maxdepth}
@@ -1004,6 +1009,7 @@
\setinterfaceconstant{middle}{stredni}
\setinterfaceconstant{middlecolor}{middlecolor}
\setinterfaceconstant{middlecommand}{middlecommand}
+\setinterfaceconstant{middlesource}{middlesource}
\setinterfaceconstant{middlespeech}{middlespeech}
\setinterfaceconstant{middlestyle}{middlestyle}
\setinterfaceconstant{middletext}{strednitext}
@@ -1176,6 +1182,7 @@
\setinterfaceconstant{rightquote}{citovatvpravo}
\setinterfaceconstant{rightsample}{rightsample}
\setinterfaceconstant{rightsentence}{vetavpravo}
+\setinterfaceconstant{rightsource}{rightsource}
\setinterfaceconstant{rightspeech}{rightspeech}
\setinterfaceconstant{rightstyle}{stylvpravo}
\setinterfaceconstant{rightsubsentence}{podvetavpravo}
@@ -1311,6 +1318,7 @@
\setinterfaceconstant{toffset}{toffset}
\setinterfaceconstant{tolerance}{tolerance}
\setinterfaceconstant{top}{vrsek}
+\setinterfaceconstant{topcolor}{topcolor}
\setinterfaceconstant{topcommand}{topcommand}
\setinterfaceconstant{topdistance}{vzdalenostvrsku}
\setinterfaceconstant{topframe}{rameceknahore}
diff --git a/tex/context/base/mkii/mult-fr.mkii b/tex/context/base/mkii/mult-fr.mkii
index 6abaaec24..d79dc0836 100644
--- a/tex/context/base/mkii/mult-fr.mkii
+++ b/tex/context/base/mkii/mult-fr.mkii
@@ -281,7 +281,6 @@
\setinterfacevariable{inright}{dansdroite}
\setinterfacevariable{inrightedge}{dansborddroit}
\setinterfacevariable{inrightmargin}{dansmargedroite}
-\setinterfacevariable{integral}{integrale}
\setinterfacevariable{interaction}{interaction}
\setinterfacevariable{interactionmenu}{menuinteraction}
\setinterfacevariable{interactive}{interactif}
@@ -300,6 +299,7 @@
\setinterfacevariable{july}{juillet}
\setinterfacevariable{june}{juin}
\setinterfacevariable{keep}{conserver}
+\setinterfacevariable{keeptogether}{conserverensemble}
\setinterfacevariable{kerncharacters}{approchercaracteres}
\setinterfacevariable{knockout}{knockout}
\setinterfacevariable{label}{etiquette}
@@ -315,6 +315,7 @@
\setinterfacevariable{lefthanging}{suspensiongauche}
\setinterfacevariable{leftmargin}{margegauche}
\setinterfacevariable{leftpage}{surpagegauche}
+\setinterfacevariable{lefttext}{textegauche}
\setinterfacevariable{lefttoright}{gaucheadroite}
\setinterfacevariable{legend}{legende}
\setinterfacevariable{less}{moins}
@@ -476,6 +477,7 @@
\setinterfacevariable{righthanging}{suspensiondroite}
\setinterfacevariable{rightmargin}{margedroite}
\setinterfacevariable{rightpage}{surpagedroite}
+\setinterfacevariable{righttext}{textedroite}
\setinterfacevariable{righttoleft}{droiteagauche}
\setinterfacevariable{roman}{romain}
\setinterfacevariable{romannumerals}{chiffresromains}
@@ -713,6 +715,7 @@
\setinterfaceconstant{bottom}{bas}
\setinterfaceconstant{bottomafter}{basaprès}
\setinterfaceconstant{bottombefore}{basavant}
+\setinterfaceconstant{bottomcolor}{bottomcolor}
\setinterfaceconstant{bottomcommand}{commandebas}
\setinterfaceconstant{bottomdistance}{distancebas}
\setinterfaceconstant{bottomframe}{cadrebas}
@@ -884,6 +887,7 @@
\setinterfaceconstant{header}{entête}
\setinterfaceconstant{headerdistance}{distanceentête}
\setinterfaceconstant{headerstate}{etatentête}
+\setinterfaceconstant{headindenting}{headindenting}
\setinterfaceconstant{headlabel}{etiquettetete}
\setinterfaceconstant{headnumber}{numerotete}
\setinterfaceconstant{headseparator}{separateurtete}
@@ -915,6 +919,7 @@
\setinterfaceconstant{inputfile}{fichierentree}
\setinterfaceconstant{insidesection}{auseinsection}
\setinterfaceconstant{instance}{instance}
+\setinterfaceconstant{integral}{integrale}
\setinterfaceconstant{intent}{intention}
\setinterfaceconstant{interaction}{interaction}
\setinterfaceconstant{interlinespace}{espaceinterligne}
@@ -957,6 +962,7 @@
\setinterfaceconstant{leftquote}{citergauche}
\setinterfaceconstant{leftsample}{echantillongauche}
\setinterfaceconstant{leftsentence}{phrasegauche}
+\setinterfaceconstant{leftsource}{leftsource}
\setinterfaceconstant{leftspeech}{discoursgauche}
\setinterfaceconstant{leftstyle}{stylegauche}
\setinterfaceconstant{leftsubsentence}{sousphrasegauche}
@@ -989,7 +995,9 @@
\setinterfaceconstant{marstyle}{stylerem}
\setinterfaceconstant{mask}{masque}
\setinterfaceconstant{mathclass}{classemath}
+\setinterfaceconstant{mathdenominatorstyle}{mathdenominatorstyle}
\setinterfaceconstant{mathlimits}{limitesmath}
+\setinterfaceconstant{mathnumeratorstyle}{mathnumeratorstyle}
\setinterfaceconstant{mathstyle}{stylemath}
\setinterfaceconstant{max}{max}
\setinterfaceconstant{maxdepth}{profondeurmax}
@@ -1001,6 +1009,7 @@
\setinterfaceconstant{middle}{milieu}
\setinterfaceconstant{middlecolor}{couleurmilieu}
\setinterfaceconstant{middlecommand}{commandemilieu}
+\setinterfaceconstant{middlesource}{middlesource}
\setinterfaceconstant{middlespeech}{discoursmilieu}
\setinterfaceconstant{middlestyle}{stylemilieu}
\setinterfaceconstant{middletext}{textemilieu}
@@ -1173,6 +1182,7 @@
\setinterfaceconstant{rightquote}{citerdroite}
\setinterfaceconstant{rightsample}{echantillondroite}
\setinterfaceconstant{rightsentence}{phrasedroite}
+\setinterfaceconstant{rightsource}{rightsource}
\setinterfaceconstant{rightspeech}{discoursdroite}
\setinterfaceconstant{rightstyle}{styledroit}
\setinterfaceconstant{rightsubsentence}{sousphrasedroite}
@@ -1278,8 +1288,10 @@
\setinterfaceconstant{synonymcommand}{commandesynonyme}
\setinterfaceconstant{synonymstyle}{stylesynonyme}
\setinterfaceconstant{tab}{tab}
+\setinterfaceconstant{target}{target}
\setinterfaceconstant{text}{texte}
\setinterfaceconstant{textalign}{alignertexte}
+\setinterfaceconstant{textalternative}{textalternative}
\setinterfaceconstant{textcolor}{couleurtexte}
\setinterfaceconstant{textcommand}{commandetexte}
\setinterfaceconstant{textdistance}{distancetexte}
@@ -1306,6 +1318,7 @@
\setinterfaceconstant{toffset}{decalaget}
\setinterfaceconstant{tolerance}{tolerance}
\setinterfaceconstant{top}{haut}
+\setinterfaceconstant{topcolor}{topcolor}
\setinterfaceconstant{topcommand}{commandehaut}
\setinterfaceconstant{topdistance}{distancehaut}
\setinterfaceconstant{topframe}{cadrehaut}
diff --git a/tex/context/base/mkii/mult-pe.mkii b/tex/context/base/mkii/mult-pe.mkii
index 290da95f2..a8f4fc599 100644
--- a/tex/context/base/mkii/mult-pe.mkii
+++ b/tex/context/base/mkii/mult-pe.mkii
@@ -281,7 +281,6 @@
\setinterfacevariable{inright}{درون‌راست}
\setinterfacevariable{inrightedge}{درلبه‌راست}
\setinterfacevariable{inrightmargin}{درحاشیه‌راست}
-\setinterfacevariable{integral}{integral}
\setinterfacevariable{interaction}{پانل}
\setinterfacevariable{interactionmenu}{منوی‌پانل}
\setinterfacevariable{interactive}{interactive}
@@ -300,6 +299,7 @@
\setinterfacevariable{july}{ژولای}
\setinterfacevariable{june}{ژوئن}
\setinterfacevariable{keep}{نگهدار}
+\setinterfacevariable{keeptogether}{keeptogether}
\setinterfacevariable{kerncharacters}{kerncharacters}
\setinterfacevariable{knockout}{knockout}
\setinterfacevariable{label}{برچسب}
@@ -715,6 +715,7 @@
\setinterfaceconstant{bottom}{پایین}
\setinterfaceconstant{bottomafter}{bottomafter}
\setinterfaceconstant{bottombefore}{bottombefore}
+\setinterfaceconstant{bottomcolor}{bottomcolor}
\setinterfaceconstant{bottomcommand}{bottomcommand}
\setinterfaceconstant{bottomdistance}{فاصله‌پایین}
\setinterfaceconstant{bottomframe}{قالب‌پایین}
@@ -886,6 +887,7 @@
\setinterfaceconstant{header}{سربرگ}
\setinterfaceconstant{headerdistance}{فاصله‌سربرگ}
\setinterfaceconstant{headerstate}{وضعیت‌سربرگ}
+\setinterfaceconstant{headindenting}{headindenting}
\setinterfaceconstant{headlabel}{برچسب‌سر}
\setinterfaceconstant{headnumber}{شماره‌سر}
\setinterfaceconstant{headseparator}{headseparator}
@@ -917,6 +919,7 @@
\setinterfaceconstant{inputfile}{پرونده‌ورودی}
\setinterfaceconstant{insidesection}{insidesection}
\setinterfaceconstant{instance}{instance}
+\setinterfaceconstant{integral}{integral}
\setinterfaceconstant{intent}{intent}
\setinterfaceconstant{interaction}{پانل}
\setinterfaceconstant{interlinespace}{فضای‌بین‌خط}
@@ -959,6 +962,7 @@
\setinterfaceconstant{leftquote}{نقل‌چپ}
\setinterfaceconstant{leftsample}{leftsample}
\setinterfaceconstant{leftsentence}{جمله‌چپ}
+\setinterfaceconstant{leftsource}{leftsource}
\setinterfaceconstant{leftspeech}{سخنرانی‌چپ}
\setinterfaceconstant{leftstyle}{سبک‌چپ}
\setinterfaceconstant{leftsubsentence}{زیرجمله‌چپ}
@@ -991,7 +995,9 @@
\setinterfaceconstant{marstyle}{سبک‌حاش}
\setinterfaceconstant{mask}{mask}
\setinterfaceconstant{mathclass}{mathclass}
+\setinterfaceconstant{mathdenominatorstyle}{mathdenominatorstyle}
\setinterfaceconstant{mathlimits}{mathlimits}
+\setinterfaceconstant{mathnumeratorstyle}{mathnumeratorstyle}
\setinterfaceconstant{mathstyle}{mathstyle}
\setinterfaceconstant{max}{بیشترین}
\setinterfaceconstant{maxdepth}{maxdepth}
@@ -1003,6 +1009,7 @@
\setinterfaceconstant{middle}{میان}
\setinterfaceconstant{middlecolor}{middlecolor}
\setinterfaceconstant{middlecommand}{middlecommand}
+\setinterfaceconstant{middlesource}{middlesource}
\setinterfaceconstant{middlespeech}{سخنرانی‌میانی}
\setinterfaceconstant{middlestyle}{middlestyle}
\setinterfaceconstant{middletext}{متن‌میانی}
@@ -1175,6 +1182,7 @@
\setinterfaceconstant{rightquote}{نقل‌راست}
\setinterfaceconstant{rightsample}{rightsample}
\setinterfaceconstant{rightsentence}{جمله‌راست}
+\setinterfaceconstant{rightsource}{rightsource}
\setinterfaceconstant{rightspeech}{سخنرانی‌راست}
\setinterfaceconstant{rightstyle}{سبک‌راست}
\setinterfaceconstant{rightsubsentence}{زیرجمله‌راست}
@@ -1229,7 +1237,7 @@
\setinterfaceconstant{solution}{solution}
\setinterfaceconstant{sort}{sort}
\setinterfaceconstant{sorttype}{ترتیب‌تایپ}
-\setinterfaceconstant{source}{منبع}
+\setinterfaceconstant{source}{source}
\setinterfaceconstant{space}{فضا}
\setinterfaceconstant{spaceafter}{فضا‌بعداز}
\setinterfaceconstant{spaceafterside}{spaceafterside}
@@ -1280,6 +1288,7 @@
\setinterfaceconstant{synonymcommand}{synonymcommand}
\setinterfaceconstant{synonymstyle}{سبک‌مترادف}
\setinterfaceconstant{tab}{تب}
+\setinterfaceconstant{target}{target}
\setinterfaceconstant{text}{متن}
\setinterfaceconstant{textalign}{textalign}
\setinterfaceconstant{textalternative}{textalternative}
@@ -1309,6 +1318,7 @@
\setinterfaceconstant{toffset}{toffset}
\setinterfaceconstant{tolerance}{بردباری}
\setinterfaceconstant{top}{بالا}
+\setinterfaceconstant{topcolor}{topcolor}
\setinterfaceconstant{topcommand}{topcommand}
\setinterfaceconstant{topdistance}{فاصله‌بالا}
\setinterfaceconstant{topframe}{قالب‌راست}
diff --git a/tex/context/base/mkiv/anch-pos.lua b/tex/context/base/mkiv/anch-pos.lua
index 77bf09e39..93ba661a7 100644
--- a/tex/context/base/mkiv/anch-pos.lua
+++ b/tex/context/base/mkiv/anch-pos.lua
@@ -49,6 +49,7 @@ local context = context
local ctx_latelua = context.latelua
local tex = tex
+local texgetdimen = tex.getdimen
local texgetcount = tex.getcount
local texgetinteger = tex.getintegervalue or tex.getcount
local texsetcount = tex.setcount
@@ -574,8 +575,8 @@ implement {
actions = function()
nofparagraphs = nofparagraphs + 1
texsetcount("global","c_anch_positions_paragraph",nofparagraphs)
- local box = getbox("strutbox")
- local w, h, d = getwhd(box)
+ local h = texgetdimen("strutht")
+ local d = texgetdimen("strutdp")
local t = {
p = true,
c = true,
@@ -704,8 +705,8 @@ implement {
name = "dosetpositionstrut",
arguments = "string",
actions = function(name)
- local box = getbox("strutbox")
- local w, h, d = getwhd(box)
+ local h = texgetdimen("strutht")
+ local d = texgetdimen("strutdp")
local spec = {
p = true,
c = column,
@@ -726,8 +727,8 @@ implement {
name = "dosetpositionstrutkind",
arguments = { "string", "integer" },
actions = function(name,kind)
- local box = getbox("strutbox")
- local w, h, d = getwhd(box)
+ local h = texgetdimen("strutht")
+ local d = texgetdimen("strutdp")
local spec = {
k = kind,
p = true,
diff --git a/tex/context/base/mkiv/char-def.lua b/tex/context/base/mkiv/char-def.lua
index 024002c07..aa6353297 100644
--- a/tex/context/base/mkiv/char-def.lua
+++ b/tex/context/base/mkiv/char-def.lua
@@ -22,6 +22,8 @@ adapting this file.
Updated end 2021 as prelude to ar's remote talk at the meeting. Needs some indic
checking (see comment field).
+
+Todo: get rid of specials = { "font", ... } in math ... we have already vectors.
]]--
local variants_emoji={
@@ -326,7 +328,7 @@ characters.data={
description="EXCLAMATION MARK",
direction="on",
linebreak="ex",
- mathclass="close",
+ mathclass="factorial",
synonyms={ "bang", "factorial" },
unicodeslot=0x21,
},
@@ -338,7 +340,7 @@ characters.data={
description="QUOTATION MARK",
direction="on",
linebreak="qu",
- mathclass="default",
+ mathclass="ordinary",
synonyms={ "neutral quotation mark" },
unicodeslot=0x22,
},
@@ -401,7 +403,7 @@ characters.data={
description="APOSTROPHE",
direction="on",
linebreak="qu",
- mathclass="default",
+ mathclass="ordinary",
synonyms={ "apl quote", "apostrophe-quote", "neutral single quotation mark" },
unicodeslot=0x27,
},
@@ -476,7 +478,7 @@ characters.data={
description="HYPHEN-MINUS",
direction="es",
linebreak="hy",
- mathclass="nothing",
+ mathclass="ordinary",
mathextensible="h",
mathfiller="relfill",
mathname="mathhyphen",
@@ -506,7 +508,7 @@ characters.data={
description="SOLIDUS",
direction="cs",
linebreak="sy",
- mathclass="middle",
+ mathclass="division",
synonyms={ "slash", "virgule" },
unicodeslot=0x2F,
},
@@ -517,7 +519,7 @@ characters.data={
description="DIGIT ZERO",
direction="en",
linebreak="nu",
- mathclass="number",
+ mathclass="digit",
unicodeslot=0x30,
variants={
[0xFE00]="short diagonal stroke form",
@@ -532,7 +534,7 @@ characters.data={
description="DIGIT ONE",
direction="en",
linebreak="nu",
- mathclass="number",
+ mathclass="digit",
unicodeslot=0x31,
variants=variants_emoji,
},
@@ -543,7 +545,7 @@ characters.data={
description="DIGIT TWO",
direction="en",
linebreak="nu",
- mathclass="number",
+ mathclass="digit",
unicodeslot=0x32,
variants=variants_emoji,
},
@@ -554,7 +556,7 @@ characters.data={
description="DIGIT THREE",
direction="en",
linebreak="nu",
- mathclass="number",
+ mathclass="digit",
unicodeslot=0x33,
variants=variants_emoji,
},
@@ -565,7 +567,7 @@ characters.data={
description="DIGIT FOUR",
direction="en",
linebreak="nu",
- mathclass="number",
+ mathclass="digit",
unicodeslot=0x34,
variants=variants_emoji,
},
@@ -576,7 +578,7 @@ characters.data={
description="DIGIT FIVE",
direction="en",
linebreak="nu",
- mathclass="number",
+ mathclass="digit",
unicodeslot=0x35,
variants=variants_emoji,
},
@@ -587,7 +589,7 @@ characters.data={
description="DIGIT SIX",
direction="en",
linebreak="nu",
- mathclass="number",
+ mathclass="digit",
unicodeslot=0x36,
variants=variants_emoji,
},
@@ -598,7 +600,7 @@ characters.data={
description="DIGIT SEVEN",
direction="en",
linebreak="nu",
- mathclass="number",
+ mathclass="digit",
unicodeslot=0x37,
variants=variants_emoji,
},
@@ -609,7 +611,7 @@ characters.data={
description="DIGIT EIGHT",
direction="en",
linebreak="nu",
- mathclass="number",
+ mathclass="digit",
unicodeslot=0x38,
variants=variants_emoji,
},
@@ -620,7 +622,7 @@ characters.data={
description="DIGIT NINE",
direction="en",
linebreak="nu",
- mathclass="number",
+ mathclass="digit",
unicodeslot=0x39,
variants=variants_emoji,
},
@@ -723,7 +725,6 @@ characters.data={
direction="l",
lccode=0x61,
linebreak="al",
- mathclass="variable",
unicodeslot=0x41,
},
{
@@ -734,7 +735,6 @@ characters.data={
direction="l",
lccode=0x62,
linebreak="al",
- mathclass="variable",
unicodeslot=0x42,
},
{
@@ -745,7 +745,6 @@ characters.data={
direction="l",
lccode=0x63,
linebreak="al",
- mathclass="variable",
unicodeslot=0x43,
},
{
@@ -756,7 +755,6 @@ characters.data={
direction="l",
lccode=0x64,
linebreak="al",
- mathclass="variable",
unicodeslot=0x44,
},
{
@@ -767,7 +765,6 @@ characters.data={
direction="l",
lccode=0x65,
linebreak="al",
- mathclass="variable",
unicodeslot=0x45,
},
{
@@ -778,7 +775,6 @@ characters.data={
direction="l",
lccode=0x66,
linebreak="al",
- mathclass="variable",
unicodeslot=0x46,
},
{
@@ -789,7 +785,6 @@ characters.data={
direction="l",
lccode=0x67,
linebreak="al",
- mathclass="variable",
unicodeslot=0x47,
},
{
@@ -800,7 +795,6 @@ characters.data={
direction="l",
lccode=0x68,
linebreak="al",
- mathclass="variable",
unicodeslot=0x48,
},
{
@@ -812,7 +806,6 @@ characters.data={
direction="l",
lccode=0x69,
linebreak="al",
- mathclass="variable",
unicodeslot=0x49,
},
{
@@ -824,7 +817,6 @@ characters.data={
direction="l",
lccode=0x6A,
linebreak="al",
- mathclass="variable",
unicodeslot=0x4A,
},
{
@@ -835,7 +827,6 @@ characters.data={
direction="l",
lccode=0x6B,
linebreak="al",
- mathclass="variable",
unicodeslot=0x4B,
},
{
@@ -846,7 +837,6 @@ characters.data={
direction="l",
lccode=0x6C,
linebreak="al",
- mathclass="variable",
unicodeslot=0x4C,
},
{
@@ -857,7 +847,6 @@ characters.data={
direction="l",
lccode=0x6D,
linebreak="al",
- mathclass="variable",
unicodeslot=0x4D,
},
{
@@ -868,7 +857,6 @@ characters.data={
direction="l",
lccode=0x6E,
linebreak="al",
- mathclass="variable",
unicodeslot=0x4E,
},
{
@@ -879,7 +867,6 @@ characters.data={
direction="l",
lccode=0x6F,
linebreak="al",
- mathclass="variable",
unicodeslot=0x4F,
},
{
@@ -890,7 +877,6 @@ characters.data={
direction="l",
lccode=0x70,
linebreak="al",
- mathclass="variable",
unicodeslot=0x50,
},
{
@@ -901,7 +887,6 @@ characters.data={
direction="l",
lccode=0x71,
linebreak="al",
- mathclass="variable",
unicodeslot=0x51,
},
{
@@ -912,7 +897,6 @@ characters.data={
direction="l",
lccode=0x72,
linebreak="al",
- mathclass="variable",
unicodeslot=0x52,
},
{
@@ -923,7 +907,6 @@ characters.data={
direction="l",
lccode=0x73,
linebreak="al",
- mathclass="variable",
unicodeslot=0x53,
},
{
@@ -934,7 +917,6 @@ characters.data={
direction="l",
lccode=0x74,
linebreak="al",
- mathclass="variable",
unicodeslot=0x54,
},
{
@@ -945,7 +927,6 @@ characters.data={
direction="l",
lccode=0x75,
linebreak="al",
- mathclass="variable",
unicodeslot=0x55,
},
{
@@ -956,7 +937,6 @@ characters.data={
direction="l",
lccode=0x76,
linebreak="al",
- mathclass="variable",
unicodeslot=0x56,
},
{
@@ -967,7 +947,6 @@ characters.data={
direction="l",
lccode=0x77,
linebreak="al",
- mathclass="variable",
unicodeslot=0x57,
},
{
@@ -978,7 +957,6 @@ characters.data={
direction="l",
lccode=0x78,
linebreak="al",
- mathclass="variable",
unicodeslot=0x58,
},
{
@@ -989,7 +967,6 @@ characters.data={
direction="l",
lccode=0x79,
linebreak="al",
- mathclass="variable",
unicodeslot=0x59,
},
{
@@ -1000,7 +977,6 @@ characters.data={
direction="l",
lccode=0x7A,
linebreak="al",
- mathclass="variable",
unicodeslot=0x5A,
},
{
@@ -1025,7 +1001,7 @@ characters.data={
description="REVERSE SOLIDUS",
direction="on",
linebreak="pr",
- mathclass="nothing",
+ mathclass="division",
mathname="backslash",
synonyms={ "backslash" },
unicodeslot=0x5C,
@@ -1088,7 +1064,6 @@ characters.data={
description="LATIN SMALL LETTER A",
direction="l",
linebreak="al",
- mathclass="variable",
uccode=0x41,
unicodeslot=0x61,
},
@@ -1099,7 +1074,6 @@ characters.data={
description="LATIN SMALL LETTER B",
direction="l",
linebreak="al",
- mathclass="variable",
uccode=0x42,
unicodeslot=0x62,
},
@@ -1110,7 +1084,6 @@ characters.data={
description="LATIN SMALL LETTER C",
direction="l",
linebreak="al",
- mathclass="variable",
uccode=0x43,
unicodeslot=0x63,
},
@@ -1121,7 +1094,6 @@ characters.data={
description="LATIN SMALL LETTER D",
direction="l",
linebreak="al",
- mathclass="variable",
uccode=0x44,
unicodeslot=0x64,
},
@@ -1132,7 +1104,6 @@ characters.data={
description="LATIN SMALL LETTER E",
direction="l",
linebreak="al",
- mathclass="variable",
uccode=0x45,
unicodeslot=0x65,
},
@@ -1143,7 +1114,6 @@ characters.data={
description="LATIN SMALL LETTER F",
direction="l",
linebreak="al",
- mathclass="variable",
uccode=0x46,
unicodeslot=0x66,
},
@@ -1154,7 +1124,6 @@ characters.data={
description="LATIN SMALL LETTER G",
direction="l",
linebreak="al",
- mathclass="variable",
uccode=0x47,
unicodeslot=0x67,
},
@@ -1165,7 +1134,6 @@ characters.data={
description="LATIN SMALL LETTER H",
direction="l",
linebreak="al",
- mathclass="variable",
uccode=0x48,
unicodeslot=0x68,
},
@@ -1177,7 +1145,6 @@ characters.data={
description="LATIN SMALL LETTER I",
direction="l",
linebreak="al",
- mathclass="variable",
uccode=0x49,
unicodeslot=0x69,
},
@@ -1188,7 +1155,6 @@ characters.data={
description="LATIN SMALL LETTER J",
direction="l",
linebreak="al",
- mathclass="variable",
uccode=0x4A,
unicodeslot=0x6A,
},
@@ -1199,7 +1165,6 @@ characters.data={
description="LATIN SMALL LETTER K",
direction="l",
linebreak="al",
- mathclass="variable",
uccode=0x4B,
unicodeslot=0x6B,
},
@@ -1210,7 +1175,6 @@ characters.data={
description="LATIN SMALL LETTER L",
direction="l",
linebreak="al",
- mathclass="variable",
uccode=0x4C,
unicodeslot=0x6C,
},
@@ -1221,7 +1185,6 @@ characters.data={
description="LATIN SMALL LETTER M",
direction="l",
linebreak="al",
- mathclass="variable",
uccode=0x4D,
unicodeslot=0x6D,
},
@@ -1232,7 +1195,6 @@ characters.data={
description="LATIN SMALL LETTER N",
direction="l",
linebreak="al",
- mathclass="variable",
uccode=0x4E,
unicodeslot=0x6E,
},
@@ -1243,7 +1205,6 @@ characters.data={
description="LATIN SMALL LETTER O",
direction="l",
linebreak="al",
- mathclass="variable",
uccode=0x4F,
unicodeslot=0x6F,
},
@@ -1254,7 +1215,6 @@ characters.data={
description="LATIN SMALL LETTER P",
direction="l",
linebreak="al",
- mathclass="variable",
uccode=0x50,
unicodeslot=0x70,
},
@@ -1265,7 +1225,6 @@ characters.data={
description="LATIN SMALL LETTER Q",
direction="l",
linebreak="al",
- mathclass="variable",
uccode=0x51,
unicodeslot=0x71,
},
@@ -1276,7 +1235,6 @@ characters.data={
description="LATIN SMALL LETTER R",
direction="l",
linebreak="al",
- mathclass="variable",
uccode=0x52,
unicodeslot=0x72,
},
@@ -1287,7 +1245,6 @@ characters.data={
description="LATIN SMALL LETTER S",
direction="l",
linebreak="al",
- mathclass="variable",
uccode=0x53,
unicodeslot=0x73,
},
@@ -1298,7 +1255,6 @@ characters.data={
description="LATIN SMALL LETTER T",
direction="l",
linebreak="al",
- mathclass="variable",
uccode=0x54,
unicodeslot=0x74,
},
@@ -1309,7 +1265,6 @@ characters.data={
description="LATIN SMALL LETTER U",
direction="l",
linebreak="al",
- mathclass="variable",
uccode=0x55,
unicodeslot=0x75,
},
@@ -1320,7 +1275,6 @@ characters.data={
description="LATIN SMALL LETTER V",
direction="l",
linebreak="al",
- mathclass="variable",
uccode=0x56,
unicodeslot=0x76,
},
@@ -1331,7 +1285,6 @@ characters.data={
description="LATIN SMALL LETTER W",
direction="l",
linebreak="al",
- mathclass="variable",
uccode=0x57,
unicodeslot=0x77,
},
@@ -1342,7 +1295,6 @@ characters.data={
description="LATIN SMALL LETTER X",
direction="l",
linebreak="al",
- mathclass="variable",
uccode=0x58,
unicodeslot=0x78,
},
@@ -1353,7 +1305,6 @@ characters.data={
description="LATIN SMALL LETTER Y",
direction="l",
linebreak="al",
- mathclass="variable",
uccode=0x59,
unicodeslot=0x79,
},
@@ -1364,7 +1315,6 @@ characters.data={
description="LATIN SMALL LETTER Z",
direction="l",
linebreak="al",
- mathclass="variable",
uccode=0x5A,
unicodeslot=0x7A,
},
@@ -1394,7 +1344,7 @@ characters.data={
linebreak="ba",
mathspec={
{
- class="nothing",
+ class="ordinary",
name="arrowvert",
},
{
@@ -1741,7 +1691,7 @@ characters.data={
description="YEN SIGN",
direction="et",
linebreak="pr",
- mathclass="nothing",
+ mathclass="ordinary",
mathname="yen",
synonyms={ "yuan sign" },
unicodeslot=0xA5,
@@ -1765,7 +1715,7 @@ characters.data={
description="SECTION SIGN",
direction="on",
linebreak="ai",
- mathclass="box",
+ mathclass="ordinary",
mathname="S",
synonyms={ "european paragraph sign" },
unicodeslot=0xA7,
@@ -1956,7 +1906,7 @@ characters.data={
description="PILCROW SIGN",
direction="on",
linebreak="ai",
- mathclass="box",
+ mathclass="ordinary",
mathname="P",
synonyms={ "european section sign", "paragraph sign" },
unicodeslot=0xB6,
@@ -4696,7 +4646,6 @@ characters.data={
description="LATIN SMALL LETTER LAMBDA WITH STROKE",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="lambdabar",
synonyms={ "latin letter lambda bar" },
unicodeslot=0x19B,
@@ -8186,6 +8135,9 @@ characters.data={
description="COMBINING GRAVE ACCENT",
direction="nsm",
linebreak="cm",
+ mathclass="topaccent",
+ mathname="widegrave",
+ mathstretch="h",
synonyms={ "greek varia" },
unicodeslot=0x300,
},
@@ -8705,6 +8657,7 @@ characters.data={
description="COMBINING LOW LINE",
direction="nsm",
linebreak="cm",
+ mathextensible="l",
synonyms={ "underline", "underscore" },
unicodeslot=0x332,
},
@@ -9537,7 +9490,6 @@ characters.data={
direction="l",
lccode=0x3B1,
linebreak="al",
- mathclass="variable",
mathname="Alpha",
unicodeslot=0x391,
},
@@ -9550,7 +9502,6 @@ characters.data={
direction="l",
lccode=0x3B2,
linebreak="al",
- mathclass="variable",
mathname="Beta",
unicodeslot=0x392,
},
@@ -9563,7 +9514,6 @@ characters.data={
direction="l",
lccode=0x3B3,
linebreak="al",
- mathclass="variable",
mathname="Gamma",
synonyms={ "gamma function" },
unicodeslot=0x393,
@@ -9577,7 +9527,6 @@ characters.data={
direction="l",
lccode=0x3B4,
linebreak="al",
- mathclass="variable",
mathname="Delta",
unicodeslot=0x394,
},
@@ -9590,7 +9539,6 @@ characters.data={
direction="l",
lccode=0x3B5,
linebreak="al",
- mathclass="variable",
mathname="Epsilon",
unicodeslot=0x395,
},
@@ -9603,7 +9551,6 @@ characters.data={
direction="l",
lccode=0x3B6,
linebreak="al",
- mathclass="variable",
mathname="Zeta",
unicodeslot=0x396,
},
@@ -9616,7 +9563,6 @@ characters.data={
direction="l",
lccode=0x3B7,
linebreak="al",
- mathclass="variable",
mathname="Eta",
unicodeslot=0x397,
},
@@ -9629,7 +9575,6 @@ characters.data={
direction="l",
lccode=0x3B8,
linebreak="al",
- mathclass="variable",
mathname="Theta",
unicodeslot=0x398,
},
@@ -9642,7 +9587,6 @@ characters.data={
direction="l",
lccode=0x3B9,
linebreak="al",
- mathclass="variable",
mathname="Iota",
unicodeslot=0x399,
},
@@ -9655,7 +9599,6 @@ characters.data={
direction="l",
lccode=0x3BA,
linebreak="al",
- mathclass="variable",
mathname="Kappa",
unicodeslot=0x39A,
},
@@ -9668,7 +9611,6 @@ characters.data={
direction="l",
lccode=0x3BB,
linebreak="al",
- mathclass="variable",
mathname="Lambda",
unicodeslot=0x39B,
},
@@ -9681,7 +9623,6 @@ characters.data={
direction="l",
lccode=0x3BC,
linebreak="al",
- mathclass="variable",
mathname="Mu",
unicodeslot=0x39C,
},
@@ -9694,7 +9635,6 @@ characters.data={
direction="l",
lccode=0x3BD,
linebreak="al",
- mathclass="variable",
mathname="Nu",
unicodeslot=0x39D,
},
@@ -9707,7 +9647,6 @@ characters.data={
direction="l",
lccode=0x3BE,
linebreak="al",
- mathclass="variable",
mathname="Xi",
unicodeslot=0x39E,
},
@@ -9720,7 +9659,6 @@ characters.data={
direction="l",
lccode=0x3BF,
linebreak="al",
- mathclass="variable",
mathname="Omicron",
unicodeslot=0x39F,
},
@@ -9733,7 +9671,6 @@ characters.data={
direction="l",
lccode=0x3C0,
linebreak="al",
- mathclass="variable",
mathname="Pi",
unicodeslot=0x3A0,
},
@@ -9746,7 +9683,6 @@ characters.data={
direction="l",
lccode=0x3C1,
linebreak="al",
- mathclass="variable",
mathname="Rho",
unicodeslot=0x3A1,
},
@@ -9759,7 +9695,6 @@ characters.data={
direction="l",
lccode=0x3C3,
linebreak="al",
- mathclass="variable",
mathname="Sigma",
unicodeslot=0x3A3,
},
@@ -9772,7 +9707,6 @@ characters.data={
direction="l",
lccode=0x3C4,
linebreak="al",
- mathclass="variable",
mathname="Tau",
unicodeslot=0x3A4,
},
@@ -9785,7 +9719,6 @@ characters.data={
direction="l",
lccode=0x3C5,
linebreak="al",
- mathclass="variable",
mathname="Upsilon",
unicodeslot=0x3A5,
},
@@ -9798,7 +9731,6 @@ characters.data={
direction="l",
lccode=0x3C6,
linebreak="al",
- mathclass="variable",
mathname="Phi",
unicodeslot=0x3A6,
},
@@ -9811,7 +9743,6 @@ characters.data={
direction="l",
lccode=0x3C7,
linebreak="al",
- mathclass="variable",
mathname="Chi",
unicodeslot=0x3A7,
},
@@ -9824,7 +9755,6 @@ characters.data={
direction="l",
lccode=0x3C8,
linebreak="al",
- mathclass="variable",
mathname="Psi",
unicodeslot=0x3A8,
},
@@ -9837,7 +9767,6 @@ characters.data={
direction="l",
lccode=0x3C9,
linebreak="al",
- mathclass="variable",
mathname="Omega",
unicodeslot=0x3A9,
},
@@ -9933,7 +9862,6 @@ characters.data={
description="GREEK SMALL LETTER ALPHA",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="alpha",
uccode=0x391,
unicodeslot=0x3B1,
@@ -9946,7 +9874,6 @@ characters.data={
description="GREEK SMALL LETTER BETA",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="beta",
uccode=0x392,
unicodeslot=0x3B2,
@@ -9959,7 +9886,6 @@ characters.data={
description="GREEK SMALL LETTER GAMMA",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="gamma",
uccode=0x393,
unicodeslot=0x3B3,
@@ -9972,7 +9898,6 @@ characters.data={
description="GREEK SMALL LETTER DELTA",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="delta",
uccode=0x394,
unicodeslot=0x3B4,
@@ -9985,7 +9910,6 @@ characters.data={
description="GREEK SMALL LETTER EPSILON",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="varepsilon",
uccode=0x395,
unicodeslot=0x3B5,
@@ -9998,7 +9922,6 @@ characters.data={
description="GREEK SMALL LETTER ZETA",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="zeta",
uccode=0x396,
unicodeslot=0x3B6,
@@ -10011,7 +9934,6 @@ characters.data={
description="GREEK SMALL LETTER ETA",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="eta",
uccode=0x397,
unicodeslot=0x3B7,
@@ -10024,7 +9946,6 @@ characters.data={
description="GREEK SMALL LETTER THETA",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="theta",
uccode=0x398,
unicodeslot=0x3B8,
@@ -10037,7 +9958,6 @@ characters.data={
description="GREEK SMALL LETTER IOTA",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="iota",
uccode=0x399,
unicodeslot=0x3B9,
@@ -10050,7 +9970,6 @@ characters.data={
description="GREEK SMALL LETTER KAPPA",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="kappa",
uccode=0x39A,
unicodeslot=0x3BA,
@@ -10063,7 +9982,6 @@ characters.data={
description="GREEK SMALL LETTER LAMDA",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="lambda",
uccode=0x39B,
unicodeslot=0x3BB,
@@ -10076,7 +9994,6 @@ characters.data={
description="GREEK SMALL LETTER MU",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="mu",
uccode=0x39C,
unicodeslot=0x3BC,
@@ -10089,7 +10006,6 @@ characters.data={
description="GREEK SMALL LETTER NU",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="nu",
uccode=0x39D,
unicodeslot=0x3BD,
@@ -10102,7 +10018,6 @@ characters.data={
description="GREEK SMALL LETTER XI",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="xi",
uccode=0x39E,
unicodeslot=0x3BE,
@@ -10115,7 +10030,6 @@ characters.data={
description="GREEK SMALL LETTER OMICRON",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="omicron",
uccode=0x39F,
unicodeslot=0x3BF,
@@ -10128,7 +10042,6 @@ characters.data={
description="GREEK SMALL LETTER PI",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="pi",
synonyms={ "mathematical constant 3.141592... pi", "mathematical constant pi" },
uccode=0x3A0,
@@ -10142,7 +10055,6 @@ characters.data={
description="GREEK SMALL LETTER RHO",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="rho",
uccode=0x3A1,
unicodeslot=0x3C1,
@@ -10154,7 +10066,6 @@ characters.data={
description="GREEK SMALL LETTER FINAL SIGMA",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="varsigma",
uccode=0x3C3,
unicodeslot=0x3C2,
@@ -10167,7 +10078,6 @@ characters.data={
description="GREEK SMALL LETTER SIGMA",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="sigma",
uccode=0x3A3,
unicodeslot=0x3C3,
@@ -10180,7 +10090,6 @@ characters.data={
description="GREEK SMALL LETTER TAU",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="tau",
uccode=0x3A4,
unicodeslot=0x3C4,
@@ -10193,7 +10102,6 @@ characters.data={
description="GREEK SMALL LETTER UPSILON",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="upsilon",
uccode=0x3A5,
unicodeslot=0x3C5,
@@ -10206,7 +10114,6 @@ characters.data={
description="GREEK SMALL LETTER PHI",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="varphi",
uccode=0x3A6,
unicodeslot=0x3C6,
@@ -10219,7 +10126,6 @@ characters.data={
description="GREEK SMALL LETTER CHI",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="chi",
uccode=0x3A7,
unicodeslot=0x3C7,
@@ -10232,7 +10138,6 @@ characters.data={
description="GREEK SMALL LETTER PSI",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="psi",
uccode=0x3A8,
unicodeslot=0x3C8,
@@ -10245,7 +10150,6 @@ characters.data={
description="GREEK SMALL LETTER OMEGA",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="omega",
uccode=0x3A9,
unicodeslot=0x3C9,
@@ -10337,7 +10241,6 @@ characters.data={
description="GREEK THETA SYMBOL",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="varTheta",
specials={ "compat", 0x3B8 },
synonyms={ "script theta" },
@@ -10378,7 +10281,6 @@ characters.data={
description="GREEK PHI SYMBOL",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="phi",
specials={ "compat", 0x3C6 },
uccode=0x3C6,
@@ -10391,7 +10293,6 @@ characters.data={
description="GREEK PI SYMBOL",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="varpi",
specials={ "compat", 0x3C0 },
synonyms={ "omega pi" },
@@ -10447,7 +10348,6 @@ characters.data={
direction="l",
lccode=0x3DD,
linebreak="al",
- mathclass="variable",
mathname="digamma",
unicodeslot=0x3DC,
},
@@ -10679,7 +10579,6 @@ characters.data={
description="GREEK LUNATE EPSILON SYMBOL",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="epsilon",
specials={ "compat", 0x3B5 },
synonyms={ "straight epsilon" },
@@ -10691,7 +10590,6 @@ characters.data={
description="GREEK REVERSED LUNATE EPSILON SYMBOL",
direction="on",
linebreak="al",
- mathclass="variable",
mathname="backepsilon",
synonyms={ "reversed straight epsilon" },
unicodeslot=0x3F6,
@@ -23166,7 +23064,6 @@ characters.data={
direction="l",
indic="d",
indicmark="l",
- indicorder="bh",
linebreak="cm",
unicodeslot=0x9C8,
},
@@ -23218,7 +23115,8 @@ characters.data={
category="mc",
description="BENGALI AU LENGTH MARK",
direction="l",
- indic="o",
+ indic="d",
+ indicmark="r",
indicorder="ap",
linebreak="cm",
unicodeslot=0x9D7,
@@ -62435,7 +62333,7 @@ characters.data={
name="Vert",
},
{
- class="nothing",
+ class="ordinary",
name="Arrowvert",
},
{
@@ -62558,7 +62456,7 @@ characters.data={
name="dagger",
},
{
- class="box",
+ class="ordinary",
name="dag",
},
},
@@ -62579,7 +62477,7 @@ characters.data={
name="ddagger",
},
{
- class="box",
+ class="ordinary",
name="ddag",
},
},
@@ -62750,7 +62648,7 @@ characters.data={
description="PRIME",
direction="et",
linebreak="po",
- mathclass="nothing",
+ mathclass="prime",
mathname="prime",
synonyms={ "feet", "minutes" },
unicodeslot=0x2032,
@@ -62762,7 +62660,7 @@ characters.data={
description="DOUBLE PRIME",
direction="et",
linebreak="po",
- mathclass="nothing",
+ mathclass="prime",
mathname="doubleprime",
specials={ "compat", 0x2032, 0x2032 },
synonyms={ "inches", "seconds" },
@@ -62773,7 +62671,7 @@ characters.data={
description="TRIPLE PRIME",
direction="et",
linebreak="po",
- mathclass="nothing",
+ mathclass="prime",
mathname="tripleprime",
specials={ "compat", 0x2032, 0x2032, 0x2032 },
unicodeslot=0x2034,
@@ -62785,7 +62683,7 @@ characters.data={
description="REVERSED PRIME",
direction="on",
linebreak="po",
- mathclass="nothing",
+ mathclass="prime",
mathname="reversedprime",
unicodeslot=0x2035,
},
@@ -62794,7 +62692,7 @@ characters.data={
description="REVERSED DOUBLE PRIME",
direction="on",
linebreak="po",
- mathclass="nothing",
+ mathclass="prime",
mathname="reverseddoubleprime",
specials={ "compat", 0x2035, 0x2035 },
unicodeslot=0x2036,
@@ -62804,7 +62702,7 @@ characters.data={
description="REVERSED TRIPLE PRIME",
direction="on",
linebreak="po",
- mathclass="nothing",
+ mathclass="prime",
mathname="reversedtripleprime",
specials={ "compat", 0x2035, 0x2035, 0x2035 },
unicodeslot=0x2037,
@@ -63089,7 +62987,7 @@ characters.data={
description="QUADRUPLE PRIME",
direction="on",
linebreak="al",
- mathclass="nothing",
+ mathclass="prime",
mathname="quadrupleprime",
specials={ "compat", 0x2032, 0x2032, 0x2032, 0x2032 },
unicodeslot=0x2057,
@@ -64046,7 +63944,7 @@ characters.data={
description="COMBINING ENCLOSING SQUARE",
direction="nsm",
linebreak="cm",
- mathclass="default",
+ mathclass="ordinary",
mathname="bigsquare",
unicodeslot=0x20DE,
},
@@ -64055,7 +63953,7 @@ characters.data={
description="COMBINING ENCLOSING DIAMOND",
direction="nsm",
linebreak="cm",
- mathclass="default",
+ mathclass="ordinary",
mathname="bigdiamond",
unicodeslot=0x20DF,
},
@@ -64220,7 +64118,6 @@ characters.data={
description="DOUBLE-STRUCK CAPITAL C",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="complexes",
specials={ "font", 0x43 },
synonyms={ "complex numbers", "the set of complex numbers" },
@@ -64269,7 +64166,6 @@ characters.data={
description="EULER CONSTANT",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="Eulerconst",
specials={ "compat", 0x190 },
unicodeslot=0x2107,
@@ -64333,7 +64229,6 @@ characters.data={
description="PLANCK CONSTANT",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="Plankconst",
specials={ "font", 0x68 },
unicodeslot=0x210E,
@@ -64345,7 +64240,7 @@ characters.data={
linebreak="al",
mathspec={
{
- class="variable",
+ class="ordinary",
name="hslash",
},
{
@@ -64372,7 +64267,6 @@ characters.data={
description="BLACK-LETTER CAPITAL I",
direction="l",
linebreak="al",
- mathclass="default",
mathname="Im",
specials={ "font", 0x49 },
synonyms={ "imaginary part" },
@@ -64397,7 +64291,7 @@ characters.data={
description="SCRIPT SMALL L",
direction="l",
linebreak="ai",
- mathclass="default",
+ mathclass="ordinary",
mathname="ell",
specials={ "font", 0x6C },
synonyms={ "liter" },
@@ -64416,7 +64310,6 @@ characters.data={
description="DOUBLE-STRUCK CAPITAL N",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="naturalnumbers",
specials={ "font", 0x4E },
synonyms={ "natural number" },
@@ -64448,7 +64341,6 @@ characters.data={
description="SCRIPT CAPITAL P",
direction="on",
linebreak="al",
- mathclass="default",
mathname="wp",
synonyms={ "weierstrass elliptic function" },
unicodeslot=0x2118,
@@ -64458,7 +64350,6 @@ characters.data={
description="DOUBLE-STRUCK CAPITAL P",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="primes",
specials={ "font", 0x50 },
unicodeslot=0x2119,
@@ -64468,7 +64359,6 @@ characters.data={
description="DOUBLE-STRUCK CAPITAL Q",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="rationals",
specials={ "font", 0x51 },
synonyms={ "rational numbers", "the set of rational numbers" },
@@ -64491,7 +64381,6 @@ characters.data={
description="BLACK-LETTER CAPITAL R",
direction="l",
linebreak="al",
- mathclass="default",
mathname="Re",
specials={ "font", 0x52 },
synonyms={ "real part" },
@@ -64502,7 +64391,6 @@ characters.data={
description="DOUBLE-STRUCK CAPITAL R",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="reals",
specials={ "font", 0x52 },
synonyms={ "real numbers", "the set of real numbers" },
@@ -64566,7 +64454,6 @@ characters.data={
description="DOUBLE-STRUCK CAPITAL Z",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="integers",
specials={ "font", 0x5A },
synonyms={ "integers", "the set of integers" },
@@ -64589,7 +64476,6 @@ characters.data={
direction="l",
lccode=0x3C9,
linebreak="al",
- mathclass="variable",
mathname="ohm",
specials={ "char", 0x3A9 },
unicodeslot=0x2126,
@@ -64600,7 +64486,6 @@ characters.data={
description="INVERTED OHM SIGN",
direction="on",
linebreak="al",
- mathclass="variable",
mathname="mho",
synonyms={ "mho" },
unicodeslot=0x2127,
@@ -64618,7 +64503,6 @@ characters.data={
description="TURNED GREEK SMALL LETTER IOTA",
direction="on",
linebreak="al",
- mathclass="variable",
mathname="turnediota",
synonyms={ "unique element" },
unicodeslot=0x2129,
@@ -64642,7 +64526,6 @@ characters.data={
direction="l",
lccode=0xE5,
linebreak="ai",
- mathclass="variable",
mathname="Angstrom",
specials={ "char", 0xC5 },
unicodeslot=0x212B,
@@ -64744,7 +64627,7 @@ characters.data={
description="ALEF SYMBOL",
direction="l",
linebreak="al",
- mathclass="default",
+ mathclass="ordinary",
mathname="aleph",
specials={ "compat", 0x5D0 },
synonyms={ "first transfinite cardinal", "first transfinite cardinal countable" },
@@ -64755,7 +64638,7 @@ characters.data={
description="BET SYMBOL",
direction="l",
linebreak="al",
- mathclass="default",
+ mathclass="ordinary",
mathname="beth",
specials={ "compat", 0x5D1 },
synonyms={ "second transfinite cardinal", "second transfinite cardinal continuum" },
@@ -64766,7 +64649,7 @@ characters.data={
description="GIMEL SYMBOL",
direction="l",
linebreak="al",
- mathclass="default",
+ mathclass="ordinary",
mathname="gimel",
specials={ "compat", 0x5D2 },
synonyms={ "third transfinite cardinal" },
@@ -64777,7 +64660,7 @@ characters.data={
description="DALET SYMBOL",
direction="l",
linebreak="al",
- mathclass="default",
+ mathclass="ordinary",
mathname="daleth",
specials={ "compat", 0x5D3 },
synonyms={ "fourth transfinite cardinal" },
@@ -64889,7 +64772,7 @@ characters.data={
description="DOUBLE-STRUCK ITALIC CAPITAL D",
direction="l",
linebreak="al",
- mathclass="nothing",
+ mathclass="differential",
mathname="differentialD",
specials={ "font", 0x44 },
unicodeslot=0x2145,
@@ -64899,7 +64782,7 @@ characters.data={
description="DOUBLE-STRUCK ITALIC SMALL D",
direction="l",
linebreak="al",
- mathclass="nothing",
+ mathclass="differential",
mathname="differentiald",
specials={ "font", 0x64 },
unicodeslot=0x2146,
@@ -64909,7 +64792,7 @@ characters.data={
description="DOUBLE-STRUCK ITALIC SMALL E",
direction="l",
linebreak="al",
- mathclass="nothing",
+ mathclass="exponential",
mathname="exponentiale",
specials={ "font", 0x65 },
unicodeslot=0x2147,
@@ -64919,7 +64802,7 @@ characters.data={
description="DOUBLE-STRUCK ITALIC SMALL I",
direction="l",
linebreak="al",
- mathclass="nothing",
+ mathclass="ordinary",
mathname="imaginaryi",
specials={ "font", 0x69 },
unicodeslot=0x2148,
@@ -64929,7 +64812,7 @@ characters.data={
description="DOUBLE-STRUCK ITALIC SMALL J",
direction="l",
linebreak="al",
- mathclass="nothing",
+ mathclass="ordinary",
mathname="imaginaryj",
specials={ "font", 0x6A },
unicodeslot=0x2149,
@@ -66891,7 +66774,7 @@ characters.data={
description="PARTIAL DIFFERENTIAL",
direction="on",
linebreak="ai",
- mathclass="default",
+ mathclass="differential",
mathname="partial",
unicodeslot=0x2202,
},
@@ -66923,7 +66806,7 @@ characters.data={
description="EMPTY SET",
direction="on",
linebreak="al",
- mathclass="default",
+ mathclass="ordinary",
mathname="emptyset",
synonyms={ "null set" },
unicodeslot=0x2205,
@@ -66947,7 +66830,7 @@ characters.data={
description="NABLA",
direction="on",
linebreak="ai",
- mathclass="default",
+ mathclass="ordinary",
mathname="nabla",
synonyms={ "backward difference", "del" },
unicodeslot=0x2207,
@@ -67229,7 +67112,7 @@ characters.data={
description="INFINITY",
direction="on",
linebreak="ai",
- mathclass="default",
+ mathclass="ordinary",
mathname="infty",
unicodeslot=0x221E,
},
@@ -67419,7 +67302,7 @@ characters.data={
name="int",
},
{
- class="nothing",
+ class="ordinary",
name="intop",
},
},
@@ -67439,7 +67322,7 @@ characters.data={
name="iint",
},
{
- class="nothing",
+ class="ordinary",
name="iintop",
},
},
@@ -67458,7 +67341,7 @@ characters.data={
name="iiint",
},
{
- class="nothing",
+ class="ordinary",
name="iiintop",
},
},
@@ -68790,7 +68673,7 @@ characters.data={
description="DOWN TACK",
direction="on",
linebreak="al",
- mathclass="default",
+ mathclass="ordinary",
mathname="top",
synonyms={ "top" },
unicodeslot=0x22A4,
@@ -68804,7 +68687,7 @@ characters.data={
linebreak="ai",
mathspec={
{
- class="default",
+ class="ordinary",
name="bot",
},
{
@@ -69717,11 +69600,11 @@ characters.data={
linebreak="al",
mathspec={
{
- class="ord",
+ class="ordinary",
name="varnothing",
},
{
- class="ord",
+ class="ordinary",
name="diameter",
},
},
@@ -76494,7 +76377,7 @@ characters.data={
description="BLACK SPADE SUIT",
direction="on",
linebreak="ai",
- mathclass="default",
+ mathclass="ordinary",
mathname="spadesuit",
unicodeslot=0x2660,
variants=variants_emoji,
@@ -76506,7 +76389,7 @@ characters.data={
description="WHITE HEART SUIT",
direction="on",
linebreak="ai",
- mathclass="default",
+ mathclass="ordinary",
mathname="heartsuit",
unicodeslot=0x2661,
},
@@ -76516,7 +76399,7 @@ characters.data={
description="WHITE DIAMOND SUIT",
direction="on",
linebreak="al",
- mathclass="default",
+ mathclass="ordinary",
mathname="diamondsuit",
unicodeslot=0x2662,
},
@@ -76527,7 +76410,7 @@ characters.data={
description="BLACK CLUB SUIT",
direction="on",
linebreak="ai",
- mathclass="default",
+ mathclass="ordinary",
mathname="clubsuit",
synonyms={ "shamrock" },
unicodeslot=0x2663,
@@ -76629,7 +76512,7 @@ characters.data={
description="MUSIC FLAT SIGN",
direction="on",
linebreak="ai",
- mathclass="default",
+ mathclass="ordinary",
mathname="flat",
unicodeslot=0x266D,
},
@@ -76638,7 +76521,7 @@ characters.data={
description="MUSIC NATURAL SIGN",
direction="on",
linebreak="al",
- mathclass="default",
+ mathclass="ordinary",
mathname="natural",
unicodeslot=0x266E,
},
@@ -76649,7 +76532,7 @@ characters.data={
description="MUSIC SHARP SIGN",
direction="on",
linebreak="ai",
- mathclass="default",
+ mathclass="ordinary",
mathname="sharp",
synonyms={ "infix bag count" },
unicodeslot=0x266F,
@@ -77950,7 +77833,7 @@ characters.data={
description="CHECK MARK",
direction="on",
linebreak="al",
- mathclass="nothing",
+ mathclass="ordinary",
mathname="checkmark",
unicodeslot=0x2713,
},
@@ -78046,7 +77929,7 @@ characters.data={
description="MALTESE CROSS",
direction="on",
linebreak="al",
- mathclass="nothing",
+ mathclass="ordinary",
mathname="maltese",
unicodeslot=0x2720,
},
@@ -83685,7 +83568,7 @@ characters.data={
name="iiiint",
},
{
- class="nothing",
+ class="ordinary",
name="iiiintop",
},
},
@@ -227475,6 +227358,13 @@ characters.data={
description="MATHEMATICAL ITALIC CAPITAL D",
direction="l",
linebreak="al",
+ mathclass="ordinary",
+ mathspec={
+ {
+ name="Dd",
+ class="differential",
+ },
+ },
specials={ "font", 0x44 },
unicodeslot=0x1D437,
visual="it",
@@ -227709,6 +227599,13 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL D",
direction="l",
linebreak="al",
+ mathclass="ordinary",
+ mathspec={
+ {
+ name="dd",
+ class="differential",
+ },
+ },
specials={ "font", 0x64 },
unicodeslot=0x1D451,
visual="it",
@@ -227718,6 +227615,13 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL E",
direction="l",
linebreak="al",
+ mathclass="ordinary",
+ mathspec={
+ {
+ name="ee",
+ class="exponential",
+ },
+ },
specials={ "font", 0x65 },
unicodeslot=0x1D452,
visual="it",
@@ -227745,6 +227649,13 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL I",
direction="l",
linebreak="al",
+ mathclass="ordinary",
+ mathspec={
+ {
+ name="ii",
+ class="imaginary",
+ },
+ },
specials={ "font", 0x69 },
unicodeslot=0x1D456,
visual="it",
@@ -227754,6 +227665,13 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL J",
direction="l",
linebreak="al",
+ mathclass="ordinary",
+ mathspec={
+ {
+ name="ji",
+ class="imaginary",
+ },
+ },
specials={ "font", 0x6A },
unicodeslot=0x1D457,
visual="it",
@@ -232673,7 +232591,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL DOTLESS I",
direction="l",
linebreak="al",
- mathclass="default",
+ mathclass="ordinary",
mathname="imath",
specials={ "font", 0x131 },
unicodeslot=0x1D6A4,
@@ -232684,7 +232602,7 @@ characters.data={
description="MATHEMATICAL ITALIC SMALL DOTLESS J",
direction="l",
linebreak="al",
- mathclass="default",
+ mathclass="ordinary",
mathname="jmath",
specials={ "font", 0x237 },
unicodeslot=0x1D6A5,
@@ -233154,6 +233072,7 @@ characters.data={
description="MATHEMATICAL BOLD PARTIAL DIFFERENTIAL",
direction="on",
linebreak="al",
+ mathclass="differential",
specials={ "font", 0x2202 },
unicodeslot=0x1D6DB,
visual="bf",
@@ -233442,7 +233361,7 @@ characters.data={
description="MATHEMATICAL ITALIC NABLA",
direction="l",
linebreak="al",
- mathclass="default",
+ mathclass="ordinary",
specials={ "font", 0x2207 },
unicodeslot=0x1D6FB,
visual="it",
@@ -233677,6 +233596,7 @@ characters.data={
description="MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL",
direction="on",
linebreak="al",
+ mathclass="differential",
specials={ "font", 0x2202 },
unicodeslot=0x1D715,
visual="it",
@@ -233695,7 +233615,7 @@ characters.data={
description="MATHEMATICAL ITALIC THETA SYMBOL",
direction="l",
linebreak="al",
- mathclass="default",
+ mathclass="ordinary",
mathname="vartheta",
specials={ "font", 0x3D1 },
unicodeslot=0x1D717,
@@ -233706,7 +233626,7 @@ characters.data={
description="MATHEMATICAL ITALIC KAPPA SYMBOL",
direction="l",
linebreak="al",
- mathclass="default",
+ mathclass="ordinary",
mathname="varkappa",
specials={ "font", 0x3F0 },
unicodeslot=0x1D718,
@@ -233726,7 +233646,6 @@ characters.data={
description="MATHEMATICAL ITALIC RHO SYMBOL",
direction="l",
linebreak="al",
- mathclass="variable",
mathname="varrho",
specials={ "font", 0x3F1 },
unicodeslot=0x1D71A,
@@ -234205,6 +234124,7 @@ characters.data={
description="MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL",
direction="on",
linebreak="al",
+ mathclass="differential",
specials={ "font", 0x2202 },
unicodeslot=0x1D74F,
visual="bi",
@@ -234727,6 +234647,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL",
direction="on",
linebreak="al",
+ mathclass="differential",
specials={ "font", 0x2202 },
unicodeslot=0x1D789,
visual="bf",
@@ -235249,6 +235170,7 @@ characters.data={
description="MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL",
direction="on",
linebreak="al",
+ mathclass="differential",
specials={ "font", 0x2202 },
unicodeslot=0x1D7C3,
visual="bi",
diff --git a/tex/context/base/mkiv/cont-new.mkiv b/tex/context/base/mkiv/cont-new.mkiv
index fb27e5d04..f33357f04 100644
--- a/tex/context/base/mkiv/cont-new.mkiv
+++ b/tex/context/base/mkiv/cont-new.mkiv
@@ -13,7 +13,7 @@
% \normalend % uncomment this to get the real base runtime
-\newcontextversion{2022.01.21 20:10}
+\newcontextversion{2022.03.12 11:24}
%D This file is loaded at runtime, thereby providing an excellent place for hacks,
%D patches, extensions and new features. There can be local overloads in cont-loc
diff --git a/tex/context/base/mkiv/context.mkiv b/tex/context/base/mkiv/context.mkiv
index 1aaa77a0f..1e81770dc 100644
--- a/tex/context/base/mkiv/context.mkiv
+++ b/tex/context/base/mkiv/context.mkiv
@@ -49,7 +49,7 @@
%D {YYYY.MM.DD HH:MM} format.
\edef\contextformat {\jobname}
-\edef\contextversion{2022.01.21 20:10}
+\edef\contextversion{2022.03.12 11:24}
%D Kind of special:
diff --git a/tex/context/base/mkiv/font-osd.lua b/tex/context/base/mkiv/font-osd.lua
index 34c047290..d169faf64 100644
--- a/tex/context/base/mkiv/font-osd.lua
+++ b/tex/context/base/mkiv/font-osd.lua
@@ -6,6 +6,16 @@ if not modules then modules = { } end modules ['font-osd'] = { -- script devanag
license = "see context related readme files"
}
+local experiment1 = false
+local experiment2 = false
+local experiment2b1 = false
+local experiment2b2 = false
+
+experiments.register("fonts.indic.experiment1", function(v) experiment1 = v end)
+experiments.register("fonts.indic.experiment2", function(v) experiment2 = v end)
+experiments.register("fonts.indic.experiment2b1", function(v) experiment2b1 = v end)
+experiments.register("fonts.indic.experiment2b2", function(v) experiment2b2 = v end)
+
-- we need to check nbsphash (context only)
-- A few remarks:
@@ -1382,13 +1392,16 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
end
if reph or vattu then
+-- print(">>> has reph or vattu")
local current = start
local cns = nil
local done = false
while current ~= stop do
+-- print("\t>>> current ~= stop yet")
local c = current
local n = getnext(current)
if ra[getchar(current)] and halant[getchar(n)] then
+-- print("\t\t>>> current ra; next halant")
c = n
n = getnext(n)
local b, bn = base, base
@@ -1402,6 +1415,7 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
if getstate(current,s_rphf) then
-- position Reph (Ra + H) after post-base 'matra' (if any) since these
-- become marks on the 'matra', not on the base glyph
+-- print("\t\t\t>>> ra + halant form → reph")
if b ~= current then
if current == start then
if head == start then
@@ -1421,6 +1435,7 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
end
elseif cns and getnext(cns) ~= current then -- todo: optimize next
-- position below-base Ra (vattu) following the consonants on which it is placed (either the base consonant or one of the pre-base consonants)
+-- print("\t\t\t>>> ra below base (vattu) → rkrf")
local cp = getprev(current)
local cnsn = getnext(cns)
setlink(cp,n)
@@ -1434,14 +1449,17 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
current = getprev(n)
end
else
+-- print("\t\t>>> NOT! current ra; next halant")
local char = getchar(current)
if consonant[char] then
+-- print("\t\t\t>>> is consonant")
cns = current
local next = getnext(cns)
if halant[getchar(next)] then
cns = next
end
if not vatucache[char] then
+-- print("\t\t\t\t>>> is in vatucache")
next = getnext(cns)
while dependent_vowel[getchar(next)] do
cns = next
@@ -1449,6 +1467,7 @@ local function reorder_one(head,start,stop,font,attr,nbspaces)
end
end
elseif char == c_nbsp then
+-- print("\t\t\t>>> is nbsp")
nbspaces = nbspaces + 1
cns = current
local next = getnext(cns)
@@ -1917,6 +1936,8 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas
reorderreph.coverage = { } -- use local
rephbase[font] = { } -- use local
+-- print("!!!!!! reorder two ")
+
for i=1,#seqsubset do
-- this can be done more efficient, the last test and less getnext
@@ -2104,6 +2125,7 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas
end
end
else -- not Stand Alone cluster
+-- print("!!!! not standalone cluster")
local last = getnext(stop)
while current ~= last do -- find base consonant
local next = getnext(current)
@@ -2173,7 +2195,10 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas
end
end
--
- if not moved[current] and dependent_vowel[char] then
+-- print("char: " .. char)
+-- if not moved[current] and dependent_vowel[char] then
+ if dependent_vowel[char] then
+-- print(">>!! dependent vowel")
if pre_mark[char] then -- or: if before_main or before_half
moved[current] = true
-- can be helper to remove one node
@@ -2384,8 +2409,8 @@ local function analyze_next_chars_one(c,font,variant) -- skip one dependent vowe
if not n then
return c
end
+ local v = ischar(n,font)
if variant == 1 then
- local v = ischar(n,font)
if v and nukta[v] then
n = getnext(n)
if n then
@@ -2418,7 +2443,6 @@ local function analyze_next_chars_one(c,font,variant) -- skip one dependent vowe
end
end
elseif variant == 2 then
- local v = ischar(n,font)
if v and nukta[v] then
c = n
end
@@ -2443,11 +2467,11 @@ local function analyze_next_chars_one(c,font,variant) -- skip one dependent vowe
end
end
-- c = ms_matra(c)
- local n = getnext(c)
+ n = getnext(c)
if not n then
return c
end
- local v = ischar(n,font)
+ v = ischar(n,font)
if not v then
return c
end
@@ -2555,13 +2579,22 @@ local function analyze_next_chars_one(c,font,variant) -- skip one dependent vowe
end
end
+-- Consonant syllable:
+--
+-- { C + [ N ] + < H + [ < ZWNJ | ZWJ > ] | < ZWNJ | ZWJ > + H > }
+-- + C
+-- + [ N ]
+-- + [ A ]
+-- + [ < H + [ < ZWNJ|ZWJ > ] | { M } + [ N ] + [ H ] > ]
+-- + [ SM ]
+-- + [ ( VD ) ]
+
local function analyze_next_chars_two(c,font)
- local n, v
- n = getnext(c)
+ local n = getnext(c)
if not n then
return c
end
- v = ischar(n,font)
+ local v = ischar(n,font)
if v and nukta[v] then
c = n
end
@@ -2677,6 +2710,10 @@ local function analyze_next_chars_two(c,font)
for k=1,#vowels do
local v = vowels[k]
if pre_mark[v] and not already_pre_mark then
+-- print(">>> pre_mark")
+-- if dependent_vowel[v] then
+-- print(">>>> dependent vowel")
+-- end
already_pre_mark = true
elseif above_mark[v] and not already_above_mark then
already_above_mark = true
@@ -3031,12 +3068,15 @@ local function method_two(head,font,attr)
end
end
if independent_vowel[char] then
+-- print("!!>>> independent_vowel")
-- vowel-based syllable: [Ra+H]+V+[N]+[<[<ZWJ|ZWNJ>]+H+C|ZWJ+C>]+[{M}+[N]+[H]]+[SM]+[(VD)]
current = analyze_next_chars_one(c,font,1)
syllableend = current
else
+-- print("!!>>> dependent vowel")
local standalone = char == c_nbsp
if standalone then
+-- print("!!>>> standalone")
nbspaces = nbspaces + 1
local p = getprev(current)
if not p then
@@ -3050,10 +3090,12 @@ local function method_two(head,font,attr)
end
end
if standalone then
+-- print("!!>>>>>>> next standalone")
-- Stand Alone cluster (at the start of the word only): #[Ra+H]+NBSP+[N]+[<[<ZWJ|ZWNJ>]+H+C>]+[{M}+[N]+[H]]+[SM]+[(VD)]
current = analyze_next_chars_one(c,font,2)
syllableend = current
elseif consonant[getchar(current)] then
+-- print("!!>>>>>>> a consonant")
-- WHY current INSTEAD OF c ?
-- Consonant syllable: {C+[N]+<H+[<ZWNJ|ZWJ>]|<ZWNJ|ZWJ>+H>} + C+[N]+[A] + [< H+[<ZWNJ|ZWJ>] | {M}+[N]+[H]>]+[SM]+[(VD)]
current = analyze_next_chars_two(current,font) -- not c !
@@ -3062,6 +3104,7 @@ local function method_two(head,font,attr)
end
end
if syllableend then
+-- print("!!!>>> syllable end")
syllabe = syllabe + 1
local c = syllablestart
local n = getnext(syllableend)
diff --git a/tex/context/base/mkiv/font-otc.lua b/tex/context/base/mkiv/font-otc.lua
index 2c955dbce..342541f12 100644
--- a/tex/context/base/mkiv/font-otc.lua
+++ b/tex/context/base/mkiv/font-otc.lua
@@ -130,7 +130,7 @@ local function validspecification(specification,name)
end
end
-local function addfeature(data,feature,specifications)
+local function addfeature(data,feature,specifications,prepareonly)
-- todo: add some validator / check code so that we're more tolerant to
-- user errors
@@ -461,13 +461,13 @@ local function addfeature(data,feature,specifications)
return false
end
+ -- 0 == remove, false = ignore (remove is default)
+
local function prepare_chain(list,featuretype,sublookups,nocheck)
-- todo: coveractions
local rules = list.rules
local coverage = { }
if rules then
- local rulehash = { }
- local rulesize = 0
local lookuptype = types[featuretype]
for nofrules=1,#rules do
local rule = rules[nofrules]
@@ -498,6 +498,15 @@ local function addfeature(data,feature,specifications)
local lookups = rule.lookups or false
local subtype = nil
if lookups and sublookups then
+-- inspect(lookups)
+if #lookups > 0 then
+ local ns = stop - start + 1
+ for i=1,ns do
+ if lookups[i] == nil then
+ lookups[i] = 0
+ end
+ end
+end
local l = { }
for k, v in sortedhash(lookups) do
local t = type(v)
@@ -535,6 +544,7 @@ local function addfeature(data,feature,specifications)
if nofsequences > 0 then -- we merge coverage into one
-- we copy as we can have different fonts
if hassteps(lookups) then
+ -- sequence is the before|current|after match list
local hashed = { }
for i=1,nofsequences do
local t = { }
@@ -547,9 +557,9 @@ local function addfeature(data,feature,specifications)
end
hashed[i] = t
end
+ -- hashed is the before|current|after match hash
sequence = hashed
- rulesize = rulesize + 1
- rulehash[rulesize] = {
+ local ruleset = {
nofrules, -- 1
lookuptype, -- 2
sequence, -- 3
@@ -561,8 +571,15 @@ local function addfeature(data,feature,specifications)
}
for unic in sortedhash(sequence[start]) do
local cu = coverage[unic]
- if not cu then
- coverage[unic] = rulehash -- can now be done cleaner i think
+ if cu then
+ local n = cu.n + 1
+ cu[n] = ruleset
+ cu.n = n
+ else
+ coverage[unic] = {
+ ruleset,
+ n = 1,
+ }
end
end
sequence.n = nofsequences
@@ -571,7 +588,6 @@ local function addfeature(data,feature,specifications)
end
end
end
- rulehash.n = rulesize
end
return coverage
end
@@ -813,6 +829,9 @@ local function addfeature(data,feature,specifications)
nofsteps = nofsteps,
type = types[featuretype],
}
+ if prepareonly then
+ return sequence
+ end
end
end
@@ -900,6 +919,23 @@ local function enhance(data,filename,raw)
end
end
+-- local function enhance(data,filename,raw)
+-- local first = 1
+-- local last = #extrafeatures
+-- while true do
+-- for slot=first,last do
+-- local specification = extrafeatures[slot]
+-- addfeature(data,specification.name,specification)
+-- end
+-- if #extrafeatures > last then
+-- first = last + 1
+-- last = #extrafeatures
+-- else
+-- break
+-- end
+-- end
+-- end
+
otf.enhancers.enhance = enhance
otf.enhancers.register("check extra features",enhance)
diff --git a/tex/context/base/mkiv/lang-imp-indic.lua b/tex/context/base/mkiv/lang-imp-indic.lua
index 5c766c5ef..164b765cc 100644
--- a/tex/context/base/mkiv/lang-imp-indic.lua
+++ b/tex/context/base/mkiv/lang-imp-indic.lua
@@ -1,12 +1,10 @@
-local zwj = utf.char(0x200D)
-
return {
name = "indic transliterations",
version = "1.00",
comment = "Experimental code, the name of this file might change"
.. "or maybe it become a llg file in the end.",
- author = "kauśika and hans",
+ author = "Sreeram and Hans",
copyright = "ConTeXt development team & whoever made this list",
transliterations = {
@@ -540,20 +538,20 @@ return {
["ḻṛ"] = "ळृ",
["ḻṝ"] = "ळॄ",
---
- ["xa"] = "क्ष",
- ["xā"] = "क्षा",
- ["xi"] = "क्षि",
- ["xī"] = "क्षी",
- ["xu"] = "क्षु",
- ["xū"] = "क्षू",
- ["xe"] = "क्षे",
- ["xo"] = "क्षो",
- ["xai"] = "क्षै",
- ["xau"] = "क्षौ",
- ["xḷ"] = "क्षॢ",
- ["xḹ"] = "क्षॣ",
- ["xṛ"] = "क्षृ",
- ["xṝ"] = "क्षॄ",
+ ["kṣa"] = "क्ष",
+ ["kṣā"] = "क्षा",
+ ["kṣi"] = "क्षि",
+ ["kṣī"] = "क्षी",
+ ["kṣu"] = "क्षु",
+ ["kṣū"] = "क्षू",
+ ["kṣe"] = "क्षे",
+ ["kṣo"] = "क्षो",
+ ["kṣai"] = "क्षै",
+ ["kṣau"] = "क्षौ",
+ ["kṣḷ"] = "क्षॢ",
+ ["kṣḹ"] = "क्षॣ",
+ ["kṣṛ"] = "क्षृ",
+ ["kṣṝ"] = "क्षॄ",
---
["jña"] = "ज्ञ",
["jñā"] = "ज्ञा",
@@ -604,7 +602,7 @@ return {
["s"] = "स्",
["h"] = "ह्",
["ḻ"] = "ळ्",
- ["x"] = "क्ष्",
+ ["kṣ"] = "क्ष्",
["jñ"] = "ज्ञ्",
-- yogavaahas (always with phonetic)
["ṁ"] = "ं",
@@ -617,6 +615,611 @@ return {
["||"] = "॥",
},
},
+ ["itrans to deva"] = {
+ mapping = {
+ --- vowels
+ ["a"] = "अ",
+ ["A"] = "आ",
+ ["i"] = "इ",
+ ["I"] = "ई",
+ ["u"] = "उ",
+ ["U"] = "ऊ",
+ ["RRi"] = "ऋ",
+ ["RRI"] = "ॠ",
+ ["LLi"] = "ऌ",
+ ["LLI"] = "ॡ",
+ ["e"] = "ए",
+ ["ai"] = "ऐ",
+ ["o"] = "ओ",
+ ["au"] = "औ",
+ --- consonant forms
+ ["ka"] = "क",
+ ["kA"] = "का",
+ ["ki"] = "कि",
+ ["kI"] = "की",
+ ["ku"] = "कु",
+ ["kU"] = "कू",
+ ["ke"] = "के",
+ ["ko"] = "को",
+ ["kai"] = "कै",
+ ["kau"] = "कौ",
+ ["kLLi"] = "कॢ",
+ ["kLLI"] = "कॣ",
+ ["kRRi"] = "कृ",
+ ["kRRI"] = "कॄ",
+ ---
+ ["kha"] = "ख",
+ ["khA"] = "खा",
+ ["khi"] = "खि",
+ ["khI"] = "खी",
+ ["khu"] = "खु",
+ ["khU"] = "खू",
+ ["khe"] = "खे",
+ ["kho"] = "खो",
+ ["khai"] = "खै",
+ ["khau"] = "खौ",
+ ["khLLi"] = "खॢ",
+ ["khLLI"] = "खॣ",
+ ["khRRi"] = "खृ",
+ ["khRRI"] = "खॄ",
+ ---
+ ["ga"] = "ग",
+ ["gA"] = "गा",
+ ["gi"] = "गि",
+ ["gI"] = "गी",
+ ["gu"] = "गु",
+ ["gU"] = "गू",
+ ["ge"] = "गे",
+ ["go"] = "गो",
+ ["gai"] = "गै",
+ ["gau"] = "गौ",
+ ["gLLi"] = "गॢ",
+ ["gLLI"] = "गॣ",
+ ["gRRi"] = "गृ",
+ ["gRRI"] = "गॄ",
+ ---
+ ["gha"] = "घ",
+ ["ghA"] = "घा",
+ ["ghi"] = "घि",
+ ["ghI"] = "घी",
+ ["ghu"] = "घु",
+ ["ghU"] = "घू",
+ ["ghe"] = "घे",
+ ["gho"] = "घो",
+ ["ghai"] = "घै",
+ ["ghau"] = "घौ",
+ ["ghLLi"] = "घॢ",
+ ["ghLLI"] = "घॣ",
+ ["ghRRi"] = "घृ",
+ ["ghRRI"] = "घॄ",
+ ---
+ ["~Na"] = "ङ",
+ ["~NA"] = "ङा",
+ ["~Ni"] = "ङि",
+ ["~NI"] = "ङी",
+ ["~Nu"] = "ङु",
+ ["~NU"] = "ङू",
+ ["~Ne"] = "ङे",
+ ["~No"] = "ङो",
+ ["~Nai"] = "ङै",
+ ["~Nau"] = "ङौ",
+ ["~NLLi"] = "ङॢ",
+ ["~NLLI"] = "ङॣ",
+ ["~NRRi"] = "ङृ",
+ ["~NRRI"] = "ङॄ",
+ ---
+ ["ca"] = "च",
+ ["cA"] = "चा",
+ ["ci"] = "चि",
+ ["cI"] = "ची",
+ ["cu"] = "चु",
+ ["cU"] = "चू",
+ ["ce"] = "चे",
+ ["co"] = "चो",
+ ["cai"] = "चै",
+ ["cau"] = "चौ",
+ ["cLLi"] = "चॢ",
+ ["cLLI"] = "चॣ",
+ ["cRRi"] = "चृ",
+ ["cRRI"] = "चॄ",
+ ---
+ ["cha"] = "छ",
+ ["chA"] = "छा",
+ ["chi"] = "छि",
+ ["chI"] = "छी",
+ ["chu"] = "छु",
+ ["chU"] = "छू",
+ ["che"] = "छे",
+ ["cho"] = "छो",
+ ["chai"] = "छै",
+ ["chau"] = "छौ",
+ ["chLLi"] = "छॢ",
+ ["chLLI"] = "छॣ",
+ ["chRRi"] = "छृ",
+ ["chRRI"] = "छॄ",
+ ---
+ ["ja"] = "ज",
+ ["jA"] = "जा",
+ ["ji"] = "जि",
+ ["jI"] = "जी",
+ ["ju"] = "जु",
+ ["jU"] = "जू",
+ ["je"] = "जे",
+ ["jo"] = "जो",
+ ["jai"] = "जै",
+ ["jau"] = "जौ",
+ ["jLLi"] = "जॢ",
+ ["jLLI"] = "जॣ",
+ ["jRRi"] = "जृ",
+ ["jRRI"] = "जॄ",
+ ---
+ ["jha"] = "झ",
+ ["jhA"] = "झा",
+ ["jhi"] = "झि",
+ ["jhI"] = "झी",
+ ["jhu"] = "झु",
+ ["jhU"] = "झू",
+ ["jhe"] = "झे",
+ ["jho"] = "झो",
+ ["jhai"] = "झै",
+ ["jhau"] = "झौ",
+ ["jhLLi"] = "झॢ",
+ ["jhLLI"] = "झॣ",
+ ["jhRRi"] = "झृ",
+ ["jhRRI"] = "झॄ",
+ ---
+ ["~na"] = "ञ",
+ ["~nA"] = "ञा",
+ ["~ni"] = "ञि",
+ ["~nI"] = "ञी",
+ ["~nu"] = "ञु",
+ ["~nU"] = "ञू",
+ ["~ne"] = "ञे",
+ ["~no"] = "ञो",
+ ["~nai"] = "ञै",
+ ["~nau"] = "ञौ",
+ ["~nLLi"] = "ञॢ",
+ ["~nLLI"] = "ञॣ",
+ ["~nRRi"] = "ञृ",
+ ["~nRRI"] = "ञॄ",
+ ---
+ ["Ta"] = "ट",
+ ["TA"] = "टा",
+ ["Ti"] = "टि",
+ ["TI"] = "टी",
+ ["Tu"] = "टु",
+ ["TU"] = "टू",
+ ["Te"] = "टे",
+ ["To"] = "टो",
+ ["Tai"] = "टै",
+ ["Tau"] = "टौ",
+ ["TLLi"] = "टॢ",
+ ["TLLI"] = "टॣ",
+ ["TRRi"] = "टृ",
+ ["TRRI"] = "टॄ",
+ ---
+ ["Tha"] = "ठ",
+ ["ThA"] = "ठा",
+ ["Thi"] = "ठि",
+ ["ThI"] = "ठी",
+ ["Thu"] = "ठु",
+ ["ThU"] = "ठू",
+ ["The"] = "ठे",
+ ["Tho"] = "ठो",
+ ["Thai"] = "ठै",
+ ["Thau"] = "ठौ",
+ ["ThLLi"] = "ठॢ",
+ ["ThLLI"] = "ठॣ",
+ ["ThRRi"] = "ठृ",
+ ["ThRRI"] = "ठॄ",
+ ---
+ ["Da"] = "ड",
+ ["DA"] = "डा",
+ ["Di"] = "डि",
+ ["DI"] = "डी",
+ ["Du"] = "डु",
+ ["DU"] = "डू",
+ ["De"] = "डे",
+ ["Do"] = "डो",
+ ["Dai"] = "डै",
+ ["Dau"] = "डौ",
+ ["DLLi"] = "डॢ",
+ ["DLLI"] = "डॣ",
+ ["DRRi"] = "डृ",
+ ["DRRI"] = "डॄ",
+ ---
+ ["Dha"] = "ढ",
+ ["DhA"] = "ढा",
+ ["Dhi"] = "ढि",
+ ["DhI"] = "ढी",
+ ["Dhu"] = "ढु",
+ ["DhU"] = "ढू",
+ ["Dhe"] = "ढे",
+ ["Dho"] = "ढो",
+ ["Dhai"] = "ढै",
+ ["Dhau"] = "ढौ",
+ ["DhLLi"] = "ढॢ",
+ ["DhLLI"] = "ढॣ",
+ ["DhRRi"] = "ढृ",
+ ["DhRRI"] = "ढॄ",
+ ---
+ ["Na"] = "ण",
+ ["NA"] = "णा",
+ ["Ni"] = "णि",
+ ["NI"] = "णी",
+ ["Nu"] = "णु",
+ ["NU"] = "णू",
+ ["Ne"] = "णे",
+ ["No"] = "णो",
+ ["Nai"] = "णै",
+ ["Nau"] = "णौ",
+ ["NLLi"] = "णॢ",
+ ["NLLI"] = "णॣ",
+ ["NRRi"] = "णृ",
+ ["NRRI"] = "णॄ",
+ ---
+ ["ta"] = "त",
+ ["tA"] = "ता",
+ ["ti"] = "ति",
+ ["tI"] = "ती",
+ ["tu"] = "तु",
+ ["tU"] = "तू",
+ ["te"] = "ते",
+ ["to"] = "तो",
+ ["tai"] = "तै",
+ ["tau"] = "तौ",
+ ["tLLi"] = "तॢ",
+ ["tLLI"] = "तॣ",
+ ["tRRi"] = "तृ",
+ ["tRRI"] = "तॄ",
+ ---
+ ["tha"] = "थ",
+ ["thA"] = "था",
+ ["thi"] = "थि",
+ ["thI"] = "थी",
+ ["thu"] = "थु",
+ ["thU"] = "थू",
+ ["the"] = "थे",
+ ["tho"] = "थो",
+ ["thai"] = "थै",
+ ["thau"] = "थौ",
+ ["thLLi"] = "थॢ",
+ ["thLLI"] = "थॣ",
+ ["thRRi"] = "थृ",
+ ["thRRI"] = "थॄ",
+ ---
+ ["da"] = "द",
+ ["dA"] = "दा",
+ ["di"] = "दि",
+ ["dI"] = "दी",
+ ["du"] = "दु",
+ ["dU"] = "दू",
+ ["de"] = "दे",
+ ["do"] = "दो",
+ ["dai"] = "दै",
+ ["dau"] = "दौ",
+ ["dLLi"] = "दॢ",
+ ["dLLI"] = "दॣ",
+ ["dRRi"] = "दृ",
+ ["dRRI"] = "दॄ",
+ ---
+ ["dha"] = "ध",
+ ["dhA"] = "धा",
+ ["dhi"] = "धि",
+ ["dhI"] = "धी",
+ ["dhu"] = "धु",
+ ["dhU"] = "धू",
+ ["dhe"] = "धे",
+ ["dho"] = "धो",
+ ["dhai"] = "धै",
+ ["dhau"] = "धौ",
+ ["dhLLi"] = "धॢ",
+ ["dhLLI"] = "धॣ",
+ ["dhRRi"] = "धृ",
+ ["dhRRI"] = "धॄ",
+ ---
+ ["na"] = "न",
+ ["nA"] = "ना",
+ ["ni"] = "नि",
+ ["nI"] = "नी",
+ ["nu"] = "नु",
+ ["nU"] = "नू",
+ ["ne"] = "ने",
+ ["no"] = "नो",
+ ["nai"] = "नै",
+ ["nau"] = "नौ",
+ ["nLLi"] = "नॢ",
+ ["nLLI"] = "नॣ",
+ ["nRRi"] = "नृ",
+ ["nRRI"] = "नॄ",
+ ---
+ ["pa"] = "प",
+ ["pA"] = "पा",
+ ["pi"] = "पि",
+ ["pI"] = "पी",
+ ["pu"] = "पु",
+ ["pU"] = "पू",
+ ["pe"] = "पे",
+ ["po"] = "पो",
+ ["pai"] = "पै",
+ ["pau"] = "पौ",
+ ["pLLi"] = "पॢ",
+ ["pLLI"] = "पॣ",
+ ["pRRi"] = "पृ",
+ ["pRRI"] = "पॄ",
+ ---
+ ["pha"] = "फ",
+ ["phA"] = "फा",
+ ["phi"] = "फि",
+ ["phI"] = "फी",
+ ["phu"] = "फु",
+ ["phU"] = "फू",
+ ["phe"] = "फे",
+ ["pho"] = "फो",
+ ["phai"] = "फै",
+ ["phau"] = "फौ",
+ ["phLLi"] = "फॢ",
+ ["phLLI"] = "फॣ",
+ ["phRRi"] = "फृ",
+ ["phRRI"] = "फॄ",
+ ---
+ ["ba"] = "ब",
+ ["bA"] = "बा",
+ ["bi"] = "बि",
+ ["bI"] = "बी",
+ ["bu"] = "बु",
+ ["bU"] = "बू",
+ ["be"] = "बे",
+ ["bo"] = "बो",
+ ["bai"] = "बै",
+ ["bau"] = "बौ",
+ ["bLLi"] = "बॢ",
+ ["bLLI"] = "बॣ",
+ ["bRRi"] = "बृ",
+ ["bRRI"] = "बॄ",
+ ---
+ ["bha"] = "भ",
+ ["bhA"] = "भा",
+ ["bhi"] = "भि",
+ ["bhI"] = "भी",
+ ["bhu"] = "भु",
+ ["bhU"] = "भू",
+ ["bhe"] = "भे",
+ ["bho"] = "भो",
+ ["bhai"] = "भै",
+ ["bhau"] = "भौ",
+ ["bhLLi"] = "भॢ",
+ ["bhLLI"] = "भॣ",
+ ["bhRRi"] = "भृ",
+ ["bhRRI"] = "भॄ",
+ ---
+ ["ma"] = "म",
+ ["mA"] = "मा",
+ ["mi"] = "मि",
+ ["mI"] = "मी",
+ ["mu"] = "मु",
+ ["mU"] = "मू",
+ ["me"] = "मे",
+ ["mo"] = "मो",
+ ["mai"] = "मै",
+ ["mau"] = "मौ",
+ ["mLLi"] = "मॢ",
+ ["mLLI"] = "मॣ",
+ ["mRRi"] = "मृ",
+ ["mRRI"] = "मॄ",
+ ---
+ ["ya"] = "य",
+ ["yA"] = "या",
+ ["yi"] = "यि",
+ ["yI"] = "यी",
+ ["yu"] = "यु",
+ ["yU"] = "यू",
+ ["ye"] = "ये",
+ ["yo"] = "यो",
+ ["yai"] = "यै",
+ ["yau"] = "यौ",
+ ["yLLi"] = "यॢ",
+ ["yLLI"] = "यॣ",
+ ["yRRi"] = "यृ",
+ ["yRRI"] = "यॄ",
+ ---
+ ["ra"] = "र",
+ ["rA"] = "रा",
+ ["ri"] = "रि",
+ ["rI"] = "री",
+ ["ru"] = "रु",
+ ["rU"] = "रू",
+ ["re"] = "रे",
+ ["ro"] = "रो",
+ ["rai"] = "रै",
+ ["rau"] = "रौ",
+ ["rLLi"] = "रॢ",
+ ["rLLI"] = "रॣ",
+ ["rRRi"] = "रृ",
+ ["rRRI"] = "रॄ",
+ ---
+ ["la"] = "ल",
+ ["lA"] = "ला",
+ ["li"] = "लि",
+ ["lI"] = "ली",
+ ["lu"] = "लु",
+ ["lU"] = "लू",
+ ["le"] = "ले",
+ ["lo"] = "लो",
+ ["lai"] = "लै",
+ ["lau"] = "लौ",
+ ["lLLi"] = "लॢ",
+ ["lLLI"] = "लॣ",
+ ["lRRi"] = "लृ",
+ ["lRRI"] = "लॄ",
+ ---
+ ["va"] = "व",
+ ["vA"] = "वा",
+ ["vi"] = "वि",
+ ["vI"] = "वी",
+ ["vu"] = "वु",
+ ["vU"] = "वू",
+ ["ve"] = "वे",
+ ["vo"] = "वो",
+ ["vai"] = "वै",
+ ["vau"] = "वौ",
+ ["vLLi"] = "वॢ",
+ ["vLLI"] = "वॣ",
+ ["vRRi"] = "वृ",
+ ["vRRI"] = "वॄ",
+ ---
+ ["sha"] = "श",
+ ["shA"] = "शा",
+ ["shi"] = "शि",
+ ["shI"] = "शी",
+ ["shu"] = "शु",
+ ["shU"] = "शू",
+ ["she"] = "शे",
+ ["sho"] = "शो",
+ ["shai"] = "शै",
+ ["shau"] = "शौ",
+ ["shLLi"] = "शॢ",
+ ["shLLI"] = "शॣ",
+ ["shRRi"] = "शृ",
+ ["shRRI"] = "शॄ",
+ ---
+ ["Sha"] = "ष",
+ ["ShA"] = "षा",
+ ["Shi"] = "षि",
+ ["ShI"] = "षी",
+ ["Shu"] = "षु",
+ ["ShU"] = "षू",
+ ["She"] = "षे",
+ ["Sho"] = "षो",
+ ["Shai"] = "षै",
+ ["Shau"] = "षौ",
+ ["ShLLi"] = "षॢ",
+ ["ShLLI"] = "षॣ",
+ ["ShRRi"] = "षृ",
+ ["ShRRI"] = "षॄ",
+ ---
+ ["sa"] = "स",
+ ["sA"] = "सा",
+ ["si"] = "सि",
+ ["sI"] = "सी",
+ ["su"] = "सु",
+ ["sU"] = "सू",
+ ["se"] = "से",
+ ["so"] = "सो",
+ ["sai"] = "सै",
+ ["sau"] = "सौ",
+ ["sLLi"] = "सॢ",
+ ["sLLI"] = "सॣ",
+ ["sRRi"] = "सृ",
+ ["sRRI"] = "सॄ",
+ ---
+ ["ha"] = "ह",
+ ["hA"] = "हा",
+ ["hi"] = "हि",
+ ["hI"] = "ही",
+ ["hu"] = "हु",
+ ["hU"] = "हू",
+ ["he"] = "हे",
+ ["ho"] = "हो",
+ ["hai"] = "है",
+ ["hau"] = "हौ",
+ ["hLLi"] = "हॢ",
+ ["hLLI"] = "हॣ",
+ ["hRRi"] = "हृ",
+ ["hRRI"] = "हॄ",
+ ---
+ ["ḻa"] = "ळ",
+ ["ḻA"] = "ळा",
+ ["ḻi"] = "ळि",
+ ["ḻI"] = "ळी",
+ ["ḻu"] = "ळु",
+ ["ḻU"] = "ळू",
+ ["ḻe"] = "ळे",
+ ["ḻo"] = "ळो",
+ ["ḻai"] = "ळै",
+ ["ḻau"] = "ळौ",
+ ["ḻLLi"] = "ळॢ",
+ ["ḻLLI"] = "ळॣ",
+ ["ḻRRi"] = "ळृ",
+ ["ḻRRI"] = "ळॄ",
+ ---
+ ["xa"] = "क्ष",
+ ["xA"] = "क्षा",
+ ["xi"] = "क्षि",
+ ["xI"] = "क्षी",
+ ["xu"] = "क्षु",
+ ["xU"] = "क्षू",
+ ["xe"] = "क्षे",
+ ["xo"] = "क्षो",
+ ["xai"] = "क्षै",
+ ["xau"] = "क्षौ",
+ ["xLLi"] = "क्षॢ",
+ ["xLLI"] = "क्षॣ",
+ ["xRRi"] = "क्षृ",
+ ["xRRI"] = "क्षॄ",
+ ---
+ ["j~na"] = "ज्ञ",
+ ["j~nA"] = "ज्ञा",
+ ["j~ni"] = "ज्ञि",
+ ["j~nI"] = "ज्ञी",
+ ["j~nu"] = "ज्ञु",
+ ["j~nU"] = "ज्ञू",
+ ["j~ne"] = "ज्ञे",
+ ["j~no"] = "ज्ञो",
+ ["j~nai"] = "ज्ञै",
+ ["j~nau"] = "ज्ञौ",
+ ["j~nLLi"] = "ज्ञॢ",
+ ["j~nLLI"] = "ज्ञॣ",
+ ["j~nRRi"] = "ज्ञृ",
+ ["j~nRRI"] = "ज्ञॄ",
+ ---
+ ["k"] = "क्",
+ ["kh"] = "ख्",
+ ["g"] = "ग्",
+ ["gh"] = "घ्",
+ ["~N"] = "ङ्",
+ ["c"] = "च्",
+ ["ch"] = "छ्",
+ ["j"] = "ज्",
+ ["jh"] = "झ्",
+ ["~n"] = "ञ्",
+ ["T"] = "ट्",
+ ["Th"] = "ठ्",
+ ["D"] = "ड्",
+ ["Dh"] = "ढ्",
+ ["N"] = "ण्",
+ ["t"] = "त्",
+ ["th"] = "थ्",
+ ["d"] = "द्",
+ ["dh"] = "ध्",
+ ["n"] = "न्",
+ ["p"] = "प्",
+ ["ph"] = "फ्",
+ ["b"] = "ब्",
+ ["bh"] = "भ्",
+ ["m"] = "म्",
+ ["y"] = "य्",
+ ["r"] = "र्",
+ ["l"] = "ल्",
+ ["v"] = "व्",
+ ["sh"] = "श्",
+ ["Sh"] = "ष्",
+ ["s"] = "स्",
+ ["h"] = "ह्",
+ ["ḻ"] = "ळ्",
+ ["x"] = "क्ष्",
+ ["j~n"] = "ज्ञ्",
+ -- yogavaahas (always with phonetic)
+ ["M"] = "ं",
+ ["H"] = "ः",
+ ["ँ"] = "ँ",
+ -- punctuations
+ ["viraama"] = "्",
+ ["."] = "।",
+ ["|"] = "।",
+ ["||"] = "॥",
+ },
+ },
["deva to iast"] = {
mapping = {
-- vowels
@@ -1147,20 +1750,20 @@ return {
["ळृ"] = "l̤ṛ",
["ळॄ"] = "l̤ṝ",
---
- ["क्ष"]= "xa",
- ["क्षा"] = "xā",
- ["क्षि"] = "xi",
- ["क्षी"] = "xī",
- ["क्षु"] = "xu",
- ["क्षू"] = "xū",
- ["क्षे"] = "xe",
- ["क्षो"] = "xo",
- ["क्षै"] = "xai",
- ["क्षौ"] = "xau",
- ["क्षॢ"] = "xḷ",
- ["क्षॣ"] = "xḹ",
- ["क्षृ"] = "xṛ",
- ["क्षॄ"] = "xṝ",
+ ["क्ष"]= "kṣa",
+ ["क्षा"] = "kṣā",
+ ["क्षि"] = "kṣi",
+ ["क्षी"] = "kṣī",
+ ["क्षु"] = "kṣu",
+ ["क्षू"] = "kṣū",
+ ["क्षे"] = "kṣe",
+ ["क्षो"] = "kṣo",
+ ["क्षै"] = "kṣai",
+ ["क्षौ"] = "kṣau",
+ ["क्षॢ"] = "kṣḷ",
+ ["क्षॣ"] = "kṣḹ",
+ ["क्षृ"] = "kṣṛ",
+ ["क्षॄ"] = "kṣṝ",
---
["ज्ञ"]= "jña",
["ज्ञा"] = "jñā",
@@ -1214,19 +1817,19 @@ return {
["क्ष्"] = "kṣ",
["ज्ञ्"] = "jñ",
-- discard virama (?!) TODO: revisit this if need arises
- -- ["्"] = "",
- ["।"] = ".",
- ["॥"] = ".",
+ -- ["्"] = "",
+ ["।"] = "|",
+ ["॥"] = "||",
["ं"] = "ṃ",
["ः"] = "ḥ",
["ऽ"] = "\'",
-- disputed
- ["ँ"] = "ँ",
+ ["ँ"] = "̃",
-- diactrics (combining): provided for completeness
-- warning: many fonts don't have these
["॒"] = "॒",
-- could not test
- -- ["॑"] = "̭",
+ -- ["॑"] = "̭",
["॑"] = "॑",
["᳚"] = "᳚",
["᳛"] = "᳛",
@@ -1335,5 +1938,345 @@ return {
["’"] = "’",
},
},
+ ["deva to tlgu"] = {
+ mapping = {
+ -- vowels
+ ["अ"] = "అ",
+ ["आ"] = "ఆ",
+ ["इ"] = "ఇ",
+ ["ई"] = "ఈ",
+ ["उ"] = "ఉ",
+ ["ऊ"] = "ఊ",
+ ["ऋ"] = "ఋ",
+ ["ॠ"] = "ౠ",
+ ["ऌ"] = "ఌ",
+ ["ॡ"] = "ౡ",
+ ["ऎ"] = "ఎ",
+ ["ए"] = "ఏ",
+ ["ऐ"] = "ఐ",
+ ["ऒ"] = "ఒ",
+ ["ओ"] = "ఓ",
+ ["औ"] = "ఔ",
+ -- consonants
+ ["क"] = "క",
+ ["ख"] = "ఖ",
+ ["ग"] = "గ",
+ ["घ"] = "ఘ",
+ ["ङ"] = "ఙ",
+ ["च"] = "చ",
+ ["छ"] = "ఛ",
+ ["ज"] = "జ",
+ ["झ"] = "ఝ",
+ ["ञ"] = "ఞ",
+ ["ट"] = "ట",
+ ["ठ"] = "ఠ",
+ ["ड"] = "డ",
+ ["ढ"] = "ఢ",
+ ["ण"] = "ణ",
+ ["त"] = "త",
+ ["थ"] = "థ",
+ ["द"] = "ద",
+ ["ध"] = "ధ",
+ ["न"] = "న",
+ ["प"] = "ప",
+ ["फ"] = "ఫ",
+ ["ब"] = "బ",
+ ["भ"] = "భ",
+ ["म"] = "మ",
+ ["य"] = "య",
+ ["र"] = "ర",
+ ["ल"] = "ల",
+ ["व"] = "వ",
+ ["श"] = "శ",
+ ["ष"] = "ష",
+ ["स"] = "స",
+ ["ह"] = "హ",
+ ["ळ"] = "ళ",
+ ["क्ष"] = "క్ష",
+ ["ज्ञ"] = "జ్ఞ",
+ -- vowel marks
+ ["ा"] = "ా",
+ ["ि"] = "ి",
+ ["ी"] = "ీ",
+ ["ु"] = "ు",
+ ["ू"] = "ూ",
+ ["ृ"] = "ృ",
+ ["ॄ"] = "ౄ",
+ ["ॢ"] = "ౢ",
+ ["ॣ"] = "ౣ",
+ ["ॆ"] = "ె",
+ ["े"] = "ే",
+ ["ै"] = "ై",
+ ["ॊ"] = "ొ",
+ ["ो"] = "ో",
+ ["ौ"] = "ౌ",
+ -- always with phonetic
+ ["ं"] = "ం",
+ ["ः"] = "ః",
+ ["ँ"] = "ఀ",
+ -- punctuation marks
+ ["्"] = "్",
+ ["'"] = "'",
+ ["।"] = ".",
+ ["॥"] = ".",
+ ["‘"] = "‘",
+ ["’"] = "’",
+ },
+ },
+ ["deva to knda"] = {
+ mapping = {
+ -- vowels
+ ["अ"] = "ಅ",
+ ["आ"] = "ಆ",
+ ["इ"] = "ಇ",
+ ["ई"] = "ಈ",
+ ["उ"] = "ಉ",
+ ["ऊ"] = "ಊ",
+ ["ऋ"] = "ಋ",
+ ["ॠ"] = "ೠ",
+ ["ऌ"] = "ಌ",
+ ["ॡ"] = "ೡ",
+ ["ऎ"] = "ಎ",
+ ["ए"] = "ಏ",
+ ["ऐ"] = "ಐ",
+ ["ऒ"] = "ಒ",
+ ["ओ"] = "ಓ",
+ ["औ"] = "ಔ",
+ -- consonants
+ ["क"] = "ಕ",
+ ["ख"] = "ಖ",
+ ["ग"] = "ಗ",
+ ["घ"] = "ಘ",
+ ["ङ"] = "ಙ",
+ ["च"] = "ಚ",
+ ["छ"] = "ಛ",
+ ["ज"] = "ಜ",
+ ["झ"] = "ಝ",
+ ["ञ"] = "ಞ",
+ ["ट"] = "ಟ",
+ ["ठ"] = "ಠ",
+ ["ड"] = "ಡ",
+ ["ढ"] = "ಢ",
+ ["ण"] = "ಣ",
+ ["त"] = "ತ",
+ ["थ"] = "ಥ",
+ ["द"] = "ದ",
+ ["ध"] = "ಧ",
+ ["न"] = "ನ",
+ ["प"] = "ಪ",
+ ["फ"] = "ಫ",
+ ["ब"] = "ಬ",
+ ["भ"] = "ಭ",
+ ["म"] = "ಮ",
+ ["य"] = "ಯ",
+ ["र"] = "ರ",
+ ["ल"] = "ಲ",
+ ["व"] = "ವ",
+ ["श"] = "ಶ",
+ ["ष"] = "ಷ",
+ ["स"] = "ಸ",
+ ["ह"] = "ಹ",
+ ["ळ"] = "ಳ",
+ ["क्ष"] = "ಕ್ಷ",
+ ["ज्ञ"] = "ಜ್ಞ",
+ -- vowel marks
+ ["ा"] = "ಾ",
+ ["ि"] = "ಿ",
+ ["ी"] = "ೀ",
+ ["ु"] = "ು",
+ ["ू"] = "ೂ",
+ ["ृ"] = "ೃ",
+ ["ॄ"] = "ೄ",
+ ["ॢ"] = "ೢ",
+ ["ॣ"] = "ೣ",
+ ["ॆ"] = "ೆ",
+ ["े"] = "ೇ",
+ ["ै"] = "ೈ",
+ ["ॊ"] = "ೊ",
+ ["ो"] = "ೋ",
+ ["ौ"] = "ೌ",
+ -- always with phonetic
+ ["ं"] = "ಂ",
+ ["ः"] = "ಃ",
+ ["ँ"] = "ಁ",
+ -- punctuation marks
+ ["्"] = "್",
+ ["'"] = "'",
+ ["।"] = ".",
+ ["॥"] = ".",
+ ["‘"] = "‘",
+ ["’"] = "’",
+ },
+ },
+ ["deva to gujr"] = {
+ mapping = {
+ -- vowels
+ ["अ"] = "અ",
+ ["आ"] = "આ",
+ ["इ"] = "ઇ",
+ ["ई"] = "ઈ",
+ ["उ"] = "ઉ",
+ ["ऊ"] = "ઊ",
+ ["ऋ"] = "ઋ",
+ ["ॠ"] = "ૠ",
+ ["ऌ"] = "ઌ",
+ ["ॡ"] = "ૡ",
+ -- ["ऎ"] = "",
+ ["ए"] = "એ",
+ ["ऐ"] = "ઐ",
+ -- ["ऒ"] = "",
+ ["ओ"] = "ઓ",
+ ["औ"] = "ઔ",
+ -- consonants
+ ["क"] = "ક",
+ ["ख"] = "ખ",
+ ["ग"] = "ગ",
+ ["घ"] = "ઘ",
+ ["ङ"] = "ઙ",
+ ["च"] = "ચ",
+ ["छ"] = "છ",
+ ["ज"] = "જ",
+ ["झ"] = "ઝ",
+ ["ञ"] = "ઞ",
+ ["ट"] = "ટ",
+ ["ठ"] = "ઠ",
+ ["ड"] = "ડ",
+ ["ढ"] = "ઢ",
+ ["ण"] = "ણ",
+ ["त"] = "ત",
+ ["थ"] = "થ",
+ ["द"] = "દ",
+ ["ध"] = "ધ",
+ ["न"] = "ન",
+ ["प"] = "પ",
+ ["फ"] = "ફ",
+ ["ब"] = "બ",
+ ["भ"] = "ભ",
+ ["म"] = "મ",
+ ["य"] = "ય",
+ ["र"] = "ર",
+ ["ल"] = "લ",
+ ["व"] = "વ",
+ ["श"] = "શ",
+ ["ष"] = "ષ",
+ ["स"] = "સ",
+ ["ह"] = "હ",
+ ["ळ"] = "ળ",
+ ["क्ष"] = "ક્ષ",
+ ["ज्ञ"] = "જ્ઞ",
+ -- vowel marks
+ ["ा"] = "ા",
+ ["ि"] = "િ",
+ ["ी"] = "ી",
+ ["ु"] = "ુ",
+ ["ू"] = "ૂ",
+ ["ृ"] = "ૃ",
+ ["ॄ"] = "ૄ",
+ ["ॢ"] = "ૢ",
+ ["ॣ"] = "ૣ",
+ -- ["ॆ"] = "",
+ ["े"] = "ે",
+ ["ै"] = "ૈ",
+ -- ["ॊ"] = "",
+ ["ो"] = "ો",
+ ["ौ"] = "ૌ",
+ -- always with phonetic
+ ["ं"] = "ં",
+ ["ः"] = "ઃ",
+ ["ँ"] = "ઁ",
+ -- punctuation marks
+ ["्"] = "્",
+ ["'"] = "'",
+ ["।"] = ".",
+ ["॥"] = ".",
+ ["‘"] = "‘",
+ ["’"] = "’",
+ },
+ },
+ ["deva to bngl"] = {
+ mapping = {
+ -- vowels
+ ["अ"] = "অ",
+ ["आ"] = "আ",
+ ["इ"] = "ই",
+ ["ई"] = "ঈ",
+ ["उ"] = "উ",
+ ["ऊ"] = "ঊ",
+ ["ऋ"] = "ঋ",
+ ["ॠ"] = "ৠ",
+ ["ऌ"] = "ঌ",
+ ["ॡ"] = "ৡ",
+ -- ["ऎ"] = "",
+ ["ए"] = "এ",
+ ["ऐ"] = "ঐ",
+ -- ["ऒ"] = "",
+ ["ओ"] = "ও",
+ ["औ"] = "ঔ",
+ -- consonants
+ ["क"] = "ক",
+ ["ख"] = "খ",
+ ["ग"] = "গ",
+ ["घ"] = "ঘ",
+ ["ङ"] = "ঙ",
+ ["च"] = "চ",
+ ["छ"] = "ছ",
+ ["ज"] = "জ",
+ ["झ"] = "ঝ",
+ ["ञ"] = "ঞ",
+ ["ट"] = "ট",
+ ["ठ"] = "ঠ",
+ ["ड"] = "ড",
+ ["ढ"] = "ঢ",
+ ["ण"] = "ণ",
+ ["त"] = "ত",
+ ["थ"] = "থ",
+ ["द"] = "দ",
+ ["ध"] = "ধ",
+ ["न"] = "ন",
+ ["प"] = "প",
+ ["फ"] = "ফ",
+ ["ब"] = "ব",
+ ["भ"] = "ভ",
+ ["म"] = "ম",
+ ["य"] = "য",
+ ["र"] = "র",
+ ["ल"] = "ল",
+ ["व"] = "ব",
+ ["श"] = "শ",
+ ["ष"] = "ষ",
+ ["स"] = "স",
+ ["ह"] = "হ",
+ -- ["ळ"] = "",
+ ["क्ष"] = "ক্ষ",
+ ["ज्ञ"] = "জ্ঞ",
+ -- vowel marks
+ ["ा"] = "া",
+ ["ि"] = "ি",
+ ["ी"] = "ী",
+ ["ु"] = "ু",
+ ["ू"] = "ূ",
+ ["ृ"] = "ৃ",
+ ["ॄ"] = "ৄ",
+ ["ॢ"] = "ৢ",
+ ["ॣ"] = "ৣ",
+ -- ["ॆ"] = "",
+ ["े"] = "ে",
+ ["ै"] = "ৈ",
+ -- ["ॊ"] = "",
+ ["ो"] = "ো",
+ ["ौ"] = "ৌ",
+ -- always with phonetic
+ ["ं"] = "ং",
+ ["ः"] = "ঃ",
+ ["ँ"] = "ঁ",
+ -- punctuation marks
+ ["्"] = "্",
+ ["'"] = "'",
+ ["।"] = ".",
+ ["॥"] = ".",
+ ["‘"] = "‘",
+ ["’"] = "’",
+ },
+ },
}
}
diff --git a/tex/context/base/mkiv/lang-imp-serbian.lua b/tex/context/base/mkiv/lang-imp-serbian.lua
index 9e2cf5ce6..6212500c2 100644
--- a/tex/context/base/mkiv/lang-imp-serbian.lua
+++ b/tex/context/base/mkiv/lang-imp-serbian.lua
@@ -1,46 +1,81 @@
-return {
+local c2l = {
+ mapping = {
+ ["А"] = "A", ["а"] = "a",
+ ["Б"] = "B", ["б"] = "b",
+ ["В"] = "V", ["в"] = "v",
+ ["Г"] = "G", ["г"] = "g",
+ ["Д"] = "D", ["д"] = "d",
+ ["Ђ"] = "Đ", ["ђ"] = "đ",
+ ["Е"] = "E", ["е"] = "e",
+ ["Ж"] = "Ž", ["ж"] = "ž",
+ ["З"] = "Z", ["з"] = "z",
+ ["И"] = "I", ["и"] = "i",
+ ["Ј"] = "J", ["ј"] = "j",
+ ["К"] = "K", ["к"] = "k",
+ ["Л"] = "L", ["л"] = "l",
+ ["Љ"] = "Lj", ["љ"] = "lj",
+ ["М"] = "M", ["м"] = "m",
+ ["Н"] = "N", ["н"] = "n",
+ ["Њ"] = "Nj", ["њ"] = "nj",
+ ["О"] = "O", ["о"] = "o",
+ ["П"] = "P", ["п"] = "p",
+ ["Р"] = "R", ["р"] = "r",
+ ["С"] = "S", ["с"] = "s",
+ ["Т"] = "T", ["т"] = "t",
+ ["Ћ"] = "Ć", ["ћ"] = "ć",
+ ["У"] = "U", ["у"] = "u",
+ ["Ф"] = "F", ["ф"] = "f",
+ ["Х"] = "H", ["х"] = "h",
+ ["Ц"] = "C", ["ц"] = "c",
+ ["Ч"] = "Č", ["ч"] = "č",
+ ["Џ"] = "Dž", ["џ"] = "dž",
+ ["Ш"] = "Š", ["ш"] = "š",
+ }
+}
+
+local C2L = {
+ mapping = {
+ ["А"] = "A", ["а"] = "a",
+ ["Б"] = "B", ["б"] = "b",
+ ["В"] = "V", ["в"] = "v",
+ ["Г"] = "G", ["г"] = "g",
+ ["Д"] = "D", ["д"] = "d",
+ ["Ђ"] = "Đ", ["ђ"] = "đ",
+ ["Е"] = "E", ["е"] = "e",
+ ["Ж"] = "Ž", ["ж"] = "ž",
+ ["З"] = "Z", ["з"] = "z",
+ ["И"] = "I", ["и"] = "i",
+ ["Ј"] = "J", ["ј"] = "j",
+ ["К"] = "K", ["к"] = "k",
+ ["Л"] = "L", ["л"] = "l",
+ ["Љ"] = "LJ", ["љ"] = "lj",
+ ["М"] = "M", ["м"] = "m",
+ ["Н"] = "N", ["н"] = "n",
+ ["Њ"] = "NJ", ["њ"] = "nj",
+ ["О"] = "O", ["о"] = "o",
+ ["П"] = "P", ["п"] = "p",
+ ["Р"] = "R", ["р"] = "r",
+ ["С"] = "S", ["с"] = "s",
+ ["Т"] = "T", ["т"] = "t",
+ ["Ћ"] = "Ć", ["ћ"] = "ć",
+ ["У"] = "U", ["у"] = "u",
+ ["Ф"] = "F", ["ф"] = "f",
+ ["Х"] = "H", ["х"] = "h",
+ ["Ц"] = "C", ["ц"] = "c",
+ ["Ч"] = "Č", ["ч"] = "č",
+ ["Џ"] = "DŽ", ["џ"] = "dž",
+ ["Ш"] = "Š", ["ш"] = "š",
+ }
+}
+return {
name = "sebian transliterations",
version = "1.00",
- author = "Hans Hagen",
- comment = "Experimental code, the name of this file might change"
- .. "or maybe it become a llg file in the end.",
+ author = "Hans Hagen & Ivan Pešić",
copyright = "ConTeXt development team & whoever made this list",
-
transliterations = {
- ["serbian to latin"] = {
- mapping = {
- ["А"] = "A", ["а"] = "a",
- ["Б"] = "B", ["б"] = "b",
- ["В"] = "V", ["в"] = "v",
- ["Г"] = "G", ["г"] = "g",
- ["Д"] = "D", ["д"] = "d",
- ["Е"] = "E", ["е"] = "e",
- ["Ж"] = "Ž", ["ж"] = "ž",
- ["З"] = "Z", ["з"] = "z",
- ["И"] = "I", ["и"] = "i",
- ["Й"] = "J", ["й"] = "j",
- ["К"] = "K", ["к"] = "k",
- ["Л"] = "L", ["л"] = "l",
- ["М"] = "M", ["м"] = "m",
- ["Н"] = "N", ["н"] = "n",
- ["О"] = "O", ["о"] = "o",
- ["П"] = "P", ["п"] = "p",
- ["Р"] = "R", ["р"] = "r",
- ["С"] = "S", ["с"] = "s",
- ["Т"] = "T", ["т"] = "t",
- ["У"] = "U", ["у"] = "u",
- ["Ф"] = "F", ["ф"] = "f",
- ["Х"] = "Ch", ["х"] = "ch",
- ["Ц"] = "C", ["ц"] = "c",
- ["Ч"] = "Č", ["ч"] = "č",
- ["Ш"] = "Š", ["ш"] = "š",
- ["Щ"] = "Št", ["щ"] = "št",
- ["Ъ"] = "Ă", ["ъ"] = "ă",
- ["Ь"] = "′", ["ь"] = "′",
- ["Ю"] = "Ju", ["ю"] = "ju",
- ["Я"] = "Ja", ["я"] = "ja",
- }
- }
+ ["serbian to latin"] = c2l,
+ c2l = c2l,
+ C2L = C2L,
}
}
diff --git a/tex/context/base/mkiv/lpdf-pda.xml b/tex/context/base/mkiv/lpdf-pda.xml
index 2f07fed2d..0de54aa2a 100644
--- a/tex/context/base/mkiv/lpdf-pda.xml
+++ b/tex/context/base/mkiv/lpdf-pda.xml
@@ -7,21 +7,9 @@
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:format>application/pdf</dc:format>
- <dc:creator>
- <rdf:Seq>
- <rdf:li xml:lang="x-default"/>
- </rdf:Seq>
- </dc:creator>
- <dc:description>
- <rdf:Alt>
- <rdf:li xml:lang="x-default"/>
- </rdf:Alt>
- </dc:description>
- <dc:title>
- <rdf:Alt>
- <rdf:li xml:lang="x-default"/>
- </rdf:Alt>
- </dc:title>
+ <dc:creator/>
+ <dc:description/>
+ <dc:title/>
</rdf:Description>
<rdf:Description rdf:about="" xmlns:pdfx="http://ns.adobe.com/pdfx/1.3/">
<pdfx:ID/>
diff --git a/tex/context/base/mkiv/lpdf-pdx.xml b/tex/context/base/mkiv/lpdf-pdx.xml
index 35726a5c0..45349b4d8 100644
--- a/tex/context/base/mkiv/lpdf-pdx.xml
+++ b/tex/context/base/mkiv/lpdf-pdx.xml
@@ -2,26 +2,19 @@
<!-- lpdf-pdx.xml -->
+<!--
+ There was a bug in the iso standard so now we just flush them flat because for some
+ reason there is no upward compatibulity. It's a sort of useless mess anyway.
+-->
+
<x:xmpmeta xmlns:x="adobe:ns:meta/">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:format>application/pdf</dc:format>
- <dc:creator>
- <rdf:Seq>
- <rdf:li xml:lang="x-default"/>
- </rdf:Seq>
- </dc:creator>
- <dc:description>
- <rdf:Alt>
- <rdf:li xml:lang="x-default"/>
- </rdf:Alt>
- </dc:description>
- <dc:title>
- <rdf:Alt>
- <rdf:li xml:lang="x-default"/>
- </rdf:Alt>
- </dc:title>
- </rdf:Description>
+ <dc:creator/>
+ <dc:description/>
+ <dc:title/>
+ </rdf:Description>
<rdf:Description rdf:about="" xmlns:pdfx="http://ns.adobe.com/pdfx/1.3/">
<pdfx:ID/>
<pdfx:ConTeXt.Jobname/>
diff --git a/tex/context/base/mkiv/lpdf-pua.xml b/tex/context/base/mkiv/lpdf-pua.xml
index f717762b6..091a3d400 100644
--- a/tex/context/base/mkiv/lpdf-pua.xml
+++ b/tex/context/base/mkiv/lpdf-pua.xml
@@ -2,25 +2,24 @@
<!-- lpdf-pua.xml -->
+<!--
+ There was a bug in the ISO standard so now we just flush them flat because for some
+ reason there is no upward compatibulity. It's a sort of useless mess anyway.
+-->
+
+<!--
+ <dc:creator> <rdf:Seq><rdf:li xml:lang="x-default"/></rdf:Seq></dc:creator>
+ <dc:description><rdf:Alt><rdf:li xml:lang="x-default"/></rdf:Alt></dc:description>
+ <dc:title> <rdf:Alt><rdf:li xml:lang="x-default"/></rdf:Alt></dc:title>
+-->
+
<x:xmpmeta xmlns:x="adobe:ns:meta/">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:format>application/pdf</dc:format>
- <dc:creator>
- <rdf:Seq>
- <rdf:li xml:lang="x-default"/>
- </rdf:Seq>
- </dc:creator>
- <dc:description>
- <rdf:Alt>
- <rdf:li xml:lang="x-default"/>
- </rdf:Alt>
- </dc:description>
- <dc:title>
- <rdf:Alt>
- <rdf:li xml:lang="x-default"/>
- </rdf:Alt>
- </dc:title>
+ <dc:creator/>
+ <dc:description/>
+ <dc:title/>
</rdf:Description>
<rdf:Description rdf:about="" xmlns:pdfx="http://ns.adobe.com/pdfx/1.3/">
<pdfx:ID/>
diff --git a/tex/context/base/mkiv/lpdf-xmp.lua b/tex/context/base/mkiv/lpdf-xmp.lua
index 508bb1997..2ca3ab3fe 100644
--- a/tex/context/base/mkiv/lpdf-xmp.lua
+++ b/tex/context/base/mkiv/lpdf-xmp.lua
@@ -59,10 +59,11 @@ local mapping = {
["Producer"] = { "metadata","rdf:Description/pdf:Producer" },
-- ["Trapped"] = { "pdf", "rdf:Description/pdf:Trapped" }, -- '/False' in /Info, but 'False' in XMP
-- Dublin Core schema
- ["Author"] = { "metadata","rdf:Description/dc:creator/rdf:Seq/rdf:li" },
["Format"] = { "metadata","rdf:Description/dc:format" }, -- optional, but nice to have
- ["Subject"] = { "metadata","rdf:Description/dc:description/rdf:Alt/rdf:li" },
- ["Title"] = { "metadata","rdf:Description/dc:title/rdf:Alt/rdf:li" },
+ -- These were dc:.../rdf:Seq/rdf:li but there was a (invalidating) bug in the iso
+ ["Author"] = { "metadata","rdf:Description/dc:creator" },
+ ["Subject"] = { "metadata","rdf:Description/dc:description" },
+ ["Title"] = { "metadata","rdf:Description/dc:title" },
-- XMP Basic schema
["CreateDate"] = { "date", "rdf:Description/xmp:CreateDate" },
["CreationDate"] = { "date", "rdf:Description/xmp:CreationDate" }, -- dummy
diff --git a/tex/context/base/mkiv/math-act.lua b/tex/context/base/mkiv/math-act.lua
index e1ef751d7..4e3365d74 100644
--- a/tex/context/base/mkiv/math-act.lua
+++ b/tex/context/base/mkiv/math-act.lua
@@ -220,10 +220,10 @@ function mathematics.tweakaftercopyingfont(target,original)
end
end
+sequencers.appendaction("mathparameters","system","mathematics.overloadparameters")
sequencers.appendaction("mathparameters","system","mathematics.scaleparameters")
sequencers.appendaction("mathparameters","system","mathematics.checkaccentbaseheight") -- should go in lfg instead
sequencers.appendaction("mathparameters","system","mathematics.checkprivateparameters") -- after scaling !
-sequencers.appendaction("mathparameters","system","mathematics.overloadparameters")
sequencers.appendaction("beforecopyingcharacters","system","mathematics.tweakbeforecopyingfont")
sequencers.appendaction("aftercopyingcharacters", "system","mathematics.tweakaftercopyingfont")
diff --git a/tex/context/base/mkiv/math-ini.lua b/tex/context/base/mkiv/math-ini.lua
index 2a8129ca7..688f682c8 100644
--- a/tex/context/base/mkiv/math-ini.lua
+++ b/tex/context/base/mkiv/math-ini.lua
@@ -31,6 +31,8 @@ local ctx_doifelsesomething = commands.doifelsesomething
local trace_defining = false trackers.register("math.defining", function(v) trace_defining = v end)
+-- trace_defining = true
+
local report_math = logs.reporter("mathematics","initializing")
mathematics = mathematics or { }
@@ -55,78 +57,96 @@ local families = allocate {
--- to be checked .. afew defaults in char-def that should be alpha
local classes = allocate {
- ord = 0, -- mathordcomm mathord
- op = 1, -- mathopcomm mathop
- bin = 2, -- mathbincomm mathbin
- rel = 3, -- mathrelcomm mathrel
- open = 4, -- mathopencomm mathopen
- middle = 4,
- close = 5, -- mathclosecomm mathclose
- punct = 6, -- mathpunctcomm mathpunct
- alpha = 7, -- mathalphacomm firstofoneargument
- accent = 8, -- class 0
- radical = 9,
- xaccent = 10, -- class 3
- topaccent = 11, -- class 0
- botaccent = 12, -- class 0
- under = 13,
- over = 14,
- delimiter = 15,
- inner = 0, -- mathinnercomm mathinner
- nothing = 0, -- mathnothingcomm firstofoneargument
- choice = 0, -- mathchoicecomm @@mathchoicecomm
- box = 0, -- mathboxcomm @@mathboxcomm
- limop = 1, -- mathlimopcomm @@mathlimopcomm
- nolop = 1, -- mathnolopcomm @@mathnolopcomm
+ ord = 0, -- mathordcomm mathord
+ op = 1, -- mathopcomm mathop
+ bin = 2, -- mathbincomm mathbin
+ rel = 3, -- mathrelcomm mathrel
+ open = 4, -- mathopencomm mathopen
+ middle = 4,
+ close = 5, -- mathclosecomm mathclose
+ punct = 6, -- mathpunctcomm mathpunct
+ alpha = 7, -- mathalphacomm firstofoneargument
+ accent = 8, -- class 0
+ radical = 9,
+ xaccent = 10, -- class 3
+ topaccent = 11, -- class 0
+ botaccent = 12, -- class 0
+ under = 13,
+ over = 14,
+ delimiter = 15,
+ division = 15,
+ inner = 0, -- mathinnercomm mathinner
+ choice = 0, -- mathchoicecomm @@mathchoicecomm
+ prime = 0,
+ differential = 0,
+ exponential = 0,
+ limop = 1, -- mathlimopcomm @@mathlimopcomm
+ nolop = 1, -- mathnolopcomm @@mathnolopcomm
--
- ordinary = 0, -- ord
- alphabetic = 7, -- alpha
- unknown = 0, -- nothing
- default = 0, -- nothing
- punctuation = 6, -- punct
- normal = 0, -- nothing
- opening = 4, -- open
- closing = 5, -- close
- binary = 2, -- bin
- relation = 3, -- rel
- fence = 0, -- unknown
- diacritic = 8, -- accent
- large = 1, -- op
- variable = 7, -- alphabetic
- number = 7, -- alphabetic
- root = 16, -- a private one
+ ordinary = 0, -- ord
+ alphabetic = 7, -- alpha
+ punctuation = 6, -- punct
+ opening = 4, -- open
+ closing = 5, -- close
+ binary = 2, -- bin
+ relation = 3, -- rel
+ diacritic = 8, -- accent
+ large = 1, -- op
+ variable = 7, -- alphabetic
+ number = 7, -- alphabetic
+ root = 16, -- a private one
}
-local open_class = 4
-local middle_class = 4
-local close_class = 5
-local accent_class = 8
-local radical_class = 9
-local topaccent_class = 11
-local botaccent_class = 12
-local under_class = 13
-local over_class = 14
-local delimiter_class = 15
-local root_class = 16
+local engineclasses = table.setmetatableindex(function(t,k)
+ if k then
+ local c = tonumber(k) or classes[k] or 0
+ local v = c < 8 and c or 0
+ t[k] = v
+ return v
+ else
+ return 0
+ end
+end)
+
+local ordinary_class = classes.ordinary
+local open_class = classes.open
+local middle_class = classes.middle
+local close_class = classes.close
+local accent_class = classes.accent
+local radical_class = classes.radical
+local topaccent_class = classes.topaccent
+local botaccent_class = classes.botaccent
+local under_class = classes.under
+local over_class = classes.over
+local delimiter_class = classes.delimiter
+local division_class = classes.division
+local root_class = classes.root
local accents = allocate {
accent = true, -- some can be both
- topaccent = true, [11] = true,
- botaccent = true, [12] = true,
- under = true, [13] = true,
- over = true, [14] = true,
+ topaccent = true, [topaccent_class] = true,
+ botaccent = true, [botaccent_class] = true,
+ under = true, [under_class] = true,
+ over = true, [over_class] = true,
unknown = false,
}
+-- engine subtypes get from elsewhere
+
local codes = allocate {
- ordinary = 0, [0] = "ordinary",
- largeoperator = 1, "largeoperator",
- binaryoperator = 2, "binaryoperator",
- relation = 3, "relation",
- openingsymbol = 4, "openingsymbol",
- closingsymbol = 5, "closingsymbol",
- punctuation = 6, "punctuation",
- variable = 7, "variable",
+ ordinary = 0, [ 0] = "ordinary",
+ largeoperator = 1, [ 1] = "largeoperator",
+ binaryoperator = 2, [ 2] = "binaryoperator",
+ relation = 3, [ 3] = "relation",
+ openingsymbol = 4, [ 4] = "openingsymbol",
+ closingsymbol = 5, [ 5] = "closingsymbol",
+ punctuation = 6, [ 6] = "punctuation",
+ -- inner = 7, [ 7] = "inner",
+ -- undersymbol = 8, [ 8] = "undersymbol",
+ -- oversymbol = 9, [ 9] = "oversymbol",
+ -- fractionsymbol = 10, [10] = "fractionsymbol",
+ -- radicalsymbol = 11, [11] = "radicalsymbol",
+ middlesymbol = 12, [12] = "middlesymbol",
}
local extensibles = allocate {
@@ -176,257 +196,206 @@ mathematics.codes = codes
mathematics.families = families
mathematics.virtualized = virtualized
--- there will be proper functions soon (and we will move this code in-line)
--- no need for " in class and family (saves space)
-
--- local function mathchar(class,family,slot)
--- return formatters['\\Umathchar "%X "%X "%X '](class,family,slot)
--- end
---
--- local function mathaccent(class,family,slot)
--- return formatters['\\Umathaccent "%X "%X "%X '](0,family,slot) -- no class
--- end
---
--- local function delimiter(class,family,slot)
--- return formatters['\\Udelimiter "%X "%X "%X '](class,family,slot)
--- end
---
--- local function radical(family,slot)
--- return formatters['\\Uradical "%X "%X '](family,slot)
--- end
---
--- local function root(family,slot)
--- return formatters['\\Uroot "%X "%X '](family,slot)
--- end
---
--- local function mathchardef(name,class,family,slot)
--- return formatters['\\Umathchardef\\%s "%X "%X "%X '](name,class,family,slot)
--- end
---
--- local function mathcode(target,class,family,slot)
--- return formatters['\\Umathcode%s="%X "%X "%X '](target,class,family,slot)
--- end
---
--- local function mathtopaccent(class,family,slot)
--- return formatters['\\Umathaccent "%X "%X "%X '](0,family,slot) -- no class
--- end
---
--- local function mathbotaccent(class,family,slot)
--- return formatters['\\Umathaccent bottom "%X "%X "%X '](0,family,slot) -- no class
--- end
---
--- local function mathtopdelimiter(class,family,slot)
--- return formatters['\\Udelimiterover "%X "%X '](family,slot) -- no class
--- end
---
--- local function mathbotdelimiter(class,family,slot)
--- return formatters['\\Udelimiterunder "%X "%X '](family,slot) -- no class
--- end
-
local escapes = characters.filters.utf.private.escapes
--- not that many so no need to reuse tables
+do
-local setmathcharacter = function(class,family,slot,unicode,mset,dset)
- if mset and codes[class] then -- regular codes < 7
- setmathcode("global",slot,class,family,unicode)
- mset = false
- end
- if dset and class == open_class or class == close_class or class == middle_class then
- setdelcode("global",slot,family,unicode,0,0)
- dset = false
+ local setmathcharacter = function(class,family,slot,unicode,mset,dset)
+ if mset and codes[class] then -- regular codes < 7
+ setmathcode("global",slot,class,family,unicode)
+ mset = false
+ end
+ if dset and (class == open_class or class == close_class or class == middle_class or class == division_class) then
+ setdelcode("global",slot,family,unicode,0,0)
+ dset = false
+ end
+ return mset, dset
end
- return mset, dset
-end
-
--- todo: make nice setters for this in lua
-
-local f_accent = formatters[ [[\defUmathtopaccent \%s{%X}{%X}{%X}]] ]
-local f_topaccent = formatters[ [[\defUmathtopaccent \%s{%X}{%X}{%X}]] ]
-local f_botaccent = formatters[ [[\defUmathbotaccent \%s{%X}{%X}{%X}]] ]
-local f_over = formatters[ [[\defUdelimiterover \%s{%X}{%X}{%X}]] ]
-local f_under = formatters[ [[\defUdelimiterunder\%s{%X}{%X}{%X}]] ]
-local f_fence = formatters[ [[\defUdelimiter \%s{%X}{%X}{%X}]] ]
-local f_delimiter = formatters[ [[\defUdelimiter \%s{%X}{%X}{%X}]] ]
-local f_radical = formatters[ [[\defUradical \%s{%X}{%X}]] ]
-local f_root = formatters[ [[\defUroot \%s{%X}{%X}]] ]
-local f_char = formatters[ [[\defUmathchar \%s{%X}{%X}{%X}]] ]
-
-local texmathchardef = tex.mathchardef
-
--- local setmathsymbol = function(name,class,family,slot) -- hex is nicer for tracing
--- if class == classes.accent then
--- ctx_sprint(f_topaccent(name,0,family,slot))
--- elseif class == classes.topaccent then
--- ctx_sprint(f_topaccent(name,0,family,slot))
--- elseif class == classes.botaccent then
--- ctx_sprint(f_botaccent(name,0,family,slot))
--- elseif class == classes.over then
--- ctx_sprint(f_over(name,0,family,slot))
--- elseif class == classes.under then
--- ctx_sprint(f_under(name,0,family,slot))
--- elseif class == open_class or class == close_class or class == middle_class then
--- setdelcode("global",slot,{family,slot,0,0})
--- ctx_sprint(f_fence(name,class,family,slot))
--- elseif class == classes.delimiter then
--- setdelcode("global",slot,{family,slot,0,0})
--- ctx_sprint(f_delimiter(name,0,family,slot))
--- elseif class == classes.radical then
--- ctx_sprint(f_radical(name,family,slot))
--- elseif class == classes.root then
--- ctx_sprint(f_root(name,family,slot))
--- elseif texmathchardef then
--- texmathchardef(name,class,family,slot,"permanent")
--- else
--- -- beware, open/close and other specials should not end up here
--- ctx_sprint(f_char(name,class,family,slot))
--- end
--- end
-local setmathsymbol = function(name,class,family,slot) -- hex is nicer for tracing
- if class == accent_class then
- ctx_sprint(f_topaccent(name,0,family,slot))
- elseif class == topaccent_class then
- ctx_sprint(f_topaccent(name,0,family,slot))
- elseif class == botaccent_class then
- ctx_sprint(f_botaccent(name,0,family,slot))
- elseif class == over_class then
- ctx_sprint(f_over(name,0,family,slot))
- elseif class == under_class then
- ctx_sprint(f_under(name,0,family,slot))
- elseif class == open_class or class == close_class or class == middle_class then
- setdelcode("global",slot,{family,slot,0,0})
- ctx_sprint(f_fence(name,class,family,slot))
- elseif class == delimiter_class then
- setdelcode("global",slot,{family,slot,0,0})
- ctx_sprint(f_delimiter(name,0,family,slot))
- elseif class == radical_class then
- ctx_sprint(f_radical(name,family,slot))
- elseif class == root_class then
- ctx_sprint(f_root(name,family,slot))
- elseif texmathchardef then
- texmathchardef(name,class,family,slot,"permanent")
- else
- -- beware, open/close and other specials should not end up here
- ctx_sprint(f_char(name,class,family,slot))
+ local function report(class,engine,family,unicode,name)
+ local nametype = type(name)
+ if nametype == "string" then
+ report_math("class %a, engine %a, family %a, char %C, name %a",class,engine,family,unicode,name)
+ elseif nametype == "number" then
+ report_math("class %a, engine %a, family %a, char %C, number %U",class,engine,family,unicode,name)
+ else
+ report_math("class %a, engine %a, family %a, char %C",class,engine,family,unicode)
+ end
end
-end
-local function report(class,family,unicode,name)
- local nametype = type(name)
- if nametype == "string" then
- report_math("class name %a, class %a, family %a, char %C, name %a",classname,class,family,unicode,name)
- elseif nametype == "number" then
- report_math("class name %a, class %a, family %a, char %C, number %U",classname,class,family,unicode,name)
- else
- report_math("class name %a, class %a, family %a, char %C", classname,class,family,unicode)
+ local f_accent = formatters[ [[\defUmathtopaccent \%s{%X}{%X}{%X}]] ]
+ local f_topaccent = formatters[ [[\defUmathtopaccent \%s{%X}{%X}{%X}]] ]
+ local f_botaccent = formatters[ [[\defUmathbotaccent \%s{%X}{%X}{%X}]] ]
+ local f_over = formatters[ [[\defUdelimiterover \%s{%X}{%X}{%X}]] ]
+ local f_under = formatters[ [[\defUdelimiterunder\%s{%X}{%X}{%X}]] ]
+ local f_fence = formatters[ [[\defUdelimiter \%s{%X}{%X}{%X}]] ]
+ local f_delimiter = formatters[ [[\defUdelimiter \%s{%X}{%X}{%X}]] ]
+ local f_radical = formatters[ [[\defUradical \%s{%X}{%X}]] ]
+ local f_root = formatters[ [[\defUroot \%s{%X}{%X}]] ]
+ local f_char = formatters[ [[\defUmathchar \%s{%X}{%X}{%X}]] ]
+
+ local texmathchardef = tex.mathchardef
+
+ local setmathsymbol = function(name,class,engine,family,slot) -- hex is nicer for tracing
+ if class == accent_class then
+ ctx_sprint(f_topaccent(name,0,family,slot))
+ elseif class == topaccent_class then
+ ctx_sprint(f_topaccent(name,0,family,slot))
+ elseif class == botaccent_class then
+ ctx_sprint(f_botaccent(name,0,family,slot))
+ elseif class == over_class then
+ ctx_sprint(f_over(name,0,family,slot))
+ elseif class == under_class then
+ ctx_sprint(f_under(name,0,family,slot))
+ elseif class == open_class or class == close_class or class == middle_class then
+ setdelcode("global",slot,{family,slot,0,0})
+ ctx_sprint(f_fence(name,engine,family,slot))
+ elseif class == delimiter_class then
+ setdelcode("global",slot,{family,slot,0,0})
+ ctx_sprint(f_delimiter(name,0,family,slot))
+ elseif class == radical_class then
+ ctx_sprint(f_radical(name,family,slot))
+ elseif class == root_class then
+ ctx_sprint(f_root(name,family,slot))
+ elseif texmathchardef then
+ texmathchardef(name,engine,family,slot,"permanent")
+ else
+ -- beware, open/close and other specials should not end up here
+ ctx_sprint(f_char(name,engine,family,slot))
+ end
end
-end
--- there will be a combined \(math)chardef (tracker)
-
-function mathematics.define(family)
- family = family or 0
- family = families[family] or family
- local data = characters.data
- for unicode, character in sortedhash(data) do
- local symbol = character.mathsymbol
- local mset = true
- local dset = true
- if symbol then
- local other = data[symbol]
- local class = other.mathclass
- if class then
- class = classes[class] or class -- no real checks needed
- if trace_defining then
- report(class,family,unicode,symbol)
- end
- mset, dset = setmathcharacter(class,family,unicode,symbol,mset,dset)
+ function mathematics.define(family)
+ family = family or 0
+ family = families[family] or family
+ local data = characters.data
+ --
+ local function remap(first,last)
+ for unicode=utfbyte(first),utfbyte(last) do
+ setmathcode("global",unicode,ordinary_class,family,unicode)
end
- local spec = other.mathspec
- if spec then
- for i=1,#spec do
- local m = spec[i]
- local class = m.class
- if class then
- class = classes[class] or class -- no real checks needed
- mset, dset = setmathcharacter(class,family,unicode,symbol,mset,dset)
+ end
+ remap("0","9")
+ remap("A","Z")
+ remap("a","z")
+ --
+ for unicode, character in sortedhash(data) do
+ local symbol = character.mathsymbol
+ local mset = true
+ local dset = true
+ if symbol then
+ local other = data[symbol]
+ local class = other.mathclass
+ if class then
+ local engine = engineclasses[class]
+ if trace_defining then
+ report(class,engine,family,unicode,symbol)
end
+ mset, dset = setmathcharacter(engine,family,unicode,symbol,mset,dset)
end
- end
- end
- local mathclass = character.mathclass
- local mathspec = character.mathspec
- if mathspec then
- if mathclass then
- local name = character.mathname
- if name then
- report_math("fatal error, conflicting mathclass and mathspec for %C",unicode)
- os.exit()
- else
- local class = classes[mathclass] or mathclass -- no real checks needed
- if not class then
- if trace_defining then
- report("unknown",family,unicode)
+ local spec = other.mathspec
+ if spec then
+ for i=1,#spec do
+ local m = spec[i]
+ local class = m.class
+ if class then
+ local engine = engineclasses[class]
+ -- todo: trace
+ mset, dset = setmathcharacter(engine,family,unicode,symbol,mset,dset)
end
- else
- if trace_defining then
- report(class,family,unicode)
- end
- mset, dset = setmathcharacter(class,family,unicode,unicode,mset,dset)
end
end
end
- for i=1,#mathspec do
- local m = mathspec[i]
- local name = m.name
- local class = m.class
+ local class = character.mathclass
+ local spec = character.mathspec
+ local name = character.mathname
+ if spec then
+ local done = false
if class then
- class = classes[class] or class -- no real checks needed
if name then
+ report_math("fatal error, conflicting mathclass and mathspec for %C",unicode)
+ os.exit()
+ else
+ class = classes[class] or ordinary_class
+ local engine = engineclasses[class]
if trace_defining then
- report(class,family,unicode,name)
+ report(class,engine,family,unicode)
end
- setmathsymbol(name,class,family,unicode)
+ mset, dset = setmathcharacter(engine,family,unicode,unicode,mset,dset)
+ done = true
+ end
+ end
+ for i=1,#spec do
+ local m = spec[i]
+ local name = m.name
+ local class = m.class or class
+ if class then
+ class = classes[class] or ordinary_class
else
- name = (class == classes.variable or class == classes.number) and character.adobename -- bad
- if name and trace_defining then
- report(class,family,unicode,name)
+ class = ordinary_class
+ end
+ if class then
+ local engine = engineclasses[class]
+ if name then
+ if trace_defining then
+ report(class,engine,family,unicode,name)
+ end
+ setmathsymbol(name,class,engine,family,unicode)
+ else
+ name = (class == classes.ordinary or class == classes.digit) and character.adobename -- bad
+ if name and trace_defining then
+ report(class,engine,family,unicode,name)
+ end
+ end
+ if not done then
+ mset, dset = setmathcharacter(engine,family,unicode,m.unicode or unicode,mset,dset) -- see solidus
+ done = true
end
end
- mset, dset = setmathcharacter(class,family,unicode,m.unicode or unicode,mset,dset) -- see solidus
- end
- end
- elseif mathclass then
- local name = character.mathname
- local class = classes[mathclass] or mathclass -- no real checks needed
- if not class then
- if trace_defining then
- report("unknown",family,unicode,name)
end
- elseif name == false then
- if trace_defining then
- report(class,family,unicode,name)
- end
- mset, dset = setmathcharacter(class,family,unicode,unicode,mset,dset)
else
- -- if not name then
- -- name = character.contextname -- too dangerous, we loose textslash and a few more
- -- end
- if name then
- if trace_defining then
- report(class,family,unicode,name)
- end
- setmathsymbol(name,class,family,unicode)
+ if class then
+ class = classes[class] or ordinary_class
else
+ class = ordinary_class
+ end
+ if name ~= nil then
+ local engine = engineclasses[class]
+ if name == false then
+ if trace_defining then
+ report(class,engine,family,unicode,name)
+ end
+ mset, dset = setmathcharacter(engine,family,unicode,unicode,mset,dset)
+ else
+ -- if not name then
+ -- name = character.contextname -- too dangerous, we loose textslash and a few more
+ -- end
+ if name then
+ if trace_defining then
+ report(class,engine,family,unicode,name)
+ end
+ setmathsymbol(name,class,engine,family,unicode)
+ else
+ if trace_defining then
+ report(class,engine,family,unicode,character.adobename)
+ end
+ end
+ mset, dset = setmathcharacter(engine,family,unicode,unicode,mset,dset)
+ end
+ elseif class ~= ordinary_class then
+ local engine = engineclasses[class]
if trace_defining then
- report(class,family,unicode,character.adobename)
+ report(class,engine,family,unicode,character.adobename)
end
+ mset, dset = setmathcharacter(engine,family,unicode,unicode,mset,dset)
end
- mset, dset = setmathcharacter(class,family,unicode,unicode,mset,dset)
end
end
+ if trace_defining then
+ logs.stopfilelogging()
+ end
end
+
end
-- needed for mathml analysis
diff --git a/tex/context/base/mkiv/math-int.mkiv b/tex/context/base/mkiv/math-int.mkiv
index 5876eb7bb..0920415f9 100644
--- a/tex/context/base/mkiv/math-int.mkiv
+++ b/tex/context/base/mkiv/math-int.mkiv
@@ -68,8 +68,8 @@
\to \everyswitchmathematics
\setupmathematics
-% [\v!integral=nolimits]
- [\v!integral=autolimits]
+% [\c!integral=nolimits]
+ [\c!integral=autolimits]
%D The following code is used for fallbacks and might become obsolete once
%D we have enough \OPENTYPE\ math fonts.
diff --git a/tex/context/base/mkiv/math-tag.lua b/tex/context/base/mkiv/math-tag.lua
index 3c53c2cc8..5bbe5cb3a 100644
--- a/tex/context/base/mkiv/math-tag.lua
+++ b/tex/context/base/mkiv/math-tag.lua
@@ -99,7 +99,6 @@ local chardata = characters.data
local getmathcodes = tex.getmathcodes
local mathcodes = mathematics.codes
local ordinary_mathcode = mathcodes.ordinary
-local variable_mathcode = mathcodes.variable
local fromunicode16 = fonts.mappings.fromunicode16
local fontcharacters = fonts.hashes.characters
@@ -226,7 +225,7 @@ process = function(start) -- we cannot use the processor as we have no finalizer
local char = getchar(start)
local code = getmathcodes(char)
local tag
- if code == ordinary_mathcode or code == variable_mathcode then
+ if code == ordinary_mathcode then
local ch = chardata[char]
local mc = ch and ch.mathclass
if mc == "number" then
diff --git a/tex/context/base/mkiv/mult-def.lua b/tex/context/base/mkiv/mult-def.lua
index e294e65d1..c0a9d70e0 100644
--- a/tex/context/base/mkiv/mult-def.lua
+++ b/tex/context/base/mkiv/mult-def.lua
@@ -7881,6 +7881,10 @@ return {
["fr"]="commandebas",
["nl"]="ondercommando",
},
+ ["bottomcolor"]={
+ ["en"]="bottomcolor",
+ ["nl"]="onderkleur",
+ },
["bottomdistance"]={
["cs"]="vzdalenostspodku",
["de"]="abstandunten",
@@ -9453,6 +9457,10 @@ return {
["en"]="instance",
["fr"]="instance",
},
+ ["integral"]={
+ ["en"]="integral",
+ ["fr"]="integrale",
+ },
["intent"]={
["en"]="intent",
["fr"]="intention",
@@ -12427,6 +12435,10 @@ return {
["fr"]="commandehaut",
["nl"]="bovencommando",
},
+ ["topcolor"]={
+ ["en"]="topcolor",
+ ["nl"]="bovenkleur",
+ },
["topdistance"]={
["cs"]="vzdalenostvrsku",
["de"]="obenabstand",
@@ -12806,6 +12818,15 @@ return {
["pe"]="گام‌وای",
["ro"]="ystep",
},
+ ["leftsource"]={
+ ["en"]="leftsource",
+ },
+ ["rightsource"]={
+ ["en"]="rightsource",
+ },
+ ["middlesource"]={
+ ["en"]="middlesource",
+ },
["source"]={
["en"]="source",
},
@@ -16305,10 +16326,6 @@ return {
["pe"]="درحاشیه‌راست",
["ro"]="inmargineadreapta",
},
- ["integral"]={
- ["en"]="integral",
- ["fr"]="integrale",
- },
["interaction"]={
["cs"]="interakce",
["de"]="interaktion",
diff --git a/tex/context/base/mkiv/mult-low.lua b/tex/context/base/mkiv/mult-low.lua
index 2be5115e0..e5feab5d6 100644
--- a/tex/context/base/mkiv/mult-low.lua
+++ b/tex/context/base/mkiv/mult-low.lua
@@ -22,6 +22,7 @@ return {
"pluscxxvii", "pluscxxviii", "pluscclv", "pluscclvi",
"normalpagebox",
"binaryshiftedten", "binaryshiftedtwenty", "binaryshiftedthirty",
+ "thickermuskip",
--
"directionlefttoright", "directionrighttoleft",
--
@@ -77,7 +78,8 @@ return {
"loosenessfrozenparcode", "lastlinefrozenparcode", "linepenaltyfrozenparcode", "clubpenaltyfrozenparcode",
"widowpenaltyfrozenparcode", "displaypenaltyfrozenparcode", "brokenpenaltyfrozenparcode",
"demeritsfrozenparcode", "shapefrozenparcode", "linefrozenparcode", "hyphenationfrozenparcode",
- "shapingpenaltiesfrozenparcode", "orphanpenaltyfrozenparcode", "allfrozenparcode",
+ "shapingpenaltyfrozenparcode", "orphanpenaltyfrozenparcode", "allfrozenparcode",
+ "mathpenaltyfrozenparcode",
--
"activemathcharcode",
--
@@ -103,10 +105,11 @@ return {
"trueifcode", "falseifcode", "caseifcode", "definedifcode", "csnameifcode", "fontcharifcode",
--
"overrulemathcontrolcode", "underrulemathcontrolcode", "radicalrulemathcontrolcode", "fractionrulemathcontrolcode",
- "accentskewhalfmathcontrolcode", "accentskewapplymathcontrolcode", "accentitalickernmathcontrolcode",
- "delimiteritalickernmathcontrolcode", "noorditalickernmathcontrolcode", "charitalicwidthmathcontrolcode",
- "charitalicnoreboxmathcontrolcode", "boxednoitalickernmathcontrolcode", "nostaircasekernmathcontrolcode",
- "textitalickernmathcontrolcode", "noscriptitalickernmathcontrolcode", "italicshapekernmathcontrolcode",
+ "accentskewhalfmathcontrolcode", "accentskewapplymathcontrolcode", "checkligatureandkernmathcontrolcode",
+ "applyverticalitalickernmathcontrolcode", "applyordinaryitalickernmathcontrolcode", "applycharitalickernmathcontrolcode",
+ "reboxcharitalickernmathcontrolcode", "applyboxeditalickernmathcontrolcode", "staircasekernmathcontrolcode",
+ "applytextitalickernmathcontrolcode", "applyscriptitalickernmathcontrolcode", "italicshapekernmathcontrolcode",
+ "checkspaceitalickernmathcontrolcode", "checktextitalickernmathcontrolcode",
--
"noligaturingglyphoptioncode", "nokerningglyphoptioncode", "noexpansionglyphoptioncode", "noprotrusionglyphoptioncode",
"noleftkerningglyphoptioncode", "noleftligaturingglyphoptioncode", "norightkerningglyphoptioncode", "norightligaturingglyphoptioncode",
@@ -157,9 +160,16 @@ return {
--
"typescriptone", "typescripttwo", "typescriptthree", "mathsizesuffix",
--
- "mathordcode", "mathopcode", "mathbincode", "mathrelcode", "mathopencode", "mathclosecode",
- "mathpunctcode", "mathalphacode", "mathinnercode", "mathnothingcode", "mathlimopcode",
- "mathnolopcode", "mathboxcode", "mathchoicecode", "mathaccentcode", "mathradicalcode",
+ "mathordinarycode", "mathordcode", "mathoperatorcode", "mathopcode", "mathbinarycode", "mathbincode",
+ "mathrelationcode", "mathrelcode", "mathopencode", "mathclosecode", "mathpunctuationcode",
+ "mathpunctcode", "mathovercode", "mathundercode", "mathinnercode", "mathradicalcode",
+ "mathfractioncode", "mathmiddlecode", "mathaccentcode", "mathfencedcode", "mathghostcode",
+ "mathvariablecode", "mathactivecode", "mathvcentercode",
+ "mathbegincode", "mathendcode", "mathexplicitcode", "mathdivisioncode", "mathfactorialcode",
+ --
+ "mathimaginarycode", "mathdifferentialcode", "mathexponentialcode", "mathfunctioncode", "mathdigitcode",
+ -- "mathtopaccentcode", "mathbottomaccentcode", "mathdelimitercode", "mathrootcode", "mathprintcode", --
+ "mathalphacode", "mathboxcode", "mathchoicecode", "mathnothingcode", "mathlimopcode", "mathnolopcode",
--
"constantnumber", "constantnumberargument", "constantdimen", "constantdimenargument", "constantemptyargument",
--
@@ -193,7 +203,7 @@ return {
--
"normalizelinenormalizecode", "parindentskipnormalizecode", "swaphangindentnormalizecode", "swapparsshapenormalizecode",
"breakafterdirnormalizecode", "removemarginkernsnormalizecode", "clipwidthnormalizecode", "flattendiscretionariesnormalizecode",
- "discardzerotabskipsnormalizecode",
+ "discardzerotabskipsnormalizecode", "flattenleadersnormalizecode",
--
"noligaturingglyphoptioncode", "nokerningglyphoptioncode", "noleftligatureglyphoptioncode",
"noleftkernglyphoptioncode", "norightligatureglyphoptioncode", "norightkernglyphoptioncode",
@@ -260,7 +270,8 @@ return {
--
"donetrue", "donefalse", "foundtrue", "foundfalse",
--
- "inlineordisplaymath","indisplaymath","forcedisplaymath","startforceddisplaymath","stopforceddisplaymath","startpickupmath","stoppickupmath","reqno",
+ "inlineordisplaymath", "indisplaymath", "forcedisplaymath", "startforceddisplaymath", "stopforceddisplaymath",
+ "startpickupmath", "stoppickupmath", "reqno", "forceinlinemath",
--
"mathortext",
--
@@ -307,6 +318,7 @@ return {
"triggergroupedcommand", "triggergroupedcommandcs",
"simplegroupedcommand", "simplegroupedcommandcs",
"pickupgroupedcommand", "pickupgroupedcommandcs",
+ "mathgroupedcommandcs",
--
"usedbaselineskip", "usedlineskip", "usedlineskiplimit",
--
@@ -467,43 +479,51 @@ return {
--
"ordordspacing", "ordopspacing", "ordbinspacing", "ordrelspacing",
"ordopenspacing", "ordclosespacing", "ordpunctspacing", "ordinnerspacing",
- "ordfracspacing", "ordradspacing",
+ "ordfracspacing", "ordradspacing", "ordmiddlespacing", "ordaccentspacing",
--
"opordspacing", "opopspacing", "opbinspacing", "oprelspacing",
"opopenspacing", "opclosespacing", "oppunctspacing", "opinnerspacing",
- "opfracspacing", "opradspacing",
+ "opfracspacing", "opradspacing", "opmiddlespacing", "opaccentspacing",
--
"binordspacing", "binopspacing", "binbinspacing", "binrelspacing",
"binopenspacing", "binclosespacing", "binpunctspacing", "bininnerspacing",
- "binfracspacing", "binradspacing",
+ "binfracspacing", "binradspacing", "binmiddlespacing", "binaccentspacing",
--
"relordspacing", "relopspacing", "relbinspacing", "relrelspacing",
"relopenspacing", "relclosespacing", "relpunctspacing", "relinnerspacing",
- "relfracspacing", "relradspacing",
+ "relfracspacing", "relradspacing", "relmiddlespacing", "relaccentspacing",
--
"openordspacing", "openopspacing", "openbinspacing", "openrelspacing",
"openopenspacing", "openclosespacing", "openpunctspacing", "openinnerspacing",
- "openfracspacing", "openradspacing",
+ "openfracspacing", "openradspacing", "openmiddlespacing", "openaccentspacing",
--
"closeordspacing", "closeopspacing", "closebinspacing", "closerelspacing",
"closeopenspacing", "closeclosespacing", "closepunctspacing", "closeinnerspacing",
- "closefracspacing", "closeradspacing",
+ "closefracspacing", "closeradspacing", "closemiddlespacing", "closeaccentspacing",
--
"punctordspacing", "punctopspacing", "punctbinspacing", "punctrelspacing",
"punctopenspacing", "punctclosespacing", "punctpunctspacing", "punctinnerspacing",
- "punctfracspacing", "punctradspacing",
+ "punctfracspacing", "punctradspacing", "punctmiddlespacing", "punctaccentspacing",
--
"innerordspacing", "inneropspacing", "innerbinspacing", "innerrelspacing",
"inneropenspacing", "innerclosespacing", "innerpunctspacing", "innerinnerspacing",
- "innerfracspacing", "innerradspacing",
+ "innerfracspacing", "innerradspacing", "innermiddlespacing", "inneraccentspacing",
--
"fracordspacing", "fracopspacing", "fracbinspacing", "fracrelspacing",
"fracopenspacing", "fracclosespacing", "fracpunctspacing", "fracinnerspacing",
- "fracfracspacing", "fracradspacing",
+ "fracfracspacing", "fracradspacing", "fracmiddlespacing", "fracaccentspacing",
--
"radordspacing", "radopspacing", "radbinspacing", "radrelspacing",
"radopenspacing", "radclosespacing", "radpunctspacing", "radinnerspacing",
- "radfracspacing", "radradspacing",
+ "radfracspacing", "radradspacing", "radmiddlespacing", "radaccentspacing",
+ --
+ "middleordspacing", "middleopspacing", "middlebinspacing", "middlerelspacing",
+ "middleopenspacing", "middleclosespacing", "middlepunctspacing", "middleinnerspacing",
+ "middlefracspacing", "middleradspacing", "middlemiddlespacing", "middleaccentspacing",
+ --
+ "accentordspacing", "accentopspacing", "accentbinspacing", "accentrelspacing",
+ "accentopenspacing", "accentclosespacing", "accentpunctspacing", "accentinnerspacing",
+ "accentfracspacing", "accentradspacing", "accentmiddlespacing", "accentaccentspacing",
--
"normalreqno",
--
diff --git a/tex/context/base/mkiv/mult-prm.lua b/tex/context/base/mkiv/mult-prm.lua
index 6959944d9..bbc41176b 100644
--- a/tex/context/base/mkiv/mult-prm.lua
+++ b/tex/context/base/mkiv/mult-prm.lua
@@ -64,8 +64,6 @@ return {
"widowpenalties",
},
["luatex"]={
- "UUskewed",
- "UUskewedwithdelims",
"Uabove",
"Uabovewithdelims",
"Uatop",
@@ -84,16 +82,6 @@ return {
"Umathadapttoleft",
"Umathadapttoright",
"Umathaxis",
- "Umathbinbinspacing",
- "Umathbinclosespacing",
- "Umathbinfracspacing",
- "Umathbininnerspacing",
- "Umathbinopenspacing",
- "Umathbinopspacing",
- "Umathbinordspacing",
- "Umathbinpunctspacing",
- "Umathbinradspacing",
- "Umathbinrelspacing",
"Umathbotaccentvariant",
"Umathchar",
"Umathcharclass",
@@ -103,16 +91,6 @@ return {
"Umathcharnumdef",
"Umathcharslot",
"Umathclass",
- "Umathclosebinspacing",
- "Umathcloseclosespacing",
- "Umathclosefracspacing",
- "Umathcloseinnerspacing",
- "Umathcloseopenspacing",
- "Umathcloseopspacing",
- "Umathcloseordspacing",
- "Umathclosepunctspacing",
- "Umathcloseradspacing",
- "Umathcloserelspacing",
"Umathcode",
"Umathcodenum",
"Umathconnectoroverlapmin",
@@ -128,16 +106,6 @@ return {
"Umathextrasupprespace",
"Umathextrasupshift",
"Umathextrasupspace",
- "Umathfracbinspacing",
- "Umathfracclosespacing",
- "Umathfracfracspacing",
- "Umathfracinnerspacing",
- "Umathfracopenspacing",
- "Umathfracopspacing",
- "Umathfracordspacing",
- "Umathfracpunctspacing",
- "Umathfracradspacing",
- "Umathfracrelspacing",
"Umathfractiondelsize",
"Umathfractiondenomdown",
"Umathfractiondenomvgap",
@@ -146,16 +114,6 @@ return {
"Umathfractionrule",
"Umathfractionvariant",
"Umathhextensiblevariant",
- "Umathinnerbinspacing",
- "Umathinnerclosespacing",
- "Umathinnerfracspacing",
- "Umathinnerinnerspacing",
- "Umathinneropenspacing",
- "Umathinneropspacing",
- "Umathinnerordspacing",
- "Umathinnerpunctspacing",
- "Umathinnerradspacing",
- "Umathinnerrelspacing",
"Umathlimitabovebgap",
"Umathlimitabovekern",
"Umathlimitabovevgap",
@@ -168,39 +126,9 @@ return {
"Umathnolimitsubfactor",
"Umathnolimitsupfactor",
"Umathnumeratorvariant",
- "Umathopbinspacing",
- "Umathopclosespacing",
- "Umathopenbinspacing",
- "Umathopenclosespacing",
- "Umathopenfracspacing",
- "Umathopeninnerspacing",
- "Umathopenopenspacing",
- "Umathopenopspacing",
- "Umathopenordspacing",
- "Umathopenpunctspacing",
- "Umathopenradspacing",
- "Umathopenrelspacing",
"Umathopenupdepth",
"Umathopenupheight",
"Umathoperatorsize",
- "Umathopfracspacing",
- "Umathopinnerspacing",
- "Umathopopenspacing",
- "Umathopopspacing",
- "Umathopordspacing",
- "Umathoppunctspacing",
- "Umathopradspacing",
- "Umathoprelspacing",
- "Umathordbinspacing",
- "Umathordclosespacing",
- "Umathordfracspacing",
- "Umathordinnerspacing",
- "Umathordopenspacing",
- "Umathordopspacing",
- "Umathordordspacing",
- "Umathordpunctspacing",
- "Umathordradspacing",
- "Umathordrelspacing",
"Umathoverbarkern",
"Umathoverbarrule",
"Umathoverbarvgap",
@@ -210,20 +138,14 @@ return {
"Umathoverlayaccentvariant",
"Umathoverlinevariant",
"Umathphantom",
- "Umathpunctbinspacing",
- "Umathpunctclosespacing",
- "Umathpunctfracspacing",
- "Umathpunctinnerspacing",
- "Umathpunctopenspacing",
- "Umathpunctopspacing",
- "Umathpunctordspacing",
- "Umathpunctpunctspacing",
- "Umathpunctradspacing",
- "Umathpunctrelspacing",
+ "Umathpresubshiftdistance",
+ "Umathpresupshiftdistance",
+ "Umathprimeraise",
+ "Umathprimeshiftdrop",
+ "Umathprimeshiftup",
+ "Umathprimesupspace",
+ "Umathprimevariant",
"Umathquad",
- "Umathradbinspacing",
- "Umathradclosespacing",
- "Umathradfracspacing",
"Umathradicaldegreeafter",
"Umathradicaldegreebefore",
"Umathradicaldegreeraise",
@@ -231,33 +153,19 @@ return {
"Umathradicalrule",
"Umathradicalvariant",
"Umathradicalvgap",
- "Umathradinnerspacing",
- "Umathradopenspacing",
- "Umathradopspacing",
- "Umathradordspacing",
- "Umathradpunctspacing",
- "Umathradradspacing",
- "Umathradrelspacing",
- "Umathrelbinspacing",
- "Umathrelclosespacing",
- "Umathrelfracspacing",
- "Umathrelinnerspacing",
- "Umathrelopenspacing",
- "Umathrelopspacing",
- "Umathrelordspacing",
- "Umathrelpunctspacing",
- "Umathrelradspacing",
- "Umathrelrelspacing",
+ "Umathruledepth",
+ "Umathruleheight",
+ "Umathskeweddelimitertolerance",
"Umathskewedfractionhgap",
"Umathskewedfractionvgap",
"Umathspaceafterscript",
"Umathspacebeforescript",
- "Umathspacingmode",
"Umathstackdenomdown",
"Umathstacknumup",
"Umathstackvariant",
"Umathstackvgap",
"Umathsubscriptvariant",
+ "Umathsubshiftdistance",
"Umathsubshiftdown",
"Umathsubshiftdrop",
"Umathsubsupshiftdown",
@@ -265,6 +173,7 @@ return {
"Umathsubtopmax",
"Umathsupbottommin",
"Umathsuperscriptvariant",
+ "Umathsupshiftdistance",
"Umathsupshiftdrop",
"Umathsupshiftup",
"Umathsupsubbottommax",
@@ -276,6 +185,7 @@ return {
"Umathunderdelimitervariant",
"Umathunderdelimitervgap",
"Umathunderlinevariant",
+ "Umathuseaxis",
"Umathvextensiblevariant",
"Umathvoid",
"Umathxscale",
@@ -285,12 +195,18 @@ return {
"Unosubscript",
"Unosuperprescript",
"Unosuperscript",
+ "Uoperator",
"Uover",
"Uoverdelimiter",
"Uoverwithdelims",
+ "Uprimescript",
"Uradical",
"Uright",
"Uroot",
+ "Ushiftedsubprescript",
+ "Ushiftedsubscript",
+ "Ushiftedsuperprescript",
+ "Ushiftedsuperscript",
"Uskewed",
"Uskewedwithdelims",
"Ustack",
@@ -314,10 +230,14 @@ return {
"aliased",
"alignmark",
"aligntab",
+ "allcrampedstyles",
+ "alldisplaystyles",
"allmathstyles",
+ "allscriptscriptstyles",
"allscriptstyles",
"allsplitstyles",
"alltextstyles",
+ "alluncrampedstyles",
"atendofgroup",
"atendofgrouped",
"attribute",
@@ -347,6 +267,9 @@ return {
"boxyoffset",
"catcodetable",
"clearmarks",
+ "copymathatomrule",
+ "copymathparent",
+ "copymathspacing",
"crampeddisplaystyle",
"crampedscriptscriptstyle",
"crampedscriptstyle",
@@ -480,13 +403,19 @@ return {
"lastarguments",
"lastchkdim",
"lastchknum",
+ "lastleftclass",
+ "lastloopiterator",
"lastnamedcs",
"lastnodesubtype",
"lastparcontext",
+ "lastrightclass",
"leftmarginkern",
"letcharcode",
"letcsname",
"letfrozen",
+ "letmathatomrule",
+ "letmathparent",
+ "letmathspacing",
"letprotected",
"lettonothing",
"linedirection",
@@ -512,15 +441,23 @@ return {
"luatexbanner",
"luatexrevision",
"luatexversion",
+ "mathaccent",
+ "mathatom",
+ "mathatomskip",
+ "mathbackwardpenalties",
"mathcontrolmode",
"mathdelimitersmode",
"mathdirection",
"mathdisplayskipmode",
"matheqnogapstep",
- "mathflattenmode",
+ "mathfenced",
+ "mathfencesmode",
"mathfontcontrol",
+ "mathforwardpenalties",
"mathfrac",
+ "mathghost",
"mathlimitsmode",
+ "mathmiddle",
"mathnolimitsmode",
"mathpenaltiesmode",
"mathrad",
@@ -531,9 +468,14 @@ return {
"mathscriptboxmode",
"mathscriptcharmode",
"mathscriptsmode",
+ "mathslackmode",
+ "mathspacingmode",
+ "mathstackstyle",
"mathstyle",
+ "mathstylefontid",
"mathsurroundmode",
"mathsurroundskip",
+ "maththreshold",
"mugluespecdef",
"mutable",
"noaligned",
@@ -562,26 +504,45 @@ return {
"permanent",
"postexhyphenchar",
"posthyphenchar",
+ "postinlinepenalty",
"prebinoppenalty",
"predisplaygapfactor",
"preexhyphenchar",
"prehyphenchar",
+ "preinlinepenalty",
"prerelpenalty",
"protrudechars",
"protrusionboundary",
"pxdimen",
"quitloop",
"quitvmode",
+ "resetmathspacing",
"retokenized",
"rightmarginkern",
"rpcode",
"savecatcodetable",
+ "scaledemwidth",
+ "scaledexheight",
+ "scaledextraspace",
+ "scaledinterwordshrink",
+ "scaledinterwordspace",
+ "scaledinterwordstretch",
+ "scaledslantperpoint",
"scantextokens",
"semiexpanded",
"semiprotected",
+ "setdefaultmathcodes",
"setfontid",
+ "setmathatomrule",
+ "setmathignore",
+ "setmathoptions",
+ "setmathpostpenalty",
+ "setmathprepenalty",
+ "setmathspacing",
"shapingpenaltiesmode",
"shapingpenalty",
+ "skewed",
+ "skewedwithdelims",
"snapshotpar",
"supmarkmode",
"swapcsvalues",
@@ -607,6 +568,7 @@ return {
"tracingmarks",
"tracingmath",
"tracingnodes",
+ "uleaders",
"undent",
"unexpandedloop",
"unletfrozen",
@@ -900,7 +862,6 @@ return {
"lower",
"lowercase",
"mark",
- "mathaccent",
"mathbin",
"mathchar",
"mathchardef",
@@ -1010,6 +971,7 @@ return {
"splitfirstmark",
"splitmaxdepth",
"splittopskip",
+ "srule",
"string",
"tabskip",
"textfont",
@@ -1018,6 +980,7 @@ return {
"thickmuskip",
"thinmuskip",
"time",
+ "tinymuskip",
"toks",
"toksdef",
"tolerance",
diff --git a/tex/context/base/mkiv/node-ser.lua b/tex/context/base/mkiv/node-ser.lua
index 0f4d13bb6..ee2abe0d2 100644
--- a/tex/context/base/mkiv/node-ser.lua
+++ b/tex/context/base/mkiv/node-ser.lua
@@ -133,7 +133,7 @@ setinspector("node",function(v) if isnode(v) then printtable(astable(v),tostring
local function totable(n,flat,verbose,noattributes) -- nicest: n,true,true,true
local function to_table(n,flat,verbose,noattributes) -- no need to pass
- local f = getfields(n)
+ local f = getfields(n.id)
local tt = { }
for k=1,#f do
local v = f[k]
diff --git a/tex/context/base/mkiv/page-str.lua b/tex/context/base/mkiv/page-str.lua
index e136a38b4..64e593e27 100644
--- a/tex/context/base/mkiv/page-str.lua
+++ b/tex/context/base/mkiv/page-str.lua
@@ -27,8 +27,9 @@ local write_node = nuts.write
local flushnode = nuts.flush
local copy_node_list = nuts.copylist
local vpack_node_list = nuts.vpack
+local new_rule = nuts.pool.rule
-local getbox = nuts.getbox
+----- getbox = nuts.getbox
local setlink = nuts.setlink
local getlist = nuts.getlist
local setlist = nuts.setlist
@@ -40,7 +41,6 @@ local settings_to_array = utilities.parsers.settings_to_array
local enableaction = nodes.tasks.enableaction
local texgetdimen = tex.getdimen
------ texgetbox = tex.getbox
local trace_collecting = false trackers.register("streams.collecting", function(v) trace_collecting = v end)
local trace_flushing = false trackers.register("streams.flushing", function(v) trace_flushing = v end)
@@ -226,9 +226,11 @@ function streams.synchronize(list) -- this is an experiment !
local delta = delta_height -- for tracing
while delta > 0 do
-- we need to add some interline penalties
- local line = copy_node_list(getbox("strutbox"))
- setwhd(line,false,strutht,strutdp)
+ -- local line = copy_node_list(getbox("strutbox"))
+ -- setwhd(line,false,strutht,strutdp)
+ local line = new_rule(0,strutht,strutdp) -- no tracing
if tail then
+ -- todo: inject at a better place
setlink(tail,line)
end
tail = line
diff --git a/tex/context/base/mkiv/status-files.pdf b/tex/context/base/mkiv/status-files.pdf
index 2675edd1b..75450daa5 100644
--- a/tex/context/base/mkiv/status-files.pdf
+++ b/tex/context/base/mkiv/status-files.pdf
Binary files differ
diff --git a/tex/context/base/mkiv/status-lua.pdf b/tex/context/base/mkiv/status-lua.pdf
index 7dea83d86..63b45c4c1 100644
--- a/tex/context/base/mkiv/status-lua.pdf
+++ b/tex/context/base/mkiv/status-lua.pdf
Binary files differ
diff --git a/tex/context/base/mkiv/strc-pag.lua b/tex/context/base/mkiv/strc-pag.lua
index 9c040104d..5cdba5b76 100644
--- a/tex/context/base/mkiv/strc-pag.lua
+++ b/tex/context/base/mkiv/strc-pag.lua
@@ -322,10 +322,6 @@ function pages.on_right(n)
end
end
-function pages.has_changed()
- return texconditionals.layouthaschanged
-end
-
function pages.in_body(n)
return texgetcount("pagebodymode") > 0
end
diff --git a/tex/context/base/mkiv/syst-ini.mkiv b/tex/context/base/mkiv/syst-ini.mkiv
index 568912a33..dd3e7c822 100644
--- a/tex/context/base/mkiv/syst-ini.mkiv
+++ b/tex/context/base/mkiv/syst-ini.mkiv
@@ -589,7 +589,7 @@
\protected\def\defUmathbotaccent #1#2#3#4{\global\instance\protected\def#1{\Umathbotaccent "#2 "#3 "#4 }}
\protected\def\defUdelimiterover #1#2#3#4{\global\instance\protected\def#1{\Udelimiterover "#2 "#3 }}
\protected\def\defUdelimiterunder #1#2#3#4{\global\instance\protected\def#1{\Udelimiterunder "#2 "#3 }}
-\protected\def\defUdelimiter #1#2#3#4{\global\instance\protected\def#1{\Udelimiter "#2 "#2 "#4 }}
+\protected\def\defUdelimiter #1#2#3#4{\global\instance\protected\def#1{\Udelimiter "#2 "#3 "#4 }}
\protected\def\defUradical #1#2#3{\global\instance\protected\def#1{\Uradical "#2 "#3 }}
\protected\def\defUroot #1#2#3{\global\instance\protected\def#1{\Uroot "#2 "#3 }}
\protected\def\defUmathchar #1#2#3#4{\global\instance\Umathchardef #1 "#2 "#3 "#4 }
diff --git a/tex/context/base/mkiv/typo-mar.lua b/tex/context/base/mkiv/typo-mar.lua
index f8c135fa7..56324c790 100644
--- a/tex/context/base/mkiv/typo-mar.lua
+++ b/tex/context/base/mkiv/typo-mar.lua
@@ -270,8 +270,8 @@ function margins.save(t)
if t.number then
local leftmargindistance = texgetdimen("naturalleftmargindistance")
local rightmargindistance = texgetdimen("naturalrightmargindistance")
- local strutbox = getbox("strutbox")
- local _, strutht, strutdp = getwhd(strutbox)
+ local strutht = texgetdimen("strutht")
+ local strutdp = texgetdimen("strutdp")
-- better make a new table and make t entry in t
t.box = content
t.n = nofsaved
diff --git a/tex/context/base/mkiv/util-sac.lua b/tex/context/base/mkiv/util-sac.lua
index 796a620ba..36daef816 100644
--- a/tex/context/base/mkiv/util-sac.lua
+++ b/tex/context/base/mkiv/util-sac.lua
@@ -544,3 +544,39 @@ do
end
end
+
+if bit32 and not streams.tocardinal1 then
+
+ local extract = bit32.extract
+ local char = string.char
+
+ streams.tocardinal1 = char
+ function streams.tocardinal2(n) return char(extract( 8,8),extract( 0,8)) end
+ function streams.tocardinal3(n) return char(extract(16,8),extract( 8,8),extract(0,8)) end
+ function streams.tocardinal4(n) return char(extract(24,8),extract(16,8),extract(8,8),extract(0,8)) end
+
+ streams.tocardinal1le = char
+ function streams.tocardinal2le(n) return char(extract(0,8),extract(8,8)) end
+ function streams.tocardinal3le(n) return char(extract(0,8),extract(8,8),extract(16,8)) end
+ function streams.tocardinal4le(n) return char(extract(0,8),extract(8,8),extract(16,8),extract(24,8)) end
+
+end
+
+if not streams.readcstring then
+
+ local readchar = streams.readchar
+ local concat = table.concat
+
+ function streams.readcstring(f)
+ local t = { }
+ while true do
+ local c = readchar(f)
+ if c and c ~= "\0" then
+ t[#t+1] = c
+ else
+ return concat(t)
+ end
+ end
+ end
+
+end
diff --git a/tex/context/base/mkiv/util-sql-tickets.lua b/tex/context/base/mkiv/util-sql-tickets.lua
index 3258fb186..d852212bc 100644
--- a/tex/context/base/mkiv/util-sql-tickets.lua
+++ b/tex/context/base/mkiv/util-sql-tickets.lua
@@ -18,7 +18,7 @@ local ostime, uuid, osfulltime = os.time, os.uuid, os.fulltime
local random = math.random
local concat = table.concat
-if not utilities.sql then require("util-sql") end
+-- if not utilities.sql then require("util-sql") end
local sql = utilities.sql
local tickets = { }
diff --git a/tex/context/base/mkiv/util-sql.lua b/tex/context/base/mkiv/util-sql.lua
index ce4a37f07..579bd7c09 100644
--- a/tex/context/base/mkiv/util-sql.lua
+++ b/tex/context/base/mkiv/util-sql.lua
@@ -121,7 +121,7 @@ if optional then
local m = methods[k]
if m then
report_state("start loading method %a as %a",k,m)
- require("libs-imp-" .. m)
+ require("libs-imp-" .. m .. "lmt") -- brrr
report_state("loading method %a done",k)
return rawget(t,m)
else
diff --git a/tex/context/base/mkiv/util-zip.lua b/tex/context/base/mkiv/util-zip.lua
index 4aa87d5e8..4ceec7afd 100644
--- a/tex/context/base/mkiv/util-zip.lua
+++ b/tex/context/base/mkiv/util-zip.lua
@@ -48,6 +48,11 @@ local zlibdecompress = zlib.decompress
local zlibdecompresssize = zlib.decompresssize
local zlibchecksum = zlib.crc32
+if not CONTEXTLMTXMODE or CONTEXTLMTXMODE == 0 then
+ local cs = zlibchecksum
+ zlibchecksum = function(str,n) return cs(n or 0, str) end
+end
+
local decompress = function(source) return zlibdecompress (source,-15) end -- auto
local decompresssize = function(source,targetsize) return zlibdecompresssize(source,targetsize,-15) end -- auto
local calculatecrc = function(buffer,initial) return zlibchecksum (initial or 0,buffer) end
@@ -565,7 +570,12 @@ else
local compress = zlib.compress
local decompress = zlib.decompress
- local crc32 = zlib.crc32
+ local zlibchecksum = zlib.crc32
+
+ if not CONTEXTLMTXMODE or CONTEXTLMTXMODE == 0 then
+ local cs = zlibchecksum
+ zlibchecksum = function(str,n) return cs(n or 0, str) end
+ end
local streams = utilities.streams
local openstream = streams.openstring
@@ -606,16 +616,16 @@ else
putcompressed = function(str,level,originalname)
return concat {
- identifier, -- 2 identifier
- tocardinal1(0x08), -- 1 method
- tocardinal1(0x08), -- 1 flags
- tocardinal4(os.time()), -- 4 mtime
- tocardinal1(0x02), -- 1 compression (2 or 4)
- tocardinal1(0xFF), -- 1 operating
+ identifier, -- 2 identifier
+ tocardinal1(0x08), -- 1 method
+ tocardinal1(0x08), -- 1 flags
+ tocardinal4(os.time()), -- 4 mtime
+ tocardinal1(0x02), -- 1 compression (2 or 4)
+ tocardinal1(0xFF), -- 1 operating
(originalname or "unknownname") .. "\0",
compress(str,level,nil,gzipwindow),
- tocardinal4(crc32(str)), -- 4
- tocardinal4(#str), -- 4
+ tocardinal4(zlibchecksum(str)), -- 4
+ tocardinal4(#str), -- 4
}
end
@@ -671,6 +681,4 @@ function gzip.decompress(s)
end
end
-zipfiles.gunzipfile = gzip.load
-
return zipfiles
diff --git a/tex/context/base/mkxl/anch-pos.lmt b/tex/context/base/mkxl/anch-pos.lmt
index 5a9ffaa3d..07e338cb6 100644
--- a/tex/context/base/mkxl/anch-pos.lmt
+++ b/tex/context/base/mkxl/anch-pos.lmt
@@ -62,6 +62,7 @@ local context = context
local ctx_latelua = context.latelua
local tex = tex
+local texgetdimen = tex.getdimen
local texgetcount = tex.getcount
local texgetinteger = tex.getintegervalue or tex.getcount
local texsetcount = tex.setcount
@@ -1269,8 +1270,8 @@ do
nofparagraphs = nofparagraphs + 1
texsetcount("global","c_anch_positions_paragraph",nofparagraphs)
local name = f_p_tag(nofparagraphs)
- local box = getbox("strutbox")
- local w, h, d = getwhd(box)
+ local h = texgetdimen("strutht")
+ local d = texgetdimen("strutdp")
--
local top = texgetnest("top","head")
local nxt = top.next
@@ -1428,8 +1429,8 @@ do
public = true,
protected = true,
actions = function(name)
- local box = getbox("strutbox")
- local w, h, d = getwhd(box)
+ local h = texgetdimen("strutht")
+ local d = texgetdimen("strutdp")
local spec = {
p = true,
c = column,
@@ -1452,8 +1453,8 @@ do
public = true,
protected = true,
actions = function(name,kind)
- local box = getbox("strutbox")
- local w, h, d = getwhd(box)
+ local h = texgetdimen("strutht")
+ local d = texgetdimen("strutdp")
local spec = {
k = kind,
p = true,
diff --git a/tex/context/base/mkxl/attr-ini.lmt b/tex/context/base/mkxl/attr-ini.lmt
index 2a4805a01..059de8fd7 100644
--- a/tex/context/base/mkxl/attr-ini.lmt
+++ b/tex/context/base/mkxl/attr-ini.lmt
@@ -54,10 +54,12 @@ storage.register("attributes/list", list, "attributes.list")
storage.register("attributes/values", values, "attributes.values")
storage.register("attributes/counts", counts, "attributes.counts")
-local report_attribute = logs.reporter("attributes")
-local report_value = logs.reporter("attributes","values")
+local report_attribute = logs.reporter("attributes")
+local report_value = logs.reporter("attributes","values")
-local trace_values = false
+local trace_values = false
+
+local max_register_index = tex.magicconstants.max_attribute_register_index
trackers.register("attributes.values", function(v) trace_values = v end)
@@ -105,7 +107,7 @@ function attributes.public(name) -- at the lua end (hidden from user)
local number = numbers[name]
if not number then
local last = sharedstorage.attributes_last_public
- if last < 65535 then
+ if last < max_register_index then
last = last + 1
sharedstorage.attributes_last_public = last
else
diff --git a/tex/context/base/mkxl/back-exp-imp-mth.lmt b/tex/context/base/mkxl/back-exp-imp-mth.lmt
index 8751ca89d..a70ea8511 100644
--- a/tex/context/base/mkxl/back-exp-imp-mth.lmt
+++ b/tex/context/base/mkxl/back-exp-imp-mth.lmt
@@ -279,7 +279,13 @@ do
-- todo: p.topfixed
if t then
-- mover
- d[1].data[1].content = utfchar(t)
+ if true then -- we don't go here any more
+ local dd = d[1].data
+ if dd then
+ dd[1].content = utfchar(t)
+ end
+ end
+ --
di.data = { d[2], d[1] }
end
else
@@ -299,7 +305,12 @@ do
-- todo: p.bottomfixed
if b then
-- munder
- d[2].data[1].content = utfchar(b)
+ if true then -- we don't go here any more
+ local dd = d[2].data
+ if dd then
+ dd[1].content = utfchar(b)
+ end
+ end
end
else
-- can't happen
@@ -322,8 +333,16 @@ do
-- todo: p.bottomfixed
if t and b then
-- munderover
- d[1].data[1].content = utfchar(t)
- d[3].data[1].content = utfchar(b)
+ if true then -- we don't go here any more
+ local dd = d[1].data
+ if dd then
+ dd[1].content = utfchar(t)
+ end
+ local dd = d[3].data
+ if dd then
+ dd[1].content = utfchar(b)
+ end
+ end
di.data = { d[2], d[3], d[1] }
else
-- can't happen
diff --git a/tex/context/base/mkxl/colo-ini.mkxl b/tex/context/base/mkxl/colo-ini.mkxl
index 21f1e1174..e9504e0eb 100644
--- a/tex/context/base/mkxl/colo-ini.mkxl
+++ b/tex/context/base/mkxl/colo-ini.mkxl
@@ -386,6 +386,16 @@
{\c_attr_color \c_colo_saved_attribute_color
\c_attr_transparency\c_colo_saved_attribute_transparency}
+%D Nasty:
+
+\permanent\def\usedcolorparameterattributes#1%
+ {\beginlocalcontrol\begingroup
+ \dousecolorparameter{#1}%
+ \normalexpanded{\endgroup\noexpand\endlocalcontrol
+ \noexpand\s!attr \colorattribute \the\c_attr_color
+ \noexpand\s!attr \colormodelattribute \the\c_attr_colormodel
+ \noexpand\s!attr \transparencyattribute \the\c_attr_transparency}}
+
%D In this documentation we will not go into too much details on palets. Curious
%D users can find more information on this topic in \from[use of color].
%D
diff --git a/tex/context/base/mkxl/cont-new.mkxl b/tex/context/base/mkxl/cont-new.mkxl
index 77ef89d5d..91c21c84d 100644
--- a/tex/context/base/mkxl/cont-new.mkxl
+++ b/tex/context/base/mkxl/cont-new.mkxl
@@ -13,7 +13,7 @@
% \normalend % uncomment this to get the real base runtime
-\newcontextversion{2022.01.21 20:10}
+\newcontextversion{2022.03.12 11:24}
%D This file is loaded at runtime, thereby providing an excellent place for hacks,
%D patches, extensions and new features. There can be local overloads in cont-loc
diff --git a/tex/context/base/mkxl/context.mkxl b/tex/context/base/mkxl/context.mkxl
index ca6e796c1..57fc8e155 100644
--- a/tex/context/base/mkxl/context.mkxl
+++ b/tex/context/base/mkxl/context.mkxl
@@ -29,7 +29,7 @@
%D {YYYY.MM.DD HH:MM} format.
\immutable\edef\contextformat {\jobname}
-\immutable\edef\contextversion{2022.01.21 20:10}
+\immutable\edef\contextversion{2022.03.12 11:24}
%overloadmode 1 % check frozen / warning
%overloadmode 2 % check frozen / error
@@ -486,6 +486,7 @@
\loadmkxlfile{math-int}
\loadmkxlfile{math-del}
\loadmkxlfile{math-fen}
+\loadmkxlfile{math-lop}
\loadmklxfile{math-acc}
\loadmklxfile{math-rad}
\loadmkxlfile{math-inl}
@@ -522,6 +523,7 @@
\loadmkxlfile{grph-pat}
\loadmkxlfile{pack-box}
+\loadmkxlfile{pack-mat}
\loadmkxlfile{pack-bar}
\loadmkxlfile{page-app}
\loadmkxlfile{meta-fig}
diff --git a/tex/context/base/mkxl/driv-shp.lmt b/tex/context/base/mkxl/driv-shp.lmt
index 2cb351880..6c4ca79cc 100644
--- a/tex/context/base/mkxl/driv-shp.lmt
+++ b/tex/context/base/mkxl/driv-shp.lmt
@@ -13,6 +13,7 @@ local setmetatableindex = table.setmetatableindex
local formatters = string.formatters
local concat = table.concat
local keys = table.keys
+local insert = table.insert
local sortedhash = table.sortedhash
local find = string.find
local stripstring = string.strip
@@ -620,8 +621,9 @@ end
local dirstack = { }
local anchors = { }
------ befores = setmetatableindex("table")
------ afters = setmetatableindex("table")
+local befores = setmetatableindex("table")
+local afters = setmetatableindex("table")
+local stired = false
local function reset_directions()
dirstack = { }
@@ -631,53 +633,55 @@ local function reset_anchors()
anchors = { }
end
--- interfaces.implement {
--- name = "registeranchorbox",
--- arguments = { "integer", "integer", "box" },
--- actions = function(anchor,where,box)
--- box = tonut(box)
--- if where < 0 then
--- table.insert(befores[anchor],box)
--- else
--- table.insert(afters[anchor],box)
--- end
--- end
--- }
+interfaces.implement {
+ name = "registeranchorbox",
+ public = true,
+ protected = true,
+ arguments = { "integer", "integer", "box" },
+ actions = function(anchor,where,box)
+ box = tonut(box)
+ if where < 0 then
+ insert(befores[anchor],box)
+ else
+ insert(afters[anchor],box)
+ end
+ stored = true
+ end
+}
local hlist_out, vlist_out do
local finalize = nodes.handlers.finalizelist
- -- local takebox = nuts.takebox
local flushnode = nuts.flushnode
- -- local function flushstored(current,source,before)
- -- local s = nil
- -- if before then
- -- s = rawget(befores,source)
- -- else
- -- s = rawget(afters,source)
- -- end
- -- if s then
- -- for i=1,#s do
- -- local si = s[i]
- -- if si then
- -- finalize(si) -- tricky: we might need to group
- -- if getid(si) == vlist_code then
- -- vlist_out(current,si)
- -- else
- -- hlist_out(current,si)
- -- end
- -- flushnode(si)
- -- s[i] = false
- -- end
- -- end
- -- if before then
- -- rawset(befores,source,nil)
- -- else
- -- rawset(afters,source,nil)
- -- end
- -- end
- -- end
+ local function flushstored(current,source,before)
+ local s = nil
+ if before then
+ s = rawget(befores,source)
+ else
+ s = rawget(afters,source)
+ end
+ if s then
+ for i=1,#s do
+ local si = s[i]
+ if si then
+ finalize(si) -- tricky: we might need to group
+ if getid(si) == vlist_code then
+ vlist_out(current,si)
+ else
+ hlist_out(current,si)
+ end
+ flushnode(si)
+ s[i] = false
+ end
+ end
+ if before then
+ rawset(befores,source,nil)
+ else
+ rawset(afters,source,nil)
+ end
+ end
+ end
local function applyorientation(orientation,x,y,width,height,depth,woffset,hoffset,doffset,xoffset,yoffset)
local ot = (orientation >> 0) & 0x0F
@@ -1098,11 +1102,17 @@ local hlist_out, vlist_out do
if usedorientation then
pushorientation(usedorientation,pos_h,pos_v,pos_r)
end
+ if source and stored then
+ flushstored(current,source,true)
+ end
if id == vlist_code then
vlist_out(current,list)
else
hlist_out(current,list)
end
+ if source and stored then
+ flushstored(current,source,false)
+ end
if usedorientation then
poporientation(usedorientation,pos_h,pos_v,pos_r)
end
@@ -1136,19 +1146,19 @@ local hlist_out, vlist_out do
end
local total = height + depth
if total > 0 then
- local xoffset, yoffset, left, right = getoffsets(current) -- top bottom
- if left ~= 0 then
- pos_v = pos_v + left
- total = total - left
- end
- if right ~= 0 then
- depth = depth - right
- total = total - right
- end
+ local xoffset, yoffset, top, bottom = getoffsets(current)
if pos_r == righttoleft_code then
pos_h = pos_h - width
xoffset = - xoffset
end
+ if top ~= 0 then
+ -- height = height - top
+ total = total - top
+ end
+ if bottom ~= 0 then
+ depth = depth - bottom
+ total = total - bottom
+ end
pos_v = pos_v - depth
flushrule(current,pos_h + xoffset,pos_v + yoffset,pos_r,width,total,subtype)
end
@@ -1486,17 +1496,17 @@ local hlist_out, vlist_out do
if usedorientation then
pushorientation(usedorientation,pos_h,pos_v,pos_r)
end
- -- if source then
- -- flushstored(current,source,true)
- -- end
+ if source and stored then
+ flushstored(current,source,true)
+ end
if id == vlist_code then
vlist_out(current,list)
else
hlist_out(current,list)
end
- -- if source then
- -- flushstored(current,source,false)
- -- end
+ if source and stored then
+ flushstored(current,source,false)
+ end
if usedorientation then
poporientation(usedorientation,pos_h,pos_v,pos_r)
end
diff --git a/tex/context/base/mkxl/font-chk.lmt b/tex/context/base/mkxl/font-chk.lmt
index 008b9bb41..089e68f9f 100644
--- a/tex/context/base/mkxl/font-chk.lmt
+++ b/tex/context/base/mkxl/font-chk.lmt
@@ -379,13 +379,13 @@ local function expandglyph(characters,index,done)
if n then
d.next = expandglyph(characters,n,done)
end
- local h = d.hvariants
+ local h = d.hparts
if h then
for i=1,#h do
h[i].glyph = expandglyph(characters,h[i].glyph,done)
end
end
- local v = d.vvariants
+ local v = d.vparts
if v then
for i=1,#v do
v[i].glyph = expandglyph(characters,v[i].glyph,done)
diff --git a/tex/context/base/mkxl/font-con.lmt b/tex/context/base/mkxl/font-con.lmt
index 3310242a8..b36f18dfa 100644
--- a/tex/context/base/mkxl/font-con.lmt
+++ b/tex/context/base/mkxl/font-con.lmt
@@ -254,6 +254,24 @@ local function fixedpsname(psname,fallback)
return usedname, psname ~= usedname
end
+local function scaleparts(parts,delta)
+ local t = { }
+ for i=1,#parts do
+ local p = parts[i]
+ local s = p["start"] or 0
+ local e = p["end"] or 0
+ local a = p["advance"] or 0
+ t[i] = {
+ ["start"] = s == 0 and 0 or s * delta,
+ ["end"] = e == 0 and 0 or e * delta,
+ ["advance"] = a == 0 and 0 or a * delta,
+ ["extender"] = p["extender"],
+ ["glyph"] = p["glyph"],
+ }
+ end
+ return t
+end
+
function constructors.scale(tfmdata,specification)
local target = { } -- the new table
--
@@ -567,9 +585,7 @@ function constructors.scale(tfmdata,specification)
--
for unicode, character in next, characters do
local chr, description, index
-
-- todo: add description entry to char entry instead of index ... saves elsewhere too
-
if changed then
local c = changed[unicode]
if c and c ~= unicode then
@@ -670,48 +686,17 @@ function constructors.scale(tfmdata,specification)
if hasmath then
--
-- todo, just operate on descriptions.math
- local vn = character.next
- if vn then
- chr.next = vn
- else
- local vv = character.vvariants
- if vv then
- local t = { }
- for i=1,#vv do
- local vvi = vv[i]
- local s = vvi["start"] or 0
- local e = vvi["end"] or 0
- local a = vvi["advance"] or 0
- t[i] = { -- zero check nicer for 5.3
- ["start"] = s == 0 and 0 or s * vdelta,
- ["end"] = e == 0 and 0 or e * vdelta,
- ["advance"] = a == 0 and 0 or a * vdelta,
- ["extender"] = vvi["extender"],
- ["glyph"] = vvi["glyph"],
- }
- end
- chr.vvariants = t
- else
- local hv = character.hvariants
- if hv then
- local t = { }
- for i=1,#hv do
- local hvi = hv[i]
- local s = hvi["start"] or 0
- local e = hvi["end"] or 0
- local a = hvi["advance"] or 0
- t[i] = { -- zero check nicer for 5.3
- ["start"] = s == 0 and 0 or s * hdelta,
- ["end"] = e == 0 and 0 or e * hdelta,
- ["advance"] = a == 0 and 0 or a * hdelta,
- ["extender"] = hvi["extender"],
- ["glyph"] = hvi["glyph"],
- }
- end
- chr.hvariants = t
- end
- end
- -- todo also check mathitalics (or that one can go away)
+ local nxt = character.next
+ if nxt then
+ chr.next = nxt
+ end
+ local vparts = character.vparts
+ if vparts then
+ chr.vparts = scaleparts(vparts,vdelta)
+ end
+ local hparts = character.hparts
+ if hparts then
+ chr.hparts = scaleparts(hparts,hdelta)
end
local vi = character.vitalic
if vi and vi ~= 0 then
@@ -742,14 +727,18 @@ function constructors.scale(tfmdata,specification)
chr.italic = vi*hdelta
end
end
- local ft = character.options
- if ft then
- chr.options = ft
- end
+ -- local ft = character.options
+ -- if ft then
+ -- chr.options = ft
+ -- end
local sm = character.smaller
if sm then
chr.smaller = sm
end
+ local fa = character.flataccent
+ if fa then
+ chr.flataccent = fa
+ end
elseif autoitalicamount then -- itlc feature
local vi = description.italic
if not vi then
diff --git a/tex/context/base/mkxl/font-imp-math.lmt b/tex/context/base/mkxl/font-imp-math.lmt
index 68dddf33d..2f9c94d16 100644
--- a/tex/context/base/mkxl/font-imp-math.lmt
+++ b/tex/context/base/mkxl/font-imp-math.lmt
@@ -26,7 +26,7 @@ local function initialize(tfmdata,value)
if mathparameters then
local sup, sub
if type(value) == "string" then
- sup, sub = lpegmatch(splitter,value)
+ sup, sub = lpegmatch(splitter,value) -- settings_to_array
if not sup then
sub, sup = 0, 0
elseif not sub then
@@ -267,3 +267,43 @@ registerotffeature {
node = initialize,
}
}
+
+local function initialize(tfmdata,value)
+ if value then
+ local validlookups, lookuplist = fonts.handlers.otf.collectlookups(tfmdata.shared.rawdata,"flac","math","dflt")
+ if validlookups then
+ -- it's quite likely just one step
+ local characters = tfmdata.characters
+ local changed = tfmdata.changed
+ for i=1,#lookuplist do
+ local lookup = lookuplist[i]
+ local steps = lookup.steps
+ local nofsteps = lookup.nofsteps
+ for i=1,nofsteps do
+ local coverage = steps[i].coverage
+ if coverage then
+ for k, v in next, coverage do
+ local c = characters[k]
+ local f = characters[v]
+ if c and f then
+ c.flataccent = v
+ if not f.unicode then
+ f.unicode = c.unicode
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+registerotffeature {
+ name = "flattenaccents",
+ description = "mapping accents to flat ones",
+ initializers = {
+ base = initialize,
+ node = initialize,
+ }
+}
diff --git a/tex/context/base/mkxl/font-imp-sanitize.lmt b/tex/context/base/mkxl/font-imp-sanitize.lmt
new file mode 100644
index 000000000..84c42e78f
--- /dev/null
+++ b/tex/context/base/mkxl/font-imp-sanitize.lmt
@@ -0,0 +1,197 @@
+if not modules then modules = { } end modules ['font-san'] = {
+ version = 1.001,
+ comment = "companion to font-ini.mkiv",
+ author = "Hans Hagen, PRAGMA ADE & śrīrāma",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- \definefontfeature[demo][sanitizer=demo]
+-- \definedfont[Serif*default,demo] test context test
+-- \definedfont[Serif*default] test context test
+
+local keys, insert, copytable = table.keys, table.insert, table.copy
+local utfvalues, utfbyte = utf.values, utf.byte
+
+local sanitizers = { }
+
+local trace = false
+local report = logs.reporter("fonts", "sanitizers")
+
+trackers.register("fonts.sanitizers", function(v) trace = v end)
+
+function fonts.registersanitizer(name,vector)
+ sanitizers[name] = vector
+end
+
+local function split(s)
+ local t = { }
+ for value in utfvalues(s) do
+ t[#t+1] = value
+ end
+ return t
+end
+
+local function wrap(t)
+ for i=1,#t do
+ t[i] = { t[i] }
+ end
+ return t
+end
+
+local function initializesanitizer(tfmdata,value)
+ local resources = tfmdata.resources
+ local sanitized = resources.sanitized
+ if not sanitized then
+ local sanitizer = false
+ local goodies = tfmdata.goodies
+ if goodies then
+ for i=1,#goodies do
+ local goodie = goodies[i]
+ local sanitizers = goodie.sanitizers
+ sanitizer = sanitizers and sanitizers[value]
+ if sanitizer then
+ report("using sanitizer %a from goodie file",value)
+ break
+ end
+ end
+ end
+ if not sanitizer then
+ sanitizer = sanitizers[value]
+ if sanitizer then
+ report("using sanitizer %a",value)
+ end
+ end
+ resources.sanitized = true
+ if sanitizer then
+ local mapping = sanitizer.mapping
+ if mapping then
+ local keys = keys(mapping)
+ local maps = { }
+ table.sort(keys, function(a,b) return a > b end)
+ for i = 1,#keys do
+ local k = keys[i]
+ keys[i] = split(k)
+ maps[i] = split(mapping[k])
+ end
+ for i=1,#maps do
+ local k = keys[i]
+ local m = maps[i]
+ if trace then
+ -- m = copytable(m)
+ -- insert(m,1,utfbyte("["))
+ -- insert(m, utfbyte("]"))
+ local t = { utfbyte("[") }
+ t[#t+1] = 0x200D -- zwnj
+ for i=1,#m do
+ t[#t+1] = m[i]
+ t[#t+1] = 0x200D -- zwnj
+ end
+ t[#t+1] = utfbyte("]")
+ end
+ maps[i] = { type = "multiple", data = { [k[1]] = m } }
+ keys[i] = { current = wrap(k) , lookups = { i } }
+ end
+ local specification = {
+ name = "sanitizer",
+ type = "chainsubstitution",
+ prepend = 1,
+ nocheck = true,
+ default = true,
+ lookups = maps,
+ data = { rules = keys },
+ }
+ local s = fonts.handlers.otf.enhancers.addfeature(
+ tfmdata,"sanitizer",specification, true
+ )
+ insert(resources.sequences,1,s)
+ end
+ end
+ end
+end
+
+-- has to come *after* devanagari because we need to push it in front
+-- ... it could be a built-in
+
+fonts.constructors.features.otf.register {
+ name = "sanitizer",
+ description = "inject sanitizer features",
+ initializers = {
+ node = initializesanitizer,
+ },
+}
+
+local dev2rkrf = {
+ ["के्र"] = "क्रे",
+ ["कै्र"] = "क्रै",
+ ["खे्र"] = "ख्रे",
+ ["खै्र"] = "ख्रै",
+ ["गे्र"] = "ग्रे",
+ ["गै्र"] = "ग्रै",
+ ["घे्र"] = "घ्रे",
+ ["घै्र"] = "घ्रै",
+ -- not required: placed here just to show how bad some fonts are :(
+ -- ["ङे्र"] = "ङ्रे",
+ -- ["ङै्र"] = "ङ्रै",
+ ["चे्र"] = "च्रे",
+ ["चै्र"] = "च्रै",
+ ["छे्र"] = "छ्रे",
+ ["छै्र"] = "छ्रै",
+ ["जे्र"] = "ज्रे",
+ ["जै्र"] = "ज्रै",
+ ["झे्र"] = "झ्रे",
+ ["झै्र"] = "झ्रै",
+ ["ञे्र"] = "ञ्रे",
+ ["ञै्र"] = "ञ्रै",
+ ["णे्र"] = "ण्रे",
+ ["णै्र"] = "ण्रै",
+ ["ते्र"] = "त्रे",
+ ["तै्र"] = "त्रै",
+ ["थे्र"] = "थ्रे",
+ ["थै्र"] = "थ्रै",
+ ["दे्र"] = "द्रे",
+ ["दै्र"] = "द्रै",
+ ["धे्र"] = "ध्रे",
+ ["धै्र"] = "ध्रै",
+ ["ने्र"] = "न्रे",
+ ["नै्र"] = "न्रै",
+ ["पे्र"] = "प्रे",
+ ["पै्र"] = "प्रै",
+ ["फे्र"] = "फ्रे",
+ ["फै्र"] = "फ्रै",
+ ["बे्र"] = "ब्रे",
+ ["बै्र"] = "ब्रै",
+ ["भे्र"] = "भ्रे",
+ ["भै्र"] = "भ्रै",
+ ["मे्र"] = "म्रे",
+ ["मै्र"] = "म्रै",
+ ["ये्र"] = "य्रे",
+ ["यै्र"] = "य्रै",
+ -- some fonts might need this, some might not: weird
+ -- for example: Shobhika does not need it but Noto Serif does :(
+ -- ["ले्र"] = "ल्रे",
+ -- ["लै्र"] = "ल्रै",
+ ["वे्र"] = "व्रे",
+ ["वै्र"] = "व्रै",
+ ["से्र"] = "स्रे",
+ ["सै्र"] = "स्रै",
+ ["शे्र"] = "श्रे",
+ ["शै्र"] = "श्रै",
+ ["षे्र"] = "ष्रे",
+ ["षै्र"] = "ष्रै",
+ ["हे्र"] = "ह्रे",
+ ["है्र"] = "ह्रै",
+ -- some fonts might need this, some might not: weird
+ -- ["ळे्र"] = "ळ्रे",
+ -- ["ळै्र"] = "ळ्रै",
+}
+
+local demomapping = {
+ luatex = "LuaTeX",
+ metapost = "MetaPost",
+ context = "ConTeXt",
+ metafun = "MetaFun",
+}
+
+fonts.registersanitizer("dev2rkrf", { mapping = dev2rkrf })
+fonts.registersanitizer("demo", { mapping = demomapping })
diff --git a/tex/context/base/mkxl/font-imp-tracing.lmt b/tex/context/base/mkxl/font-imp-tracing.lmt
index 2187b9497..749a3c964 100644
--- a/tex/context/base/mkxl/font-imp-tracing.lmt
+++ b/tex/context/base/mkxl/font-imp-tracing.lmt
@@ -130,7 +130,12 @@ local function initialize(tfmdata,key,value)
elseif v == v_none then
rule[9] = false
else
- rule[9] = v
+ local thickness = string.todimen(v)
+ if thickness and thickness > 0 then
+ rule[5] = thickness
+ else
+ rule[9] = v
+ end
end
end
end
diff --git a/tex/context/base/mkxl/font-lib.mklx b/tex/context/base/mkxl/font-lib.mklx
index c5543a107..485ed1041 100644
--- a/tex/context/base/mkxl/font-lib.mklx
+++ b/tex/context/base/mkxl/font-lib.mklx
@@ -117,9 +117,11 @@
\registerctxluafile{font-imp-tweaks}{}
\registerctxluafile{font-imp-combining}{}
\registerctxluafile{font-imp-scripts}{autosuffix}
+\registerctxluafile{font-imp-sanitize}{autosuffix} % fixes for indic fonts
\registerctxluafile{font-imp-tracing}{autosuffix} % comes last!
+
\registerctxluafile{font-fbk}{autosuffix}
\registerctxluafile{font-aux}{}
diff --git a/tex/context/base/mkxl/font-mat.mklx b/tex/context/base/mkxl/font-mat.mklx
index cca22c497..7d72c5618 100644
--- a/tex/context/base/mkxl/font-mat.mklx
+++ b/tex/context/base/mkxl/font-mat.mklx
@@ -126,7 +126,7 @@
\def\font_helpers_set_math_family_set_scales_compact
{% these are used when no font setting is there, the settings come before setting the parameters
- % and are stored with the family
+ % and are stored with the family ... this is not really needed because the size is used otherwise
\glyphtextscale \plusthousand
\glyphscriptscale \numexpr\plusthousand*\dimexpr\scriptface \relax/\dimexpr\textface\relax\relax
\glyphscriptscriptscale \numexpr\plusthousand*\dimexpr\scriptscriptface\relax/\dimexpr\textface\relax\relax}
diff --git a/tex/context/base/mkxl/font-ogr.lmt b/tex/context/base/mkxl/font-ogr.lmt
index 87166b36d..662c75b15 100644
--- a/tex/context/base/mkxl/font-ogr.lmt
+++ b/tex/context/base/mkxl/font-ogr.lmt
@@ -555,6 +555,7 @@ local initializeoverlay do
manipulators = {
base = initializeoverlay,
node = initializeoverlay,
+ plug = initializeoverlay,
}
}
@@ -632,6 +633,7 @@ local initializesvg do
manipulators = {
base = initializesvg,
node = initializesvg,
+ plug = initializesvg,
}
}
@@ -673,6 +675,7 @@ local initializepng do
manipulators = {
base = initializepng,
node = initializepng,
+ plug = initializepng,
}
}
@@ -682,6 +685,7 @@ local initializepng do
manipulators = {
base = initializepng,
node = initializepng,
+ plug = initializepng,
}
}
@@ -715,6 +719,7 @@ do
manipulators = {
base = initializecolor,
node = initializecolor,
+ plug = initializecolor,
}
}
diff --git a/tex/context/base/mkxl/font-otl.lmt b/tex/context/base/mkxl/font-otl.lmt
index f493bc327..a68988e87 100644
--- a/tex/context/base/mkxl/font-otl.lmt
+++ b/tex/context/base/mkxl/font-otl.lmt
@@ -311,6 +311,41 @@ end
-- instance protruding info and loop over characters; one is not supposed
-- to change descriptions and if one does so one should make a copy!
+-- local function best_done_here(tfmdata,characters,descriptions)
+-- local validlookups, lookuplist = fonts.handlers.otf.collectlookups(
+-- { resources = tfmdata.resources },"flac","math","dflt"
+-- )
+-- if validlookups then
+-- -- it's quite likely just one step
+-- for i=1,#lookuplist do
+-- local lookup = lookuplist[i]
+-- local steps = lookup.steps
+-- local nofsteps = lookup.nofsteps
+-- for i=1,nofsteps do
+-- local coverage = steps[i].coverage
+-- if coverage then
+-- for k, v in next, coverage do
+-- local f = characters[v]
+-- if f then
+-- local d = descriptions[k]
+-- local c = characters[k]
+-- if c then
+-- c.flataccent = v
+-- end
+-- if d then
+-- d.flataccent = v
+-- end
+-- if not f.unicode then
+-- f.unicode = c.unicode
+-- end
+-- end
+-- end
+-- end
+-- end
+-- end
+-- end
+-- end
+
local function copytotfm(data,cache_id)
if data then
local metadata = data.metadata
@@ -348,7 +383,6 @@ local function copytotfm(data,cache_id)
local d = descriptions[unicode] -- we could use parent table here
local m = d.math
if m then
- -- watch out: luatex uses hvariants for the parts
--
local italic = m.italic
local vitalic = m.vitalic
@@ -363,9 +397,9 @@ local function copytotfm(data,cache_id)
c.next = un
c = characters[un]
end -- c is now last in chain
- c.hvariants = parts
+ c.hparts = parts
elseif parts then
- character.hvariants = parts
+ character.hparts = parts
italic = m.hitalic
end
--
@@ -379,9 +413,9 @@ local function copytotfm(data,cache_id)
c.next = un
c = characters[un]
end -- c is now last in chain
- c.vvariants = parts
+ c.vparts = parts
elseif parts then
- character.vvariants = parts
+ character.vparts = parts
end
--
if italic and italic ~= 0 then
@@ -403,6 +437,7 @@ local function copytotfm(data,cache_id)
end
end
end
+-- best_done_here(data,characters,descriptions)
end
-- we need a runtime lookup because of running from cdrom or zip, brrr (shouldn't
-- we use the basename then?)
diff --git a/tex/context/base/mkxl/font-ots.lmt b/tex/context/base/mkxl/font-ots.lmt
index c668c86d1..f9c6b2fae 100644
--- a/tex/context/base/mkxl/font-ots.lmt
+++ b/tex/context/base/mkxl/font-ots.lmt
@@ -8,6 +8,11 @@ if not modules then modules = { } end modules ['font-ots'] = { -- sequences
}
--[[ldx--
+<p>I need to check the description at the microsoft site ... it has been improved
+so maybe there are some interesting details there. Most below is based on old and
+incomplete documentation and involved quite a bit of guesswork (checking with the
+abstract uniscribe of those days. But changing things is tricky!</p>
+
<p>This module is a bit more split up that I'd like but since we also want to test
with plain <l n='tex'/> it has to be so. This module is part of <l n='context'/>
and discussion about improvements and functionality mostly happens on the
diff --git a/tex/context/base/mkxl/font-pre.mkxl b/tex/context/base/mkxl/font-pre.mkxl
index aba14d8b2..60351ff53 100644
--- a/tex/context/base/mkxl/font-pre.mkxl
+++ b/tex/context/base/mkxl/font-pre.mkxl
@@ -404,14 +404,17 @@
[mode=base,
% mode=none, % better, maybe do this last
kern=yes,
- % liga=yes, % makes no sense
- mathnolimitsmode={0,800}, % this looks okay on the average font
+% flac=yes,
+% liga=yes, % makes no sense
+% mode=node,
+% mathnolimitsmode={0,800}, % now in lfg files
mathalternates=yes,
mathitalics=yes, % we pass them
mathdimensions=all,
% mathkerns=yes,
% staircase=yes,
compactmath=yes,
+ flattenaccents=yes,
% mathgaps=yes,
language=dflt,
script=math]
@@ -889,6 +892,12 @@
\permanent\protected\def\setsuperiors{\doaddfeature{f:superiors}}
\permanent\protected\def\setfractions{\doaddfeature{f:fractions}}
+\permanent\protected\def\resetsmallcaps{\dosubtractfeature{f:smallcaps}}
+\permanent\protected\def\resetoldstyle {\dosubtractfeature{f:oldstyle}}
+\permanent\protected\def\resettabular {\dosubtractfeature{f:tabular}}
+\permanent\protected\def\resetsuperiors{\dosubtractfeature{f:superiors}}
+\permanent\protected\def\resetfractions{\dosubtractfeature{f:fractions}}
+
% \permanent\protected\def\frc#1#2%
% {\dontleavehmode
% \begingroup
diff --git a/tex/context/base/mkxl/font-tfm.lmt b/tex/context/base/mkxl/font-tfm.lmt
index dcb76ba80..5f1c7bf2a 100644
--- a/tex/context/base/mkxl/font-tfm.lmt
+++ b/tex/context/base/mkxl/font-tfm.lmt
@@ -258,6 +258,8 @@ end
--
shared.processes = next(features) and tfm.setfeatures(tfmdata,features) or nil
--
+ fonts.loggers.register(tfmdata,'tfm',specification)
+ --
if size < 0 then
size = idiv(65536 * -size,100)
end
diff --git a/tex/context/base/mkxl/font-vfc.lmt b/tex/context/base/mkxl/font-vfc.lmt
index 57344d18e..aff647dd1 100644
--- a/tex/context/base/mkxl/font-vfc.lmt
+++ b/tex/context/base/mkxl/font-vfc.lmt
@@ -91,7 +91,7 @@ helpers.vfinjectors = {
-- stopcolor = function(h,v,packet) codeinjections.vfstartcolor(h,v,packet) end,
-- literal = function(h,v,packet) codeinjections.vfliteral (h,v,packer) end,
startcolor = function(h,v,packet) vfstartcolor(h,v,packet) end,
- stopcolor = function(h,v,packet) vfstartcolor(h,v,packet) end,
+ stopcolor = function(h,v,packet) vfstopcolor (h,v,packet) end,
-- literal = function(h,v,packet) vfliteral (h,v,packer) end,
}
diff --git a/tex/context/base/mkxl/lang-def.mkxl b/tex/context/base/mkxl/lang-def.mkxl
index e50be9afc..b7919a29b 100644
--- a/tex/context/base/mkxl/lang-def.mkxl
+++ b/tex/context/base/mkxl/lang-def.mkxl
@@ -826,12 +826,12 @@
\installlanguage [\s!thai] [\s!th]
-%D Indic languages (Kauśika)
+%D Indic languages (śrīrāman)
%
%
%D Sanskit (someone needs to define the parameters):
-%D
-%D The file \type {lang-sa.lua} contains sanskrit hyphenation patterns for devanagari,
+%D
+%D The file \type {lang-sa.lua} contains sanskrit hyphenation patterns for devanagari,
%D bengali, telugu, kannada, malayalam and roman(iast.
\installlanguage
diff --git a/tex/context/base/mkxl/lang-tra.lmt b/tex/context/base/mkxl/lang-tra.lmt
index b3fedc7c1..259165928 100644
--- a/tex/context/base/mkxl/lang-tra.lmt
+++ b/tex/context/base/mkxl/lang-tra.lmt
@@ -9,7 +9,11 @@ if not modules then modules = { } end modules ['lang-tra'] = {
-- The indic transliterations was researched by kauśika and after some experiments
-- we settled on the current approach (mappings and a more specific lpeg).
-local concat = table.concat
+-- Todo: initial and final in addition to mapping so that we can do hebrew and
+-- such.
+
+local concat, setmetatableindex = table.concat, table.setmetatableindex
+local nospaces = string.nospaces
local utfbyte, utfchar, utfsplit, utfvalues = utf.byte, utf.char, utf.split, utf.values
local C, Cc, Cs, lpegmatch = lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.match
local utfchartabletopattern = lpeg.utfchartabletopattern
@@ -30,6 +34,9 @@ local removenode = nuts.remove
local texsetattribute = tex.setattribute
+local registervalue = attributes.registervalue
+local getvalue = attributes.getvalue
+
local transliteration = { }
languages.transliteration = transliteration
@@ -41,9 +48,10 @@ local context = context
local zwj = utf.char(0x200D)
-local lastmapping = 0
+-- local lastmapping = 0
local loadedmappings = { }
local loadedlibraries = { }
+local exceptions = { }
local report = logs.reporter("transliteration")
local trace = false trackers.register("languages.transliteration", function(v) trace = v end)
@@ -80,21 +88,23 @@ local converters = {
["mapping"] = function(m)
local t_mapping = m.mapping
if t_mapping then
+ local t_exceptions = m.exceptions
local p = Cs ( (
utfchartabletopattern(t_mapping) / t_mapping
+ C(utfcharacterpattern)
)^0 )
-- lpeg.print(p)
- return function(s)
- return lpegmatch(p,s) or s
+ return function(s,e)
+ return (e and e[s]) or t_exceptions[s] or lpegmatch(p,s) or s
end
else
return false
end
end,
["default"] = function(m)
- return function(s)
- return s
+ local t_exceptions = m.exceptions
+ return function(s,e)
+ return (e and e[s]) or t_exceptions[s] or s
end
end,
}
@@ -109,19 +119,21 @@ function transliteration.use(library)
if transliterations then
for name, d in table.sortedhash(transliterations) do
local vector = d.vector
+ if not d.exceptions then
+ d.exceptions = { }
+ end
if vector then
- report("vector %a in %a is %sloaded with index %i",name,library," already",d.attribute)
+ report("vector %a in %a is %sloaded",name,library," already")
else
- lastmapping = lastmapping + 1
d.vector = (converters[name] or converters.mapping or converters.default)(d)
or (converters.default)(d)
- report("vector %a in set %a is %sloaded with index %i",name,library,"",lastmapping)
+ report("vector %a in set %a is %sloaded",name,library,"")
end
- d.attribute = lastmapping
d.library = library
d.name = name
+ d.mapping = nil -- for now, saves memory
loadedmappings[name] = d
- loadedmappings[lastmapping] = d
+ loadedmappings[nospaces(name)] = d
end
else
report("library %a has no transliterations",library)
@@ -140,28 +152,47 @@ enable = function()
enable = false
end
-function transliteration.set(vector)
+function transliteration.register(parent,name)
+ local p = exceptions[parent]
+ if p then
+ if trace then
+ report("%a has exceptions that default to %a",name,parent)
+ end
+ exceptions[name] = setmetatableindex({ },p)
+ else
+ if trace then
+ report("%a has independent exceptions",name)
+ end
+ exceptions[name] = { }
+ end
+end
+
+function transliteration.set(name,vector)
if enable then
enable()
end
- local m = loadedmappings[vector]
- local a = m and m.attribute or unsetvalue
+ local a = registervalue(a_transliteration, {
+ m = loadedmappings[vector],
+ e = exceptions[name],
+ })
if trace then
- report("setting transliteration %s",vector)
+ report("setting transliteration %i, name %a, vector %a",a,name,vector)
end
texsetattribute(a_transliteration,a)
end
-function transliteration.register(vector)
- if enable then
- enable()
- end
- local m = loadedmappings[vector]
- local a = m and m.attribute or unsetvalue
- if trace then
- report("registering transliteration %s",vector)
+function transliteration.exception(name,old,new)
+ local m = loadedmappings[name]
+ if m then
+ m.exceptions[old] = new
+ else
+ local e = exceptions[name]
+ if not e then
+ e = { }
+ exceptions[name] = e
+ end
+ e[old] = new
end
- return a
end
-- When there is need I will improve the performance of the next handler.
@@ -169,6 +200,7 @@ end
function transliteration.handler(head)
local aprev = nil
local vector = nil
+ local except = nil
local current = head
local first = nil
local last = nil
@@ -180,34 +212,36 @@ function transliteration.handler(head)
-- actually we can generalize the replacer elsewhere
local function flush(nxt)
- -- we can do some optimization here by having the split as replacement
- local old = concat(list,"",1,size)
- local new = vector(old)
- if old ~= new then
- if trace then
- report("old: %s",old)
- report("new: %s",new)
- end
- local c = first
- local x = false
- for s in utfvalues(new) do
- if x then
- head, c = insertafter(head,c,copynode(first))
- setchar(c,s)
- else
- setchar(c,s)
- if c == last then
- x = true
+ if vector then
+ -- we can do some optimization here by having the split as replacement
+ local old = concat(list,"",1,size)
+ local new = vector(old,except)
+ if old ~= new then
+ if trace then
+ report("old: %s",old)
+ report("new: %s",new)
+ end
+ local c = first
+ local x = false
+ for s in utfvalues(new) do
+ if x then
+ head, c = insertafter(head,c,copynode(first))
+ setchar(c,s)
else
- c = getnext(c)
+ setchar(c,s)
+ if c == last then
+ x = true
+ else
+ c = getnext(c)
+ end
end
end
- end
- if not x then
- while c do
- head, c = removenode(head,c,true)
- if c == nxt then
- break
+ if not x then
+ while c do
+ head, c = removenode(head,c,true)
+ if c == nxt then
+ break
+ end
end
end
end
@@ -226,9 +260,19 @@ function transliteration.handler(head)
size = 0
end
aprev = a
- vector = loadedmappings[a]
- if vector then
- vector = vector.vector
+ local data = getvalue(a_transliteration,a)
+ if data then
+ local m = data.m
+ if m then
+ vector = m.vector
+ except = data.e
+ else
+ vector = nil
+ except = nil
+ end
+ else
+ vector = nil
+ except = nil
end
end
if not first then
@@ -269,14 +313,20 @@ interfaces.implement {
implement {
name = "settransliteration",
- arguments = "string",
+ arguments = "2 strings",
actions = transliteration.set,
}
implement {
name = "registertransliteration",
- arguments = "string",
- actions = { transliteration.register, context },
+ arguments = "3 strings",
+ actions = transliteration.register,
+}
+
+implement {
+ name = "transliterationexception",
+ arguments = "3 strings",
+ actions = transliteration.exception,
}
nodes.tasks.prependaction("processors", "normalizers", "languages.transliteration.handler", nil, "nut", "disabled" )
diff --git a/tex/context/base/mkxl/lang-tra.mkxl b/tex/context/base/mkxl/lang-tra.mkxl
index 96dcc7d94..a44ee4ba9 100644
--- a/tex/context/base/mkxl/lang-tra.mkxl
+++ b/tex/context/base/mkxl/lang-tra.mkxl
@@ -23,46 +23,62 @@
\definesystemattribute[transliteration][public,global]
-% define in lua: \usetransliteration[#1]
+\newtoks\everytransliterations
-% todo: define fast attribute at the tex end do we can have a proper define
+\appendtoks
+ \disablediscretionaries
+ \let~=\lettertilde
+ % \let|=\letterbar
+\to \everytransliterations
-\def\lang_transliteration_set#1%
- {\ifcsname\??transliteration#1\endcsname
- \c_attr_transliteration\lastnamedcs
- \edef\currenttransliteration{#1}%
- \usetransliterationstyleandcolor\c!style\c!color
- \uselanguageparameter\transliterationparameter
- \else
- \clf_settransliteration{#1}%
- \fi}
+\def\lang_transliteration_common
+ {\usetransliterationstyleandcolor\c!style\c!color
+ \uselanguageparameter\transliterationparameter
+ \clf_settransliteration{\currenttransliteration}{\transliterationparameter\c!vector}%
+ \the\everytransliterations}
\permanent\tolerant\protected\def\settransliteration[#1]#;#2%
- {\lang_transliteration_set{#1}}
+ {\edef\currenttransliteration{#1#2}%
+ \lang_transliteration_common}
+
+\permanent\protected\def\transliterationexception[#1]#2#3%
+ {\clf_transliterationexception{#1}{#2}{#3}}
\permanent\tolerant\protected\def\starttransliteration[#1]#*[#2]%
{\begingroup
+ \edef\currenttransliteration{#1}%
\ifparameter#2\or
- \edef\currenttransliteration{#1}%
\setupcurrenttransliteration[#2]%
\fi
- \lang_transliteration_set{#1}}
+ \transliterationparameter\c!before\relax
+ \lang_transliteration_common}
+
+\permanent\protected\def\stoptransliteration
+ {\transliterationparameter\c!after\relax
+ \endgroup}
\permanent\tolerant\protected\def\transliteration[#1]#;#2%
- {\groupedcommand{\lang_transliteration_set{#1#2}}\donothing}
+ {\groupedcommand
+ {\edef\currenttransliteration{#1#2}%
+ \lang_transliteration_common
+ \transliterationparameter\c!left\relax}
+ {\transliterationparameter\c!right\relax}}
\appendtoks
- \expandafter\integerdef\csname\??transliteration\currenttransliteration\endcsname
- \clf_registertransliteration{\transliterationparameter\c!vector}%
- \relax
+ \clf_registertransliteration{\currenttransliterationparent}{\currenttransliteration}%
+ \ifcstok{\transliterationparameter\c!define}\v!yes
+ \frozen\protected\instance\edefcsname\e!start\currenttransliteration\endcsname{\starttransliteration[\currenttransliteration]}%
+ \frozen\protected\instance\edefcsname\e!stop \currenttransliteration\endcsname{\stoptransliteration}%
+ \frozen\protected\instance\edefcsname \currenttransliteration\endcsname{\transliteration[\currenttransliteration]}%
+ \fi
\to \everydefinetransliteration
-\permanent\protected\def\stoptransliteration
- {\endgroup}
-
\permanent\protected\def\resettransliteration
{\c_attr_transliteration\attributeunsetvalue}
+\setuptransliteration
+ [\c!define=\v!yes]
+
\appendtoks
\resettransliteration
\to \everyinitializeverbatim
diff --git a/tex/context/base/mkxl/libs-imp-zint.lmt b/tex/context/base/mkxl/libs-imp-zint.lmt
index 4558ca58e..1b1d294c9 100644
--- a/tex/context/base/mkxl/libs-imp-zint.lmt
+++ b/tex/context/base/mkxl/libs-imp-zint.lmt
@@ -79,31 +79,56 @@ table.setmetatableindex(mapping,function(t,k)
return v
end)
+-- local options = {
+-- -- DATA_MODE = 0 -- Binary
+-- -- UNICODE_MODE = 1 -- UTF-8
+-- -- GS1_MODE = 2 -- GS1
+-- -- GS1PARENS_MODE = 16 -- process parentheses as GS1 AI delimiters (instead of square brackets)
+-- square = 100 -- DM_SQUARE : only consider square versions on automatic symbol size selection
+-- -- DMRE = 101 -- DM_DMRE : consider DMRE versions on automatic symbol size selection
+-- }
+
local report = logs.reporter("zint")
local context = context
local shown = false
-- Same performance as just context(fmt,...): 113pps (On 2013 i7 laptop.)
------ f_rectangle = formatters["%sofill unitsquare xysized (%N,%N) shifted (%N,%N);"]
-local f_hexagon = formatters["%sofill (%N,%N)--(%N,%N)--(%N,%N)--(%N,%N)--(%N,%N)--(%N,%N)--cycle;"]
-local f_circle = formatters["%sofill unitcircle scaled %N shifted (%N,%N);"]
+-- ----- f_rectangle = formatters["%sofill unitsquare xysized (%N,%N) shifted (%N,%N);"]
+-- local f_hexagon = formatters["%sofill (%N,%N)--(%N,%N)--(%N,%N)--(%N,%N)--(%N,%N)--(%N,%N)--cycle;"]
+-- local f_circle = formatters["%sofill unitcircle scaled %N shifted (%N,%N);"]
+
+----- f_rectangle = formatters["%nofill unitsquare xysized (%N,%N) shifted (%N,%N);"]
+local f_hexagon = formatters["%nofill (%N,%N)--(%N,%N)--(%N,%N)--(%N,%N)--(%N,%N)--(%N,%N)--cycle;"]
+local f_circle = formatters["%nofill unitcircle scaled %N shifted (%N,%N);"]
+
+local s_done = "dofill origin --cycle;"
local f_string = formatters['draw textext("%s") scaled (%N/10) shifted (%N,%N);']
-- A bit faster: 130pps (When I see hexagons I'll do that too but MP takes way more time.)
+-- local s_preamble = [[
+-- save ns; def ns (expr a, b) = nofill unitsquare xyscaled a shifted b ; enddef;
+-- save ds; def ds (expr a, b) = dofill unitsquare xyscaled a shifted b ; enddef;
+-- ]]
+
local s_preamble = [[
save ns; def ns (expr a, b) = nofill unitsquare xyscaled a shifted b ; enddef;
- save ds; def ds (expr a, b) = dofill unitsquare xyscaled a shifted b ; enddef;
]]
----- f_rectangle = formatters["%ss((%N,%N),(%N,%N));"]
-local f_rectangle = formatters["%ss((%i,%i),(%i,%i));"]
+local f_rectangle = formatters["ns((%i,%i),(%i,%i));"]
local function execute(specification)
if okay() then
- local code = specification.code
- local text = specification.text
+ local code = specification.code
+ local text = specification.text
+ local option = specification.option
+ --
+ if option then
+ option = gsub(option,"^%-+","")
+ end
+ specification.option = option
--
if lower(code) == "isbn" then
specification.text = text and gsub(text,"[^%d]","") or ""
@@ -127,20 +152,24 @@ local function execute(specification)
for i=1,n do
local r = rectangles[i]
-- context("%sofill unitsquare xysized (%N,%N) shifted (%N,%N);",
- rectangles[i] = f_rectangle(
- i == n and "d" or "n",r[3],r[4],r[1],r[2]
- )
+-- rectangles[i] = f_rectangle(
+-- i == n and "d" or "n",r[3],r[4],r[1],r[2]
+-- )
+rectangles[i] = f_rectangle(r[3],r[4],r[1],r[2])
end
+rectangles[n+1] = s_done
context("% t",rectangles)
end
if hexagons then
local n = #hexagons
for i=1,n do
-- context("%sofill (%N,%N)--(%N,%N)--(%N,%N)--(%N,%N)--(%N,%N)--(%N,%N)--cycle;",
- hexagons[i] = f_hexagon(
- i == n and "d" or "n",unpack(hexagons[i])
- )
+-- hexagons[i] = f_hexagon(
+-- i == n and "d" or "n",unpack(hexagons[i])
+-- )
+hexagons[i] = f_hexagon(unpack(hexagons[i]))
end
+hexagons[n+1] = s_done
context("% t",hexagons)
end
if circles then
@@ -148,9 +177,11 @@ local function execute(specification)
for i=1,n do
local c = circles[i]
-- context("%sofill unitcircle scaled %N shifted (%N,%N);",
- circles[i] = f_circle(
- i == n and "d" or "n",c[3],c[1],c[2]
- )
+-- circles[i] = f_circle(
+-- i == n and "d" or "n",c[3],c[1],c[2]
+-- )
+circles[i] = f_circle(c[3],c[1],c[2])
+circles[n+1] = s_done
end
context("% t",circles)
end
@@ -197,6 +228,7 @@ interfaces.implement {
{
{ "code" },
{ "text" },
+ { "option" },
}
}
}
diff --git a/tex/context/base/mkxl/libs-imp-zint.mkxl b/tex/context/base/mkxl/libs-imp-zint.mkxl
index b2c364379..9905e0470 100644
--- a/tex/context/base/mkxl/libs-imp-zint.mkxl
+++ b/tex/context/base/mkxl/libs-imp-zint.mkxl
@@ -22,7 +22,7 @@
%D
%D % e:\tex-context\tex\texmf-win64\bin\lib\luametatex\zint\libzint.dll
-\enabletrackers[*res*]
+% \enabletrackers[*res*]
\registerctxluafile{libs-imp-zint}{autosuffix}
@@ -34,12 +34,13 @@
{\bgroup
\usedzintfont
\getdummyparameters
- [\c!alternative=,\c!text=,#1]%
+ [\c!alternative=,\c!text=,\c!option=,#1]%
\scale
[#1]%
{\clf_zint
- code {\dummyparameter\c!alternative}
- text {\dummyparameter\c!text}
+ code {\dummyparameter\c!alternative}
+ text {\dummyparameter\c!text}
+ option {\dummyparameter\c!option}
\relax}%
\egroup}
@@ -51,23 +52,76 @@
\dontcomplain
-\dorecurse{1}{
+% \dorecurse{1}{
+% \startTEXpage
+% \barcode[alternative=PDF417,text={Hans Hagen}]%
+% \blank
+% \barcode[alternative=PDF417,text={Ton Otten}]%
+% \blank
+% \barcode[alternative=ISBN,text=9789490688011]%
+% \blank
+% \barcode[alternative=isbn,text=9789490688011,width=3cm]%
+% \blank
+% \dontleavehmode
+% \barcode[alternative=qr code,text={This is ConTeXt MKIV : #1}]
+% \barcode[alternative=qr code,text={This is ConTeXt LMTX}]
+% \barcode[alternative=qr code,text={\cldloadfile{tufte}},width=3cm]
+% \blank
+% \barcode[alternative=datamatrix,text=whatever,width=3cm,option=square]
+% \scale[width=3cm,height=3cm]{\barcode[alternative=datamatrix,text=whatever,width=3cm,option=square]}
+% \barcode[alternative=datamatrix,text={helloworld}]
+% \barcode[alternative=datamatrix,text={hello world}]
+% \stopTEXpage
+% }
+
+ \startTEXpage
+ \startluacode
+ for i=1,100 do
+ context.dontleavehmode()
+ context.barcode {
+ alternative = "datamatrix",
+ text = string.rep("!",i),
+ }
+ context.space()
+ context.allowbreak()
+ end
+ \stopluacode
+ \stopTEXpage
+
\startTEXpage
- \barcode[alternative=PDF417,text={Hans Hagen}]%
- \blank
- \barcode[alternative=PDF417,text={Ton Otten}]%
- \blank
- \barcode[alternative=ISBN,text=9789490688011]%
- \blank
- \barcode[alternative=isbn,text=9789490688011,width=3cm]%
- \blank
- \dontleavehmode
- \barcode[alternative=qr code,text={This is ConTeXt MKIV : #1}]
- \barcode[alternative=qr code,text={This is ConTeXt LMTX}]
- \barcode[alternative=qr code,text={\cldloadfile{tufte}},width=3cm]
+ \startluacode
+ for i=1,100 do
+ context.dontleavehmode()
+ context.barcode {
+ alternative = "datamatrix",
+ text = string.rep("!",i),
+ option = "square",
+ }
+ context.space()
+ context.allowbreak()
+ end
+ \stopluacode
\stopTEXpage
-}
+ \startluacode
+ for i=1,25 do
+ context.startTEXpage()
+ context.dontleavehmode()
+ context(i)
+ context.space()
+ context.barcode {
+ alternative = "datamatrix",
+ text = string.rep("!",i),
+ }
+ context.space()
+ context.barcode {
+ alternative = "datamatrix",
+ text = string.rep("!",i),
+ option = "square",
+ }
+ context.stopTEXpage()
+ end
+ \stopluacode
\stoptext
diff --git a/tex/context/base/mkxl/lpdf-emb.lmt b/tex/context/base/mkxl/lpdf-emb.lmt
index 9811c0843..d6252ae02 100644
--- a/tex/context/base/mkxl/lpdf-emb.lmt
+++ b/tex/context/base/mkxl/lpdf-emb.lmt
@@ -1826,7 +1826,7 @@ do
if kind == "font" then
return setmetatableindex(function(t,k)
local h = data[k]
- local v = direct(h[1]/255,h[2]/255,h[3]/255)
+ local v = h and direct(h[1]/255,h[2]/255,h[3]/255) or false
t[k] = v
return v
end)
diff --git a/tex/context/base/mkxl/lpdf-lmt.lmt b/tex/context/base/mkxl/lpdf-lmt.lmt
index 9bb3319d4..6b623b372 100644
--- a/tex/context/base/mkxl/lpdf-lmt.lmt
+++ b/tex/context/base/mkxl/lpdf-lmt.lmt
@@ -1529,7 +1529,7 @@ local flushimage do
local d = -depth + half
local w = width - line
local t = total - line
- if baseline then
+ if baseline and w > 0 then
rule = f_y(line,half,d,w,t,half,w)
else
rule = f_x(line,half,d,w,t)
@@ -3406,8 +3406,13 @@ do
converter(driver,texgetbox(boxnumber),"page")
end
- localconverter = function(...)
- converter(useddriver,...)
+-- localconverter = function(...)
+-- print(...) -- ok when we add this
+-- converter(useddriver,...) -- otherwise nil .. lua bug
+-- end
+
+ localconverter = function(a,b,c,d)
+ converter(useddriver,a,b,c,d)
end
drivers.install {
diff --git a/tex/context/base/mkxl/lpdf-rul.lmt b/tex/context/base/mkxl/lpdf-rul.lmt
index 96b4597bb..1dfcc11a3 100644
--- a/tex/context/base/mkxl/lpdf-rul.lmt
+++ b/tex/context/base/mkxl/lpdf-rul.lmt
@@ -376,7 +376,29 @@ h %s]]
pdfprint("direct",f_baselined(l,o,o,w-l,h+d-l,0,d,w,d))
end
else
- pdfprint("direct",f_rectangle(l,o,o,w-l,h+d-l))
+ pdfprint("direct",f_rectangle(l,o,o,w-l,h+d-l,"s"))
+ end
+ end
+
+ local function rule_box(p,h,v,i,n)
+ local w, h, d = getwhd(n)
+ local line = p.line or 65536
+ local l = line *bpfactor
+ local w = w * bpfactor
+ local h = h * bpfactor
+ local d = d * bpfactor
+ local o = l / 2
+ if p.baseline ~= false and ((d >= 0 and h >= 0) or (d <= 0 and h <= 0)) then
+ local dashed = tonumber(p.dashed)
+ if dashed and dashed > 5*line then
+ dashed = dashed * bpfactor
+ local delta = (w - 2*dashed*floor(w/(2*dashed)))/2
+ pdfprint("direct",f_dashlined(l,o,o,w-l,h+d-l,dashed,dashed,delta,d,w-delta,d))
+ else
+ pdfprint("direct",f_baselined(l,o,o,w-l,h+d-l,0,d,w,d))
+ end
+ else
+ pdfprint("direct",f_rectangle(l,o,o,w-l,h+d-l,"s"))
end
end
diff --git a/tex/context/base/mkxl/lpdf-xmp.lmt b/tex/context/base/mkxl/lpdf-xmp.lmt
index c4f475914..e147c796f 100644
--- a/tex/context/base/mkxl/lpdf-xmp.lmt
+++ b/tex/context/base/mkxl/lpdf-xmp.lmt
@@ -64,10 +64,11 @@ local mapping = table.setmetatableindex ( {
["Producer"] = { "metadata","rdf:Description/pdf:Producer" },
-- ["Trapped"] = { "pdf", "rdf:Description/pdf:Trapped" }, -- '/False' in /Info, but 'False' in XMP
-- Dublin Core schema
- ["Author"] = { "metadata","rdf:Description/dc:creator/rdf:Seq/rdf:li" },
["Format"] = { "metadata","rdf:Description/dc:format" }, -- optional, but nice to have
- ["Subject"] = { "metadata","rdf:Description/dc:description/rdf:Alt/rdf:li" },
- ["Title"] = { "metadata","rdf:Description/dc:title/rdf:Alt/rdf:li" },
+ -- These were dc:.../rdf:Seq/rdf:li but there was a (invalidating) bug in the iso
+ ["Author"] = { "metadata","rdf:Description/dc:creator" },
+ ["Subject"] = { "metadata","rdf:Description/dc:description" },
+ ["Title"] = { "metadata","rdf:Description/dc:title" },
-- XMP Basic schema
["CreateDate"] = { "date", "rdf:Description/xmp:CreateDate" },
["CreationDate"] = { "date", "rdf:Description/xmp:CreationDate" }, -- dummy
@@ -254,11 +255,11 @@ local pdfaddxmpinfo = lpdf.addxmpinfo
function lpdf.addtoinfo(tag,pdfvalue,strvalue)
local pattern = mapping[tag][2]
- if pattern then
+ if pattern or strvalue == true then
pdfaddtoinfo(tag,pdfvalue)
end
if type(pattern) == "string" then
- local value = strvalue or gsub(tostring(pdfvalue),"^%((.*)%)$","%1") -- hack
+ local value = (type(strvalue) == "string" and strvalue) or gsub(tostring(pdfvalue),"^%((.*)%)$","%1") -- hack
if trace_info then
report_info("set %a to %a",tag,value)
end
diff --git a/tex/context/base/mkxl/math-acc.mklx b/tex/context/base/mkxl/math-acc.mklx
index aab7e4874..929a37ae6 100644
--- a/tex/context/base/mkxl/math-acc.mklx
+++ b/tex/context/base/mkxl/math-acc.mklx
@@ -46,108 +46,129 @@
\installcorenamespace{mathaccents}
-\installcommandhandler \??mathaccents {mathaccents} \??mathaccents
+\installcommandhandler \??mathaccents {mathaccent} \??mathaccents
+
+\aliased\let\setupmathaccents\setupmathaccent
\setupmathaccents
[\c!top=,
\c!bottom=,
\c!mathstyle=,
\c!color=,
+ \c!stretch=\v!no,
\c!define=\v!yes] % not used
-\definemathaccents
+\definemathaccent
[\v!both]
-\definemathaccents
+\definemathaccent
[\v!top]
[\v!both]
-\definemathaccents
+\definemathaccent
[\v!bottom]
[\v!both]
\permanent\tolerant\protected\def\definemathtopaccent[#1]#*[#2]#*[#3]% class name top
{\ifparameter#3\or
- \frozen\protected\instance\edefcsname#2\endcsname{\math_accents_make_double {#1}\plusone{\number#3}\zerocount}%
+ \frozen\protected\instance\edefcsname#2\endcsname{\math_accent_make_double {#1}\plusone{\number#3}\zerocount}%
\else
- \frozen\protected\instance\edefcsname#1\endcsname{\math_accents_make_double\noexpand\currentmathaccents\plusone{\number#2}\zerocount}%
+ \frozen\protected\instance\edefcsname#1\endcsname{\math_accent_make_double\noexpand\currentmathaccent\plusone{\number#2}\zerocount}%
\fi}
\permanent\tolerant\protected\def\definemathbottomaccent[#1]#*[#2]#*[#3]% class name bottom
{\ifparameter#3\or
- \frozen\protected\instance\edefcsname#2\endcsname{\math_accents_make_double {#1}\plustwo\zerocount{\number#3}}%
+ \frozen\protected\instance\edefcsname#2\endcsname{\math_accent_make_double {#1}\plustwo\zerocount{\number#3}}%
\else
- \frozen\protected\instance\edefcsname#1\endcsname{\math_accents_make_double\noexpand\currentmathaccents\plustwo\zerocount{\number#2}}%
+ \frozen\protected\instance\edefcsname#1\endcsname{\math_accent_make_double\noexpand\currentmathaccent\plustwo\zerocount{\number#2}}%
\fi}
\permanent\tolerant\protected\def\definemathdoubleaccent[#1]#*[#2]#*[#3]#*[#4]% class name top bottom
{\ifparameter#4\or
- \frozen\protected\instance\edefcsname#2\endcsname{\math_accents_make_double {#1}\plusthree{\number#3}{\number#4}}%
+ \frozen\protected\instance\edefcsname#2\endcsname{\math_accent_make_double {#1}\plusthree{\number#3}{\number#4}}%
\else
- \frozen\protected\instance\edefcsname#1\endcsname{\math_accents_make_double\noexpand\currentmathaccents\plusthree{\number#2}{\number#3}}%
+ \frozen\protected\instance\edefcsname#1\endcsname{\math_accent_make_double\noexpand\currentmathaccent\plusthree{\number#2}{\number#3}}%
\fi}
-\let\math_accents_color_pop\donothing
-
-\def\math_accents_color_push_yes
- {\pushcolor[\p_math_accent_color]%
- \let\math_accents_color_pop\popcolor}
+\installlocalcurrenthandler \??mathaccents {mathaccent}
-\def\math_accents_color_push_nop
- {\let\math_accents_color_pop\donothing}
-
-\protected\def\math_accents_make_double#class#kind#top#bottom#content%
- {\begingroup
- \edef\currentmathaccents {#class}%
- \edef\p_math_accent_color{\mathaccentsparameter\c!color}%
- \startusemathstyleparameter\mathaccentsparameter\c!mathstyle
- \ifempty\p_math_accent_color
- \math_accents_color_push_nop
- \else
- \math_accents_color_push_yes
- \fi
+\tolerant\protected\def\math_accent_make_double#class#kind#top#bottom#*[#settings]#:#content%
+ {\beginmathgroup
+ \setlocalmathaccentcurrent{#class}% \edef\currentmathaccent{#class}%
+ \startusemathstyleparameter\mathaccentparameter\c!mathstyle
+ \setupcurrentmathaccent[#settings]%
+ \edef\m_fixed{\ifcstok{\mathaccentparameter\c!stretch}\v!yes\else\s!fixed\fi}%
+ \Umathaccent
+ \usedcolorparameterattributes{\mathaccentparameter\c!color}%
\ifcase#kind\or
- \Umathaccent \fam\zerocount#top
+ top \m_fixed
+ \fam\zerocount#top
\or
- \Umathaccent bottom \fam\zerocount#bottom
+ bottom \m_fixed
+ \fam\zerocount#bottom
\or
- \Umathaccent both \fam\zerocount#top
- \fam\zerocount#bottom
+ both \m_fixed
+ \fam\zerocount#top
+ \fam\zerocount#bottom
\fi
- {\math_accents_color_pop#content}%
+ {\ifconditional\c_math_accent_auto_dotless\mathdotless\fi#content}%
\stopusemathstyleparameter
- \endgroup}
+ \endmathgroup}
%D Relative new:
-\newconditional\c_math_accents_auto_dotless \settrue\c_math_accents_auto_dotless % cf opentype math
-
-\aliased\let\normalgrave\grave \permanent\protected\def\dotlessgrave#1{\normalgrave{\mathdotless#1}}
-\aliased\let\normalddot \ddot \permanent\protected\def\dotlessddot #1{\normalddot {\mathdotless#1}}
-\aliased\let\normalbar \bar \permanent\protected\def\dotlessbar #1{\normalbar {\mathdotless#1}}
-\aliased\let\normalacute\acute \permanent\protected\def\dotlessacute#1{\normalacute{\mathdotless#1}}
-\aliased\let\normalhat \hat \permanent\protected\def\dotlesshat #1{\normalhat {\mathdotless#1}}
-\aliased\let\normalcheck\check \permanent\protected\def\dotlesscheck#1{\normalcheck{\mathdotless#1}}
-\aliased\let\normalbreve\breve \permanent\protected\def\dotlessbreve#1{\normalbreve{\mathdotless#1}}
-\aliased\let\normaldot \dot \permanent\protected\def\dotlessdot #1{\normaldot {\mathdotless#1}}
-\aliased\let\normalring \ring \permanent\protected\def\dotlessring #1{\normalring {\mathdotless#1}}
-\aliased\let\normaltilde\tilde \permanent\protected\def\dotlesstilde#1{\normaltilde{\mathdotless#1}}
-\aliased\let\normaldddot\dddot \permanent\protected\def\dotlessdddot#1{\normaldddot{\mathdotless#1}}
-
-\def\math_accents_auto_dotless#1#2{\ifconditional\c_math_accents_auto_dotless\expandafter#2\else\expandafter#1\fi}
-
-\permanent\protected\def\grave {\math_accents_auto_dotless\normalgrave \dotlessgrave }
-\permanent\protected\def\ddot {\math_accents_auto_dotless\normalddot \dotlessddot }
-\permanent\protected\def\bar {\math_accents_auto_dotless\normalbar \dotlessbar }
-\permanent\protected\def\acute {\math_accents_auto_dotless\normalacute \dotlessacute }
-\permanent\protected\def\hat {\math_accents_auto_dotless\normalhat \dotlesshat }
-\permanent\protected\def\check {\math_accents_auto_dotless\normalcheck \dotlesscheck }
-\permanent\protected\def\breve {\math_accents_auto_dotless\normalbreve \dotlessbreve }
-\permanent\protected\def\dot {\math_accents_auto_dotless\normaldot \dotlessdot }
-\permanent\protected\def\ring {\math_accents_auto_dotless\normalring \dotlessring }
-\permanent\protected\def\tilde {\math_accents_auto_dotless\normaltilde \dotlesstilde }
-\permanent\protected\def\dddot {\math_accents_auto_dotless\normaldddot \dotlessdddot }
+\newconditional\c_math_accent_auto_dotless \settrue\c_math_accent_auto_dotless % cf opentype math
+
+\aliased\let\normalgrave\grave
+\aliased\let\normalddot \ddot
+\aliased\let\normalbar \bar
+\aliased\let\normalacute\acute
+\aliased\let\normalhat \hat
+\aliased\let\normalcheck\check
+\aliased\let\normalbreve\breve
+\aliased\let\normaldot \dot
+\aliased\let\normalring \ring
+\aliased\let\normaltilde\tilde
+\aliased\let\normaldddot\dddot
+
+\pushoverloadmode
+
+% these are not stretched ... we should adapt char-def.lua to use these:
+
+\definemathtopaccent[\v!top][grave]["60]
+\definemathtopaccent[\v!top][ddot] ["A8]
+\definemathtopaccent[\v!top][bar] ["AF]
+\definemathtopaccent[\v!top][acute]["B4]
+\definemathtopaccent[\v!top][hat] ["2C6] % "302
+\definemathtopaccent[\v!top][check]["2C7]
+\definemathtopaccent[\v!top][breve]["2D8]
+\definemathtopaccent[\v!top][dot] ["2D9]
+\definemathtopaccent[\v!top][ring] ["2DA]
+\definemathtopaccent[\v!top][tilde]["2DC]
+\definemathtopaccent[\v!top][dddot]["20DB]
+
+\definemathaccent
+ [\v!top:\v!stretch]
+ [\v!top]
+ [\c!stretch=\v!yes]
+
+%D We have a problem. We can use stackers but then we need to adapt the dimensions
+%D which is font dependent. So, for now we keep them as accents.
+
+\definemathtopaccent[\v!top:\v!stretch][widegrave]["0300] % ["060]
+\definemathtopaccent[\v!top:\v!stretch][wideddot] ["0308] % ["0A8]
+\definemathtopaccent[\v!top:\v!stretch][widebar] ["0304] % ["0AF]
+\definemathtopaccent[\v!top:\v!stretch][wideacute]["0301] % ["0B4]
+\definemathtopaccent[\v!top:\v!stretch][widehat] ["0302] % ["2C6]
+\definemathtopaccent[\v!top:\v!stretch][widecheck]["030C] % ["2C7]
+\definemathtopaccent[\v!top:\v!stretch][widebreve]["0306] % ["2D8]
+\definemathtopaccent[\v!top:\v!stretch][widedot] ["0307] % ["2D9]
+\definemathtopaccent[\v!top:\v!stretch][widering] ["030A] % ["2DA]
+\definemathtopaccent[\v!top:\v!stretch][widetilde]["0303] % ["2DC]
+\definemathtopaccent[\v!top:\v!stretch][widedddot]["20DB]
\aliased\let\mathring\ring % for a while
+\popoverloadmode
+
\protect \endinput
diff --git a/tex/context/base/mkxl/math-act.lmt b/tex/context/base/mkxl/math-act.lmt
index 48d389bf9..7aeec184f 100644
--- a/tex/context/base/mkxl/math-act.lmt
+++ b/tex/context/base/mkxl/math-act.lmt
@@ -13,6 +13,7 @@ local type, next = type, next
local fastcopy, insert, remove = table.fastcopy, table.insert, table.remove
local formatters = string.formatters
local byte = string.byte
+local setmetatableindex, sortedhash = table.setmetatableindex, table.sortedhash
local trace_defining = false trackers.register("math.defining", function(v) trace_defining = v end)
local trace_collecting = false trackers.register("math.collecting", function(v) trace_collecting = v end)
@@ -60,9 +61,26 @@ function mathematics.initializeparameters(target,original)
local mathparameters = original.mathparameters
if mathparameters and next(mathparameters) then
mathparameters = mathematics.dimensions(mathparameters)
- if not mathparameters.SpaceBeforeScript then
- mathparameters.SpaceBeforeScript = mathparameters.SpaceAfterScript
- end
+ if not mathparameters.PrimeRaisePercent then mathparameters.PrimeRaisePercent = 25 end
+ if not mathparameters.PrimeShiftUp then mathparameters.PrimeShiftUp = mathparameters.SuperscriptShiftUp end
+ if not mathparameters.PrimeBaselineDropMax then mathparameters.PrimeBaselineDropMax = mathparameters.SuperscriptBaselineDropMax end
+ if not mathparameters.PrimeShiftUpCramped then mathparameters.PrimeShiftUpCramped = mathparameters.SuperscriptShiftUpCramped end
+ if not mathparameters.PrimeSpaceAfter then mathparameters.PrimeSpaceAfter = 0 end
+ if not mathparameters.PrimeWidthPercent then mathparameters.PrimeWidthPercent = 50 end
+ if not mathparameters.SpaceBeforeScript then mathparameters.SpaceBeforeScript = mathparameters.SpaceAfterScript end
+ if not mathparameters.NoLimitSupFactor then mathparameters.NoLimitSupFactor = 0 end
+ if not mathparameters.NoLimitSubFactor then mathparameters.NoLimitSubFactor = 0 end
+ if not mathparameters.AccentTopShiftUp then mathparameters.AccentTopShiftUp = 0 end
+ if not mathparameters.AccentBottomShiftDown then mathparameters.AccentBottomShiftDown = 0 end
+ if not mathparameters.FlattenedAccentTopShiftUp then mathparameters.AccentTopShiftUp = 0 end
+ if not mathparameters.FlattenedAccentBottomShiftDown then mathparameters.AccentBottomShiftDown = 0 end
+ if not mathparameters.AccentBaseDepth then mathparameters.AccentBaseDepth = 0 end
+ if not mathparameters.AccentFlattenedBaseDepth then mathparameters.AccentFlattenedBaseDepth = 0 end
+ --
+ -- we don't want to reset that each time .. but then we also can't show what the value was
+ --
+ -- mathparameters.RadicalDegreeBefore = 0
+ --
target.mathparameters = mathparameters
end
end
@@ -77,6 +95,8 @@ local how = {
RadicalDegreeBottomRaisePercent = "unscaled",
NoLimitSupFactor = "unscaled",
NoLimitSubFactor = "unscaled",
+ PrimeRaisePercent = "unscaled",
+ PrimeWidthPercent = "unscaled",
}
function mathematics.scaleparameters(target,original)
@@ -122,12 +142,15 @@ function mathematics.checkprivateparameters(target,original)
if parameters then
local size = parameters.size
if size then
- if not mathparameters.FractionDelimiterSize then
- mathparameters.FractionDelimiterSize = 1.01 * size
- end
- if not mathparameters.FractionDelimiterDisplayStyleSize then
- mathparameters.FractionDelimiterDisplayStyleSize = 2.40 * size
- end
+-- if not mathparameters.FractionDelimiterSize then
+-- mathparameters.FractionDelimiterSize = 1.01 * size
+-- end
+-- if not mathparameters.FractionDelimiterDisplayStyleSize then
+-- mathparameters.FractionDelimiterDisplayStyleSize = 2.40 * size
+-- end
+-- if not mathparameters.PrimeSuperscriptSpace then
+-- mathparameters.PrimeSuperscriptSpace = size / 20
+-- end
elseif properties then
report_math("invalid parameters in font %a",properties.fullname or "?")
else
@@ -149,34 +172,55 @@ function mathematics.overloadparameters(target,original)
for i=1,#goodies do
local goodie = goodies[i]
local mathematics = goodie.mathematics
- local parameters = mathematics and mathematics.parameters
- if parameters then
- if trace_defining then
- report_math("overloading math parameters in %a @ %p",target.properties.fullname,target.parameters.size)
- end
- for name, value in next, parameters do
- local tvalue = type(value)
- if tvalue == "string" then
- report_math("comment for math parameter %a: %s",name,value)
- else
+ if mathematics then
+ local parameters = mathematics.parameters
+ local bigslots = mathematics.bigslots or mathematics.bigs
+ if parameters then
+ if trace_defining then
+ report_math("overloading math parameters in %a @ %p",target.properties.fullname,target.parameters.size)
+ end
+ for name, value in next, parameters do
+ local tvalue = type(value)
local oldvalue = mathparameters[name]
local newvalue = oldvalue
- if oldvalue then
- if tvalue == "number" then
- newvalue = value
- elseif tvalue == "function" then
- newvalue = value(oldvalue,target,original)
- elseif not tvalue then
- newvalue = nil
- end
- if trace_defining and oldvalue ~= newvalue then
- report_math("overloading math parameter %a: %S => %S",name,oldvalue,newvalue)
- end
- else
- report_math("invalid math parameter %a",name)
+ if tvalue == "number" then
+ newvalue = value
+ elseif tvalue == "string" then
+ -- delay till all set
+ elseif tvalue == "function" then
+ newvalue = value(oldvalue,target,original)
+ elseif not tvalue then
+ newvalue = nil
+ end
+ if trace_defining and oldvalue ~= newvalue then
+ report_math("overloading math parameter %a: %S => %S",name,oldvalue or 0,newvalue)
end
mathparameters[name] = newvalue
end
+ for name, value in next, parameters do
+ local tvalue = type(value)
+ if tvalue == "string" then
+ local newvalue = mathparameters[value]
+ -- if not newvalue then
+ -- local code = loadstring("return " .. value,"","t",mathparameters)
+ -- if type(code) == "function" then
+ -- local okay, v = pcall(code)
+ -- if okay then
+ -- newvalue = v
+ -- end
+ -- end
+ -- end
+ if newvalue then
+ -- split in number and string
+ mathparameters[name] = newvalue
+ elseif trace_defining then
+ report_math("ignoring math parameter %a: %S",name,value)
+ end
+ end
+ end
+ end
+ if bigslots then
+ target.bigslots = bigslots
end
end
end
@@ -208,34 +252,151 @@ end
do
local stepper = utilities.parsers.stepper
+ local count = 0
+
+ local splitter = lpeg.tsplitat(".")
- local function adapt(target,original,targetcharacters,originalcharacters,k,v,compact,n)
+ local function adapt(list,target,original,targetcharacters,originalcharacters,k,v,compact,n)
local character = targetcharacters[k]
if character then
- local width = character.width
- local italic = character.italic
- local offsetfactor = v[1] or 1
- local widthfactor = v[2] or 1
- local italicfactor = v[3] or 1
- if width then
- character.advance = width -- so advance is oldwidth
- character.xoffset = offsetfactor * width
- character.width = widthfactor * width
- end
- if italic then
- character.italic = italicfactor * italic
- elseif width and italicfactor ~= 1 then
- character.italic = italicfactor * width
- end
- if trace_tweaking then
- report_tweak("adapting dimensions of %U ",target,original,k)
- end
- local smaller = originalcharacters[k].smaller
- if compact and smaller and smaller ~= k then
- adapt(target,original,targetcharacters,originalcharacters,smaller,v,compact,n+1)
+ if not character.tweaked then
+ local t = type(v)
+ if t == "number" then
+ v = list[v]
+ t = type(v)
+ end
+ if t == "table" then
+ local width = character.width
+ local height = character.height
+ local depth = character.depth
+ local italic = character.italic
+ local topaccent = character.topaccent
+ if #v > 0 then
+ local offsetfactor = v[1]
+ local widthfactor = v[2]
+ local italicfactor = v[3]
+ local anchorfactor = v[4]
+ if width then
+ character.advance = width -- so advance is oldwidth
+ character.xoffset = offsetfactor * width
+ character.width = widthfactor * width
+ end
+ if italic then
+ character.italic = italicfactor * italic
+ elseif width and italicfactor ~= 1 then
+ character.italic = italicfactor * width
+ end
+ if topaccent and topaccent > 0 then
+ if anchorfactor then
+ character.topaccent = anchorfactor * topaccent
+ elseif width then
+ character.topaccent = topaccent + (character.width - character.advance) / 2
+ end
+ end
+ else
+ local widthfactor = v.width
+ local heightfactor = v.height
+ local depthfactor = v.depth
+ local italicfactor = v.italic
+ local anchorfactor = v.anchor
+ local advancefactor = v.advance
+ local xoffsetfactor = v.xoffset
+ local yoffsetfactor = v.yoffset
+ local scalefactor = v.scale
+ local total = (height or 0) + (depth or 0)
+ if scalefactor ~= 1 then
+ character.scale = scalefactor
+ end
+ if width and width ~= 0 then
+ if advancefactor then
+ character.advance = advancefactor * width
+ end
+ if widthfactor then
+ character.width = widthfactor * width
+ end
+ if xoffsetfactor then
+ character.xoffset = xoffsetfactor * width
+ end
+ end
+ if height and height ~= 0 then
+ if heightfactor then
+ character.height = heightfactor * height
+ end
+ end
+ if depth and depthfactor then
+ character.depth = depthfactor * depth
+ end
+ if yoffsetfactor then
+ character.yoffset = yoffsetfactor * total
+ end
+ if italic and italic ~= 0 and italicfactor then
+ character.italic = italicfactor * italic
+ end
+ if anchorfactor then
+ character.topaccent = anchorfactor * (topaccent or width)
+ end
+ end
+ if trace_tweaking then
+ report_tweak("adapting dimensions of %U ",target,original,k)
+ end
+ local smaller = originalcharacters[k].smaller
+ if compact and smaller and smaller ~= k then
+ adapt(list,target,original,targetcharacters,originalcharacters,smaller,v,compact,n+1)
+ end
+ count = count + 1
+ else
+ report_mathtweak("invalid dimension entry %U",k)
+ end
+ character.tweaked = true
+ if v.all then
+ local nxt = character.next
+ if nxt then
+ adapt(list,target,original,targetcharacters,originalcharacters,nxt,v,compact,n)
+ else
+ local parts = character.hparts
+ if parts then
+ for i=1,#parts do
+ adapt(list,target,original,targetcharacters,originalcharacters,parts[i],v,compact,n)
+ end
+ end
+ end
+ end
end
else
- report_math("no character %U",k)
+ report_tweak("no character %U",target,original,k)
+ end
+ end
+
+ local function detail(characters,k)
+ if type(k) == "string" then
+ local t = lpeg.match(splitter,k)
+ local n = #t
+ if n > 0 then
+ local m = tonumber(t[1]) or tonumber(t[1],16)
+ if m then
+ local c = characters[m]
+ if c and n > 1 then
+ m = t[2]
+ if m == "parts" then
+ local nxt = c.next
+ while nxt do
+ c = characters[nxt]
+ nxt = c.next
+ end
+ c = c.hparts or c.vparts
+ if c and n > 2 then
+ m = tonumber(t[3])
+ if m then
+ c = c[m]
+ if c then
+ return c.glyph
+ end
+ end
+ end
+ end
+ end
+ end
+ end
end
end
@@ -245,14 +406,29 @@ do
local targetcharacters = target.characters
local originalcharacters = original.characters
local compact = target.parameters.textscale and true or false
- for k, v in next, list do
+ count = 0
+ for k, v in sortedhash(list) do
local t = type(k)
if t == "number" then
- adapt(target,original,targetcharacters,originalcharacters,k,v,compact,1)
+ adapt(list,target,original,targetcharacters,originalcharacters,k,v,compact,1)
elseif t == "string" then
- stepper(k,function(n) adapt(target,original,targetcharacters,originalcharacters,n,v,compact,1) end)
+ local d = detail(targetcharacters,k)
+ if d then
+ adapt(list,target,original,targetcharacters,originalcharacters,d,v,compact,1)
+ else
+ stepper(k,function(n)
+ adapt(list,target,original,targetcharacters,originalcharacters,n,v,compact,1)
+ end)
+ end
+ -- elseif t == "table" then
+ -- for i=1,#t do
+ -- adapt(list,target,original,targetcharacters,originalcharacters,t[i],v,compact,1)
+ -- end
end
end
+ if trace_tweaking and count > 0 then
+ report_mathtweak("%i dimensions adapted",count)
+ end
end
end
@@ -411,6 +587,274 @@ do
end
+do
+
+ function mathtweaks.fixanchors(target,original,parameters)
+ local factor = tonumber(parameters.factor)
+ if factor ~= 0 then
+ for k, v in next, target.characters do
+ local a = v.topaccent
+ if a and a > 0 then
+ v.topaccent = a * factor
+ end
+ end
+ end
+ end
+
+end
+
+do
+
+ -- local list = {
+ -- [0x203E] = { factor = .4 }, -- overbar
+ -- [0x203E] = { factor = .7 }, -- underbar
+ -- [0x23DE] = { factor = .4 }, -- overbrace
+ -- [0x23DF] = { factor = .7 }, -- underbrace
+ -- [0x23DC] = { factor = .4 }, -- overparent
+ -- [0x23DD] = { factor = .7 }, -- underparent
+ -- [0x23B4] = { factor = .4 }, -- overbracket
+ -- [0x23B5] = { factor = .7 }, -- underbracket
+ -- }
+
+ -- We can patch the dimensions in-place or we can use additional characters in
+ -- the private namespace.
+
+ -- local addprivate = fonts.helpers.addprivate
+ -- local newnextglyph = addprivate(target,formatters["M-N-%H"](nextglyph),newnextdata)
+
+ local over = { factor = "over" }
+ local under = { factor = "under" }
+
+ local candidates = {
+ over = {
+ [0x203E] = over, -- overbar
+ [0x23DE] = over, -- overbrace
+ [0x23DC] = over, -- overparent
+ [0x23B4] = over, -- overbracket
+ },
+ under = {
+ [0x23DF] = under, -- underbrace
+ [0x23DD] = under, -- underparent
+ [0x23B5] = under, -- underbracket
+ },
+ accent = {
+ [0x0300] = over, -- widegrave
+ [0x0308] = over, -- wideddot
+ [0x0304] = over, -- widebar
+ [0x0301] = over, -- wideacute
+ [0x0302] = over, -- widehat
+ [0x030C] = over, -- widecheck
+ [0x0306] = over, -- widebreve
+ [0x0307] = over, -- widedot
+ [0x030A] = over, -- widering
+ [0x0303] = over, -- widetilde
+ [0x20DB] = over, -- widedddot
+ },
+ }
+
+ local function adapt(c,factor,baseheight,basedepth)
+ if not c.tweaked then
+ local height = c.height or 0
+ local depth = c.depth or 0
+ local yoffset = 0
+ if factor == "over" then
+ local h = height - baseheight
+ yoffset = h - height
+ height = h
+ depth = depth - baseheight
+ elseif factor == "under" then
+ local d = depth - basedepth
+ yoffset = depth - d
+ depth = d
+ height = height - baseheight
+ else
+ if height > 0 then
+ local h = tonumber(factor) * height
+ yoffset = h - height
+ height = h
+ elseif depth > 0 then
+ local d = tonumber(factor) * depth
+ yoffset = depth - d
+ depth = d
+ end
+ end
+ c.yoffset = yoffset ~= 0 and yoffset or nil
+ c.height = height > 0 and height or nil
+ c.depth = depth > 0 and depth or nil
+ c.tweaked = true
+ end
+ end
+
+ local function process(characters,list,baseheight,basedepth)
+ if list then
+ for k, v in sortedhash(list) do -- sort for tracing
+ local c = characters[k]
+ if c and not c.yoffset then
+ local factor = v.factor
+ if factor then
+ adapt(c,factor,baseheight,basedepth)
+ local nc = c.next
+ local nv = 0
+ local ns = 0
+ while nc do
+ local c = characters[nc]
+ if c then
+ adapt(c,factor,baseheight,basedepth)
+ nv = nv + 1
+ nc = c.next
+ if not nc then
+ local hv = c.hparts
+ if hv then
+ for i=1,#hv do
+ local c = characters[hv[i].glyph]
+ if c then
+ adapt(c,factor,baseheight,basedepth)
+ ns = ns + 1
+ end
+ end
+ end
+ break
+ end
+ else
+ break
+ end
+ end
+ if trace_tweaking then
+ report_tweak("adapting extensible (%i sizes, %i parts) %U",k,nv,ns)
+ end
+ end
+ end
+ end
+ end
+ end
+
+ function mathtweaks.accentdimensions(target,original,parameters)
+ local list = parameters.list or { "over", "under" }
+ if list then
+ local characters = target.characters
+ local baseheight = target.mathparameters.AccentBaseHeight or 0
+ local basedepth = target.mathparameters.AccentBaseDepth or 0
+ for k, v in sortedhash(list) do -- sort for tracing
+ local t = type(v)
+ if t == "string" then
+ v = candidates[v]
+ t = type(v)
+ end
+ if t == "table" then
+ process(characters,v,baseheight,basedepth)
+ end
+ end
+ end
+ end
+
+end
+
+do
+
+ -- function mathtweaks.addrules(target,original,parameters)
+ -- local characters = target.characters
+ -- local height = target.mathparameters.OverbarRuleThickness
+ -- local depth = target.mathparameters.UnderbarRuleThickness
+ -- local width = target.parameters.emwidth/2
+ -- local step = 0.8 * width
+ -- characters[0x203E] = { -- over
+ -- width = width,
+ -- height = height,
+ -- depth = 0,
+ -- unicode = 0x203E,
+ -- commands = { { "rule", height, width } },
+ -- hparts = {
+ -- { advance = width, ["end"] = step, glyph = 0x203E, start = 0 },
+ -- { advance = width, ["end"] = 0, glyph = 0x203E, start = step, extender = 1 },
+ -- }
+ -- }
+ -- characters[0x0332] = { -- under
+ -- width = width,
+ -- height = 0,
+ -- depth = depth,
+ -- yoffset = -depth,
+ -- unicode = 0x0332,
+ -- commands = { { "rule", height, width } },
+ -- hparts = {
+ -- { advance = width, ["end"] = step, glyph = 0x0332, start = 0 },
+ -- { advance = width, ["end"] = 0, glyph = 0x0332, start = step, extender = 1 },
+ -- }
+ -- }
+ -- end
+
+ function mathtweaks.addrules(target,original,parameters)
+ local characters = target.characters
+ local thickness = target.mathparameters.OverbarRuleThickness
+ local width = target.parameters.emwidth / 2
+ local step = 0.8 * width
+ characters[0x203E] = { -- over
+ width = width,
+ height = thickness / 2,
+ depth = thickness / 2,
+ yoffset = - thickness / 2,
+ unicode = 0x203E,
+ commands = { { "rule", thickness, width } },
+ hparts = {
+ { advance = width, ["end"] = step, glyph = 0x203E, start = 0 },
+ { advance = width, ["end"] = 0, glyph = 0x203E, start = step, extender = 1 },
+ }
+ }
+ --
+ characters[0x0332] = characters[0x203E]
+ --
+ -- lucida lacks them ...
+ --
+ local addprivate = fonts.helpers.addprivate
+ --
+ local half = thickness / 2
+ local double = thickness * 2
+ --
+ if not characters[0x23B4] then
+ local tpiece = addprivate(target,"bracket-piece-top",{
+ width = thickness,
+ height = half,
+ depth = double,
+ yoffset = - double,
+ commands = { { "rule", thickness * 2.5, thickness } },
+ })
+ characters[0x23B4] = { -- over
+ width = width,
+ height = half,
+ depth = double,
+ unicode = 0x23B4,
+ commands = { { "rule", thickness, width } },
+ hparts = {
+ { advance = thickness, glyph = tpiece, ["end"] = 0, start = half },
+ { advance = width, glyph = 0x203E, ["end"] = step, start = step, extender = 1 },
+ { advance = thickness, glyph = tpiece, ["end"] = half, start = 0 },
+ }
+ }
+ end
+ if not characters[0x23B5] then
+ local bpiece = addprivate(target,"bracket-piece-bottom",{
+ width = thickness,
+ height = double,
+ depth = half,
+ yoffset = - half,
+ commands = { { "rule", thickness * 2.5, thickness } },
+ })
+ characters[0x23B5] = { -- over
+ width = width,
+ height = double,
+ depth = half,
+ unicode = 0x23B5,
+ commands = { { "rule", thickness, width } },
+ hparts = {
+ { advance = thickness, glyph = bpiece, ["end"] = 0, start = half },
+ { advance = width, glyph = 0x203E, ["end"] = step, start = step, extender = 1 },
+ { advance = thickness, glyph = bpiece, ["end"] = half, start = 0 },
+ }
+ }
+ end
+ end
+
+end
+
function mathtweaks.action(target,original,parameters)
local action = parameters.action
if type(action) == "function" then
@@ -626,32 +1070,42 @@ do
end
+local apply_tweaks = true
+
+directives.register("math.applytweaks", function(v)
+ apply_tweaks = v;
+end)
+
local function applytweaks(when,target,original)
- local goodies = original.goodies
- if goodies then
- for i=1,#goodies do
- local goodie = goodies[i]
- local mathematics = goodie.mathematics
- local tweaks = mathematics and mathematics.tweaks
- if type(tweaks) == "table" then
- tweaks = tweaks[when]
+ if apply_tweaks then
+ local goodies = original.goodies
+ if goodies then
+ for i=1,#goodies do
+ local goodie = goodies[i]
+ local mathematics = goodie.mathematics
+ local tweaks = mathematics and mathematics.tweaks
if type(tweaks) == "table" then
- if trace_defining then
- report_math("tweaking math of %a @ %p (%s)",target.properties.fullname,target.parameters.size,when)
- end
- for i=1,#tweaks do
- local tweak = tweaks[i]
- local tvalue = type(tweak)
- if type(tweak) == "table" then
- local action = mathtweaks[tweak.tweak or ""]
- if action then
- action(target,original,tweak)
+ tweaks = tweaks[when]
+ if type(tweaks) == "table" then
+ if trace_defining then
+ report_math("tweaking math of %a @ %p (%s)",target.properties.fullname,target.parameters.size,when)
+ end
+ for i=1,#tweaks do
+ local tweak = tweaks[i]
+ local tvalue = type(tweak)
+ if type(tweak) == "table" then
+ local action = mathtweaks[tweak.tweak or ""]
+ if action then
+ action(target,original,tweak)
+ end
end
end
end
end
end
end
+ else
+ report_math("not tweaking math of %a @ %p (%s)",target.properties.fullname,target.parameters.size,when)
end
end
@@ -669,10 +1123,10 @@ function mathematics.tweakaftercopyingfont(target,original)
end
end
+sequencers.appendaction("mathparameters","system","mathematics.overloadparameters")
sequencers.appendaction("mathparameters","system","mathematics.scaleparameters")
sequencers.appendaction("mathparameters","system","mathematics.checkaccentbaseheight") -- should go in lfg instead
sequencers.appendaction("mathparameters","system","mathematics.checkprivateparameters") -- after scaling !
-sequencers.appendaction("mathparameters","system","mathematics.overloadparameters")
sequencers.appendaction("beforecopyingcharacters","system","mathematics.tweakbeforecopyingfont")
sequencers.appendaction("aftercopyingcharacters", "system","mathematics.tweakaftercopyingfont")
@@ -683,16 +1137,11 @@ sequencers.appendaction("aftercopyingcharacters", "system","mathematics.tweakaft
-- helpers
-local setmetatableindex = table.setmetatableindex
-
-local getfontoffamily = tex.getfontoffamily
+local getfontoffamily = tex.getfontoffamily
-local fontcharacters = fonts.hashes.characters
-local extensibles = utilities.storage.allocate()
-fonts.hashes.extensibles = extensibles
-
-local chardata = characters.data
-local extensibles = mathematics.extensibles
+local fontcharacters = fonts.hashes.characters
+local chardata = characters.data
+local extensibles = mathematics.extensibles
-- we use numbers at the tex end (otherwise we could stick to chars)
@@ -722,15 +1171,15 @@ local function extensiblecode(font,unicode)
if not char then
return unknown
end
- if character.hvariants then
- if character.vvariants then
+ if character.hparts then
+ if character.vparts then
return { e_mixed, code, character }
else
local m = char.mathextensible
local e = m and extensibles[m]
return e and { e, code, character } or unknown
end
- elseif character.vvariants then
+ elseif character.vparts then
local m = char.mathextensible
local e = m and extensibles[m]
return e and { e, code, character } or unknown
@@ -772,19 +1221,19 @@ local function horizontalcode(family,unicode)
local loffset = 0
local roffset = 0
if kind == e_left then
- local charlist = data[3].hvariants
+ local charlist = data[3].hparts
if charlist then
local left = charlist[1]
loffset = abs((left["start"] or 0) - (left["end"] or 0))
end
elseif kind == e_right then
- local charlist = data[3].hvariants
+ local charlist = data[3].hparts
if charlist then
local right = charlist[#charlist]
roffset = abs((right["start"] or 0) - (right["end"] or 0))
end
elseif kind == e_horizontal then
- local charlist = data[3].hvariants
+ local charlist = data[3].hparts
if charlist then
local left = charlist[1]
local right = charlist[#charlist]
@@ -815,7 +1264,6 @@ interfaces.implement { -- can be public with two times "integerargument"
end
}
-
local stack = { }
function mathematics.registerfallbackid(n,id,name)
diff --git a/tex/context/base/mkxl/math-ali.mkxl b/tex/context/base/mkxl/math-ali.mkxl
index 30f5c0524..6149d9be2 100644
--- a/tex/context/base/mkxl/math-ali.mkxl
+++ b/tex/context/base/mkxl/math-ali.mkxl
@@ -2196,6 +2196,25 @@
{\afterdisplayspace
\endgroup}
+%D Kind of new (February 2022):
+
+\installcorenamespace {maththreshold}
+
+\setupmathematics[\c!threshold=\zeropoint]
+
+\permanent\protected\def\installmaththreshold#1#2%
+ {\expandafter\gluespecdef\csname\??maththreshold#1\endcsname#2\relax}
+
+\installmaththreshold\v!none {\zeropoint}
+\installmaththreshold\v!small {3\emwidth plus 0.50\emwidth minus 0.25\emwidth}
+\installmaththreshold\v!medium{4\emwidth plus 0.75\emwidth minus 0.50\emwidth}
+\installmaththreshold\v!big {5\emwidth plus 1.00\emwidth minus 0.75\emwidth}
+
+\appendtoks
+ \edef\p_threshold{\mathematicsparameter\c!threshold}%
+ \maththreshold\ifcsname\??maththreshold\p_threshold\endcsname\lastnamedcs\else\p_threshold\fi\relax
+\to \everymath % \everyemathematics
+
\protect \endinput
% \placeformula \startformula[-] \startmatrix
diff --git a/tex/context/base/mkxl/math-def.mkxl b/tex/context/base/mkxl/math-def.mkxl
index c7cf65270..53165a30c 100644
--- a/tex/context/base/mkxl/math-def.mkxl
+++ b/tex/context/base/mkxl/math-def.mkxl
@@ -26,8 +26,7 @@
\activatemathcharacters
-%D The \mfunction macro is an alternative for \hbox with a controlable font
-%D switch.
+%D The \mfunction macro is an alternative for \hbox with a controlable font switch.
\definemathcommand [arccos] [nolop] {\mfunctionlabeltext{arccos}}
\definemathcommand [arcsin] [nolop] {\mfunctionlabeltext{arcsin}}
@@ -104,15 +103,14 @@
%D equalscoloncolon, coloncolonapprox, approxcoloncolon,
%D colonsim, simcoloncolon}
%D
-%D The following colon related definitions are provided by Aditya
-%D Mahajan who derived them from \type {mathtools.sty} and \type
-%D {colonequals.sty}. This will be redone as part of the overhaul
-%D and font updates.
+%D The following colon related definitions are provided by Aditya Mahajan who
+%D derived them from \type {mathtools.sty} and \type {colonequals.sty}. This will be
+%D redone as part of the overhaul and font updates.
%D
-%D In $a := b$ the colon is not vertically centered with the equal
-%D to. Also the distance between colon and equal to is a bit large.
-%D So, we define a vertically centered colon \tex {centercolon} and
-%D a few macros for colon and double colon relation symbols.
+%D In $a := b$ the colon is not vertically centered with the equal to. Also the
+%D distance between colon and equal to is a bit large. So, we define a vertically
+%D centered colon \tex {centercolon} and a few macros for colon and double colon
+%D relation symbols.
%D
%D \startlines
%D \formula {A \centercolon B}
@@ -140,8 +138,8 @@
\pushoverloadmode
-\definemathcommand [colonsep] {\mkern-1.2mu}
-\definemathcommand [doublecolonsep] {\mkern-0.9mu}
+\definemathcommand [colonsep] {\mkern-1.2mu}
+\definemathcommand [doublecolonsep] {\mkern-0.9mu}
\definemathcommand [centercolon] [rel] {\mathstylevcenteredhbox\colon}
\definemathcommand [colonminus] [rel] {\centercolon\colonsep\mathrel{-}}
diff --git a/tex/context/base/mkxl/math-del.mkxl b/tex/context/base/mkxl/math-del.mkxl
index 8f2596359..47febc180 100644
--- a/tex/context/base/mkxl/math-del.mkxl
+++ b/tex/context/base/mkxl/math-del.mkxl
@@ -66,7 +66,7 @@
% A new experiment:
% Hm, we already have \definemathextensible so we need to preserve that one. We now
-% use \definemathdelimiter.
+% use \definemathdelimiter. This mechanism will probably disappear so don't use it!
\installcorenamespace {mathdelimiter}
@@ -139,7 +139,7 @@
% \ruledhbox{$\int f\frac{1}{2}$}
% \stoplines
-\permanent\protected\def\autointegral#1#2#3%
+\permanent\protected\def\autointegral#1#2#3% this one is obsolete now
{\ifmmode
\setbox\nextbox\mathstylehbox{#3}%
\scratchdimen\ifdim\nextboxht>\nextboxdp\nextboxht\else\nextboxdp\fi
diff --git a/tex/context/base/mkxl/math-dim.lmt b/tex/context/base/mkxl/math-dim.lmt
index 3b88b0b0b..0dd348184 100644
--- a/tex/context/base/mkxl/math-dim.lmt
+++ b/tex/context/base/mkxl/math-dim.lmt
@@ -104,14 +104,14 @@ local defaults = {
}
local styles = {
+ 'display_style',
'cramped_display_style',
- 'cramped_script_script_style',
- 'cramped_script_style',
+ 'text_style',
'cramped_text_style',
- 'display_style',
- 'script_script_style',
'script_style',
- 'text_style',
+ 'cramped_script_style',
+ 'script_script_style',
+ 'cramped_script_script_style',
}
for k, v in next, defaults do
diff --git a/tex/context/base/mkxl/math-fbk.lmt b/tex/context/base/mkxl/math-fbk.lmt
index 80b99d83b..c219bb34f 100644
--- a/tex/context/base/mkxl/math-fbk.lmt
+++ b/tex/context/base/mkxl/math-fbk.lmt
@@ -246,160 +246,164 @@ virtualcharacters[0xFE352] = function(data)
end
end
-local function accent_to_extensible(target,newchr,original,oldchr,height,depth,swap,offset,unicode)
- local characters = target.characters
- local olddata = characters[oldchr]
- -- brrr ... pagella has only next
- if olddata and not olddata.commands then -- not: and olddata.width > 0
- local addprivate = fonts.helpers.addprivate
- if swap then
- swap = characters[swap]
- height = swap.depth or 0
- depth = 0
- else
- height = height or 0
- depth = depth or 0
- end
- local oldheight = olddata.height or 0
- local correction = swap and
- downcommand[oldheight - height]
- or downcommand[oldheight + (offset or 0)]
- local newdata = {
- commands = { correction, charcommand[oldchr] },
- width = olddata.width,
- height = height,
- depth = depth,
- unicode = unicode,
- }
- local glyphdata = newdata
- local nextglyph = olddata.next
- while nextglyph do
- local oldnextdata = characters[nextglyph]
- if oldnextdata then
- local newnextdata = {
- commands = { correction, charcommand[nextglyph] },
- width = oldnextdata.width,
- height = height,
- depth = depth,
- }
- local newnextglyph = addprivate(target,formatters["M-N-%H"](nextglyph),newnextdata)
- newdata.next = newnextglyph
- local nextnextglyph = oldnextdata.next
- if nextnextglyph == nextglyph then
- break
- else
- olddata = oldnextdata
- newdata = newnextdata
- nextglyph = nextnextglyph
- end
- else
- report_fallbacks("error in fallback: no valid next, slot %X",nextglyph)
- break
- end
- end
- local hv = olddata.hvariants
- if hv then
- hv = fastcopy(hv)
- newdata.hvariants = hv
- for i=1,#hv do
- local hvi = hv[i]
- local oldglyph = hvi.glyph
- local olddata = characters[oldglyph]
- if olddata then
- local newdata = {
- commands = { correction, charcommand[oldglyph] },
- width = olddata.width,
- height = height,
- depth = depth,
- }
- hvi.glyph = addprivate(target,formatters["M-H-%H"](oldglyph),newdata)
- else
- report_fallbacks("error in fallback: no valid hvariants, slot %X, index %i",oldglyph,i)
- end
- end
- end
- return glyphdata, true
- else
- return olddata, false
- end
-end
-
-virtualcharacters[0x203E] = function(data)
- local target = data.target
- local height = 0
- local depth = 0
- -- local mathparameters = target.mathparameters
- -- if mathparameters then
- -- height = mathparameters.OverbarVerticalGap
- -- depth = mathparameters.UnderbarVerticalGap
- -- else
- height = target.parameters.xheight/4
- depth = height
- -- end
- return accent_to_extensible(target,0x203E,data.original,0x0305,height,depth,nil,nil,0x203E)
-end
-
--- virtualcharacters[0xFE33E] = virtualcharacters[0x203E] -- convenient
--- virtualcharacters[0xFE33F] = virtualcharacters[0x203E] -- convenient
-
-virtualcharacters[0xFE33E] = function(data)
- local target = data.target
- local height = 0
- local depth = target.parameters.xheight/4
- return accent_to_extensible(target,0xFE33E,data.original,0x0305,height,depth,nil,nil,0x203E)
-end
-
-virtualcharacters[0xFE33F] = function(data)
- local target = data.target
- local height = target.parameters.xheight/8
- local depth = height
- return accent_to_extensible(target,0xFE33F,data.original,0x0305,height,depth,nil,nil,0x203E)
-end
-
-local function smashed(data,unicode,swap,private)
- local target = data.target
- local original = data.original
- local chardata = target.characters[unicode]
- if chardata and chardata.height > target.parameters.xheight then
- return accent_to_extensible(target,private,original,unicode,0,0,swap,nil,unicode)
- else
- return original.characters[unicode]
- end
-end
-
-addextra(0xFE3DE) -- EXTENSIBLE OF 0x03DE
-addextra(0xFE3DC) -- EXTENSIBLE OF 0x03DC
-addextra(0xFE3B4) -- EXTENSIBLE OF 0x03B4
-
-virtualcharacters[0xFE3DE] = function(data) return smashed(data,0x23DE,0x23DF,0xFE3DE) end
-virtualcharacters[0xFE3DC] = function(data) return smashed(data,0x23DC,0x23DD,0xFE3DC) end
-virtualcharacters[0xFE3B4] = function(data) return smashed(data,0x23B4,0x23B5,0xFE3B4) end
-
-addextra(0xFE3DF) -- EXTENSIBLE OF 0x03DF
-addextra(0xFE3DD) -- EXTENSIBLE OF 0x03DD
-addextra(0xFE3B5) -- EXTENSIBLE OF 0x03B5
-
-virtualcharacters[0xFE3DF] = function(data) local c = data.target.characters[0x23DF] if c then c.unicode = 0x23DF return c end end
-virtualcharacters[0xFE3DD] = function(data) local c = data.target.characters[0x23DD] if c then c.unicode = 0x23DD return c end end
-virtualcharacters[0xFE3B5] = function(data) local c = data.target.characters[0x23B5] if c then c.unicode = 0x23B5 return c end end
-
--- todo: add some more .. numbers might change
-
-addextra(0xFE302) -- EXTENSIBLE OF 0x0302
-addextra(0xFE303) -- EXTENSIBLE OF 0x0303
-
-local function smashed(data,unicode,private)
- local target = data.target
- local height = target.parameters.xheight / 2
- local c, done = accent_to_extensible(target,private,data.original,unicode,height,0,nil,-height,unicode)
- if done then
- c.topaccent = nil -- or maybe also all the others
- end
- return c
-end
+---------------------------------------------------------------------------------
+-- these are moved to math-act.lmt (keep this code)
+---------------------------------------------------------------------------------
-virtualcharacters[0xFE302] = function(data) return smashed(data,0x0302,0xFE302) end
-virtualcharacters[0xFE303] = function(data) return smashed(data,0x0303,0xFE303) end
+-- local function accent_to_extensible(target,newchr,original,oldchr,height,depth,swap,offset,unicode)
+-- local characters = target.characters
+-- local olddata = characters[oldchr]
+-- -- brrr ... pagella has only next
+-- if olddata and not olddata.commands then -- not: and olddata.width > 0
+-- local addprivate = fonts.helpers.addprivate
+-- if swap then
+-- swap = characters[swap]
+-- height = swap.depth or 0
+-- depth = 0
+-- else
+-- height = height or 0
+-- depth = depth or 0
+-- end
+-- local oldheight = olddata.height or 0
+-- local correction = swap and
+-- downcommand[oldheight - height]
+-- or downcommand[oldheight + (offset or 0)]
+-- local newdata = {
+-- commands = { correction, charcommand[oldchr] },
+-- width = olddata.width,
+-- height = height,
+-- depth = depth,
+-- unicode = unicode,
+-- }
+-- local glyphdata = newdata
+-- local nextglyph = olddata.next
+-- while nextglyph do
+-- local oldnextdata = characters[nextglyph]
+-- if oldnextdata then
+-- local newnextdata = {
+-- commands = { correction, charcommand[nextglyph] },
+-- width = oldnextdata.width,
+-- height = height,
+-- depth = depth,
+-- }
+-- local newnextglyph = addprivate(target,formatters["M-N-%H"](nextglyph),newnextdata)
+-- newdata.next = newnextglyph
+-- local nextnextglyph = oldnextdata.next
+-- if nextnextglyph == nextglyph then
+-- break
+-- else
+-- olddata = oldnextdata
+-- newdata = newnextdata
+-- nextglyph = nextnextglyph
+-- end
+-- else
+-- report_fallbacks("error in fallback: no valid next, slot %X",nextglyph)
+-- break
+-- end
+-- end
+-- local hv = olddata.hparts
+-- if hv then
+-- hv = fastcopy(hv)
+-- newdata.hparts = hv
+-- for i=1,#hv do
+-- local hvi = hv[i]
+-- local oldglyph = hvi.glyph
+-- local olddata = characters[oldglyph]
+-- if olddata then
+-- local newdata = {
+-- commands = { correction, charcommand[oldglyph] },
+-- width = olddata.width,
+-- height = height,
+-- depth = depth,
+-- }
+-- hvi.glyph = addprivate(target,formatters["M-H-%H"](oldglyph),newdata)
+-- else
+-- report_fallbacks("error in fallback: no valid hparts, slot %X, index %i",oldglyph,i)
+-- end
+-- end
+-- end
+-- return glyphdata, true
+-- else
+-- return olddata, false
+-- end
+-- end
+--
+-- virtualcharacters[0x203E] = function(data) -- overbar
+-- local target = data.target
+-- local height = 0
+-- local depth = 0
+-- -- local mathparameters = target.mathparameters
+-- -- if mathparameters then
+-- -- height = mathparameters.OverbarVerticalGap
+-- -- depth = mathparameters.UnderbarVerticalGap
+-- -- else
+-- height = target.parameters.xheight/4
+-- depth = height
+-- -- end
+-- return accent_to_extensible(target,0x203E,data.original,0x0305,height,depth,nil,nil,0x203E)
+-- end
+--
+-- -- virtualcharacters[0xFE33E] = virtualcharacters[0x203E] -- convenient
+-- -- virtualcharacters[0xFE33F] = virtualcharacters[0x203E] -- convenient
+--
+-- virtualcharacters[0xFE33E] = function(data)
+-- local target = data.target
+-- local height = 0
+-- local depth = target.parameters.xheight/4
+-- return accent_to_extensible(target,0xFE33E,data.original,0x0305,height,depth,nil,nil,0x203E)
+-- end
+--
+-- virtualcharacters[0xFE33F] = function(data)
+-- local target = data.target
+-- local height = target.parameters.xheight/8
+-- local depth = height
+-- return accent_to_extensible(target,0xFE33F,data.original,0x0305,height,depth,nil,nil,0x203E)
+-- end
+--
+-- local function smashed(data,unicode,swap,private)
+-- local target = data.target
+-- local original = data.original
+-- local chardata = target.characters[unicode]
+-- if chardata and chardata.height > target.parameters.xheight then
+-- return accent_to_extensible(target,private,original,unicode,0,0,swap,nil,unicode)
+-- else
+-- return original.characters[unicode]
+-- end
+-- end
+--
+-- addextra(0xFE3DE) -- EXTENSIBLE OF 0x03DE : overbrace
+-- addextra(0xFE3DC) -- EXTENSIBLE OF 0x03DC : overparent
+-- addextra(0xFE3B4) -- EXTENSIBLE OF 0x03B4 : overbracket
+--
+-- virtualcharacters[0xFE3DE] = function(data) return smashed(data,0x23DE,0x23DF,0xFE3DE) end
+-- virtualcharacters[0xFE3DC] = function(data) return smashed(data,0x23DC,0x23DD,0xFE3DC) end
+-- virtualcharacters[0xFE3B4] = function(data) return smashed(data,0x23B4,0x23B5,0xFE3B4) end
+--
+-- addextra(0xFE3DF) -- EXTENSIBLE OF 0x03DF
+-- addextra(0xFE3DD) -- EXTENSIBLE OF 0x03DD
+-- addextra(0xFE3B5) -- EXTENSIBLE OF 0x03B5
+--
+-- virtualcharacters[0xFE3DF] = function(data) local c = data.target.characters[0x23DF] if c then c.unicode = 0x23DF return c end end
+-- virtualcharacters[0xFE3DD] = function(data) local c = data.target.characters[0x23DD] if c then c.unicode = 0x23DD return c end end
+-- virtualcharacters[0xFE3B5] = function(data) local c = data.target.characters[0x23B5] if c then c.unicode = 0x23B5 return c end end
+--
+-- -- todo: add some more .. numbers might change
+--
+-- addextra(0xFE302) -- EXTENSIBLE OF 0x0302
+-- addextra(0xFE303) -- EXTENSIBLE OF 0x0303
+--
+-- local function smashed(data,unicode,private)
+-- local target = data.target
+-- local height = target.parameters.xheight / 2
+-- local c, done = accent_to_extensible(target,private,data.original,unicode,height,0,nil,-height,unicode)
+-- if done then
+-- c.topaccent = nil -- or maybe also all the others
+-- end
+-- return c
+-- end
+--
+-- virtualcharacters[0xFE302] = function(data) return smashed(data,0x0302,0xFE302) end
+-- virtualcharacters[0xFE303] = function(data) return smashed(data,0x0303,0xFE303) end
---------------------------------------------------------------------------------
-- these are moved to math-act.lmt
@@ -717,7 +721,7 @@ virtualcharacters[0x305] = function(data)
height = height,
depth = depth,
commands = { { "rule", height, width } },
- hvariants = {
+ hparts = {
{
advance = width,
["end"] = used,
diff --git a/tex/context/base/mkxl/math-fen.mkxl b/tex/context/base/mkxl/math-fen.mkxl
index b8347eb66..08891286e 100644
--- a/tex/context/base/mkxl/math-fen.mkxl
+++ b/tex/context/base/mkxl/math-fen.mkxl
@@ -58,13 +58,19 @@
\c!color=,
\c!command=,
\c!mathclass=,
+ \c!leftsource=\zerocount,
+ \c!middlesource=\zerocount,
+ \c!rightsource=\mathfenceparameter\c!source,
+ \c!source=\zerocount,
+ \c!height=\zeropoint,
+ \c!depth=\zeropoint,
\c!factor=\v!auto]
\appendtoks
\edef\p_command{\mathfenceparameter\c!command}%
\ifx\p_command\v!yes
% \instance
- \protected\edefcsname\currentmathfence\endcsname{\math_fenced_fenced[\currentmathfence]}%
+ \protected\edefcsname\currentmathfence\endcsname{\math_fenced_fenced{\currentmathfence}}%
\fi
\to \everydefinemathfence
@@ -87,9 +93,13 @@
%D $ a + \fenced[bar] {\frac {b} {c}} + d $
%D \stoptyping
+% todo : class -> number
+
\newconditional\c_math_fenced_mirror \settrue \c_math_fenced_mirror
\newconditional\c_math_fenced_sized \setfalse\c_math_fenced_sized
+\newcount\c_math_fence_nesting
+
\installcorenamespace {mathfencesize}
\defcsname\??mathfencesize big\endcsname{1}
@@ -97,125 +107,143 @@
\defcsname\??mathfencesize bigg\endcsname{3}
\defcsname\??mathfencesize Bigg\endcsname{4}
+\let\math_fenced_trace\donothing
+
\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.%
+\def\math_fenced_common_factor_none
+ {\math_fenced_force_size\bigmathdelimitervariant\c_math_fence_nesting\relax
+ \Uvextensible
+ \s!axis
+ \s!exact}
+
+\def\math_fenced_common_factor_fixed
+ {\Uvextensible
+ \s!axis
+ \s!exact}
+
+\def\math_fenced_common_factor_unknown
+ {\scratchdimen\dimexpr\p_factor\bodyfontsize/2\relax
+ \Uvextensible
+ \s!height\scratchdimen
+ \s!depth\scratchdimen
+ \s!axis
+ \s!exact}
+
+\def\math_fenced_common_factor_force
+ {\Uvextensible
+ \s!height\mathfenceparameter\c!height
+ \s!depth\mathfenceparameter\c!depth
+ \s!axis
+ \s!exact}
+
+\permanent\def\math_fenced_common#1#2#3#4% \Uwhatever class symbol source
+ {\ifconditional\c_math_fenced_sized
+ \orelse\ifconditional\c_math_fenced_level_mode
+ \ifnum#2=\mathopencode
+ % \hpack{\infofont<L:\number\c_math_fenced_level:\number\c_attr_mathsize>}%
+ \integerdef\c_math_fenced_stack\c_attr_mathsize
+ \push_macro_c_math_fenced_stack
+ \orelse\ifnum#2=\mathclosecode
+ \pop_macro_c_math_fenced_stack
+ \c_attr_mathsize\c_math_fenced_stack
+ % \hpack{\infofont<R:\number\c_math_fenced_level:\number\c_attr_mathsize>}%
+ \fi
+ \fi
+ \edef\p_fence{#3}%
+ \ifempty\p_fence
+ #1.\relax
\else
+ \edef\p_factor {\mathfenceparameter\c!factor}%
+ \edef\p_size {\mathfenceparameter\c!size}%
\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%
+ \ifnum\c_math_fenced_level>\zerocount
+ \math_fenced_common_factor_fixed
+ \orelse\ifconditional\c_math_fenced_sized
+ \math_fenced_common_factor_fixed
+ \orelse\ifempty\p_factor
+ \ifconditional\c_math_fenced_level_mode
+ \Uvextensible
\else
- #3%
- \s!class\p_mathclass
+ #1% \Uleft \Umiddle \Uleft
\fi
\orelse\ifx\p_factor\v!auto
- \ifempty\p_mathclass
- #2%
+ \ifconditional\c_math_fenced_level_mode
+ \Uvextensible
\else
- #3%
- \s!class\p_mathclass
+ #1% \Uleft \Umiddle \Uleft
\fi
\orelse\ifx\p_factor\v!none
- #3%
- \s!height\zeropoint % redundant with "exact"
- \s!depth\zeropoint % redundant with "exact"
- \ifempty\p_mathclass\else
- \s!class\p_mathclass
- \fi
- \s!axis
- \s!exact % new
- % #2%
+ \math_fenced_common_factor_none
+ \orelse\ifx\p_factor\v!fixed
+ \math_fenced_common_factor_fixed
+ \orelse\ifx\p_factor\v!force
+ \math_fenced_common_factor_force
\else
- %\scratchdimen\ifx\p_factor\v!fixed\scaledpoint\else\dimexpr\p_factor\bodyfontsize/2\relax\fi
- \scratchdimen\ifx\p_factor\v!fixed\zeropoint\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
- \s!exact
+ \math_fenced_common_factor_unknown
+ \fi
+ \usedcolorparameterattributes{\mathfenceparameter\c!color}%
+ \s!class\ifempty\p_mathclass#2\else\p_mathclass\fi
+ \s!source\numexpr\namedboxanchor{\mathfenceparameter#4}\relax
+ \math_fenced_trace
+ \Udelimiter#2\fam\p_fence\relax
+ \fi
+ % we could use \s!attr \c_math_fenced_stack here
+ \ifconditional\c_math_fenced_sized
+ \orelse\ifcase\c_math_fenced_level
+ \c_attr_mathsize\attributeunsetvalue
+ \fi}
+
+\def\math_fenced_left
+ {\advance\c_math_fence_nesting\plusone
+ \math_fenced_common\Uleft\mathopencode\math_fenced_p_left\c!leftsource}
+
+\def\math_fenced_middle
+ {\math_fenced_common\Umiddle\mathmiddlecode\math_fenced_p_middle\c!middlesource}
+
+\def\math_fenced_right
+ {\math_fenced_common\Uright\mathclosecode\math_fenced_p_right\c!rightsource
+ \advance\c_math_fence_nesting\minusone}
+
+\def\math_fenced_p_left
+ {\ifconditional\c_math_fenced_mirror
+ \ifconditional\c_math_right_to_left
+ \mathfenceparameter\c!right
+ \else
+ \mathfenceparameter\c!left
\fi
- \Udelimiter#4\fam#1\relax
+ \else
+ \mathfenceparameter\c!left
\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
+\def\math_fenced_p_middle
+ {\mathfenceparameter\c!middle}%
+
+\def\math_fenced_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}
\aliased\let\fence \relax
\aliased\let\fenced\relax
-\newcount\c_math_fenced_nesting
-
\protected\def\math_fenced_fenced_common
{\startusemathstyleparameter\mathfenceparameter\c!mathstyle
- \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}
+ \enforced\let\fence\math_fenced_middle}
\protected\def\math_fenced_fenced_start#1%
- {\advance\c_math_fenced_nesting\plusone
- \begingroup
+ {\begingroup
+ %{\beginmathgroup
\edef\currentmathfence{#1}%
\math_fenced_fenced_common
\math_fenced_left}
@@ -224,15 +252,19 @@
{\edef\currentmathfence{#1}%
\math_fenced_right
\stopusemathstyleparameter
- \endgroup
- \advance\c_math_fenced_nesting\minusone}
+ \endgroup}
+ %\endmathgroup}
-\tolerant\protected\def\math_fenced_fenced[#1]#*[#2]%
- {\advance\c_math_fenced_nesting\plusone
- \begingroup
- \edef\currentmathfence{#1}%
+\installlocalcurrenthandler \??mathfences {mathfence}
+
+\tolerant\protected\def\math_fenced_fenced#1#*[#2]%
+ {\begingroup
+ %{\beginmathgroup
+ \setlocalmathfencecurrent{#1}% \edef\currentmathfence{#1}%
% under test:
+ \setfalse\c_math_fenced_level_mode
\c_attr_mathsize\attributeunsetvalue
+ %
\letmathfenceparameter\c!size\empty
\letmathfenceparameter\c!factor\v!auto
% so far
@@ -250,8 +282,8 @@
\protected\def\math_fenced_fenced_indeed_finish
{\stopusemathstyleparameter
- \endgroup
- \advance\c_math_fenced_nesting\minusone}
+ \endgroup}
+ %\endmathgroup}
\protected\def\math_fenced_fenced_indeed_fixed#1%
{\math_fenced_force_size\bigmathdelimitervariant\p_size
@@ -272,10 +304,81 @@
\math_fenced_right
\math_fenced_fenced_indeed_finish}
+\protected\def\math_fenced_direct[#1]%
+ {\math_fenced_fenced{#1}}
+
\appendtoks
- \enforced\let\fenced\math_fenced_fenced
+ \enforced\let\fenced\math_fenced_direct
\to \everymathematics
+%D This is new:
+%D
+%D \starttyping
+%D $ \F0 \left( x + \F1 \left( x \right) + x \right) $
+%D $
+%D \F0 \left( x + \F1 \left( x + \F2 \left( x + \F3 \left( x + \F4 \left( x +
+%D 2
+%D + x \right) + x \right) + x \right) + x \right) + x \right)
+%D $
+%D $ \F1 \left( x + \F1 \left( x \right) + x \right) $
+%D $ \F3 \left( x + \F1 \left( x \right) + x \right) $
+%D $ \F1 \left( x + \F4 \left( x \right) + x \right) $
+%D $ \F4 \left( x + \F- \left( x \right) + x \right) $
+%D $ \F4
+%D \left( 1 +
+%D \F- \left( 2 +
+%D \F* \left( 3 +
+%D 4
+%D \right)
+%D + 5 +
+%D \F- \left( 6 +
+%D 7
+%D \right)
+%D \right)
+%D + 8
+%D \right)
+%D $
+%D \stoptyping
+%D
+%D \starttyping
+%D \startTEXpage[offset=1dk,width=20dk]
+%D \ruledhbox{$ \F3 \left( 1 + \F2 \left( a + b \right) + \left( a + b \right) \right) $}\par
+%D \ruledhbox{$ \F3 \left( 1 + \F0 \left( a + b \right) \right) $}\par
+%D \ruledhbox{$ \F3 \left( 1 + \F= \left( a + b \right) \right) $}\par
+%D \ruledhbox{$ \F4 \left( 1 + \fenced[parenthesis]{a + b} \right) $}\par
+%D \ruledhbox{$ \F3 \left( 1 + \F- \left( a + b \right) \right) $}\par
+%D \ruledhbox{$ \left( \frac{1}{1+x} \right) $}\par
+%D \ruledhbox{$ \left( \frac{1}{1+x} \right) $}\par
+%D \stopTEXpage
+%D \stoptyping
+
+\newcount \c_math_fenced_level
+\newconditional\c_math_fenced_level_mode
+
+\integerdef\c_math_fenced_stack \zerocount
+
+\installmacrostack \c_math_fenced_stack
+
+\installcorenamespace{fencelevels}
+\installcorenamespace{fencestack}
+
+\defcsname\??fencelevels+\endcsname{\advance\c_math_fenced_level\plusone }
+\defcsname\??fencelevels-\endcsname{\advance\c_math_fenced_level\minusone }
+\defcsname\??fencelevels=\endcsname {\c_math_fenced_level\zerocount}
+
+\letcsname\??fencelevels*\endcsname\donothing
+
+\permanent\protected\def\F#1%
+ {\settrue\c_math_fenced_level_mode
+ \ifchknum#1\or
+ \c_math_fenced_level#1\relax
+ \orelse\ifcsname\??fencelevels#1\endcsname
+ \lastnamedcs
+ \else
+ \c_math_fenced_level\zerocount
+ \fi
+ \math_fenced_force_size\bigmathdelimitervariant\c_math_fenced_level\relax}
+
% integral experiment (but no scripts)
%
% \protected\def\math_fenced_fenced_simple#1%
@@ -420,7 +523,7 @@
\popoverloadmode
-\let\leftorright\relax
+% \let\leftorright\relax
\newconditional\c_math_fenced_done
\newconditional\c_math_fenced_unknown \settrue\c_math_fenced_unknown
@@ -620,12 +723,6 @@
%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
@@ -633,85 +730,35 @@
% 3: htdp * 1.33^n
% 4: size * 1.33^n
-\setnewconstant\bigmathdelimitermethod \plustwo % \plusone
\setnewconstant\bigmathdelimitervariant\plusthree
\appendtoks
- \bigmathdelimitermethod \mathfenceparameter\c!method\relax
- \bigmathdelimitervariant\mathfenceparameter\c!alternative\relax
+ \bigmathdelimitervariant\mathfenceparameter\c!alternative\relax % controls lua
\to \everysetupmathfence
-\setupmathfence[\c!method=1,\c!alternative=1]
+\setupmathfence[\c!alternative=1] % or 5
-% \protected\def\plainbigdelimiters % traditional method
-% {\bigmathdelimitermethod\plustwo}
-%
-% \plainbigdelimiters % is default for the moment but not so nice
-
-\installcorenamespace{mathbig}
+\permanent\protected\def\choosemathbig
+ {\mathortext\math_choosemathbig_math\math_choosemathbig_text}
-\defcsname\??mathbig1\endcsname{0.85}
-\defcsname\??mathbig2\endcsname{1.15}
-\defcsname\??mathbig3\endcsname{1.45}
-\defcsname\??mathbig4\endcsname{1.75}
+\protected\def\math_choosemathbig_math#1#2% so we accept \big{||} as well
+ {\math_fenced_force_size\bigmathdelimitervariant{#1}\relax
+ \Uvextensible#2\relax
+ \c_attr_mathsize\attributeunsetvalue}
-\permanent\protected\def\choosemathbig#1#2% so we accept \big{||} as well
- {{\naturalhbox\bgroup
+\protected\def\math_choosemathbig_text#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
+ \math_choosemathbig_math{#1}{#2}%
+ \nulldelimiterspace\zeropoint
\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}
+ \egroup}
-\permanent\protected\def\mathdelimiterstep#1#2% not used
+\permanent\protected\def\mathdelimiterstep#1#2% not used, only in example
{\begingroup
\math_fenced_force_size\plusone{#1}%
- \math_fenced_step#2\relax
+ \Uvextensible#2\relax
\endgroup}
\definemathcommand [big] {\choosemathbig1}
@@ -779,6 +826,7 @@
\permanent\protected\def\enableautofences
{\clf_enableautofences
+ \setfalse\c_math_fences_auto
\glet\clf_enableautofences\relax % onlyonce anyway
\enforced\permanent\protected\gdef\enableautofences{\settrue\c_math_fences_auto}%
\enableautofences}
@@ -865,4 +913,79 @@
\immutable\Umathchardef\bracelu\zerocount \zerocount "FF07C
\immutable\Umathchardef\braceru\zerocount \zerocount "FF07D
+%D Some tracing:
+
+\definefont[mathindexfont][Mono sa .2]
+
+\def\math_fenced_trace_indeed
+ {%
+ \beginlocalcontrol
+ \registerboxanchor
+ \registeranchorbox
+ \registeredboxanchor
+ \plusone
+ \hbox
+ \s!anchors \boxanchorpresetcode{depth} \boxanchorpresetcode{height}
+ \s!yoffset -.1\exheight
+ \s!target \registeredboxanchor
+ \s!to \zeropoint
+ {\darkblue\hss\mathindexfont\ruledhbox{\number\c_math_fence_nesting}\hss}%
+ \endlocalcontrol
+ \s!source \registeredboxanchor
+ }
+
+% \def\math_fenced_trace_indeed
+% {%
+% \beginlocalcontrol
+% \registerboxanchor
+% \registeranchorbox
+% \registeredboxanchor
+% \plusone
+% \ruledhbox
+% \s!anchors \boxanchorpresetcode{depth} \boxanchorpresetcode{height}
+% \s!yoffset -.1\exheight
+% \s!target \registeredboxanchor
+% \s!to \zeropoint
+% {\darkblue\hss\mathindexfont\ruledhbox{\number\c_math_fence_nesting B}\hss}%
+% \registeranchorbox
+% \registeredboxanchor
+% \plusone
+% \ruledhbox
+% \s!anchors \boxanchorpresetcode{height} \boxanchorpresetcode{depth}
+% \s!yoffset .1\exheight
+% \s!target \registeredboxanchor
+% \s!to \zeropoint
+% {\darkgreen\hss\mathindexfont\ruledhbox{\number\c_math_fence_nesting T}\hss}%
+% \registeranchorbox
+% \registeredboxanchor
+% \plusone
+% \ruledhbox
+% \s!anchors \boxanchorpresetcode{left} \boxanchorpresetcode{right}
+% \s!xoffset -.1\emwidth
+% \s!target \registeredboxanchor
+% \s!to \zeropoint
+% {\darkred\hss\mathindexfont\ruledhbox{\number\c_math_fence_nesting L}}%
+% \registeranchorbox
+% \registeredboxanchor
+% \plusone
+% \ruledhbox
+% \s!anchors \boxanchorpresetcode{right} \boxanchorpresetcode{left}
+% \s!xoffset .1\emwidth
+% \s!target \registeredboxanchor
+% \s!to \zeropoint
+% {\darkyellow\mathindexfont\ruledhbox{\number\c_math_fence_nesting R}\hss}%
+% \endlocalcontrol
+% \s!source \registeredboxanchor
+% }
+
+\installtextracker
+ {math.fencenesting}
+ {\let\math_fenced_trace\math_fenced_trace_indeed}
+ {\let\math_fenced_trace\donothing}
+
+\appendtoks
+ \integerdef\c_math_fence_level\minusone
+ \c_math_fence_nesting\zerocount
+\to \everymathematics
+
\protect
diff --git a/tex/context/base/mkxl/math-frc.lmt b/tex/context/base/mkxl/math-frc.lmt
index c82b8387d..c2ae2fbd5 100644
--- a/tex/context/base/mkxl/math-frc.lmt
+++ b/tex/context/base/mkxl/math-frc.lmt
@@ -6,73 +6,62 @@ if not modules then modules = { } end modules ['math-frc'] = {
license = "see context related readme files"
}
-local utfchar = utf.char
-
-local context = context
-local variables = interfaces.variables
-
-local v_no = variables.no
-local v_yes = variables.yes
-local v_hidden = variables.hidden
-
-local resolved = {
- [0x007B] = "\\{",
- [0x007D] = "\\}",
-}
-
-table.setmetatableindex(resolved, function(t,k)
- local v = utfchar(k)
- t[k] = v
- return v
-end)
-
-local ctx_Uatop = context.Uatop
-local ctx_Uover = context.Uover
-
--- local function umathfraction(how,style,left,right,width)
--- style = tonumber(style) -- or nil
+-- obsolete
+--
+-- \def\math_frac_command_u
+-- {\clf_umathfraction % we can get this bakc to the tex end
+-- {\mathfractionparameter\c!rule}%
+-- \ifempty\p_math_fraction_fences
+-- \mathfractionparameter\c!left \space
+-- \mathfractionparameter\c!right\space
+-- \else
+-- \math_frac_no_delim\space
+-- \math_frac_no_delim\space
+-- \fi
+-- \dimexpr\mathfractionparameter\c!rulethickness\relax
+-- {\number\namedboxanchor{\mathfractionparameter\c!source}}%
+-- \relax}
+--
+-- local utfchar = utf.char
+--
+-- local context = context
+-- local variables = interfaces.variables
+--
+-- local v_no = variables.no
+-- local v_yes = variables.yes
+-- local v_hidden = variables.hidden
+--
+-- local resolved = {
+-- [0x007B] = "\\{",
+-- [0x007D] = "\\}",
+-- }
+--
+-- table.setmetatableindex(resolved, function(t,k)
+-- local v = utfchar(k)
+-- t[k] = v
+-- return v
+-- end)
+--
+-- local function umathfraction(how,left,right,width,source)
+-- source = tonumber(source) or 0
-- if how == v_no then
-- if left == 0x002E and right == 0x002E then
--- if style then
--- context("\\Uatop style %i",style)
--- else
--- ctx_Uatop()
--- end
+-- context("\\Uatop source %i ",source)
-- else
--- if style then
--- context("\\Uatopwithdelims style %i %s%s",style,resolved[left],resolved[right])
--- else
--- context("\\Uatopwithdelims%s%s",resolved[left],resolved[right])
--- end
+-- context("\\Uatopwithdelims %s%s source %i ",resolved[left],resolved[right],source)
-- end
-- elseif how == v_yes or how == v_hidden then
--- local norule = how == v_hidden and " norule " or ""
--- if style then
--- if left == 0x002E and right == 0x002E then
--- context("\\Uabove style %i %s%ssp",style,norule,width)
--- else
--- context("\\Uabovewithdelims style %i %s%s%s%ssp",style,norule,resolved[left],resolved[right],width)
--- end
+-- local norule = how == v_hidden and "norule" or ""
+-- if left == 0x002E and right == 0x002E then
+-- context("\\Uabove source %i %s %ssp",source,norule,width)
-- else
--- if left == 0x002E and right == 0x002E then
--- context("\\Uabove%s%ssp",norule,width)
--- else
--- context("\\Uabovewithdelims%s%s%s%ssp",norule,resolved[left],resolved[right],width)
--- end
+-- context("\\Uabovewithdelims %s%s source %i %s %ssp",resolved[left],resolved[right],source,norule,width)
-- end
-- else -- v_auto
-- if left == 0x002E and right == 0x002E then
--- if style then
--- context("\\Uover style %i",style)
--- else
--- ctx_Uover()
--- end
+-- context("\\Uover source %i ",source)
-- else
--- if style then
--- context("\\Uoverwithdelims style %i %s%s",style,resolved[left],resolved[right])
--- else
--- context("\\Uoverwithdelims%s%s",resolved[left],resolved[right])
--- end
+-- context("\\Uoverwithdelims %s%s source %i ",resolved[left],resolved[right],source)
-- end
-- end
-- end
@@ -80,35 +69,6 @@ local ctx_Uover = context.Uover
-- interfaces.implement {
-- name = "umathfraction",
-- actions = umathfraction,
--- arguments = { "string", "string", "number", "number", "dimen" }
+-- protected = true,
+-- arguments = { "string", "number", "number", "dimen", "string" }
-- }
-
-local function umathfraction(how,left,right,width)
- if how == v_no then
- if left == 0x002E and right == 0x002E then
- ctx_Uatop()
- else
- context("\\Uatopwithdelims%s%s",resolved[left],resolved[right])
- end
- elseif how == v_yes or how == v_hidden then
- local norule = how == v_hidden and " norule " or ""
- if left == 0x002E and right == 0x002E then
- context("\\Uabove %s%ssp",norule,width)
- else
- context("\\Uabovewithdelims %s%s%s%ssp",norule,resolved[left],resolved[right],width)
- end
- else -- v_auto
- if left == 0x002E and right == 0x002E then
- ctx_Uover()
- else
- context("\\Uoverwithdelims%s%s",resolved[left],resolved[right])
- end
- end
-end
-
-interfaces.implement {
- name = "umathfraction",
- actions = umathfraction,
- protected = true,
- arguments = { "string", "number", "number", "dimen" }
-}
diff --git a/tex/context/base/mkxl/math-frc.mkxl b/tex/context/base/mkxl/math-frc.mkxl
index 8835ea997..6e41ee71e 100644
--- a/tex/context/base/mkxl/math-frc.mkxl
+++ b/tex/context/base/mkxl/math-frc.mkxl
@@ -31,11 +31,10 @@
%D \macros
%D {frac, xfrac, xxfrac}
%D
-%D This is another one Tobias asked for. It replaces the primitive \type
-%D {\over}. We also take the opportunity to handle math style restoring,
-%D which makes sure units and chemicals come out ok. The \type {\frac}
-%D macro kind of replaces the awkward \type {\over} primitive. Say that
-%D we have the following formulas:
+%D This is another one Tobias asked for. It replaces the primitive \type {\over}. We
+%D also take the opportunity to handle math style restoring, which makes sure units
+%D and chemicals come out ok. The \type {\frac} macro kind of replaces the awkward
+%D \type {\over} primitive. Say that we have the following formulas:
%D
%D \startbuffer[sample]
%D test $\frac {1}{2}$ test $$1 + \frac {1}{2} = 1.5$$
@@ -78,23 +77,8 @@
%D So we stick to the next definitions (watch the local overloading of
%D \type {\xfrac}).
%D
-%D In the meantime, in \LUATEX, we have better control over styles so the
-%D following macros are different from the \MKII\ ones.
-
-% obsolete, is now c!mathstyle
-%
-% 0=auto, 1=displaystyle, 2=textstyle, 3=scriptstyle, 4=scriptscriptstyle, 5=mathstyle
-%
-% $\mathfracmode0 \frac{1}{2}$
-% $\mathfracmode1 \frac{1}{2}$
-% $\mathfracmode2 \frac{1}{2}$
-% $\mathfracmode3 \frac{1}{2}$
-% $\mathfracmode4 \frac{1}{2}$
-% $\mathfracmode5 \frac{1}{2}$
-%
-% we keep the constant for a while
-
-\setnewconstant\mathfracmode\zerocount
+%D In the meantime, in \LUATEX, we have better control over styles so the following
+%D macros are different from the \MKII\ ones.
\installcorenamespace{mathfractions}
\installcorenamespace{mathfractionstyle}
@@ -108,16 +92,22 @@
\setupmathfractions
[\c!mathstyle=,
+ \c!method=\v!vertical,
\c!mathnumeratorstyle=\mathfractionparameter\c!mathstyle,
\c!mathdenominatorstyle=\mathfractionparameter\c!mathstyle,
\c!alternative=\v!inner,
\c!margin=\zeropoint,
- \c!rulethickness=.25\exheight,
- \c!left=0x2E,
- \c!right=0x2E,
+ % \c!rulethickness=.1\exheight, % was .25 for above / atop
+ \c!rulethickness=\v!font,
+ \c!left="2E,
+ \c!right="2E,
+ \c!middle="2F,
\c!strut=\v!yes,
\c!topdistance=,
\c!bottomdistance=,
+ \c!source=\zerocount,
+ \c!hfactor=\plusthousand,
+ \c!vfactor=\plusthousand,
\c!rule=\v!auto]
\appendtoks
@@ -207,10 +197,14 @@
%D $\frac {2}{3} ^4$ % we wrap in \mathfrac so we can also use prescripts
%D \stoptyping
-\protected\def\math_frac#1%
- %{\begingroup
+\installlocalcurrenthandler\??mathfractions {mathfraction}
+
+\tolerant\protected\def\math_frac#1#*[#2]%%
{\mathfrac\bgroup
- \edef\currentmathfraction{#1}%
+ %
+ \setlocalmathfractioncurrent{#1}% \edef\currentmathfraction{#1}%
+ %
+ \ifparameter#2\or\setupcurrentmathfraction[#2]\fi
%
\edef\p_math_fraction_fences{\mathfractionparameter\c!fences}%
\ifempty\p_math_fraction_fences \else
@@ -224,8 +218,6 @@
\let\math_fraction_margin_kern\math_fraction_margin_kern_indeed
\fi
%
- \edef\p_math_fractions_color{\mathfractionparameter\c!color}%
- %
\edef\p_math_fractions_strut{\mathfractionparameter\c!strut}%
\ifcsname\??mathfractionstrut\p_math_fractions_strut\endcsname
\lastnamedcs
@@ -233,30 +225,15 @@
\math_frac_no_strut
\fi
%
- \ifempty\p_math_fractions_color
- \expandafter\math_frac_normal
- \else
- \expandafter\math_frac_colored
- \fi}
+ \expandnamespaceparameter\??mathfractionalternative\mathfractionparameter\c!alternative\v!inner}
\protected\def\math_frac_wrapup
{\ifempty\p_math_fraction_fences \else
\math_fenced_fenced_stop\p_math_fraction_fences
\fi
- % \endgroup}
\egroup}
-\protected\def\math_frac_colored#1#2%
- {\savecolor
- \colo_helpers_activate\p_math_fractions_color
- \math_frac_normal{\restorecolor#1}{\restorecolor#2}}
-
-\protected\def\math_frac_normal
- {\expandnamespaceparameter\??mathfractionalternative\mathfractionparameter\c!alternative\v!inner}
-
-% we use utfchar anyway so we can as well do all at the lua end
-
-\def\math_frac_no_delim{0x2E}
+\integerdef\math_frac_no_delim "2E % or just \zerocount
% Having a \withmarginornot{#1}{#2} makes not much sense nor do 4 tests or 4 redundant
% kerns (longer node lists plus possible interference). A split in normal and margin
@@ -268,33 +245,90 @@
% See \MKIV\ for the old (more messy) implementation where we have to fight the over
% related syntax (we now use a lmtx primitive).
-% {\ifcstok{#1}\emptytoks\else\tomathstyle#1\fi}%
-%
-% {\expandedmathstyleparameter\mathfractionparameter\c!mathstyle}%
-
% timestamp: 01/2022 : (re)watching eNerd⁴ - Time Capsule 2020 a.k.a. Farewell Party
% for Normalcy (UHD) with the soekris/neumanns combination
+\installcorenamespace{fractionmethods}
+
+\defcsname\??fractionmethods\v!vertical \v!no \v!none\endcsname{\Uatop}
+\defcsname\??fractionmethods\v!vertical \v!no \endcsname{\Uatopwithdelims
+ \Udelimiter\zerocount\fam\scratchcounterone
+ \Udelimiter\zerocount\fam\scratchcountertwo}
+\defcsname\??fractionmethods\v!vertical \v!yes \v!none\endcsname{\Uabove}
+\defcsname\??fractionmethods\v!vertical \v!yes \endcsname{\Uabovewithdelims
+ \Udelimiter\zerocount\fam\scratchcounterone
+ \Udelimiter\zerocount\fam\scratchcountertwo}
+\defcsname\??fractionmethods\v!vertical \v!hidden\v!none\endcsname{\Uabove
+ norule}
+\defcsname\??fractionmethods\v!vertical \v!hidden \endcsname{\Uabovewithdelims
+ \Udelimiter\zerocount\fam\scratchcounterone
+ \Udelimiter\zerocount\fam\scratchcountertwo
+ norule}
+\defcsname\??fractionmethods\v!vertical \v!auto \v!none\endcsname{\Uover}
+\defcsname\??fractionmethods\v!vertical \v!auto \endcsname{\Uoverwithdelims
+ \Udelimiter\zerocount\fam\scratchcounterone
+ \Udelimiter\zerocount\fam\scratchcountertwo}
+\defcsname\??fractionmethods\v!horizontal \v!none\endcsname{\Uskewed
+ \Udelimiter\zerocount\fam\scratchcounterthree
+ \s!hfactor \numexpr\mathfractionparameter\c!hfactor\relax}
+\defcsname\??fractionmethods\v!horizontal \endcsname{\Uskewedwithdelims
+ \Udelimiter\zerocount\fam\scratchcounterone
+ \Udelimiter\zerocount\fam\scratchcountertwo
+ \Udelimiter\zerocount\fam\scratchcounterthree
+ \s!hfactor \numexpr\mathfractionparameter\c!hfactor\relax}
+\defcsname\??fractionmethods\v!line \v!none\endcsname{\Uskewed
+ \Udelimiter\zerocount\fam\scratchcounterthree
+ \s!noaxis \space
+ \s!hfactor \numexpr\mathfractionparameter\c!hfactor\relax}
+\defcsname\??fractionmethods\v!line \endcsname{\Uskewedwithdelims
+ \Udelimiter\zerocount\fam\scratchcounterone
+ \Udelimiter\zerocount\fam\scratchcountertwo
+ \Udelimiter\zerocount\fam\scratchcounterthree
+ \s!noaxis \space
+ \s!hfactor \numexpr\mathfractionparameter\c!hfactor\relax}
+
\def\math_frac_command_u
- {\clf_umathfraction
- {\mathfractionparameter\c!rule}%
- \ifempty\p_math_fraction_fences
- \mathfractionparameter\c!left \space
- \mathfractionparameter\c!right\space
- \else
- \math_frac_no_delim\space
- \math_frac_no_delim\space
- \fi
- \dimexpr\mathfractionparameter\c!rulethickness\relax
- \relax}
+ {\edef\p_method {\mathfractionparameter\c!method}%
+ \edef\p_rule {\mathfractionparameter\c!rule}%
+ \edef\p_thickness{\mathfractionparameter\c!rulethickness}%
+ \scratchcounterone \mathfractionparameter\c!left \relax
+ \scratchcountertwo \mathfractionparameter\c!right \relax
+ \scratchcounterthree \mathfractionparameter\c!middle \relax
+ \csname
+ \??fractionmethods
+ \p_method
+ \ifx\p_method\v!horizontal
+ \orelse\ifx\p_method\v!line
+ \orelse\ifcsname\??fractionmethods\p_method\p_rule\endcsname
+ \p_rule
+ \else
+ \v!auto
+ \fi
+ \ifnum\scratchcounterone=\math_frac_no_delim
+ \ifnum\scratchcountertwo=\math_frac_no_delim
+ \v!none
+ \fi
+ \fi
+ \endcsname
+ \usedcolorparameterattributes{\mathfractionparameter\c!color}%
+ thickness \ifx\p_thickness\v!font
+ \zeropoint
+ \s!font \space
+ \else
+ \dimexpr\p_thickness\relax
+ \fi
+ \s!vfactor \numexpr\mathfractionparameter\c!vfactor\relax
+ \s!source \number\namedboxanchor{\mathfractionparameter\c!source}}
\protected\defcsname\??mathfractionalternative\v!inner\endcsname#1#2%
{\math_frac_command_u
- {\math_fraction_margin_kern
+ {\dousecolorparameter{\mathfractionparameter\c!topcolor}%
+ \math_fraction_margin_kern
\usemathstyleparameter\mathfractionparameter\c!mathnumeratorstyle
\m_fractions_strut_top#1%
\math_fraction_margin_kern}%
- {\math_fraction_margin_kern
+ {\dousecolorparameter{\mathfractionparameter\c!bottomcolor}%
+ \math_fraction_margin_kern
\usemathstyleparameter\mathfractionparameter\c!mathdenominatorstyle
\m_fractions_strut_bot#2%
\math_fraction_margin_kern}%
@@ -304,10 +338,12 @@
{\beginmathgroup
\usemathstyleparameter\mathfractionparameter\c!mathstyle
\math_frac_command_u
- {\math_fraction_margin_kern
+ {\dousecolorparameter{\mathfractionparameter\c!topcolor}%
+ \math_fraction_margin_kern
\m_fractions_strut_top#1%
\math_fraction_margin_kern}%
- {\math_fraction_margin_kern
+ {\dousecolorparameter{\mathfractionparameter\c!bottomcolor}%
+ \math_fraction_margin_kern
\m_fractions_strut_bot#2%
\math_fraction_margin_kern}%
\endmathgroup
@@ -317,11 +353,13 @@
{\beginmathgroup
\usemathstyleparameter\mathfractionparameter\c!mathstyle
\math_frac_command_u
- {\math_fraction_margin_kern
+ {\dousecolorparameter{\mathfractionparameter\c!topcolor}%
+ \math_fraction_margin_kern
\usemathstyleparameter\mathfractionparameter\c!mathnumeratorstyle
\m_fractions_strut_top#1%
\math_fraction_margin_kern}%
- {\math_fraction_margin_kern
+ {\dousecolorparameter{\mathfractionparameter\c!bottomcolor}%
+ \math_fraction_margin_kern
\usemathstyleparameter\mathfractionparameter\c!mathdenominatorstyle
\m_fractions_strut_bot#2%
\math_fraction_margin_kern}%
@@ -339,10 +377,8 @@
%D Spacing (sensitive for definition of \triggermathstyle:
-% \ifcase\contextlmtxmode
-
-\permanent\protected\def\nomathfractiongaps {\normalexpanded{\math_no_fraction_gaps \mathstyletrigger\mathstyle}} % maybe collect settings
-\permanent\protected\def\overlaymathfractiongaps{\normalexpanded{\math_overlay_fraction_gaps\mathstyletrigger\mathstyle}} % maybe collect settings
+\permanent\protected\def\nomathfractiongaps {\normalexpanded{\math_no_fraction_gaps \allmathstyles}}
+\permanent\protected\def\overlaymathfractiongaps{\normalexpanded{\math_overlay_fraction_gaps\allmathstyles}}
\protected\def\math_no_fraction_gaps#1%
{\Umathfractionnumup #1\zeropoint
@@ -351,25 +387,9 @@
\protected\def\math_overlay_fraction_gaps#1%
{\Umathfractionnumup #1\zeropoint
\Umathfractionnumvgap #1\zeropoint
- %Umathfractionrule #1\zeropoint
\Umathfractiondenomvgap#1\zeropoint
\Umathfractiondenomdown#1\zeropoint}
-% \else
-
-% \protected\def\math_no_fraction_gaps
-% {\Umathfractionnumup \mathstyle\zeropoint
-% \Umathfractiondenomdown\mathstyle\zeropoint}
-%
-% \protected\def\math_overlay_fraction_gaps
-% {\Umathfractionnumup \mathstyle\zeropoint
-% \Umathfractionnumvgap \mathstyle\zeropoint
-% %Umathfractionrule \mathstyle\zeropoint
-% \Umathfractiondenomvgap\mathstyle\zeropoint
-% \Umathfractiondenomdown\mathstyle\zeropoint}
-
-% \fi
-
\installcorenamespace{mathfractiondistance}
\letcsname\??mathfractiondistance\v!none \endcsname\nomathfractiongaps
@@ -379,6 +399,8 @@
\setupmathfractions
[\c!distance=\v!none]
+% we need to keep it local, so not everybodyfont
+
\appendtoks
\edef\p_distance{\rootmathfractionparameter\c!distance}%
\ifempty\p_distance\else
@@ -427,6 +449,17 @@
{\edef\p_threshold{\mathfractionparameter\c!displaythreshold}%
\Umathfractiondelsize\displaystyle \p_threshold\dimexpr\textface\relax}
+%D This is a variant
+
+\setupmathfractions
+ [%\c!inlinethreshold=.25, % no unit but fraction
+ %\c!displaythreshold=.25, % no unit but fraction
+ \c!threshold=.5\exheight] % wrong name, better is margin or offset or so
+
+\appendtoks
+ \Umathskeweddelimitertolerance\allmathstyles\mathfractionparameter\c!threshold
+\to \everymathematics % else original lost: \to \everybodyfont
+
%D \macros
%D {dfrac, tfrac, frac, dbinom, tbinom, binom}
%D
@@ -456,7 +489,7 @@
\definemathfraction[i:dfrac][\c!alternative=\v!inner,\c!mathstyle=\s!display]
\definemathfraction[d:frac] [\c!alternative=\v!inner,\c!mathstyle=\s!cramped]
-\definemathfraction[d:tfrac][\c!alternative=\v!both,\c!mathstyle={\s!cramped,\s!script}]
+\definemathfraction[d:tfrac][\c!alternative=\v!inner,\c!mathstyle={\s!cramped,\s!script}]
\definemathfraction[d:sfrac][\c!alternative=\v!both,\c!mathstyle={\s!cramped,\s!scriptscript}]
\definemathfraction[d:dfrac][\c!alternative=\v!both,\c!mathstyle=\s!display]
@@ -488,12 +521,6 @@
\permanent\protected\def\ctxfrac{\csname\inlineordisplaymath id:frac\endcsname}
\permanent\protected\def\amsfrac{\csname\inlineordisplaymath id:ams:frac\endcsname}
-% \appendtoks
-% \doifelse{\mathfractionparameter\c!option}{ams}%
-% {\let\frac\amsfrac}%
-% {\let\frac\ctxfrac}%
-% \to \everysetupmathfraction
-
\appendtoks
\doifelse{\mathematicsparameter\c!fractions}{ams}%
{\enforced\let\frac\amsfrac}%
@@ -508,22 +535,50 @@
% \protected\def\dbinom#1#2{{\displaystyle{{#1}\normalabovewithdelims()\zeropoint{#2}}}}
% \protected\def\tbinom#1#2{{\textstyle {{#1}\normalabovewithdelims()\zeropoint{#2}}}}
+% \definemathfraction
+% [binom]
+% [\c!alternative=\v!outer,
+% \c!rule=\v!no,
+% \c!left="28,
+% \c!right="29,
+% \c!mathstyle=\s!auto]
+%
+% \definemathfraction
+% [dbinom]
+% [binom]
+% [\c!mathstyle=\s!display]
+%
+% \definemathfraction
+% [tbinom]
+% [binom]
+% [\c!mathstyle=\s!text]
+
\definemathfraction
- [binom]
- [\c!alternative=\v!outer,
- \c!rule=\v!no,
- \c!left=0x28,
- \c!right=0x29,
- \c!mathstyle=\s!auto]
+ [d:binom]
+ [d:frac]
+ [\c!rule=\v!no,
+ % \c!mathstyle=\s!display,
+ \c!left="28,
+ \c!right="29]
+
+\definemathfraction
+ [i:binom]
+ [i:frac]
+ [\c!rule=\v!no,
+ %\c!mathstyle=\s!text,
+ \c!left="28,
+ \c!right="29]
+
+\permanent\protected\def\binom {\csname\inlineordisplaymath id:binom\endcsname}
\definemathfraction
[dbinom]
- [binom]
+ [d:binom]
[\c!mathstyle=\s!display]
\definemathfraction
[tbinom]
- [binom]
+ [i:binom]
[\c!mathstyle=\s!text]
%D \macros
@@ -570,8 +625,8 @@
%D \macros
%D {splitfrac, splitdfrac}
%D
-%D Occasionally one needs to typeset multi||line fractions.
-%D These commands use \tex{genfrac} to create such fractions.
+%D Occasionally one needs to typeset multi||line fractions. These commands use \type
+%D {\genfrac} to create such fractions.
%D
%D \startbuffer
%D \startformula
@@ -590,54 +645,59 @@
%D
%D \typebuffer \getbuffer
%D
-%D These macros are based on Michael J.~Downes posting on
-%D comp.text.tex on 2001/12/06 but adapted a bit.
+%D These macros are based on Michael J.~Downes posting on comp.text.tex on 2001/12/06
+%D but adapted a bit.
+%D
+%D Does anyone actually use this kinf of stuff?
\permanent\protected\def\splitfrac #1#2{{\textstyle {{\textstyle#1\quad\hfill}\normalabove\zeropoint{\textstyle\hfill\quad\mathstrut#2}}}}
\permanent\protected\def\splitdfrac#1#2{{\displaystyle{{ #1\quad\hfill}\normalabove\zeropoint{ \hfill\quad\mathstrut#2}}}}
-%D For testing:
+%D More fracking (for Alan):
-% \protected\def\ShowMathFractions#1#2%
-% {\mathematics{x+\tfrac{#1}{#2}+1+\frac{#1}{#2}+2+\sfrac{#1}{#2}+g}}
+% \appendtoks
+% \Umathskewedfractionhgap\allmathstyles\namedmathfractionparameter\s!vfrac\c!hfactor\fontemwidth \mathstylefont\textstyle
+% \Umathskewedfractionvgap\allmathstyles\namedmathfractionparameter\s!vfrac\c!vfactor\fontexheight\mathstylefont\textstyle
+% \to \everymathematics
-%D More fracking (for Alan):
+\definemathfraction
+ [\v!horizontal]
+ [\c!method=\v!horizontal]
-\protected\def\math_frac_colored_vulgar#1#2%
- {\savecolor
- \colo_helpers_activate\p_math_fractions_color
- {\restorecolor#1}\Uskewed/{\restorecolor#2}}
+\definemathfraction
+ [\s!vfrac]
+ [\v!horizontal]
+ [\c!hfactor=20,
+ \c!vfactor=10]
-\protected\def\math_frac_normal_vulgar#1#2%
- {{#1}\Uskewed/{#2}}
+%D For Mikael Sundqvist who found out that most inline fractions look real bad:
-\permanent\protected\def\vfrac#1#2%
- {\bgroup
- \edef\p_math_fractions_color{\namedmathfractionparameter\s!vfrac\c!color}%
- \ifempty\p_math_fractions_color
- \expandafter\math_frac_normal_vulgar
- \else
- \expandafter\math_frac_colored_vulgar
- \fi
- {#1}%
- {#2}%
- \egroup}
+\pushoverloadmode
-\appendtoks
- \edef\p_hfactor{\namedmathfractionparameter\s!vfrac\c!hfactor}%
- \edef\p_vfactor{\namedmathfractionparameter\s!vfrac\c!vfactor}%
- \Umathskewedfractionhgap\textstyle \p_hfactor\fontemwidth \mathstylefont\textstyle
- \Umathskewedfractionhgap\scriptstyle \p_hfactor\fontemwidth \mathstylefont\scriptstyle
- \Umathskewedfractionhgap\scriptscriptstyle\p_hfactor\fontemwidth \mathstylefont\scriptscriptstyle
- \Umathskewedfractionvgap\textstyle \p_vfactor\fontexheight\mathstylefont\textstyle
- \Umathskewedfractionvgap\scriptstyle \p_vfactor\fontexheight\mathstylefont\scriptstyle
- \Umathskewedfractionvgap\scriptscriptstyle\p_vfactor\fontexheight\mathstylefont\scriptscriptstyle
-\to \everysetupmathfraction
+%ifdefined\d \let\text_d\d \else \let\text_d\firstofoneargument \fi
+\ifdefined\f \let\text_f\f \else \let\text_f\firstofoneargument \fi
-\setupmathfraction
- [\s!vfrac]
- [\c!hfactor=.2,
- \c!vfactor=.1]
+\definemathfraction
+ [f]
+ [\c!strut=\v!math]
+
+% \definemathfraction
+% [d]
+% [\c!method=\v!line,
+% \c!strut=\v!math]
+
+\aliased\let\math_f\f
+%aliased\let\math_d\d
+
+\permanent\protected\def\d{\mathortext\math_d\text_d}
+%permanent\protected\def\f{\mathortext\math_f\text_f}
+
+% \setupmathfraction
+% [%strut=math,
+% \c!hfactor=100,
+% \c!vfactor=100]
+
+\popoverloadmode
\protect \endinput
@@ -716,7 +776,7 @@
% \hss$\textstyle/$\hss
% \egroup
% \lower
-% \Umathskewedfractionvgap\textstyle
+% \Umathskewedfractionvgapskewedfractionvgap\textstyle
% \hbox\bgroup
% $\hskip\dimexpr\Umathskewedfractionhgap\textstyle/2\relax\scriptstyle#2$%
% \egroup
diff --git a/tex/context/base/mkxl/math-ini.lmt b/tex/context/base/mkxl/math-ini.lmt
index 4ac76fa62..f41170a97 100644
--- a/tex/context/base/mkxl/math-ini.lmt
+++ b/tex/context/base/mkxl/math-ini.lmt
@@ -31,6 +31,8 @@ local ctx_doifelsesomething = commands.doifelsesomething
local trace_defining = false trackers.register("math.defining", function(v) trace_defining = v end)
+trace_defining = true
+
local report_math = logs.reporter("mathematics","initializing")
mathematics = mathematics or { }
@@ -47,86 +49,159 @@ local texsetattribute = tex.setattribute
local setmathcode = tex.setmathcode
local setdelcode = tex.setdelcode
-local families = allocate {
- mr = 0,
- mb = 1,
-}
+-- These are different from mkiv with luatex.
---- to be checked .. a few defaults in char-def that should be alpha
-
-local classes = allocate {
- ord = 0, -- mathordcomm mathord
- op = 1, -- mathopcomm mathop
- bin = 2, -- mathbincomm mathbin
- rel = 3, -- mathrelcomm mathrel
- open = 4, -- mathopencomm mathopen
- middle = 4,
- close = 5, -- mathclosecomm mathclose
- punct = 6, -- mathpunctcomm mathpunct
- alpha = 7, -- mathalphacomm firstofoneargument
- accent = 8, -- class 0
- radical = 9,
- xaccent = 10, -- class 3
- topaccent = 11, -- class 0
- botaccent = 12, -- class 0
- under = 13,
- over = 14,
- delimiter = 15,
- inner = 0, -- mathinnercomm mathinner
- nothing = 0, -- mathnothingcomm firstofoneargument
- choice = 0, -- mathchoicecomm @@mathchoicecomm
- box = 0, -- mathboxcomm @@mathboxcomm
- limop = 1, -- mathlimopcomm @@mathlimopcomm
- nolop = 1, -- mathnolopcomm @@mathnolopcomm
- --
- ordinary = 0, -- ord
- alphabetic = 7, -- alpha
- unknown = 0, -- nothing
- default = 0, -- nothing
- punctuation = 6, -- punct
- normal = 0, -- nothing
- opening = 4, -- open
- closing = 5, -- close
- binary = 2, -- bin
- relation = 3, -- rel
- fence = 0, -- unknown
- diacritic = 8, -- accent
- large = 1, -- op
- variable = 7, -- alphabetic
- number = 7, -- alphabetic
- root = 16, -- a private one
+local classes = allocate { }
+local classnames = allocate { }
+local maxengineclass = 63
+local lastengineclass = 0
+local lastprivateclass = maxengineclass
+
+for k, v in next, nodes.noadcodes do
+ if type(k) == "string"then
+ classes[k] = v
+ local n = classnames[v]
+ if not n or #k < #n then
+ classnames[v] = k
+ end
+ elseif k > lastengineclass then
+ lastengineclass = k
+ end
+end
+
+local ordinary_class = classes.ordinary
+local operator_class = classes.operator
+local binary_class = classes.binary
+local relation_class = classes.relation
+local open_class = classes.open
+local close_class = classes.close
+local punctuation_class = classes.punctuation
+local middle_class = classes.middle
+local accent_class = classes.accent
+local radical_class = classes.radical
+local fraction_class = classes.fraction
+local under_class = classes.under
+local over_class = classes.over
+local fenced_class = classes.fenced
+local ghost_class = classes.ghost
+
+classes.ord = ordinary_class
+classes.op = operator_class
+classes.bin = binary_class
+classes.rel = relation_class
+classes.opening = open_class -- will go
+classes.closing = close_class -- will go
+classes.punct = punctuation_class
+classes.frac = fraction_class
+classes.rad = radical_class
+classes.fen = fenced_class
+classes.gst = ghost_class
+
+classes.limop = operator_class
+classes.limoperator = operator_class
+classes.nolop = operator_class
+classes.nolimoperator = operator_class
+classes.large = operator_class
+classes.largeoperator = operator_class
+
+-- special in the engine : variable active inner vcenter
+
+local function registerengineclass(name,short)
+ local class = classes[name]
+ if not class then
+ if lastengineclass < maxengineclass then
+ lastengineclass = lastengineclass + 1
+ class = lastengineclass
+ classnames[class] = short or name
+ else
+ class = ordinary_class
+ end
+ classes[name] = class
+ end
+ return class
+end
+
+local explicit_class = registerengineclass("explicit","expl")
+local imaginary_class = registerengineclass("imaginary","im")
+local diferential_class = registerengineclass("differential","dif")
+local exponential_class = registerengineclass("exponential","exp")
+local function_class = registerengineclass("function","fnc")
+local digit_class = registerengineclass("digit","dig")
+local division_class = registerengineclass("division","div")
+local factorial_class = registerengineclass("factorial","fac")
+
+classes["begin"] = 62 classnames[62] = "begin"
+classes["end"] = 63 classnames[63] = "end"
+
+local function registerprivateclass(name)
+ local class = classes[name]
+ if not class then
+ lastprivateclass = lastprivateclass + 1
+ class = lastprivateclass
+ classes[name] = class
+ -- also setup
+ end
+ return class
+end
+
+local function toengineclass(class)
+ if type(class) == "string" then
+ return classes[class] or ordinary_class
+ elseif class > lastengineclass then
+ return ordinary_class
+ else
+ return class
+ end
+end
+
+implement {
+ name = "registerengineclass",
+ public = true,
+ protected = true,
+ arguments = { "optional", "optional" },
+ actions = registerengineclass,
}
-local open_class = 4
-local middle_class = 4
-local close_class = 5
-local accent_class = 8
-local radical_class = 9
-local topaccent_class = 11
-local botaccent_class = 12
-local under_class = 13
-local over_class = 14
-local delimiter_class = 15
-local root_class = 16
+local topaccent_class = registerprivateclass("topaccent")
+local botaccent_class = registerprivateclass("botaccent")
+local delimiter_class = registerprivateclass("delimiter")
+local root_class = registerprivateclass("root")
+local prime_class = registerprivateclass("prime")
local accents = allocate {
accent = true, -- some can be both
- topaccent = true, [11] = true,
- botaccent = true, [12] = true,
- under = true, [13] = true,
- over = true, [14] = true,
+ topaccent = true, [topaccent_class] = true,
+ botaccent = true, [botaccent_class] = true,
+ under = true, [under_class] = true,
+ over = true, [over_class] = true,
unknown = false,
}
+local integer_value = tokens.values.integer
+
+implement {
+ name = "mathclassvalue",
+ -- usage = "value",
+ public = true,
+ arguments = "string",
+ actions = function(name)
+ -- return integer_value, classes[name] or ordinary_class
+ context(tostring(classes[name] or ordinary_class))
+ end
+}
+
+-- used in math-tag: so there we need to make things ord etc to fit within
+-- mathml
+
local codes = allocate {
- ordinary = 0, [0] = "ordinary",
- largeoperator = 1, "largeoperator",
- binaryoperator = 2, "binaryoperator",
- relation = 3, "relation",
- openingsymbol = 4, "openingsymbol",
- closingsymbol = 5, "closingsymbol",
- punctuation = 6, "punctuation",
- variable = 7, "variable",
+ ordinary = ordinary_class, [ordinary_class] = "ordinary",
+ largeoperator = operator_class, [operator_class] = "largeoperator",
+ binaryoperator = binary_class, [binary_class] = "binaryoperator",
+ relation = relation_class, [relation_class] = "relation",
+ openingsymbol = open_class, [open_class] = "openingsymbol",
+ closingsymbol = close_class, [close_class] = "closingsymbol",
+ punctuation = punctuation_class, [punctuation_class] = "punctuation",
+ middlesymbol = middle_class, [middle_class] = "middlesymbol",
}
local extensibles = allocate {
@@ -169,61 +244,69 @@ function mathematics.virtualize(unicode,virtual)
end
end
-mathematics.extensibles = extensibles
-mathematics.classes = classes
-mathematics.codes = codes
------------.accents = codes
-mathematics.families = families
-mathematics.virtualized = virtualized
+mathematics.extensibles = extensibles
+mathematics.classes = classes
+mathematics.toengineclass = toengineclass
+mathematics.classnames = classnames
+mathematics.codes = codes
+-----------.accents = codes
+mathematics.virtualized = virtualized
do
- -- not that many so no need to reuse tables
-
local setmathcharacter = function(class,family,slot,unicode,mset,dset)
- if mset and codes[class] then -- regular codes < 7
+ if mset and class ~= ordinary_class then
setmathcode("global",slot,class,family,unicode)
mset = false
end
- if dset and class == open_class or class == close_class or class == middle_class then
+ if dset and (class == open_class or class == close_class or class == middle_class or class == division_class) then
setdelcode("global",slot,family,unicode,0,0)
dset = false
end
return mset, dset
end
- -- todo: make nice setters for this in lua
+ local function report(class,engine,family,unicode,name)
+ local nametype = type(name)
+ if nametype == "string" then
+ report_math("class %a, engine %a, family %a, char %C, name %a",class,engine,family,unicode,name)
+ elseif nametype == "number" then
+ report_math("class %a, engine %a, family %a, char %C, number %U",class,engine,family,unicode,name)
+ else
+ report_math("class %a, engine %a, family %a, char %C",class,engine,family,unicode)
+ end
+ end
- local f_accent = formatters[ [[\defUmathtopaccent \%s{%X}{%X}{%X}]] ]
- local f_topaccent = formatters[ [[\defUmathtopaccent \%s{%X}{%X}{%X}]] ]
- local f_botaccent = formatters[ [[\defUmathbotaccent \%s{%X}{%X}{%X}]] ]
- local f_over = formatters[ [[\defUdelimiterover \%s{%X}{%X}{%X}]] ]
- local f_under = formatters[ [[\defUdelimiterunder\%s{%X}{%X}{%X}]] ]
- local f_fence = formatters[ [[\defUdelimiter \%s{%X}{%X}{%X}]] ]
- local f_delimiter = formatters[ [[\defUdelimiter \%s{%X}{%X}{%X}]] ]
- local f_radical = formatters[ [[\defUradical \%s{%X}{%X}]] ]
- local f_root = formatters[ [[\defUroot \%s{%X}{%X}]] ]
- local f_char = formatters[ [[\defUmathchar \%s{%X}{%X}{%X}]] ]
+ local f_accent = formatters[ [[\defUmathtopaccent \%s{%X}{%X}{%X}]] ]
+ local f_fixedtopaccent = formatters[ [[\defUmathfixedtopaccent \%s{%X}{%X}{%X}]] ]
+ local f_fixedbotaccent = formatters[ [[\defUmathfixedbotaccent \%s{%X}{%X}{%X}]] ]
+ local f_topaccent = formatters[ [[\defUmathtopaccent \%s{%X}{%X}{%X}]] ]
+ local f_botaccent = formatters[ [[\defUmathbotaccent \%s{%X}{%X}{%X}]] ]
+ local f_over = formatters[ [[\defUdelimiterover \%s{%X}{%X}{%X}]] ]
+ local f_under = formatters[ [[\defUdelimiterunder\%s{%X}{%X}{%X}]] ]
+ local f_fence = formatters[ [[\defUdelimiter \%s{%X}{%X}{%X}]] ]
+ local f_delimiter = formatters[ [[\defUdelimiter \%s{%X}{%X}{%X}]] ]
+ local f_radical = formatters[ [[\defUradical \%s{%X}{%X}]] ]
+ local f_root = formatters[ [[\defUroot \%s{%X}{%X}]] ]
+ local f_char = formatters[ [[\defUmathchar \%s{%X}{%X}{%X}]] ]
local texmathchardef = tex.mathchardef
- local setmathsymbol = function(name,class,family,slot) -- hex is nicer for tracing
+ local setmathsymbol = function(name,class,engine,family,slot,stretch) -- hex is nicer for tracing
if class == accent_class then
ctx_sprint(f_topaccent(name,0,family,slot))
elseif class == topaccent_class then
- ctx_sprint(f_topaccent(name,0,family,slot))
+ ctx_sprint((stretch and f_topaccent or f_fixedtopaccent)(name,0,family,slot))
elseif class == botaccent_class then
- ctx_sprint(f_botaccent(name,0,family,slot))
+ ctx_sprint((stretch and f_botaccent or f_fixedbotaccent)(name,0,family,slot))
elseif class == over_class then
ctx_sprint(f_over(name,0,family,slot))
elseif class == under_class then
ctx_sprint(f_under(name,0,family,slot))
elseif class == open_class or class == close_class or class == middle_class then
--- setdelcode("global",slot,{family,slot,0,0})
setdelcode("global",slot,family,slot,0,0)
- ctx_sprint(f_fence(name,class,family,slot))
+ ctx_sprint(f_fence(name,engine,family,slot))
elseif class == delimiter_class then
--- setdelcode("global",slot,{family,slot,0,0})
setdelcode("global",slot,family,slot,0,0)
ctx_sprint(f_delimiter(name,0,family,slot))
elseif class == radical_class then
@@ -231,29 +314,31 @@ do
elseif class == root_class then
ctx_sprint(f_root(name,family,slot))
elseif texmathchardef then
- texmathchardef(name,class,family,slot,"permanent")
+ texmathchardef(name,engine,family,slot,"permanent")
else
-- beware, open/close and other specials should not end up here
- ctx_sprint(f_char(name,class,family,slot))
+ ctx_sprint(f_char(name,engine,family,slot))
end
end
- local function report(class,family,unicode,name)
- local nametype = type(name)
- if nametype == "string" then
- report_math("class name %a, class %a, family %a, char %C, name %a",classname,class,family,unicode,name)
- elseif nametype == "number" then
- report_math("class name %a, class %a, family %a, char %C, number %U",classname,class,family,unicode,name)
- else
- report_math("class name %a, class %a, family %a, char %C", classname,class,family,unicode)
+ function mathematics.define()
+ if trace_defining then
+ logs.startfilelogging(report_math,"math defined from character definitions")
end
- end
-
- -- there will be a combined \(math)chardef (tracker)
-
- function mathematics.define() -- we now always use family zero
local family = 0
local data = characters.data
+ --
+ local function remap(first,last)
+ for unicode=utfbyte(first),utfbyte(last) do
+ setmathcode("global",unicode,ordinary_class,family,unicode)
+ end
+ end
+ remap("0","9")
+ remap("A","Z")
+ remap("a","z")
+ --
+ setdelcode("global",0x2E,0,0,0,0) -- period is special
+ --
for unicode, character in sortedhash(data) do
local symbol = character.mathsymbol
local mset = true
@@ -262,11 +347,11 @@ do
local other = data[symbol]
local class = other.mathclass
if class then
- class = classes[class] or class -- no real checks needed
+ local engine = toengineclass(class)
if trace_defining then
- report(class,family,unicode,symbol)
+ report(class,engine,family,unicode,symbol)
end
- mset, dset = setmathcharacter(class,family,unicode,symbol,mset,dset)
+ mset, dset = setmathcharacter(engine,family,unicode,symbol,mset,dset)
end
local spec = other.mathspec
if spec then
@@ -274,84 +359,103 @@ do
local m = spec[i]
local class = m.class
if class then
- class = classes[class] or class -- no real checks needed
- mset, dset = setmathcharacter(class,family,unicode,symbol,mset,dset)
+ local engine = toengineclass(class)
+ -- todo: trace
+ mset, dset = setmathcharacter(engine,family,unicode,symbol,mset,dset)
end
end
end
end
- local mathclass = character.mathclass
- local mathspec = character.mathspec
- if mathspec then
- if mathclass then
- local name = character.mathname
+ local class = character.mathclass
+ local spec = character.mathspec
+ local name = character.mathname
+ local stretch = character.mathstretch
+ if spec then
+ local done = false
+ if class then
if name then
report_math("fatal error, conflicting mathclass and mathspec for %C",unicode)
os.exit()
else
- local class = classes[mathclass] or mathclass -- no real checks needed
- if not class then
- if trace_defining then
- report("unknown",family,unicode)
- end
- else
- if trace_defining then
- report(class,family,unicode)
- end
- mset, dset = setmathcharacter(class,family,unicode,unicode,mset,dset)
+ class = classes[class] or ordinary_class
+ local engine = toengineclass(class)
+ if trace_defining then
+ report(class,engine,family,unicode)
end
+ mset, dset = setmathcharacter(engine,family,unicode,unicode,mset,dset)
+ done = true
end
end
- for i=1,#mathspec do
- local m = mathspec[i]
- local name = m.name
- local class = m.class
+ for i=1,#spec do
+ local m = spec[i]
+ local name = m.name
+ local class = m.class or class
if class then
- class = classes[class] or class -- no real checks needed
+ class = classes[class] or ordinary_class
+ else
+ class = ordinary_class
+ end
+ if class then
+ local engine = toengineclass(class)
if name then
if trace_defining then
- report(class,family,unicode,name)
+ report(class,engine,family,unicode,name)
end
- setmathsymbol(name,class,family,unicode)
+ setmathsymbol(name,class,engine,family,unicode,stretch)
else
- name = (class == classes.variable or class == classes.number) and character.adobename -- bad
+ name = (class == classes.ordinary or class == classes.digit) and character.adobename -- bad
if name and trace_defining then
- report(class,family,unicode,name)
+ report(class,engine,family,unicode,name)
end
end
- mset, dset = setmathcharacter(class,family,unicode,m.unicode or unicode,mset,dset) -- see solidus
+ if not done then
+ mset, dset = setmathcharacter(engine,family,unicode,m.unicode or unicode,mset,dset) -- see solidus
+ done = true
+ end
end
end
- elseif mathclass then
- local name = character.mathname
- local class = classes[mathclass] or mathclass -- no real checks needed
- if not class then
- if trace_defining then
- report("unknown",family,unicode,name)
- end
- elseif name == false then
- if trace_defining then
- report(class,family,unicode,name)
- end
- mset, dset = setmathcharacter(class,family,unicode,unicode,mset,dset)
+ else
+ if class then
+ class = classes[class] or ordinary_class
else
- -- if not name then
- -- name = character.contextname -- too dangerous, we loose textslash and a few more
- -- end
- if name then
+ class = ordinary_class
+ end
+ if name ~= nil then
+ local engine = toengineclass(class)
+ if name == false then
if trace_defining then
- report(class,family,unicode,name)
+ report(class,engine,family,unicode,name)
end
- setmathsymbol(name,class,family,unicode)
+ mset, dset = setmathcharacter(engine,family,unicode,unicode,mset,dset)
else
- if trace_defining then
- report(class,family,unicode,character.adobename)
+ -- if not name then
+ -- name = character.contextname -- too dangerous, we loose textslash and a few more
+ -- end
+ if name then
+ if trace_defining then
+ report(class,engine,family,unicode,name)
+ end
+ setmathsymbol(name,class,engine,family,unicode,stretch)
+ else
+ if trace_defining then
+ report(class,engine,family,unicode,character.adobename)
+ end
end
+ mset, dset = setmathcharacter(engine,family,unicode,unicode,mset,dset)
end
- mset, dset = setmathcharacter(class,family,unicode,unicode,mset,dset)
+ elseif class ~= ordinary_class then
+ local engine = toengineclass(class)
+ if trace_defining then
+ report(class,engine,family,unicode,character.adobename)
+ end
+ mset, dset = setmathcharacter(engine,family,unicode,unicode,mset,dset)
end
end
end
+ --
+ if trace_defining then
+ logs.stopfilelogging()
+ end
end
end
@@ -596,17 +700,19 @@ end
-- 2: step 2
-- 3: htdp * 1.33^n
-- 4: size * 1.33^n
+-- 5: use lfg
function mathematics.big(tfmdata,unicode,n,method)
local t = tfmdata.characters
local c = t[unicode]
if c and n > 0 then
- local vv = c.vvariants or c.next and t[c.next].vvariants
- if vv then
- local vvn = vv[n]
- return vvn and vvn.glyph or vv[#vv].glyph or unicode
- elseif method == 1 or method == 2 then
- if method == 2 then -- large steps
+ if method == 1 or method == 2 or method == 5 then
+ if method == 5 then
+ local b = tfmdata.bigslots
+ if b then
+ n = (n > #b and b[#b]) or b[n] or n
+ end
+ elseif method == 2 then -- large steps
n = n * 2
end
local next = c.next
@@ -754,7 +860,7 @@ implement {
-- weird to do this here but it's a side affect of math anyway
-interfaces.implement {
+implement {
name = "enableasciimode",
onlyonce = true,
actions = resolvers.macros.enablecomment,
diff --git a/tex/context/base/mkxl/math-ini.mkxl b/tex/context/base/mkxl/math-ini.mkxl
index 990341c99..fbfc7a972 100644
--- a/tex/context/base/mkxl/math-ini.mkxl
+++ b/tex/context/base/mkxl/math-ini.mkxl
@@ -76,10 +76,343 @@
\registerctxluafile{math-tag}{autosuffix}
\registerctxluafile{math-fbk}{autosuffix}
\registerctxluafile{math-dir}{}
-\registerctxluafile{math-spa}{}
+\registerctxluafile{math-spa}{autosuffix}
\registerctxluafile{math-fnt}{autosuffix}
\registerctxluafile{math-pre}{autosuffix}
+%D Basic spacing:
+
+\mathfencesmode \plusone % unpack
+
+% These need to be set because otherwise the engine will not honor some font
+% properties. It also permits tracing. These might become engine defaults. As a
+% consequence we no longer check for traditional fonts but one can use font control
+% options.
+
+% \mathcontrolmode\plusone
+
+\mathfontcontrol\numexpr
+ \zerocount
+ +\overrulemathcontrolcode % let the node family/font win over current family/font
+ +\underrulemathcontrolcode % idem
+ +\radicalrulemathcontrolcode % idem
+ +\fractionrulemathcontrolcode % idem
+ +\accentskewhalfmathcontrolcode % fall back to half width skewing when no topaccent is given
+ +\accentskewapplymathcontrolcode % use topaccent, otherwise use skew char
+ % + checkligatureandkernmathcontrolcode % old fonts
+ +\applyverticalitalickernmathcontrolcode % best do this indeed
+ +\applyordinaryitalickernmathcontrolcode % best do this indeed
+ % +\applycharitalickernmathcontrolcode % not done
+ % +\reboxcharitalickernmathcontrolcode % old code path
+ +\applyboxeditalickernmathcontrolcode % best do this indeed
+ +\staircasekernmathcontrolcode % use these when set
+ +\applytextitalickernmathcontrolcode
+ +\checktextitalickernmathcontrolcode
+ % +\checkspaceitalickernmathcontrolcode % old code path
+ +\applyscriptitalickernmathcontrolcode
+ +\italicshapekernmathcontrolcode % instead of adding pre italic to the shift, inject a kern
+\relax
+
+% \mathpenaltiesmode\plusone
+
+% These are frozen values because otherwise we need to sunc them when the predefined
+% muskip (internal) registers are changed.
+
+\immutable\mugluespecdef\defaultthickermuskip 7mu plus 5.0mu
+\immutable\mugluespecdef\defaultthickmuskip 5mu plus 5mu
+\immutable\mugluespecdef\defaultmedmuskip 4mu plus 2mu minus 4mu
+\immutable\mugluespecdef\defaultthinmuskip 3mu
+\immutable\mugluespecdef\defaulttinymuskip 1mu
+
+\immutable\mugluespecdef\halfthickmuskip 2.5mu plus 2.5mu
+\immutable\mugluespecdef\halfmedmuskip 2.0mu plus 1.0mu minus 2.0mu
+\immutable\mugluespecdef\halfthinmuskip 1.5mu
+\immutable\mugluespecdef\halftinymuskip 0.5mu
+
+\immutable\mugluespecdef\hairmuskip .15mu
+
+\immutable\integerdef \defaultrelpenalty 500
+\immutable\integerdef \defaultbinoppenalty 700
+\immutable\integerdef \defaultprerelpenalty -100
+\immutable\integerdef \defaultprebinoppenalty -100
+
+\newmuskip\thickermuskip \thickermuskip \defaultthickermuskip
+
+% more friendly in setups:
+
+\setnewconstant\mathordinarycode \mathclassvalue ordinary \aliased\let\mathordcode \mathordinarycode
+\setnewconstant\mathoperatorcode \mathclassvalue operator \aliased\let\mathopcode \mathoperatorcode
+\setnewconstant\mathbinarycode \mathclassvalue binary \aliased\let\mathbincode \mathbinarycode
+\setnewconstant\mathrelationcode \mathclassvalue relation \aliased\let\mathrelcode \mathrelationcode
+\setnewconstant\mathopencode \mathclassvalue open
+\setnewconstant\mathclosecode \mathclassvalue close
+\setnewconstant\mathpunctuationcode \mathclassvalue punctuation \aliased\let\mathpunctcode\mathpunctuationcode
+\setnewconstant\mathinnercode \mathclassvalue inner
+\setnewconstant\mathovercode \mathclassvalue over
+\setnewconstant\mathundercode \mathclassvalue under
+\setnewconstant\mathfractioncode \mathclassvalue fraction
+\setnewconstant\mathradicalcode \mathclassvalue radical
+\setnewconstant\mathmiddlecode \mathclassvalue middle
+\setnewconstant\mathaccentcode \mathclassvalue accent
+\setnewconstant\mathfencedcode \mathclassvalue fenced
+\setnewconstant\mathghostcode \mathclassvalue ghost
+\setnewconstant\mathvariablecode \mathclassvalue variable
+\setnewconstant\mathactivecode \mathclassvalue active
+\setnewconstant\mathvcentercode \mathclassvalue vcenter
+\setnewconstant\mathimaginarycode \mathclassvalue imaginary
+\setnewconstant\mathdifferentialcode \mathclassvalue differential
+\setnewconstant\mathexponentialcode \mathclassvalue exponential
+\setnewconstant\mathfunctioncode \mathclassvalue function
+\setnewconstant\mathdigitcode \mathclassvalue digit
+\setnewconstant\mathexplicitcode \mathclassvalue explicit
+\setnewconstant\mathdivisioncode \mathclassvalue division
+\setnewconstant\mathfactorialcode \mathclassvalue factorial
+
+\setnewconstant\mathbegincode \mathclassvalue begin
+\setnewconstant\mathendcode \mathclassvalue end
+
+%setnewconstant\mathtopaccentcode \mathclassvalue topaccent % these are private and above 31
+%setnewconstant\mathbotaccentcode \mathclassvalue botaccent % these are private and above 31
+%setnewconstant\mathdelimitercode \mathclassvalue delimiter % these are private and above 31
+%setnewconstant\mathrootcode \mathclassvalue root % these are private and above 31
+%setnewconstant\mathprimecode \mathclassvalue prime % these are private and above 31
+
+%letmathspacing \mathimaginarycode \mathordinarycode \mathordinarycode \mathordinarycode \mathordinarycode
+%letmathspacing \mathdifferentialcode \mathordinarycode \mathordinarycode \mathordinarycode \mathordinarycode
+%letmathspacing \mathexponentialcode \mathordinarycode \mathordinarycode \mathordinarycode \mathordinarycode
+%letmathspacing \mathfunctioncode \mathordinarycode \mathordinarycode \mathordinarycode \mathordinarycode
+%letmathspacing \mathdigitcode \mathordinarycode \mathordinarycode \mathordinarycode \mathordinarycode
+
+\copymathspacing \mathimaginarycode \mathordinarycode
+\copymathspacing \mathdifferentialcode \mathordinarycode
+\copymathspacing \mathfactorialcode \mathordinarycode
+\copymathspacing \mathexponentialcode \mathordinarycode
+\copymathspacing \mathfunctioncode \mathordinarycode
+\copymathspacing \mathdigitcode \mathordinarycode
+
+\setnewconstant\mathlimopcode \plusone
+\setnewconstant\mathnolopcode \plusone
+
+% obsolete
+
+\setnewconstant\mathboxcode \zerocount
+\setnewconstant\mathchoicecode \zerocount
+\setnewconstant\mathalphacode \zerocount
+\setnewconstant\mathnothingcode \zerocount
+
+\pushoverloadmode
+ \untraced\permanent\protected\def\binoppenalty {\setmathpostpenalty\mathbinarycode}
+ \untraced\permanent\protected\def\prebinoppenalty{\setmathprepenalty \mathbinarycode}
+ \untraced\permanent\protected\def\relpenalty {\setmathpostpenalty\mathrelationcode}
+ \untraced\permanent\protected\def\prerelpenalty {\setmathprepenalty \mathrelationcode}
+\popoverloadmode
+
+% \newcount\binoppenalty
+% \newcount\prebinoppenalty
+% \newcount\relpenalty
+% \newcount\prerelpenalty
+
+% topaccent botaccent .. but do we ever need these
+
+\permanent\protected\def\ordordspacing {\setmathspacing \mathordinarycode \mathordinarycode }
+\permanent\protected\def\ordopspacing {\setmathspacing \mathordinarycode \mathoperatorcode }
+\permanent\protected\def\ordbinspacing {\setmathspacing \mathordinarycode \mathbinarycode }
+\permanent\protected\def\ordrelspacing {\setmathspacing \mathordinarycode \mathrelationcode }
+\permanent\protected\def\ordopenspacing {\setmathspacing \mathordinarycode \mathopencode }
+\permanent\protected\def\ordclosespacing {\setmathspacing \mathordinarycode \mathclosecode }
+\permanent\protected\def\ordpunctspacing {\setmathspacing \mathordinarycode \mathpunctuationcode}
+\permanent\protected\def\ordinnerspacing {\setmathspacing \mathordinarycode \mathinnercode }
+\permanent\protected\def\ordfracspacing {\setmathspacing \mathordinarycode \mathfractioncode }
+\permanent\protected\def\ordradspacing {\setmathspacing \mathordinarycode \mathradicalcode }
+\permanent\protected\def\ordmiddlespacing {\setmathspacing \mathordinarycode \mathmiddlecode }
+\permanent\protected\def\ordaccentspacing {\setmathspacing \mathordinarycode \mathaccentcode }
+
+\permanent\protected\def\opordspacing {\setmathspacing \mathoperatorcode \mathordinarycode }
+\permanent\protected\def\opopspacing {\setmathspacing \mathoperatorcode \mathoperatorcode }
+\permanent\protected\def\opbinspacing {\setmathspacing \mathoperatorcode \mathbinarycode }
+\permanent\protected\def\oprelspacing {\setmathspacing \mathoperatorcode \mathrelationcode }
+\permanent\protected\def\opopenspacing {\setmathspacing \mathoperatorcode \mathopencode }
+\permanent\protected\def\opclosespacing {\setmathspacing \mathoperatorcode \mathclosecode }
+\permanent\protected\def\oppunctspacing {\setmathspacing \mathoperatorcode \mathpunctuationcode}
+\permanent\protected\def\opinnerspacing {\setmathspacing \mathoperatorcode \mathinnercode }
+\permanent\protected\def\opfracspacing {\setmathspacing \mathoperatorcode \mathfractioncode }
+\permanent\protected\def\opradspacing {\setmathspacing \mathoperatorcode \mathradicalcode }
+\permanent\protected\def\opmiddlespacing {\setmathspacing \mathoperatorcode \mathmiddlecode }
+\permanent\protected\def\opaccentspacing {\setmathspacing \mathoperatorcode \mathaccentcode }
+
+\permanent\protected\def\binordspacing {\setmathspacing \mathbinarycode \mathordinarycode }
+\permanent\protected\def\binopspacing {\setmathspacing \mathbinarycode \mathoperatorcode }
+\permanent\protected\def\binbinspacing {\setmathspacing \mathbinarycode \mathbinarycode }
+\permanent\protected\def\binrelspacing {\setmathspacing \mathbinarycode \mathrelationcode }
+\permanent\protected\def\binopenspacing {\setmathspacing \mathbinarycode \mathopencode }
+\permanent\protected\def\binclosespacing {\setmathspacing \mathbinarycode \mathclosecode }
+\permanent\protected\def\binpunctspacing {\setmathspacing \mathbinarycode \mathpunctuationcode}
+\permanent\protected\def\bininnerspacing {\setmathspacing \mathbinarycode \mathinnercode }
+\permanent\protected\def\binfracspacing {\setmathspacing \mathbinarycode \mathfractioncode }
+\permanent\protected\def\binradspacing {\setmathspacing \mathbinarycode \mathradicalcode }
+\permanent\protected\def\binmiddlespacing {\setmathspacing \mathbinarycode \mathmiddlecode }
+\permanent\protected\def\binaccentspacing {\setmathspacing \mathbinarycode \mathaccentcode }
+
+\permanent\protected\def\relordspacing {\setmathspacing \mathrelationcode \mathordinarycode }
+\permanent\protected\def\relopspacing {\setmathspacing \mathrelationcode \mathoperatorcode }
+\permanent\protected\def\relbinspacing {\setmathspacing \mathrelationcode \mathbinarycode }
+\permanent\protected\def\relrelspacing {\setmathspacing \mathrelationcode \mathrelationcode }
+\permanent\protected\def\relopenspacing {\setmathspacing \mathrelationcode \mathopencode }
+\permanent\protected\def\relclosespacing {\setmathspacing \mathrelationcode \mathclosecode }
+\permanent\protected\def\relpunctspacing {\setmathspacing \mathrelationcode \mathpunctuationcode}
+\permanent\protected\def\relinnerspacing {\setmathspacing \mathrelationcode \mathinnercode }
+\permanent\protected\def\relfracspacing {\setmathspacing \mathrelationcode \mathfractioncode }
+\permanent\protected\def\relradspacing {\setmathspacing \mathrelationcode \mathradicalcode }
+\permanent\protected\def\relmiddlespacing {\setmathspacing \mathrelationcode \mathmiddlecode }
+\permanent\protected\def\relaccentspacing {\setmathspacing \mathrelationcode \mathaccentcode }
+
+\permanent\protected\def\openordspacing {\setmathspacing \mathopencode \mathordinarycode }
+\permanent\protected\def\openopspacing {\setmathspacing \mathopencode \mathoperatorcode }
+\permanent\protected\def\openbinspacing {\setmathspacing \mathopencode \mathbinarycode }
+\permanent\protected\def\openrelspacing {\setmathspacing \mathopencode \mathrelationcode }
+\permanent\protected\def\openopenspacing {\setmathspacing \mathopencode \mathopencode }
+\permanent\protected\def\openclosespacing {\setmathspacing \mathopencode \mathclosecode }
+\permanent\protected\def\openpunctspacing {\setmathspacing \mathopencode \mathpunctuationcode}
+\permanent\protected\def\openinnerspacing {\setmathspacing \mathopencode \mathinnercode }
+\permanent\protected\def\openfracspacing {\setmathspacing \mathopencode \mathfractioncode }
+\permanent\protected\def\openradspacing {\setmathspacing \mathopencode \mathradicalcode }
+\permanent\protected\def\openmiddlespacing {\setmathspacing \mathopencode \mathmiddlecode }
+\permanent\protected\def\openaccentspacing {\setmathspacing \mathopencode \mathaccentcode }
+
+\permanent\protected\def\closeordspacing {\setmathspacing \mathclosecode \mathordinarycode }
+\permanent\protected\def\closeopspacing {\setmathspacing \mathclosecode \mathoperatorcode }
+\permanent\protected\def\closebinspacing {\setmathspacing \mathclosecode \mathbinarycode }
+\permanent\protected\def\closerelspacing {\setmathspacing \mathclosecode \mathrelationcode }
+\permanent\protected\def\closeopenspacing {\setmathspacing \mathclosecode \mathopencode }
+\permanent\protected\def\closeclosespacing {\setmathspacing \mathclosecode \mathclosecode }
+\permanent\protected\def\closepunctspacing {\setmathspacing \mathclosecode \mathpunctuationcode}
+\permanent\protected\def\closeinnerspacing {\setmathspacing \mathclosecode \mathinnercode }
+\permanent\protected\def\closefracspacing {\setmathspacing \mathclosecode \mathfractioncode }
+\permanent\protected\def\closeradspacing {\setmathspacing \mathclosecode \mathradicalcode }
+\permanent\protected\def\closemiddlespacing {\setmathspacing \mathclosecode \mathmiddlecode }
+\permanent\protected\def\closeaccentspacing {\setmathspacing \mathclosecode \mathaccentcode }
+
+\permanent\protected\def\punctordspacing {\setmathspacing \mathpunctuationcode \mathordinarycode }
+\permanent\protected\def\punctopspacing {\setmathspacing \mathpunctuationcode \mathoperatorcode }
+\permanent\protected\def\punctbinspacing {\setmathspacing \mathpunctuationcode \mathbinarycode }
+\permanent\protected\def\punctrelspacing {\setmathspacing \mathpunctuationcode \mathrelationcode }
+\permanent\protected\def\punctopenspacing {\setmathspacing \mathpunctuationcode \mathopencode }
+\permanent\protected\def\punctclosespacing {\setmathspacing \mathpunctuationcode \mathclosecode }
+\permanent\protected\def\punctpunctspacing {\setmathspacing \mathpunctuationcode \mathpunctuationcode}
+\permanent\protected\def\punctinnerspacing {\setmathspacing \mathpunctuationcode \mathinnercode }
+\permanent\protected\def\punctfracspacing {\setmathspacing \mathpunctuationcode \mathfractioncode }
+\permanent\protected\def\punctradspacing {\setmathspacing \mathpunctuationcode \mathradicalcode }
+\permanent\protected\def\punctmiddlespacing {\setmathspacing \mathpunctuationcode \mathmiddlecode }
+\permanent\protected\def\punctaccentspacing {\setmathspacing \mathpunctuationcode \mathaccentcode }
+
+\permanent\protected\def\innerordspacing {\setmathspacing \mathinnercode \mathordinarycode }
+\permanent\protected\def\inneropspacing {\setmathspacing \mathinnercode \mathoperatorcode }
+\permanent\protected\def\innerbinspacing {\setmathspacing \mathinnercode \mathbinarycode }
+\permanent\protected\def\innerrelspacing {\setmathspacing \mathinnercode \mathrelationcode }
+\permanent\protected\def\inneropenspacing {\setmathspacing \mathinnercode \mathopencode }
+\permanent\protected\def\innerclosespacing {\setmathspacing \mathinnercode \mathclosecode }
+\permanent\protected\def\innerpunctspacing {\setmathspacing \mathinnercode \mathpunctuationcode}
+\permanent\protected\def\innerinnerspacing {\setmathspacing \mathinnercode \mathinnercode }
+\permanent\protected\def\innerfracspacing {\setmathspacing \mathinnercode \mathfractioncode }
+\permanent\protected\def\innerradspacing {\setmathspacing \mathinnercode \mathradicalcode }
+\permanent\protected\def\innermiddlespacing {\setmathspacing \mathinnercode \mathmiddlecode }
+\permanent\protected\def\inneraccentspacing {\setmathspacing \mathinnercode \mathaccentcode }
+
+\permanent\protected\def\fracordspacing {\setmathspacing \mathfractioncode \mathordinarycode }
+\permanent\protected\def\fracopspacing {\setmathspacing \mathfractioncode \mathoperatorcode }
+\permanent\protected\def\fracbinspacing {\setmathspacing \mathfractioncode \mathbinarycode }
+\permanent\protected\def\fracrelspacing {\setmathspacing \mathfractioncode \mathrelationcode }
+\permanent\protected\def\fracopenspacing {\setmathspacing \mathfractioncode \mathopencode }
+\permanent\protected\def\fracclosespacing {\setmathspacing \mathfractioncode \mathclosecode }
+\permanent\protected\def\fracpunctspacing {\setmathspacing \mathfractioncode \mathpunctuationcode}
+\permanent\protected\def\fracinnerspacing {\setmathspacing \mathfractioncode \mathinnercode }
+\permanent\protected\def\fracfracspacing {\setmathspacing \mathfractioncode \mathfractioncode }
+\permanent\protected\def\fracradspacing {\setmathspacing \mathfractioncode \mathradicalcode }
+\permanent\protected\def\fracmiddlespacing {\setmathspacing \mathfractioncode \mathmiddlecode }
+\permanent\protected\def\fracaccentspacing {\setmathspacing \mathfractioncode \mathaccentcode }
+
+\permanent\protected\def\radordspacing {\setmathspacing \mathradicalcode \mathordinarycode }
+\permanent\protected\def\radopspacing {\setmathspacing \mathradicalcode \mathoperatorcode }
+\permanent\protected\def\radbinspacing {\setmathspacing \mathradicalcode \mathbinarycode }
+\permanent\protected\def\radrelspacing {\setmathspacing \mathradicalcode \mathrelationcode }
+\permanent\protected\def\radopenspacing {\setmathspacing \mathradicalcode \mathopencode }
+\permanent\protected\def\radclosespacing {\setmathspacing \mathradicalcode \mathclosecode }
+\permanent\protected\def\radpunctspacing {\setmathspacing \mathradicalcode \mathpunctuationcode}
+\permanent\protected\def\radinnerspacing {\setmathspacing \mathradicalcode \mathinnercode }
+\permanent\protected\def\radfracspacing {\setmathspacing \mathradicalcode \mathfractioncode }
+\permanent\protected\def\radradspacing {\setmathspacing \mathradicalcode \mathradicalcode }
+\permanent\protected\def\radmiddlespacing {\setmathspacing \mathradicalcode \mathmiddlecode }
+\permanent\protected\def\radaccentspacing {\setmathspacing \mathradicalcode \mathaccentcode }
+
+\permanent\protected\def\middleordspacing {\setmathspacing \mathmiddlecode \mathordinarycode }
+\permanent\protected\def\middleopspacing {\setmathspacing \mathmiddlecode \mathoperatorcode }
+\permanent\protected\def\middlebinspacing {\setmathspacing \mathmiddlecode \mathbinarycode }
+\permanent\protected\def\middlerelspacing {\setmathspacing \mathmiddlecode \mathrelationcode }
+\permanent\protected\def\middleopenspacing {\setmathspacing \mathmiddlecode \mathopencode }
+\permanent\protected\def\middleclosespacing {\setmathspacing \mathmiddlecode \mathclosecode }
+\permanent\protected\def\middlepunctspacing {\setmathspacing \mathmiddlecode \mathpunctuationcode}
+\permanent\protected\def\middleinnerspacing {\setmathspacing \mathmiddlecode \mathinnercode }
+\permanent\protected\def\middlefracspacing {\setmathspacing \mathmiddlecode \mathfractioncode }
+\permanent\protected\def\middleradspacing {\setmathspacing \mathmiddlecode \mathradicalcode }
+\permanent\protected\def\middlemiddlespacing{\setmathspacing \mathmiddlecode \mathmiddlecode }
+\permanent\protected\def\middleaccentspacing{\setmathspacing \mathmiddlecode \mathaccentcode }
+
+\permanent\protected\def\accentordspacing {\setmathspacing \mathaccentcode \mathordinarycode }
+\permanent\protected\def\accentopspacing {\setmathspacing \mathaccentcode \mathoperatorcode }
+\permanent\protected\def\accentbinspacing {\setmathspacing \mathaccentcode \mathbinarycode }
+\permanent\protected\def\accentrelspacing {\setmathspacing \mathaccentcode \mathrelationcode }
+\permanent\protected\def\accentopenspacing {\setmathspacing \mathaccentcode \mathopencode }
+\permanent\protected\def\accentclosespacing {\setmathspacing \mathaccentcode \mathclosecode }
+\permanent\protected\def\accentpunctspacing {\setmathspacing \mathaccentcode \mathpunctuationcode}
+\permanent\protected\def\accentinnerspacing {\setmathspacing \mathaccentcode \mathinnercode }
+\permanent\protected\def\accentfracspacing {\setmathspacing \mathaccentcode \mathfractioncode }
+\permanent\protected\def\accentradspacing {\setmathspacing \mathaccentcode \mathradicalcode }
+\permanent\protected\def\accentmiddlespacing{\setmathspacing \mathaccentcode \mathmiddlecode }
+\permanent\protected\def\accentaccentspacing{\setmathspacing \mathaccentcode \mathaccentcode }
+
+%D In the end Mikael and I prefer for this:
+
+% \setmathignore\Umathspacebeforescript\plusone
+% \setmathignore\Umathspaceafterscript \plusone
+
+\setmathignore \Umathspacebeforescript\zerocount
+\setmathignore \Umathspaceafterscript \zerocount
+
+\mathslackmode \plusone
+
+\setmathoptions\mathoperatorcode \plusthree
+\setmathoptions\mathbinarycode \plusthree
+\setmathoptions\mathrelationcode \plusthree
+\setmathoptions\mathopencode \plusthree
+\setmathoptions\mathclosecode \plusthree
+\setmathoptions\mathpunctuationcode\plusthree
+\setmathoptions\mathfractioncode \plusthree
+
+%D For now \unknown
+
+\permanent\protected\def\math_discretionary_plus {\discretionary class \mathbinarycode {$+$}{$+$}{$+$}}
+\permanent\protected\def\math_discretionary_minus{\discretionary class \mathbinarycode {$-$}{$-$}{$-$}}
+
+\newtoks\everymathdiscretionaries
+
+\appendtoks
+ \enforced\let\+\math_discretionary_plus
+ \enforced\let\-\math_discretionary_minus
+\to \everymathdiscretionaries
+
+\appendtoks
+ \ifconditional\c_math_discretionaries
+ \the\everymathdiscretionaries
+ \fi
+\to \everymathematics
+
+\setfalse\c_math_discretionaries
+
+\installtexexperiment
+ {mathematics.discretionaries}
+ {\settrue \c_math_discretionaries}
+ {\setfalse\c_math_discretionaries}
+
%D A starter:
%D
%D \startbuffer
@@ -123,13 +456,13 @@
\definesystemattribute[displaymath] [public]
-\mathflattenmode\numexpr
- \ordmathflattencode
- +\binmathflattencode
- +\relmathflattencode
- +\punctmathflattencode
- +\innermathflattencode
-\relax
+% \mathflattenmode\numexpr
+% \ordmathflattencode
+% +\binmathflattencode
+% +\relmathflattencode
+% +\punctmathflattencode
+% +\innermathflattencode
+% \relax
\ifdefined\ordlimits\else
\let\ordlimits\Umathlimits % downward compatible
@@ -166,6 +499,12 @@
\settrue\indisplaymath
\fi}
+\permanent\protected\def\forceinlinemath
+ {\ifmmode
+ \textstyle
+ \setfalse\indisplaymath
+ \fi}
+
\permanent\protected\def\startforceddisplaymath
{\startimath
\displaystyle
@@ -223,19 +562,6 @@
\installmacrostack\currentmathematics
-% \permanent\protected\def\startmathematics % no grouping, if ever then also an optional second
-% {\doifelsenextoptionalcs\math_mathematics_start_yes\math_mathematics_start_nop}
-%
-% \protected\def\math_mathematics_start_yes[#1]%
-% {\push_macro_currentmathematics
-% \edef\currentmathematics{#1}% check for valid
-% \the\everyswitchmathematics}
-%
-% \protected\def\math_mathematics_start_nop
-% {\push_macro_currentmathematics
-% \let\currentmathematics\empty
-% \the\everyswitchmathematics}
-
\permanent\protected\tolerant\def\startmathematics[#1]% no grouping, if ever then also an optional second
{\push_macro_currentmathematics
\edef\currentmathematics{#1}% check for valid
@@ -267,7 +593,7 @@
\fi}
\def\math_m_yes_math[#1]#2%
- {#2}
+ {#2} % grouping permits \mathbf etc
\def\math_m_yes_text[#1]%
{\begingroup
@@ -304,7 +630,7 @@
\def\math_m_yes_text_normal#1%
{\the\everyswitchmathematics\relax
\normalstartimath
- #1%
+ \begingroup#1\endgroup % grouping permits aftergroups trickery
\normalstopimath
\endgroup}
@@ -314,26 +640,31 @@
#1%
\else
\normalstartimath
- #1%
+ \begingroup#1\endgroup % grouping permits aftergroups trickery
\normalstopimath
\fi}
-% e.g.: \definemathematics[i:mp][setups=i:tight,openup=yes]
+%D maybe more setters
-\immutable\mugluespecdef\defaultthickmuskip 5mu plus 5mu
-\immutable\mugluespecdef\defaultmedmuskip 4mu plus 2mu minus 4mu
-\immutable\mugluespecdef\defaultthinmuskip 3mu
+\permanent\protected\def\dm#1%
+ {\relax
+ \ifmmode
+ \beginmathgroup\forcedisplaymath#1\endmathgroup
+ \else
+ \startimath\begingroup\forcedisplaymath#1\endgroup\stopimath
+ \fi}
-\immutable\mugluespecdef\halfthickmuskip 2.5mu plus 2.5mu
-\immutable\mugluespecdef\halfmedmuskip 2.0mu plus 1.0mu minus 2.0mu
-\immutable\mugluespecdef\halfthinmuskip 1.5mu
+\permanent\protected\def\im#1%
+ {\relax
+ \ifmmode
+ \beginmathgroup\forceinlinemath#1\endmathgroup
+ \else
+ \startimath#1\stopimath
+ \fi}
-\immutable\mugluespecdef\hairmuskip .15mu
+% \aliased\let\m \mathematics % we keep the simple versions
-\immutable\integerdef \defaultrelpenalty 500
-\immutable\integerdef \defaultbinoppenalty 700
-\immutable\integerdef \defaultprerelpenalty -100
-\immutable\integerdef \defaultprebinoppenalty -100
+% e.g.: \definemathematics[i:mp][setups=i:tight,openup=yes]
% we need to control these otherwise:
%
@@ -344,6 +675,7 @@
\thickmuskip \defaultthickmuskip
\medmuskip \defaultmedmuskip
\thinmuskip \defaultthinmuskip
+ \tinymuskip \defaulttinymuskip
\relpenalty \defaultrelpenalty
\binoppenalty \defaultbinoppenalty
\prebinoppenalty\maxdimen
@@ -354,6 +686,7 @@
\thickmuskip \defaultthickmuskip
\medmuskip \defaultmedmuskip
\thinmuskip \defaultthinmuskip
+ \tinymuskip \defaulttinymuskip
\relpenalty \defaultrelpenalty
\binoppenalty \defaultbinoppenalty
\prebinoppenalty\defaultprebinoppenalty
@@ -364,6 +697,7 @@
\thickmuskip \halfthickmuskip
\medmuskip \halfmedmuskip
\thinmuskip \halfthinmuskip
+ \tinymuskip \halftinymuskip
\relpenalty \defaultrelpenalty
\binoppenalty \defaultbinoppenalty
\prebinoppenalty\maxdimen
@@ -375,10 +709,12 @@
\thickmuskip \halfthickmuskip
\medmuskip \halfmedmuskip
\thinmuskip \halfthinmuskip
+ \tinymuskip \halftinymuskip
\else
\thickmuskip 1\halfthickmuskip
\medmuskip 1\halfmedmuskip
\thinmuskip 1\halfthinmuskip
+ \tinymuskip 1\halftinymuskip
\fi
\relpenalty \defaultrelpenalty
\binoppenalty \maxdimen
@@ -391,10 +727,12 @@
\thickmuskip \halfthickmuskip
\medmuskip \halfmedmuskip
\thinmuskip \halfthinmuskip
+ \tinymuskip \halftinymuskip
\else
\thickmuskip 1\halfthickmuskip
\medmuskip 1\halfmedmuskip
\thinmuskip 1\halfthinmuskip
+ \tinymuskip 1\halftinymuskip
\fi
\relpenalty \maxdimen
\binoppenalty \maxdimen
@@ -402,8 +740,209 @@
\prerelpenalty \maxdimen
\stopsetups
+% this will reset the spacing to default values
+
+% \Umathspacingmode\allmathstyles\plusone % always pair driven
+
+% todo: use fullnames instead shirt ones
+
+\startsetups math:spacing:presets
+ \resetmathspacing
+ % \ordordspacing \allmathstyles \zeromuskip
+ \inherited\ordopspacing \allmathstyles \thinmuskip
+ \inherited\ordbinspacing \allsplitstyles \medmuskip
+ \inherited\ordbinspacing \allscriptstyles\tinymuskip
+ \inherited\ordrelspacing \allsplitstyles \thickmuskip
+ \inherited\ordrelspacing \allscriptstyles\tinymuskip
+ % \inherited\ordopenspacing \allmathstyles \zeromuskip
+ \inherited\ordmiddlespacing \allsplitstyles \medmuskip
+ \inherited\ordmiddlespacing \allscriptstyles\tinymuskip
+ % \inherited\ordclosespacing \allmathstyles \zeromuskip
+ % \inherited\ordpunctspacing \allmathstyles \zeromuskip
+ \inherited\ordinnerspacing \allsplitstyles \thinmuskip
+ \inherited\ordinnerspacing \allscriptstyles\tinymuskip
+ \inherited\ordfracspacing \allmathstyles \tinymuskip
+ \inherited\ordradspacing \allmathstyles \tinymuskip
+ \inherited\opordspacing \allmathstyles \thinmuskip
+ \inherited\opopspacing \allmathstyles \thinmuskip
+ %%\inherited \opbinspacing \allmathstyles \zeromuskip
+ \inherited\oprelspacing \allsplitstyles \thickmuskip
+ \inherited\oprelspacing \allscriptstyles\tinymuskip
+ % \inherited\opopenspacing \allmathstyles \zeromuskip
+ \inherited\opmiddlespacing \allsplitstyles \medmuskip
+ \inherited\opmiddlespacing \allscriptstyles\tinymuskip
+ % \inherited\opclosespacing \allmathstyles \zeromuskip
+ % \inherited\oppunctspacing \allmathstyles \zeromuskip
+ \inherited\opinnerspacing \allsplitstyles \thinmuskip
+ \inherited\opinnerspacing \allscriptstyles\tinymuskip
+ \inherited\opfracspacing \allmathstyles \thinmuskip
+ \inherited\opradspacing \allmathstyles \thinmuskip
+ \inherited\binordspacing \allsplitstyles \medmuskip
+ \inherited\binordspacing \allscriptstyles\tinymuskip
+ \inherited\binopspacing \allsplitstyles \medmuskip
+ \inherited\binopspacing \allscriptstyles\tinymuskip
+ %% \inherited\binbinspacing \allmathstyles \zeromuskip
+ %% \inherited\binrelspacing \allmathstyles \zeromuskip
+ \inherited\binopenspacing \allsplitstyles \medmuskip
+ \inherited\binopenspacing \allscriptstyles\tinymuskip
+ \inherited\binmiddlespacing \allsplitstyles \medmuskip
+ \inherited\binmiddlespacing \allscriptstyles\tinymuskip
+ %% \inherited\binclosespacing \allmathstyles \zeromuskip
+ %% \inherited\binpunctspacing \allmathstyles \zeromuskip
+ \inherited\bininnerspacing \allsplitstyles \medmuskip
+ \inherited\bininnerspacing \allscriptstyles\tinymuskip
+ \inherited\binfracspacing \allsplitstyles \medmuskip
+ \inherited\binfracspacing \allscriptstyles\tinymuskip
+ \inherited\binradspacing \allsplitstyles \medmuskip
+ \inherited\binradspacing \allscriptstyles\tinymuskip
+ \inherited\relordspacing \allsplitstyles \thickmuskip
+ \inherited\relordspacing \allscriptstyles\tinymuskip
+ \inherited\relopspacing \allsplitstyles \thickmuskip
+ \inherited\relopspacing \allscriptstyles\tinymuskip
+ %% \inherited\relbinspacing \allmathstyles \zeromuskip
+ % \inherited\relrelspacing \allmathstyles \zeromuskip
+ \inherited\relopenspacing \allsplitstyles \thickmuskip
+ \inherited\relopenspacing \allscriptstyles\tinymuskip
+ \inherited\relmiddlespacing \allsplitstyles \thickmuskip
+ \inherited\relmiddlespacing \allscriptstyles\thinmuskip
+ % \inherited\relclosespacing \allmathstyles \zeromuskip
+ % \inherited\relpunctspacing \allmathstyles \zeromuskip
+ \inherited\relinnerspacing \allsplitstyles \thickmuskip
+ \inherited\relinnerspacing \allscriptstyles\tinymuskip
+ \inherited\relfracspacing \allsplitstyles \thickmuskip
+ \inherited\relfracspacing \allscriptstyles\tinymuskip
+ \inherited\relradspacing \allsplitstyles \thickmuskip
+ \inherited\relradspacing \allscriptstyles\tinymuskip
+ % \inherited\openordspacing \allmathstyles \zeromuskip
+ % \inherited\openopspacing \allmathstyles \zeromuskip
+ %% \inherited\openbinspacing \allmathstyles \zeromuskip
+ % \inherited\openrelspacing \allmathstyles \zeromuskip
+ % \inherited\openopenspacing \allmathstyles \zeromuskip
+ % \inherited\openmiddlespacing \allmathstyles \zeromuskip
+ % \inherited\openclosespacing \allmathstyles \zeromuskip
+ % \inherited\openpunctspacing \allmathstyles \zeromuskip
+ % \inherited\openinnerspacing \allmathstyles \zeromuskip
+ \inherited\openfracspacing \allmathstyles \tinymuskip
+ % \inherited\openradspacing \allmathstyles \zeromuskip
+ % \inherited\closeordspacing \allmathstyles \zeromuskip
+ \inherited\closeopspacing \allmathstyles \thinmuskip
+ \inherited\closebinspacing \allsplitstyles \medmuskip
+ \inherited\closebinspacing \allscriptstyles\tinymuskip
+ \inherited\closerelspacing \allsplitstyles \thickmuskip
+ \inherited\closerelspacing \allscriptstyles\tinymuskip
+ % \inherited\closeopenspacing \allmathstyles \zeromuskip
+ % \inherited\closemiddlespacing \allmathstyles \zeromuskip
+ % \inherited\closeclosespacing \allmathstyles \zeromuskip
+ % \inherited\closepunctspacing \allmathstyles \zeromuskip
+ \inherited\closeinnerspacing \allsplitstyles \thinmuskip
+ \inherited\closeinnerspacing \allscriptstyles\tinymuskip
+ \inherited\closefracspacing \allsplitstyles \thinmuskip
+ \inherited\closefracspacing \allscriptstyles\tinymuskip
+ % \inherited\closeradspacing \allmathstyles \zeromuskip
+ \inherited\punctordspacing \allsplitstyles \thinmuskip
+ \inherited\punctordspacing \allscriptstyles\tinymuskip
+ \inherited\punctopspacing \allsplitstyles \thinmuskip
+ \inherited\punctopspacing \allscriptstyles\tinymuskip
+ %% \inherited\punctbinspacing \allmathstyles \zeromuskip
+ \inherited\punctrelspacing \allsplitstyles \thinmuskip
+ \inherited\punctrelspacing \allscriptstyles\tinymuskip
+ \inherited\punctopenspacing \allsplitstyles \thinmuskip
+ \inherited\punctopenspacing \allscriptstyles\tinymuskip
+ \inherited\punctmiddlespacing \allsplitstyles \thinmuskip
+ \inherited\punctmiddlespacing \allscriptstyles\tinymuskip
+ \inherited\punctclosespacing \allsplitstyles \thinmuskip
+ \inherited\punctclosespacing \allscriptstyles\tinymuskip
+ \inherited\punctpunctspacing \allsplitstyles \thinmuskip
+ \inherited\punctpunctspacing \allscriptstyles\tinymuskip
+ \inherited\punctinnerspacing \allsplitstyles \thinmuskip
+ \inherited\punctinnerspacing \allscriptstyles\tinymuskip
+ \inherited\punctfracspacing \allsplitstyles \thinmuskip
+ \inherited\punctfracspacing \allscriptstyles\tinymuskip
+ \inherited\punctradspacing \allsplitstyles \thinmuskip
+ \inherited\punctradspacing \allscriptstyles\tinymuskip
+ \inherited\innerordspacing \allsplitstyles \thinmuskip
+ \inherited\innerordspacing \allscriptstyles\tinymuskip
+ \inherited\inneropspacing \allmathstyles \thinmuskip
+ \inherited\innerbinspacing \allsplitstyles \medmuskip
+ \inherited\innerbinspacing \allscriptstyles\tinymuskip
+ \inherited\innerrelspacing \allsplitstyles \thickmuskip
+ \inherited\innerrelspacing \allscriptstyles\tinymuskip
+ \inherited\inneropenspacing \allsplitstyles \thinmuskip
+ \inherited\inneropenspacing \allscriptstyles\tinymuskip
+ \inherited\innermiddlespacing \allsplitstyles \thinmuskip
+ \inherited\innermiddlespacing \allscriptstyles\tinymuskip
+ % \inherited\innerclosespacing \allmathstyles \zeromuskip
+ \inherited\innerpunctspacing \allsplitstyles \thinmuskip
+ \inherited\innerpunctspacing \allscriptstyles\tinymuskip
+ \inherited\innerinnerspacing \allsplitstyles \thinmuskip
+ \inherited\innerinnerspacing \allscriptstyles\tinymuskip
+ \inherited\innerfracspacing \allsplitstyles \thinmuskip
+ \inherited\innerfracspacing \allscriptstyles\tinymuskip
+ \inherited\innerradspacing \allsplitstyles \thinmuskip
+ \inherited\innerradspacing \allscriptstyles\tinymuskip
+ \inherited\fracordspacing \allmathstyles \tinymuskip
+ \inherited\fracopspacing \allmathstyles \thinmuskip
+ \inherited\fracbinspacing \allsplitstyles \medmuskip
+ \inherited\fracbinspacing \allscriptstyles\tinymuskip
+ \inherited\fracrelspacing \allsplitstyles \thickmuskip
+ \inherited\fracrelspacing \allscriptstyles\tinymuskip
+ \inherited\fracopenspacing \allsplitstyles \thinmuskip
+ \inherited\fracopenspacing \allscriptstyles\tinymuskip
+ \inherited\fracmiddlespacing \allsplitstyles \medmuskip
+ \inherited\fracmiddlespacing \allscriptstyles\tinymuskip
+ \inherited\fracclosespacing \allmathstyles \tinymuskip
+ % \inherited\fracpunctspacing \allmathstyles \zeromuskip
+ \inherited\fracinnerspacing \allsplitstyles \thinmuskip
+ \inherited\fracinnerspacing \allscriptstyles\tinymuskip
+ \inherited\fracfracspacing \allsplitstyles \thinmuskip
+ \inherited\fracfracspacing \allscriptstyles\tinymuskip
+ \inherited\fracradspacing \allmathstyles \tinymuskip
+ \inherited\radordspacing \allsplitstyles \tinymuskip
+ \inherited\radopspacing \allmathstyles \thinmuskip
+ \inherited\radbinspacing \allsplitstyles \medmuskip
+ \inherited\radbinspacing \allscriptstyles\tinymuskip
+ \inherited\radrelspacing \allsplitstyles \thickmuskip
+ \inherited\radrelspacing \allscriptstyles\tinymuskip
+ % \inherited\radopenspacing \allmathstyles \zeromuskip
+ % \inherited\radmiddlespacing \allmathstyles \zeromuskip
+ % \inherited\radclosespacing \allmathstyles \zeromuskip
+ % \inherited\radpunctspacing \allmathstyles \zeromuskip
+ \inherited\radinnerspacing \allsplitstyles \thinmuskip
+ \inherited\radinnerspacing \allscriptstyles\tinymuskip
+ \inherited\radfracspacing \allmathstyles \tinymuskip
+ \inherited\radradspacing \allmathstyles \tinymuskip
+ \inherited\middleordspacing \allsplitstyles \medmuskip
+ \inherited\middleordspacing \allscriptstyles\tinymuskip
+ \inherited\middleopspacing \allmathstyles \thinmuskip
+ \inherited\middlebinspacing \allsplitstyles \medmuskip
+ \inherited\middlebinspacing \allscriptstyles\tinymuskip
+ \inherited\middlerelspacing \allsplitstyles \thickmuskip
+ \inherited\middlerelspacing \allscriptstyles\tinymuskip
+ % \inherited\middleopenspacing \allmathstyles \zeromuskip
+ % \inherited\middlemiddlespacing \allmathstyles \zeromuskip
+ % \inherited\middleclosespacing \allmathstyles \zeromuskip
+ % \inherited\middlepunctspacing \allmathstyles \zeromuskip
+ \inherited\middleinnerspacing \allsplitstyles \thinmuskip
+ \inherited\middleinnerspacing \allscriptstyles\tinymuskip
+ \inherited\middlefracspacing \allsplitstyles \medmuskip
+ \inherited\middlefracspacing \allscriptstyles\tinymuskip
+ % \inherited\middleradspacing \allmathstyles \zeromuskip
+ %
+ \inherited\setmathspacing \mathclosecode \mathdifferentialcode \allsplitstyles \thinmuskip
+ \inherited\setmathspacing \mathclosecode \mathdifferentialcode \allscriptstyles \tinymuskip
+ \inherited\setmathspacing \mathordinarycode \mathdifferentialcode \allsplitstyles \thinmuskip
+ \inherited\setmathspacing \mathordinarycode \mathdifferentialcode \allscriptstyles \tinymuskip
+ \inherited\setmathspacing \mathfactorialcode \mathordinarycode \allsplitstyles \thinmuskip
+ \inherited\setmathspacing \mathfactorialcode \mathordinarycode \allscriptstyles \tinymuskip
+\stopsetups
+
+\directsetup{math:spacing:default}
+\directsetup{math:spacing:presets}
+
% \dorecurse{80}{test \m[i:tight]{\red \fakeformula} test }
+%setupmathematics [\c!setups=math:spacing:default]
+
\definemathematics[i:default][\c!setups=math:spacing:equal]
\definemathematics[i:half] [\c!setups=math:spacing:half]
\definemathematics[i:tight] [\c!setups=math:spacing:tight]
@@ -488,33 +1027,71 @@
\aliased\let\setmathfontstylealternative\setmathfontstylealternate
\aliased\let\mathalternate \setmathfontalternate
-\permanent\protected\def\mathupright {\setmathattribute\s!regular\s!tf\setmathfontstylealternate\s!tf}
-\permanent\protected\def\mathitalic {\setmathattribute\s!regular\s!it\setmathfontstylealternate\s!it}
+% \permanent\protected\def\mathupright {\setmathattribute\s!regular\s!tf\setmathfontstylealternate\s!tf}
+% \permanent\protected\def\mathitalic {\setmathattribute\s!regular\s!it\setmathfontstylealternate\s!it}
+% \permanent\protected\def\mathscript {\setmathalphabet \s!script \setmathfontstylealternate\s!script}
+% \permanent\protected\def\mathfraktur {\setmathalphabet \s!fraktur \setmathfontstylealternate\s!fraktur}
+% \permanent\protected\def\mathblackboard{\setmathalphabet \s!blackboard\setmathfontstylealternate\s!blackboard}
+
+\permanent\protected\def\math_upright {\setmathattribute\s!regular\s!tf\setmathfontstylealternate\s!tf}
+\permanent\protected\def\math_italic {\setmathattribute\s!regular\s!it\setmathfontstylealternate\s!it}
+\permanent\protected\def\math_script {\setmathalphabet \s!script \setmathfontstylealternate\s!script}
+\permanent\protected\def\math_fraktur {\setmathalphabet \s!fraktur \setmathfontstylealternate\s!fraktur}
+\permanent\protected\def\math_blackboard{\setmathalphabet \s!blackboard\setmathfontstylealternate\s!blackboard}
+
+\permanent\protected\def\mathupright {\mathgroupedcommandcs\math_upright}
+\permanent\protected\def\mathitalic {\mathgroupedcommandcs\math_italic}
+\permanent\protected\def\mathscript {\mathgroupedcommandcs\math_script}
+\permanent\protected\def\mathfraktur {\mathgroupedcommandcs\math_fraktur}
+\permanent\protected\def\mathblackboard{\mathgroupedcommandcs\math_blackboard}
-\permanent\protected\def\mathscript {\setmathalphabet \s!script \setmathfontstylealternate\s!script}
-\permanent\protected\def\mathfraktur {\setmathalphabet \s!fraktur \setmathfontstylealternate\s!fraktur}
-\permanent\protected\def\mathblackboard{\setmathalphabet \s!blackboard\setmathfontstylealternate\s!blackboard}
+% \permanent\protected\def\mathrm{\setmathattribute\s!rm\s!tf\setmathfontstylealternate\s!tf}
+% \permanent\protected\def\mathss{\setmathattribute\s!ss\s!tf\setmathfontstylealternate\s!tf}
+% \permanent\protected\def\mathtt{\setmathattribute\s!tt\s!tf\setmathfontstylealternate\s!tf}
+%
+% \permanent\protected\def\mathtf{\setmathfontstyle\s!tf\setmathfontstylealternate\s!tf}
+% \permanent\protected\def\mathsl{\setmathfontstyle\s!it\setmathfontstylealternate\s!it} % no sl
+% \permanent\protected\def\mathit{\setmathfontstyle\s!it\setmathfontstylealternate\s!it}
+%
+% \permanent\protected\def\mathbf{\setmathfontstyle\s!bf\setmathfontstylealternate\s!bf}
+% \permanent\protected\def\mathbs{\setmathfontstyle\s!bi\setmathfontstylealternate\s!bi} % no sl
+% \permanent\protected\def\mathbi{\setmathfontstyle\s!bi\setmathfontstylealternate\s!bi}
-\permanent\protected\def\mathrm {\setmathattribute\s!rm\s!tf\setmathfontstylealternate\s!tf}
-\permanent\protected\def\mathss {\setmathattribute\s!ss\s!tf\setmathfontstylealternate\s!tf}
-\permanent\protected\def\mathtt {\setmathattribute\s!tt\s!tf\setmathfontstylealternate\s!tf}
+\permanent\protected\def\math_rm{\setmathattribute\s!rm\s!tf\setmathfontstylealternate\s!tf}
+\permanent\protected\def\math_ss{\setmathattribute\s!ss\s!tf\setmathfontstylealternate\s!tf}
+\permanent\protected\def\math_tt{\setmathattribute\s!tt\s!tf\setmathfontstylealternate\s!tf}
-\permanent\protected\def\mathtf {\setmathfontstyle\s!tf\setmathfontstylealternate\s!tf}
-\permanent\protected\def\mathsl {\setmathfontstyle\s!it\setmathfontstylealternate\s!it} % no sl
-\permanent\protected\def\mathit {\setmathfontstyle\s!it\setmathfontstylealternate\s!it}
+\permanent\protected\def\math_tf{\setmathfontstyle\s!tf\setmathfontstylealternate\s!tf}
+\permanent\protected\def\math_sl{\setmathfontstyle\s!it\setmathfontstylealternate\s!it} % no sl
+\permanent\protected\def\math_it{\setmathfontstyle\s!it\setmathfontstylealternate\s!it}
-\permanent\protected\def\mathbf {\setmathfontstyle\s!bf\setmathfontstylealternate\s!bf}
-\permanent\protected\def\mathbs {\setmathfontstyle\s!bi\setmathfontstylealternate\s!bi} % no sl
-\permanent\protected\def\mathbi {\setmathfontstyle\s!bi\setmathfontstylealternate\s!bi}
+\permanent\protected\def\math_bf{\setmathfontstyle\s!bf\setmathfontstylealternate\s!bf}
+\permanent\protected\def\math_bs{\setmathfontstyle\s!bi\setmathfontstylealternate\s!bi} % no sl
+\permanent\protected\def\math_bi{\setmathfontstyle\s!bi\setmathfontstylealternate\s!bi}
-\aliased\let\mathdefault\mathitalic
+\permanent\protected\def\mathrm{\mathgroupedcommandcs\math_rm\relax}
+\permanent\protected\def\mathss{\mathgroupedcommandcs\math_ss\relax}
+\permanent\protected\def\mathtt{\mathgroupedcommandcs\math_tt\relax}
+
+\permanent\protected\def\mathtf{\mathgroupedcommandcs\math_tf\relax}
+\permanent\protected\def\mathsl{\mathgroupedcommandcs\math_sl\relax}
+\permanent\protected\def\mathit{\mathgroupedcommandcs\math_it\relax}
+
+\permanent\protected\def\mathbf{\mathgroupedcommandcs\math_bf\relax}
+\permanent\protected\def\mathbs{\mathgroupedcommandcs\math_bs\relax}
+\permanent\protected\def\mathbi{\mathgroupedcommandcs\math_bi\relax}
+
+\aliased\let\math_default\math_italic
+\aliased\let\mathdefault \math_italic
\appendtoks
\edef\p_default{\mathematicsparameter\c!default}%
\ifx\p_default\v!normal
- \enforced\let\mathdefault\mathupright
+ \enforced\let\mathdefault \math_upright
+ \enforced\let\math_default\math_upright
\else
- \enforced\let\mathdefault\mathitalic
+ \enforced\let\mathdefault \math_italic
+ \enforced\let\math_default\math_italic
\fi
\to \everysetupmathematics
@@ -538,9 +1115,9 @@
\permanent\protected\def\fraktur {\ifmmode\expandafter\mathfraktur \fi}
\permanent\protected\def\gothic {\ifmmode\expandafter\mathfraktur \fi}
-\permanent\protected\def\mathcal #1{{\mathscript #1}} % for AMS compatibility
-\permanent\protected\def\mathfrak#1{{\mathfraktur #1}} % for AMS compatibility
-\permanent\protected\def\mathbb #1{{\mathblackboard#1}} % for AMS compatibility
+\permanent\protected\def\mathcal {\mathgroupedcommandcs\math_script \relax} % for AMS compatibility
+\permanent\protected\def\mathfrak{\mathgroupedcommandcs\math_fraktur \relax} % for AMS compatibility
+\permanent\protected\def\mathbb {\mathgroupedcommandcs\math_blackboard\relax} % for AMS compatibility
\ifdefined\normaltf \else \permanent\let\normaltf\tf \fi \permanent\protected\def\tf{\ifmmode\expandafter\mathtf\else\expandafter\normaltf\fi}
\ifdefined\normalbf \else \permanent\let\normalbf\bf \fi \permanent\protected\def\bf{\ifmmode\expandafter\mathbf\else\expandafter\normalbf\fi}
@@ -563,7 +1140,7 @@
% 5: $e=mc^2 \quad \mb e=mc^2$
\prependtoks
- \mathdefault
+ \math_default
\to \everymathematics
%D We could set the rendering attribute at the \LUA\ end but as there can be many
@@ -635,32 +1212,40 @@
\installcorenamespace{mathcodecommand}
-\permanent\protected\def\mathlimop#1{\mathop{#1}} %no \limits
+\permanent\protected\def\mathlimop#1{\normalmathop{#1}} %no \limits
\permanent\protected\def\mathbox #1{\dontleavehmode\hbox\Ustartmath\mathsurround\zeropoint#1\Ustopmath}
-\permanent\protected\def\mathnolop#1{\mathop{#1}\nolimits}
+\permanent\protected\def\mathnolop#1{\normalmathop{#1}\nolimits}
+
+% \permanent\protected\def\mathlimop#1{\mathatom \mathoperatorcode options "C0000 {#1}} % auto "40000 + "80000
+% \permanent\protected\def\mathnolop#1{\mathatom \mathoperatorcode options "80000 {#1}}
\aliased\let\mathnothing\firstofoneunexpanded
\aliased\let\mathalpha \firstofoneunexpanded
% todo 'frac' and 'rad'
-\setnewconstant\mathordcode \zerocount \letcsname\??mathcodecommand ord\endcsname\mathord
-\setnewconstant\mathopcode \plusone \letcsname\??mathcodecommand op\endcsname\mathop
-\setnewconstant\mathbincode \plustwo \letcsname\??mathcodecommand bin\endcsname\mathbin
-\setnewconstant\mathrelcode \plusthree \letcsname\??mathcodecommand rel\endcsname\mathrel
-\setnewconstant\mathopencode \plusfour \letcsname\??mathcodecommand open\endcsname\mathopen
-\setnewconstant\mathclosecode \plusfive \letcsname\??mathcodecommand close\endcsname\mathclose
-\setnewconstant\mathpunctcode \plussix \letcsname\??mathcodecommand punct\endcsname\mathpunct
-\setnewconstant\mathalphacode \plusseven \letcsname\??mathcodecommand alpha\endcsname\mathalpha
-\setnewconstant\mathinnercode \zerocount \letcsname\??mathcodecommand inner\endcsname\mathinner
-\setnewconstant\mathnothingcode \zerocount \letcsname\??mathcodecommand nothing\endcsname\mathnothing
-\setnewconstant\mathlimopcode \plusone \letcsname\??mathcodecommand limop\endcsname\mathlimop
-\setnewconstant\mathnolopcode \plusone \letcsname\??mathcodecommand nolop\endcsname\mathnolop
-\setnewconstant\mathboxcode \zerocount \letcsname\??mathcodecommand box\endcsname\mathbox
-\setnewconstant\mathchoicecode \zerocount %letcsname\??mathcodecommand choice\endcsname\mathnothing
-
-\setnewconstant\mathaccentcode \pluseight
-\setnewconstant\mathradicalcode \plusnine
+% why not \aliased ?
+
+\letcsname\??mathcodecommand ord\endcsname\mathord
+\letcsname\??mathcodecommand op\endcsname\mathop
+\letcsname\??mathcodecommand bin\endcsname\mathbin
+\letcsname\??mathcodecommand rel\endcsname\mathrel
+\letcsname\??mathcodecommand open\endcsname\mathopen
+\letcsname\??mathcodecommand close\endcsname\mathclose
+\letcsname\??mathcodecommand punct\endcsname\mathpunct
+\letcsname\??mathcodecommand inner\endcsname\mathinner % hm
+%letcsname\??mathcodecommand fraction\endcsname\mathnothing
+%letcsname\??mathcodecommand radical\endcsname\mathnothing
+%letcsname\??mathcodecommand middle\endcsname\mathnothing
+\letcsname\??mathcodecommand limop\endcsname\mathlimop
+\letcsname\??mathcodecommand nolop\endcsname\mathnolop
+
+% obsolete
+
+\letcsname\??mathcodecommand box\endcsname\mathbox
+%letcsname\??mathcodecommand choice\endcsname\mathnothing
+\letcsname\??mathcodecommand alpha\endcsname\mathalpha % hm
+\letcsname\??mathcodecommand nothing\endcsname\mathnothing
\permanent \def\mathcodenumber #1{\the\csname math#1code\endcsname}
\permanent\protected\def\mathcodecommand#1{\csname\??mathcodecommand#1\endcsname}
@@ -742,79 +1327,51 @@
% \relax
% \hskip-.01\emwidth}
-\protected\def\math_strut_ht#1% nasty!
- {\s!height\dimexpr(\fontcharht#1\c_math_strut/\glyphscale)*\mathscale#1\relax}
+\let\math_strut_math_style\normalmathstyle
-\protected\def\math_strut_dp#1% nasty!
- {\s!depth \dimexpr(\fontchardp#1\c_math_strut/\glyphscale)*\mathscale#1\relax}
+% using \s!font \mathstylefontid\mathstyle\fam would needs expansion and guesswork
-\protected\def\math_strut_htdp#1% nasty!
- {\math_strut_ht{#1}%
- \math_strut_dp{#1}}
-
-\protected\def\math_strut_normal
- {\vrule
+\appendtoks
+ \Umathruleheight\alltextstyles \strutheightfactor\fontspecifiedsize\textfont \zerocount
+ \Umathruledepth \alltextstyles \strutdepthfactor \fontspecifiedsize\textfont \zerocount
+ \Umathruleheight\allscriptstyles \strutheightfactor\fontspecifiedsize\scriptfont \zerocount
+ \Umathruledepth \allscriptstyles \strutdepthfactor \fontspecifiedsize\scriptfont \zerocount
+ \Umathruleheight\allscriptscriptstyles\strutheightfactor\fontspecifiedsize\scriptscriptfont\zerocount
+ \Umathruledepth \allscriptscriptstyles\strutdepthfactor \fontspecifiedsize\scriptscriptfont\zerocount
+ \Umathruleheight\alldisplaystyles \Umathruleheight\textstyle
+ \Umathruledepth \alldisplaystyles \Umathruledepth \textstyle
+\to \everybodyfont
+
+\protected\def\math_strut
+ {\normalsrule
\s!width \zeropoint
- \normalexpanded{\math_strut_htdp{\mathstylefont\normalmathstyle}}%
+ \s!fam \fam
+ \s!char \c_math_strut
\relax}
-\protected\def\math_strut_visual
- {\hskip-.01\emwidth
- \vrule
- \s!width .02\emwidth
- \normalexpanded{\math_strut_htdp{\mathstylefont\normalmathstyle}}%
- \relax
- \hskip-.01\emwidth}
-
-\permanent\protected\def\math_strut_height_normal
- {\vrule
+\permanent\protected\def\math_strut_height
+ {\normalsrule
\s!width \zeropoint
- \normalexpanded{\math_strut_ht{\mathstylefont\normalmathstyle}}%
\s!depth \zeropoint
+ \s!fam \fam
+ \s!char \c_math_strut
\relax}
-\permanent\protected\def\math_strut_height_visual
- {\hskip-.01\emwidth
- \vrule
- \s!width .02\emwidth
- \normalexpanded{\math_strut_ht{\mathstylefont\normalmathstyle}}%
- \s!depth \zeropoint
- \relax
- \hskip-.01\emwidth}
-
-\permanent\protected\def\math_strut_depth_normal
- {\vrule
+\permanent\protected\def\math_strut_depth
+ {\normalsrule
\s!width \zeropoint
\s!height\zeropoint
- \normalexpanded{\math_strut_dp{\mathstylefont\normalmathstyle}}%
+ \s!fam \fam
+ \s!char \c_math_strut
\relax}
-\permanent\protected\def\math_strut_depth_visual
- {\hskip-.01\emwidth
- \vrule
- \s!width .02\emwidth
- \s!height\zeropoint
- \normalexpanded{\math_strut_dp{\mathstylefont\normalmathstyle}}%
- \relax
- \hskip-.01\emwidth}
-
\permanent\protected\def\showmathstruts % let's not overload \math_strut_normal
- {\enforced\let\math_strut \math_strut_visual
- \enforced\let\math_strut_height\math_strut_height_visual
- \enforced\let\math_strut_depth \math_strut_depth_visual}
-
-\let\math_strut \math_strut_normal
-\let\math_strut_height\math_strut_height_normal
-\let\math_strut_depth \math_strut_depth_normal
-
-% \protected\def\mathstrut{\mathcodecommand{nothing}{\math_strut}}
+ {\showmakeup[strut]}
\pushoverloadmode
-
- \definemathcommand [mathstrut] {\math_strut}
- \definemathcommand [mathheightstrut] {\math_strut_height}
- \definemathcommand [mathdepthstrut] {\math_strut_depth}
-
+ \permanent\protected\def\mathstrut {\math_strut}
+ \permanent\protected\def\mathheightstrut{\math_strut_height}
+ \permanent\protected\def\mathdepthstrut {\math_strut_depth}
\popoverloadmode
%D We could have a arg variant \unknown\ but not now.
@@ -887,8 +1444,8 @@
\let\math_tags_mo\firstofoneunexpanded
\let\math_tags_mi\firstofoneunexpanded
-\protected\def\math_tags_mn#1{\begingroup\mathupright\math_set_o_both#1\endgroup}
-\protected\def\math_tags_ms#1{\begingroup\mathupright\math_set_p_both#1\endgroup} % why not just \text
+\protected\def\math_tags_mn#1{\begingroup\math_upright\math_set_o_both#1\endgroup}
+\protected\def\math_tags_ms#1{\begingroup\math_upright\math_set_p_both#1\endgroup} % why not just \text
% Once this is stable we can store the number at the tex end which is
% faster. Functions getnumbers >= 1000.
@@ -901,52 +1458,72 @@
\c!functionstyle=, % rm ss etc i.e. known alternatives, otherwise math
\c!functioncolor=]
-\protected\def\math_mfunction_styled
+% \protected\def\math_mfunction_styled
+% {%\begingroup
+% \usemathematicscolorparameter\c!functioncolor
+% \edef\p_functionstyle{\mathematicsparameter\c!functionstyle}%
+% \ifempty\p_functionstyle
+% \expandafter\math_mfunction_styled_none
+% \orelse\ifcsname\??alternativestyle\p_functionstyle\endcsname
+% \expandafter\math_mfunction_styled_text
+% \else
+% \expandafter\math_mfunction_styled_math
+% \fi}
+%
+% \protected\def\math_mfunction_styled_text#1%
+% {\expandafter$\expandafter\mathoptext\expandafter{\lastnamedcs#1}$%
+% %{\normalexpanded{$\mathoptext{\csname\??alternativestyle\p_functionstyle\endcsname#1}$}%
+% }%\endgroup}
+%
+% \protected\def\math_mfunction_styled_math#1%
+% {\p_functionstyle
+% #1%
+% }%\endgroup}
+%
+% \protected\def\math_mfunction_styled_none#1%
+% {\math_upright
+% #1%
+% }%\endgroup}
+%
+% \permanent\protected\def\mfunction#1%
+% {\mathatom mathfont class \mathfunctioncode \bgroup
+% \math_tags_mfunctiontxt{#1}\c_apply_function
+% \hbox{\math_mfunction_styled{#1}}%
+% \egroup}
+%
+% \permanent\protected\def\mfunctionlabeltext#1%
+% {\mathatom mathfont class \mathfunctioncode \bgroup
+% \math_tags_mfunctionlab{#1}\c_apply_function
+% \hbox{\math_mfunction_styled{\mathlabeltext{#1}}}%
+% \egroup}
+
+\def\math_function_handle#1#2%
{\begingroup
\usemathematicscolorparameter\c!functioncolor
\edef\p_functionstyle{\mathematicsparameter\c!functionstyle}%
\ifempty\p_functionstyle
- \expandafter\math_mfunction_styled_none
+ \expandafter\math_upright
\orelse\ifcsname\??alternativestyle\p_functionstyle\endcsname
- \expandafter\math_mfunction_styled_text
+ \expandafter\lastnamedcs
\else
- \expandafter\math_mfunction_styled_math
- \fi}
-
-\protected\def\math_mfunction_styled_text#1%
- %{\mathoptext{\csname\??alternativestyle\p_functionstyle\endcsname#1}%
- {\expandafter\mathoptext\expandafter{\lastnamedcs#1}%
- \endgroup}
-
-\protected\def\math_mfunction_styled_math#1%
- {\p_functionstyle
- #1%
- \endgroup}
-
-\protected\def\math_mfunction_styled_none#1%
- {\mathupright
- #1%
- \endgroup}
-
-\permanent\protected\def\mfunction#1%
- {\begingroup
- \math_tags_mfunctiontxt{#1}\c_apply_function
- \math_mfunction_styled{#1}%
+ \expandafter\p_functionstyle
+ \fi
+ \mathatom mathfont class \mathfunctioncode \bgroup
+ \math_tags_mfunctionlab{#2}\c_apply_function % maybe move this before mathatom
+ #1{#2}%
+ \egroup
\endgroup}
-\permanent\protected\def\mfunctionlabeltext#1%
- {\begingroup
- \math_tags_mfunctionlab{#1}\c_apply_function
- \math_mfunction_styled{\mathlabeltext{#1}}%
- \endgroup}
+\permanent\protected\def\mfunction {\math_function_handle\firstofoneargument}
+\permanent\protected\def\mfunctionlabeltext{\math_function_handle\mathlabeltext}
\let\math_tags_mfunctiontxt\gobbletwoarguments
\let\math_tags_mfunctionlab\gobbletwoarguments
-\permanent\protected\def\math_tags_mo_indeed#1{\begingroup \c_attr_mathcategory\plusone #1\endgroup}
-\permanent\protected\def\math_tags_mi_indeed#1{\begingroup \c_attr_mathcategory\plustwo #1\endgroup}
-\permanent\protected\def\math_tags_mn_indeed#1{\begingroup\mathupright\c_attr_mathcategory\plusthree\math_set_o_both#1\endgroup}
-\permanent\protected\def\math_tags_ms_indeed#1{\begingroup\mathupright\c_attr_mathcategory\plusfour \math_set_p_both#1\endgroup} % todo: mathoptext
+\permanent\protected\def\math_tags_mo_indeed#1{\begingroup \c_attr_mathcategory\plusone #1\endgroup}
+\permanent\protected\def\math_tags_mi_indeed#1{\begingroup \c_attr_mathcategory\plustwo #1\endgroup}
+\permanent\protected\def\math_tags_mn_indeed#1{\begingroup\math_upright\c_attr_mathcategory\plusthree\math_set_o_both#1\endgroup}
+\permanent\protected\def\math_tags_ms_indeed#1{\begingroup\math_upright\c_attr_mathcategory\plusfour \math_set_p_both#1\endgroup} % todo: mathoptext
\newconditional\c_apply_function
@@ -1063,7 +1640,7 @@
\activatemathcharacter\underscoreasciicode
\activatemathcharacter\ampersandasciicode
-\permanent\def\normalmathaligntab{&} % \let\normalmathaligntab\aligntab does to work well in a let to & (a def works ok)
+\permanent\def\normalmathaligntab{&} % \let\normalmathaligntab\aligntab doesn;t work well in a let to & (a def works ok)
\appendtoks
\edef\p_ampersand{\mathematicsparameter\s!ampersand}%
@@ -1773,6 +2350,8 @@
\bgroup
+ % This can adn will be replaced by classes:
+
\catcode\c_math_comma \activecatcode
\catcode\c_math_period \activecatcode
\catcode\c_math_semicolon\activecatcode
@@ -1902,20 +2481,24 @@
% 7 = crampedscriptscript
\permanent\def\uncramped#1%
- {{\ifmathstyle
+ {\beginmathgroup
+ \ifmathstyle
\or \displaystyle \or
\or \textstyle \or
\or \scriptstyle \or
\or \scriptscriptstyle \fi
- #1}}
+ #1%
+ \endmathgroup}
\permanent\def\cramped#1%
- {{\ifmathstyle
+ {\beginmathgroup
+ \ifmathstyle
\crampeddisplaystyle \or \or % 0 -> 1
\crampedtextstyle \or \or % 2 -> 3
\crampedscriptstyle \or \or % 4 -> 5
\crampedscriptscriptstyle \fi % 6 -> 7
- #1}}
+ #1%
+ \endmathgroup}
\permanent\def\triggermathstyle#1{\Ustyle\numexpr#1\relax}
%permanent\def\mathstyletrigger#1{\numexpr#1\relax}
@@ -1986,6 +2569,9 @@
\textface
\fi}
+% \permanent\def\mathstyleface#1% #1 is number (\normalmathstyle)
+% {\mathstylefont#1\relax}
+
\permanent\def\mathsmallstyleface#1% #1 is number (\normalmathstyle)
{\ifcase\numexpr#1\relax
\scriptface \or
@@ -1999,6 +2585,19 @@
\scriptface
\fi}
+% \permanent\def\mathsmallstyleface#1% #1 is number (\normalmathstyle)
+% {\mathstylefont\ifcase\numexpr#1\relax
+% \scriptstyle \or
+% \scriptstyle \or
+% \scriptstyle \or
+% \scriptstyle \or
+% \scriptscriptstyle \or
+% \scriptscriptstyle \or
+% \scriptscriptstyle \or
+% \scriptscriptstyle \else
+% \scriptstyle
+% \fi}
+
\permanent\def\mathstylecommand#1#2#3%
{\ifcase\numexpr\normalmathstyle\relax
\expandafter#1\or
@@ -2570,7 +3169,7 @@
\mathscriptboxmode \plustwo % lists and boxes
\mathscriptcharmode \plusone % lists and boxes
%mathscriptboxmode \plusthree % lists and boxes with \boundary=1 (also for testing and demo)
-\mathrulethicknessmode\plusone % adaptive
+%mathrulethicknessmode\plusone % adaptive
\permanent\protected\def\mathtext {\mathortext{\math_text_choice_font\relax}\hbox}
\permanent\protected\def\mathword {\mathortext{\math_text_choice_word\relax}\hbox}
@@ -3132,28 +3731,41 @@
\installcorenamespace{mathspacing}
-\protected\def\math_spacing_set#1#2% maybe some day \allmathstyles
- {\relax
- #1\displaystyle #2%
- #1\crampeddisplaystyle#2%
- #1\textstyle #2%
- #1\scriptstyle #2%
- #1\crampedscriptstyle #2%
- #1\scriptstyle #2%
- #1\crampedscriptstyle #2%
- \relax}
+% \protected\def\math_spacing_set#1#2% maybe some day \allmathstyles
+% {\relax
+% #1\displaystyle #2%
+% #1\crampeddisplaystyle#2%
+% #1\textstyle #2%
+% #1\scriptstyle #2%
+% #1\crampedscriptstyle #2%
+% #1\scriptstyle #2%
+% #1\crampedscriptstyle #2%
+% \relax}
+%
+% \permanent\tolerant\protected\def\definemathspacing[#1]#*[#2]#*[#3]%
+% {\ifcstok{#2}\v!horizontal
+% \edefcsname\??mathspacing#1\endcsname
+% {\math_spacing_set\Umathxscale{\ifchknum#3\or#3\else\plusthousand\fi\relax}}%
+% \orelse\ifcstok{#2}\v!vertical
+% \edefcsname\??mathspacing#1\endcsname
+% {\math_spacing_set\Umathyscale{\ifchknum#3\or#3\else\plusthousand\fi\relax}}%
+% \else
+% \edefcsname\??mathspacing#1\endcsname
+% {\math_spacing_set\Umathxscale{\ifchknum#2\or\number#2\else\plusthousand\fi\relax}%
+% \math_spacing_set\Umathyscale{\ifchknum#3\or\number#3\orelse\ifchknum#2\or\number#2\else\plusthousand\fi\relax}}%
+% \fi}
\permanent\tolerant\protected\def\definemathspacing[#1]#*[#2]#*[#3]%
{\ifcstok{#2}\v!horizontal
\edefcsname\??mathspacing#1\endcsname
- {\math_spacing_set\Umathxscale{\ifchknum#3\or#3\else\plusthousand\fi\relax}}%
+ {\Umathxscale\allmathstyles\ifchknum#3\or#3\else\plusthousand\fi\relax}%
\orelse\ifcstok{#2}\v!vertical
\edefcsname\??mathspacing#1\endcsname
- {\math_spacing_set\Umathyscale{\ifchknum#3\or#3\else\plusthousand\fi\relax}}%
+ {\Umathyscale\allmathstyles\ifchknum#3\or#3\else\plusthousand\fi\relax}%
\else
\edefcsname\??mathspacing#1\endcsname
- {\math_spacing_set\Umathxscale{\ifchknum#2\or\number#2\else\plusthousand\fi\relax}%
- \math_spacing_set\Umathyscale{\ifchknum#3\or\number#3\orelse\ifchknum#2\or\number#2\else\plusthousand\fi\relax}}%
+ {\Umathxscale\allmathstyles\ifchknum#2\or\number#2\else\plusthousand\fi\relax
+ \Umathyscale\allmathstyles\ifchknum#3\or\number#3\orelse\ifchknum#2\or\number#2\else\plusthousand\fi\relax}%
\fi}
\definemathspacing[\v!normal] [1000] [1000]
@@ -3167,6 +3779,66 @@
\permanent\protected\def\setupmathspacing[#1]%
{\begincsname\??mathspacing#1\endcsname}
+\installcorenamespace {mathclasses}
+
+% \defcsname\??mathspacing +\endcsname
+% {\expandedloop\zerocount\plusseven\plusone
+% {\Umathxscale
+% \the\currentloopiterator
+% \numexpr\Umathxscale\the\currentloopiterator+\plushundred\relax
+% \Umathyscale
+% \the\currentloopiterator
+% \numexpr\Umathxscale\the\currentloopiterator+\plushundred\relax}}
+%
+% \defcsname\??mathspacing -\endcsname
+% {\expandedloop\zerocount\plusseven\plusone
+% {\Umathxscale
+% \the\currentloopiterator
+% \numexpr\Umathxscale\the\currentloopiterator-\plushundred\relax
+% \Umathyscale
+% \the\currentloopiterator
+% \numexpr\Umathxscale\the\currentloopiterator-\plushundred\relax}}
+
+% can become a lua call that globally defined it, then we can have
+% partials
+
+% todo: fences and stackers should be done the same: number or
+% name
+
+\letcsname\??mathclasses \endcsname\normalmathord
+\letcsname\??mathclasses ord\endcsname\normalmathord
+\letcsname\??mathclasses ordinary\endcsname\normalmathord
+\letcsname\??mathclasses op\endcsname\normalmathop
+\letcsname\??mathclasses operator\endcsname\normalmathop
+\letcsname\??mathclasses rel\endcsname\normalmathrel
+\letcsname\??mathclasses relation\endcsname\normalmathrel
+\letcsname\??mathclasses bin\endcsname\normalmathbin
+\letcsname\??mathclasses binary\endcsname\normalmathbin
+\letcsname\??mathclasses punct\endcsname\normalmathbin
+\letcsname\??mathclasses punctuation\endcsname\normalmathbin
+\letcsname\??mathclasses frac\endcsname\normalmathfrac
+\letcsname\??mathclasses fraction\endcsname\normalmathfrac
+\letcsname\??mathclasses rad\endcsname\normalmathrad
+\letcsname\??mathclasses radical\endcsname\normalmathrad
+
+\def\math_class_by_parameter#1%
+ {\normalexpanded{\noexpand\math_class_by_parameter_indeed{#1\c!mathclass}}}
+
+\def\math_class_by_parameter_indeed#1%
+ {\csname\??mathclasses\ifcsname\??mathclasses#1\endcsname#1\fi\endcsname}
+
+%D For now we define this here:
+
+\ifdefined\d \let\text_d\d \else \let\text_d\firstofoneargument \fi
+
+\pushoverloadmode
+
+ \permanent\protected\def\math_d{\mathatom unpack \mathdifferentialcode{d}}
+
+ \permanent\protected\def\d{\mathortext\math_d\text_d}
+
+\popoverloadmode
+
\protect \endinput
% % not used (yet)
diff --git a/tex/context/base/mkxl/math-int.mkxl b/tex/context/base/mkxl/math-int.mkxl
index 462c6587b..30d9643cf 100644
--- a/tex/context/base/mkxl/math-int.mkxl
+++ b/tex/context/base/mkxl/math-int.mkxl
@@ -13,29 +13,10 @@
\writestatus{loading}{ConTeXt Math Macros / Integrals}
-% todo: int and sum etc can be stackers
+%D This is replaced by the operator module.
\unprotect
-%D \startbuffer
-%D $\int _a^b f(x) dx $ and also
-%D $\iint _a^b f(x,y) dxdy$,
-%D $\iiint _a^b f(x,y) dxdy$,
-%D \startformula
-%D \int _a^b f(x) dx \quad
-%D \iint _a^b f(x) dx \quad
-%D \iiint _a^b f(x) dx \quad
-%D \stopformula
-%D \stopbuffer
-%D
-%D Default: \getbuffer
-%D
-%D Displaylimits: \setupmathematics[integral=displaylimits] \getbuffer
-%D
-%D Limits: \setupmathematics[integral=limits] \getbuffer
-
-%D Adapted to mkiv by HH from code by AM.
-
\installcorenamespace{mathintegral}
\newconstant\mathintlimitmode
@@ -64,78 +45,16 @@
\letcsname\??mathintegral none\endcsname\plusfour
\appendtoks
- \mathintlimitmode\executeifdefined{\??mathintegral\mathematicsparameter\s!integral}\zerocount
+ \mathintlimitmode
+ \ifcsname\??mathintegral\mathematicsparameter\s!integral\endcsname
+ \lastnamedcs
+ \else
+ \zerocount
+ \fi
\to \everyswitchmathematics
\setupmathematics
-% [\v!integral=nolimits]
- [\v!integral=autolimits]
-
-%D The following code is used for fallbacks and might become obsolete once
-%D we have enough \OPENTYPE\ math fonts.
-
-% \def\math_repeated_integal_i
-% {\int}
-
-% \def\math_repeated_integal_ii
-% {\math_repeated_integal_i
-% \math_repeated_integral_kern
-% \math_repeated_integal_i
-% \math_repeat_integral_finish
-% \intlimits}
-
-% \def\math_repeated_integal_iii
-% {\math_repeated_integal_i
-% \math_repeated_integral_kern
-% \math_repeated_integal_ii}
-%
-% \def\math_repeated_integal_iiii
-% {\math_repeated_integal_i
-% \math_repeated_integral_kern
-% \math_repeated_integal_iii}
-%
-% \protected\def\math_repeat_integral#1%
-% {\let\math_repeat_integral_finish\donothing
-% \iffontchar\textfont\zerocount#1\relax
-% \expandafter\math_repeat_integral_real
-% \else
-% \expandafter\math_repeat_integral_fake
-% \fi}
-%
-% \def\math_repeat_integral_fake#1#2%
-% {\let\math_repeat_integral_fake_symbol#2%
-% \futurelet\next\math_repeat_integral_fake_indeed}
-%
-% \def\math_repeat_integral_real#1#2%
-% {#1}
-%
-% \definemathcommand [iint] {\math_repeat_integral{"0222C}\normalint \math_repeated_integal_ii } % double
-% \definemathcommand [iiint] {\math_repeat_integral{"0222D}\normaliint \math_repeated_integal_iii } % tripple
-% \definemathcommand [iiiint] {\math_repeat_integral{"FFFFF}\normaliiint\math_repeated_integal_iiii} % quadruple
-%
-% \def\math_repeated_integral_kern
-% {\mkern-6mu\mathchoice{\mkern-3mu}{}{}{}}
-%
-% \def\math_repeat_integral_fake_indeed
-% {\ifx\next\limits
-% \math_repeated_integral_correction
-% \orelse\ifx\next\displaylimits
-% \math_repeated_integral_correction
-% \orelse\ifx\next\nolimits
-% % nothing
-% \orelse\ifcase\mathintlimitmode
-% % nothing
-% \else
-% \math_repeated_integral_correction
-% \fi
-% \math_repeat_integral_fake_symbol}
-%
-% \def\math_repeated_integral_correction
-% {\mkern-7mu\mathchoice{\mkern-2mu}{}{}{}%
-% \mathop\bgroup\mkern7mu\mathchoice{\mkern2mu}{}{}{}\let\math_repeat_integral_finish\egroup}
-%
-% %D If the \type{\limits} option is used after \type {\iint}, use \type
-% %D {\mathop} and fudge the left hand space a bit to make the subscript
-% %D visually centered.
+% [\c!integral=nolimits]
+ [\c!integral=autolimits]
\protect \endinput
diff --git a/tex/context/base/mkxl/math-lop.mkxl b/tex/context/base/mkxl/math-lop.mkxl
new file mode 100644
index 000000000..c860b1318
--- /dev/null
+++ b/tex/context/base/mkxl/math-lop.mkxl
@@ -0,0 +1,143 @@
+%D \module
+%D [ file=math-lop,
+%D version=2022.02.10,
+%D title=\CONTEXT\ Math Macros,
+%D subtitle=Large operators,
+%D author={Hans Hagen & Mikael Sundqvist},
+%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 / Large Operators}
+
+% $\textstyle \Uoperator \Udelimiter "0 \fam "222B {t} {b} {x}$\blank
+% $\textstyle \Uoperator \Udelimiter "0 \fam "222B {t} {b} {\frac{1}{x}}$\blank
+% $\displaystyle x + \Uoperator \Udelimiter "0 \fam "222B {t} {b} {\frac{1}{x}}$\blank
+% $ x + \Uoperator nolimits \Udelimiter "0 \fam "222B {t} {b} {\frac{1}{x}}$\blank
+% $ x + \Uoperator limits \Udelimiter "0 \fam "222B {t} {b} {\frac{1}{x}}$\blank
+
+\unprotect
+
+\installcorenamespace{mathoperators}
+\installcorenamespace{mathoperatormethod}
+
+\installcommandhandler \??mathoperators {mathoperator} \??mathoperators
+
+\setupmathoperator
+ [\c!left=\zerocount]% so we always have something
+
+\aliased\let\setupmathoperators\setupmathoperator
+
+\appendtoks
+ % todo: only define when there's left or right
+ \protected\instance\edefcsname\currentmathoperator\endcsname{\math_operator{\currentmathoperator}}%
+ % todo: under definition control
+ \protected\instance\edefcsname\e!start\currentmathoperator\endcsname{\math_operator_start{\currentmathoperator}}%
+ \protected\instance\edefcsname\e!stop \currentmathoperator\endcsname{\math_operator_stop}%
+\to \everydefinemathoperator
+
+% more generic:
+
+\defcsname\??mathoperatormethod\v!horizontal\endcsname{nolimits }
+\defcsname\??mathoperatormethod\v!vertical \endcsname{limits }
+
+% The ones we wlready had:
+
+\letcsname\??mathoperatormethod \v!auto\endcsname\empty
+\letcsname\??mathoperatormethod autolimits\endcsname\empty
+\letcsname\??mathoperatormethod nolimits\expandafter\endcsname\csname\??mathoperatormethod\v!horizontal\endcsname
+\letcsname\??mathoperatormethod limits\expandafter\endcsname\csname\??mathoperatormethod\v!vertical \endcsname
+
+\installlocalcurrenthandler\??mathoperators {mathoperator}
+
+\protected\def\math_operator_operator#1#2%
+ {\setlocalmathoperatorcurrent{#1}% \edef\currentmathoperator{#1}%
+ \setupcurrentmathoperator[#2]%
+ \Uoperator
+ \usedcolorparameterattributes{\mathoperatorparameter\c!color}%
+ \begincsname\??mathoperatormethod\mathoperatorparameter\c!method\endcsname
+ \ifchkdim\mathoperatorparameter\c!size\or
+ \s!depth \mathoperatorparameter\c!size
+ \s!height\mathoperatorparameter\c!size
+ \s!axis
+ \orelse\ifcstok{\mathoperatorparameter\c!size}\v!auto
+ \s!auto
+ \fi
+ \s!class \mathoperatorcode
+ % todo: find a way to pick up or pass sup/sub to here
+ \Udelimiter \zerocount \fam \mathoperatorparameter\c!left
+ {\edef\m_operator_text{\mathoperatorparameter\c!top}%
+ \ifempty\m_operator_text\else
+ \mathstrut % todo: make option
+ \dousecolorparameter{\mathoperatorparameter\c!topcolor}
+ \m_operator_text
+ \fi}%
+ {\edef\m_operator_text{\mathoperatorparameter\c!bottom}%
+ \ifempty\m_operator_text\else
+ \mathstrut % todo: make option
+ \dousecolorparameter{\mathoperatorparameter\c!bottomcolor}
+ \m_operator_text
+ \fi}}
+
+\tolerant\protected\def\math_operator#1#*[#2]#*#:#=% mandate braces
+ {\math_operator_operator{#1}{#2}#3\Uright.}
+
+\tolerant\protected\def\math_operator_start#1#*[#2]%
+ {\math_operator_operator{#1}{#2}}
+
+\protected\def\math_operator_stop
+ {\Uright.}
+% {\Uright\Udelimiter\zerocount \fam \zerocount }
+
+% \def\math_operator_default_size % is now the auto option
+% {\ifconditional\indisplaymath\ifcase\Umathoperatorsize=\maxdimen\else
+% \Umathoperatorsize\displaystyle
+% \fi\fi}
+
+% TODO: Add 4 (inherited) classes and then define them automatically from char-def
+% instead.
+
+\setupmathoperators [integrals] [\c!size=\v!auto,\c!method=\mathematicsparameter\c!integral] % cf Mikael's wish
+\setupmathoperators [summations] [\c!size=\v!auto]
+\setupmathoperators [products] [\c!size=\v!auto]
+\setupmathoperators [operators] [\c!size=\v!auto]
+
+\definemathoperator [integral] [integrals] [\c!left="222B] % these might go unless we decide
+\definemathoperator [iintegral] [integrals] [\c!left="222C] % to have verbose parents but who
+\definemathoperator [iiintegral] [integrals] [\c!left="222D] % will use them
+
+\definemathoperator [int] [integrals] [\c!left="222B] % INTEGRAL
+\definemathoperator [iint] [integrals] [\c!left="222C] % DOUBLE INTEGRAL
+\definemathoperator [iiint] [integrals] [\c!left="222D] % TRIPLE INTEGRAL
+\definemathoperator [iiiint] [integrals] [\c!left="2A0C] % QUADRUPLE INTEGRAL OPERATOR
+\definemathoperator [oint] [integrals] [\c!left="222E] % CONTOUR INTEGRAL
+\definemathoperator [oiint] [integrals] [\c!left="222F] % SURFACE INTEGRAL
+\definemathoperator [oiiint] [integrals] [\c!left="2230] % VOLUME INTEGRAL
+\definemathoperator [intc] [integrals] [\c!left="2231] % CLOCKWISE INTEGRAL
+\definemathoperator [ointc] [integrals] [\c!left="2232] % CLOCKWISE CONTOUR INTEGRAL
+\definemathoperator [aointc] [integrals] [\c!left="2233] % ANTI CLOCKWISE CONTOUR INTEGRAL
+
+\definemathoperator [sum] [summations] [\c!left="2211] % N-ARY SUMMATION
+
+\definemathoperator [prod] [products] [\c!left="220F] % N-ARY PRODUCT
+\definemathoperator [coprod] [products] [\c!left="2210] % N-ARY COPRODUCT
+
+% todo: middles too
+
+\definemathoperator [bigwedge] [operators] [\c!left="22C0] % N-ARY LOGICAL AND
+\definemathoperator [bigvee] [operators] [\c!left="22C1] % N-ARY LOGICAL OR
+\definemathoperator [bigcap] [operators] [\c!left="22C2] % N-ARY LOGICAL INTERSECTION
+\definemathoperator [bigcup] [operators] [\c!left="22C3] % N-ARY UNION
+\definemathoperator [bigodot] [operators] [\c!left="2A00] % N-ARY CIRCLED DOT OPERATOR
+\definemathoperator [bigoplus] [operators] [\c!left="2A01] % N-ARY CIRCLED PLUS OPERATOR
+\definemathoperator [bigotimes] [operators] [\c!left="2A02] % N-ARY CIRCLED TIMES OPERATOR
+\definemathoperator [bigudot] [operators] [\c!left="2A03] % N-ARY UNION OPERATOR WITH DOT
+\definemathoperator [biguplus] [operators] [\c!left="2A04] % N-ARY UNION OPERATOR WITH PLUS
+\definemathoperator [bigsqcap] [operators] [\c!left="2A05] % N-ARY SQUARE INTERSECTION OPERATOR
+\definemathoperator [bigsqcup] [operators] [\c!left="2A06] % N-ARY SQUARE UNION OPERATOR
+\definemathoperator [bigtimes] [operators] [\c!left="2A09] % N-ARY TIMES OPERATOR
+
+\protect \endinput
diff --git a/tex/context/base/mkxl/math-noa.lmt b/tex/context/base/mkxl/math-noa.lmt
index 3699ae03c..e035a9f68 100644
--- a/tex/context/base/mkxl/math-noa.lmt
+++ b/tex/context/base/mkxl/math-noa.lmt
@@ -7,6 +7,9 @@ if not modules then modules = { } end modules ['math-noa'] = {
license = "see context related readme files"
}
+-- if specials and (specials[1] == "char" or specials[1] == "font") then -- can we avoid this
+-- ... better create a reverse mapping from the already present vectors
+
-- beware: this is experimental code and there will be a more generic (attribute value
-- driven) interface too but for the moment this is ok (sometime in 2015-2016 i will
-- start cleaning up as by then the bigger picture is clear and code has been used for
@@ -108,6 +111,7 @@ local setattrlist = nuts.setattrlist
local setwidth = nuts.setwidth
local setheight = nuts.setheight
local setdepth = nuts.setdepth
+local setoptions = nuts.setoptions
local getfield = nuts.getfield
local getnext = nuts.getnext
@@ -185,19 +189,22 @@ local nodecodes = nodes.nodecodes
local noadcodes = nodes.noadcodes
local fencecodes = nodes.fencecodes
-local ordinarynoad_code = noadcodes.ordinary
-local operatornoad_code = noadcodes.operator
-local binarynoad_code = noadcodes.binary
-local relationnoad_code = noadcodes.relation
-local opennoad_code = noadcodes.open
-local closenoad_code = noadcodes.close
+local ordinarynoad_code = noadcodes.ordinary
+local operatornoad_code = noadcodes.operator
+local binarynoad_code = noadcodes.binary
+local relationnoad_code = noadcodes.relation
+local opennoad_code = noadcodes.open
+local closenoad_code = noadcodes.close
+local middlenoad_code = noadcodes.middle
local punctuationnoad_code = noadcodes.punctuation
-local innernoad_code = noadcodes.inner
-local undernoad_code = noadcodes.under
-local overnoad_code = noadcodes.over
-local vcenternoad_code = noadcodes.vcenter
-local fractionnoad_code = noadcodes.fraction
-local radicalnoad_code = noadcodes.radical
+local innernoad_code = noadcodes.inner
+local fencednoad_code = noadcodes.fenced
+local undernoad_code = noadcodes.under
+local overnoad_code = noadcodes.over
+local vcenternoad_code = noadcodes.vcenter
+local fractionnoad_code = noadcodes.fraction
+local radicalnoad_code = noadcodes.radical
+local accentnoad_code = noadcodes.accent
local noad_code = nodecodes.noad
local accent_code = nodecodes.accent
@@ -230,6 +237,8 @@ local rightfence_code = fencecodes.right
-- local gf = getfield local gt = setmetatableindex("number") getfield = function(n,f) gt[f] = gt[f] + 1 return gf(n,f) end mathematics.GETFIELD = gt
-- local sf = setfield local st = setmetatableindex("number") setfield = function(n,f,v) st[f] = st[f] + 1 sf(n,f,v) end mathematics.SETFIELD = st
+-- TODO : get rid of done
+
local function process(start,what,n,parent)
if n then
@@ -280,10 +289,9 @@ local function process(start,what,n,parent)
local noad = getnucleus(start) if noad then process(noad,what,n,start) end -- list
noad = getsup (start) if noad then process(noad,what,n,start) end -- list
noad = getsub (start) if noad then process(noad,what,n,start) end -- list
- if getsubpre then
noad = getsuppre (start) if noad then process(noad,what,n,start) end -- list
noad = getsubpre (start) if noad then process(noad,what,n,start) end -- list
- end
+ noad = getfield(start,"prime") if noad then process(noad,what,n,start) end -- list
elseif id == mathchar_code or id == mathtextchar_code or id == delimiter_code then
break
elseif id == subbox_code or id == submlist_code then
@@ -300,24 +308,24 @@ local function process(start,what,n,parent)
noad = getfield(start,"scriptscript") if noad then process(noad,what,n,start) end -- list
elseif id == fence_code then
local noad = getfield(start,"delimiter") if noad then process(noad,what,n,start) end -- delimiter
+ noad = getfield(start,"top") if noad then process(noad,what,n,start) end -- list
+ noad = getfield(start,"bottom") if noad then process(noad,what,n,start) end -- list
elseif id == radical_code then
local noad = getnucleus(start) if noad then process(noad,what,n,start) end -- list
noad = getsup (start) if noad then process(noad,what,n,start) end -- list
noad = getsub (start) if noad then process(noad,what,n,start) end -- list
- if getsubpre then
noad = getsuppre (start) if noad then process(noad,what,n,start) end -- list
noad = getsubpre (start) if noad then process(noad,what,n,start) end -- list
- end
+ noad = getfield(start,"prime") if noad then process(noad,what,n,start) end -- delimiter
noad = getfield(start,"left") if noad then process(noad,what,n,start) end -- delimiter
noad = getfield(start,"degree") if noad then process(noad,what,n,start) end -- list
elseif id == accent_code then
local noad = getnucleus(start) if noad then process(noad,what,n,start) end -- list
noad = getsup (start) if noad then process(noad,what,n,start) end -- list
noad = getsub (start) if noad then process(noad,what,n,start) end -- list
- if getsubpre then
noad = getsuppre (start) if noad then process(noad,what,n,start) end -- list
noad = getsubpre (start) if noad then process(noad,what,n,start) end -- list
- end
+ noad = getfield(start,"prime") if noad then process(noad,what,n,start) end -- list
noad = getfield(start,"topaccent") if noad then process(noad,what,n,start) end -- list
noad = getfield(start,"botaccent") if noad then process(noad,what,n,start) end -- list
-- elseif id == style_code then
@@ -341,10 +349,9 @@ local function processnested(current,what,n)
noad = getnucleus(current) if noad then process(noad,what,n,current) end -- list
noad = getsup (current) if noad then process(noad,what,n,current) end -- list
noad = getsub (current) if noad then process(noad,what,n,current) end -- list
- if getsubpre then
noad = getsuppre (current) if noad then process(noad,what,n,current) end -- list
noad = getsubpre (current) if noad then process(noad,what,n,current) end -- list
- end
+ noad = getfield (current,"prime") if noad then process(noad,what,n,current) end -- list
elseif id == subbox_code or id == submlist_code then
noad = getlist(current) if noad then process(noad,what,n,current) end -- list (not getlist !)
elseif id == fraction_code then
@@ -359,24 +366,24 @@ local function processnested(current,what,n)
noad = getfield(current,"scriptscript") if noad then process(noad,what,n,current) end -- list
elseif id == fence_code then
noad = getfield(current,"delimiter") if noad then process(noad,what,n,current) end -- delimiter
+ noad = getfield(current,"top") if noad then process(noad,what,n,current) end -- list
+ noad = getfield(current,"bottom") if noad then process(noad,what,n,current) end -- list
elseif id == radical_code then
noad = getnucleus(current) if noad then process(noad,what,n,current) end -- list
noad = getsup (current) if noad then process(noad,what,n,current) end -- list
noad = getsub (current) if noad then process(noad,what,n,current) end -- list
- if getsubpre then
noad = getsuppre (current) if noad then process(noad,what,n,current) end -- list
noad = getsubpre (current) if noad then process(noad,what,n,current) end -- list
- end
+ noad = getfield(current,"prime") if noad then process(noad,what,n,current) end -- list
noad = getfield(current,"left") if noad then process(noad,what,n,current) end -- delimiter
noad = getfield(current,"degree") if noad then process(noad,what,n,current) end -- list
elseif id == accent_code then
noad = getnucleus(current) if noad then process(noad,what,n,current) end -- list
noad = getsup (current) if noad then process(noad,what,n,current) end -- list
noad = getsub (current) if noad then process(noad,what,n,current) end -- list
- if getsubpre then
noad = getsuppre (current) if noad then process(noad,what,n,current) end -- list
noad = getsubpre (current) if noad then process(noad,what,n,current) end -- list
- end
+ noad = getfield(current,"prime") if noad then process(noad,what,n,current) end -- list
noad = getfield(current,"topaccent") if noad then process(noad,what,n,current) end -- list
noad = getfield(current,"botaccent") if noad then process(noad,what,n,current) end -- list
end
@@ -389,10 +396,9 @@ local function processstep(current,process,n,id)
noad = getnucleus(current) if noad then process(noad,n,current) end -- list
noad = getsup (current) if noad then process(noad,n,current) end -- list
noad = getsub (current) if noad then process(noad,n,current) end -- list
- if getsubpre then
noad = getsuppre (current) if noad then process(noad,n,current) end -- list
noad = getsubpre (current) if noad then process(noad,n,current) end -- list
- end
+ noad = getfield (current,"prime") if noad then process(noad,n,current) end -- list
elseif id == subbox_code or id == submlist_code then
noad = getlist(current) if noad then process(noad,n,current) end -- list (not getlist !)
elseif id == fraction_code then
@@ -407,24 +413,24 @@ local function processstep(current,process,n,id)
noad = getfield(current,"scriptscript") if noad then process(noad,n,current) end -- list
elseif id == fence_code then
noad = getfield(current,"delimiter") if noad then process(noad,n,current) end -- delimiter
+ noad = getfield(current,"top") if noad then process(noad,n,current) end -- list
+ noad = getfield(current,"bottom") if noad then process(noad,n,current) end -- list
elseif id == radical_code then
noad = getnucleus(current) if noad then process(noad,n,current) end -- list
noad = getsup (current) if noad then process(noad,n,current) end -- list
noad = getsub (current) if noad then process(noad,n,current) end -- list
- if getsubpre then
noad = getsuppre (current) if noad then process(noad,n,current) end -- list
noad = getsubpre (current) if noad then process(noad,n,current) end -- list
- end
+ noad = getfield(current,"prime") if noad then process(noad,n,current) end -- delimiter
noad = getfield(current,"left") if noad then process(noad,n,current) end -- delimiter
noad = getfield(current,"degree") if noad then process(noad,n,current) end -- list
elseif id == accent_code then
noad = getnucleus(current) if noad then process(noad,n,current) end -- list
noad = getsup (current) if noad then process(noad,n,current) end -- list
noad = getsub (current) if noad then process(noad,n,current) end -- list
- if getsubpre then
noad = getsuppre (current) if noad then process(noad,n,current) end -- list
noad = getsubpre (current) if noad then process(noad,n,current) end -- list
- end
+ noad = getfield(current,"prime") if noad then process(noad,n,current) end -- list
noad = getfield(current,"topaccent") if noad then process(noad,n,current) end -- list
noad = getfield(current,"botaccent") if noad then process(noad,n,current) end -- list
end
@@ -837,40 +843,44 @@ end
do
+ -- todo: use registerattribute
+
local a_mathsize = privateattribute("mathsize") -- this might move into other fence code
local resize = { }
resize[fence_code] = function(pointer)
local subtype = getsubtype(pointer)
- if subtype == leftfence_code or subtype == rightfence_code then
+ -- if subtype == leftfence_code or subtype == rightfence_code then
local a = getattr(pointer,a_mathsize)
if a and a > 0 then
local method = div(a,100)
local size = a % 100
setattr(pointer,a_mathsize,0)
local delimiter = getfield(pointer,"delimiter")
- local chr, fnt, fam = getcharspec(delimiter)
- if chr > 0 and fnt > 0 then
- local data = fontdata[fnt]
- local char = mathematics.big(data,chr,size,method)
- local ht = getheight(pointer)
- local dp = getdepth(pointer)
- if ht == 1 or dp == 1 then -- 1 scaled point is a signal
- local chardata = data.characters[char]
- if ht == 1 then
- setheight(pointer,chardata.height)
+ if delimiter then
+ local chr, fnt, fam = getcharspec(delimiter)
+ if chr > 0 and fnt > 0 then
+ local data = fontdata[fnt]
+ local char = mathematics.big(data,chr,size,method)
+ local ht = getheight(pointer)
+ local dp = getdepth(pointer)
+ if ht == 1 or dp == 1 then -- 1 scaled point is a signal
+ local chardata = data.characters[char]
+ if ht == 1 then
+ setheight(pointer,chardata.height)
+ end
+ if dp == 1 then
+ setdepth(pointer,chardata.depth)
+ end
end
- if dp == 1 then
- setdepth(pointer,chardata.depth)
+ if trace_fences then
+ report_fences("replacing %C by %C using method %a and size %a",chr,char,method,size)
end
+ setchar(delimiter,char)
end
- if trace_fences then
- report_fences("replacing %C by %C using method %a and size %a",chr,char,method,size)
- end
- setchar(delimiter,char)
end
end
- end
+ -- end
end
function handlers.resize(head,style,penalties)
@@ -930,7 +940,7 @@ do
-- f_c or "?"
-- )
local list = new_submlist()
- setsubtype(noad,innernoad_code)
+ setsubtype(noad,fencednoad_code)
setnucleus(noad,list)
setlist(list,f_o)
setlink(f_o,o_next) -- prev of list is nil
@@ -993,8 +1003,8 @@ do
local f_c = makefence(rightfence_code,close)
local c_prev = getprev(close)
local f_next = getnext(first)
- makelist(middle, close, f_o,f_next,c_prev,f_c)
- -- close is now a list
+ makelist(middle,close,f_o,f_next,c_prev,f_c)
+ -- close is now a list : inner but should be fenced
if c_prev ~= first then
setlink(first,close)
end
@@ -1003,7 +1013,7 @@ do
local stacks = setmetatableindex("table")
- -- 1=open 2=close 3=middle 4=both
+ -- 1=open 2=close 3=middle 4=both : todo check both
local function processfences(pointer,n,parent)
local current = pointer
@@ -1811,14 +1821,17 @@ do
[binarynoad_code] = true, -- new
[relationnoad_code] = true,
[opennoad_code] = true, -- new
+ [middlenoad_code] = true, -- new
[closenoad_code] = true, -- new
[punctuationnoad_code] = true, -- new
[innernoad_code] = false,
+ [fencednoad_code] = false,
[undernoad_code] = false,
[overnoad_code] = false,
[vcenternoad_code] = false,
- [fractionnoad_code] = false,
+ [fractionnoad_code] = true,
[radicalnoad_code] = false,
+ [accentnoad_code] = true,
}
local reported = setmetatableindex("table")
@@ -1928,111 +1941,64 @@ do
end
do
- -- inner under over vcenter
+ -- todo: make a primes class
local fixscripts = { }
--- local movesub = {
--- -- primes
--- [0x2032] = 0xFE932,
--- [0x2033] = 0xFE933,
--- [0x2034] = 0xFE934,
--- [0x2057] = 0xFE957,
--- -- reverse primes
--- [0x2035] = 0xFE935,
--- [0x2036] = 0xFE936,
--- [0x2037] = 0xFE937,
--- }
---
--- mathematics.virtualize(movesub)
- local movesub = {
+ local primes = {
-- primes
- [0x2032] = 0x2032,
- [0x2033] = 0x2033,
- [0x2034] = 0x2034,
- [0x2057] = 0x2057,
+ [0x2032] = true,
+ [0x2033] = true,
+ [0x2034] = true,
+ [0x2057] = true,
-- reverse primes
- [0x2035] = 0x2035,
- [0x2036] = 0x2036,
- [0x2037] = 0x2037,
+ [0x2035] = true,
+ [0x2036] = true,
+ [0x2037] = true,
}
- local nosuperscript_code = tex.mathoptioncodes.nosuperscript
-
- local function fixsupscript(parent,current,current_char,new_char)
- if new_char ~= current_char and new_char ~= true then
- setchar(current,new_char)
- if trace_fixing then
- report_fixing("fixing subscript, replacing superscript %U by %U",current_char,new_char)
- end
- else
- if trace_fixing then
- report_fixing("fixing subscript, superscript %U",current_char)
- end
- end
- setfield(parent,"options",nosuperscript_code)
- end
-
- local function move_none_none(parent,prev,nuc,oldchar,newchar)
- fixsupscript(prev,nuc,oldchar,newchar)
- local sub = getsub(parent)
- setsup(prev,nuc)
- setsub(prev,sub)
- local dummy = copy_node(nuc)
- setchar(dummy,0)
- setnucleus(parent,dummy)
- setsub(parent)
- end
-
- local function move_none_psub(parent,prev,nuc,oldchar,newchar)
- fixsupscript(prev,nuc,oldchar,newchar)
- setsup(prev,nuc)
- local dummy = copy_node(nuc)
- setchar(dummy,0)
- setnucleus(parent,dummy)
- end
+ local fixable = {
+ [noad_code] = true,
+ [accent_code] = true,
+ [radical_code] = true,
+ [fraction_code] = true,
+ }
fixscripts[mathchar_code] = function(pointer,what,n,parent,nested) -- todo: switch to turn in on and off
if parent then
- local oldchar = getchar(pointer)
- local newchar = movesub[oldchar]
- if newchar then
+ local char = getchar(pointer)
+ if char and primes[char] then
local nuc = getnucleus(parent)
if pointer == nuc then
- local sub = getsub(pointer)
- local sup = getsup(pointer)
- if sub then
- if sup then
- -- print("[char] sub sup")
- else
- -- print("[char] sub ---")
+ local prev = getprev(parent)
+ if prev and fixable[getid(prev)] then
+ local prevsup = getsup(prev)
+ local prevsub = getsub(prev)
+ local primesup = getsup(parent)
+ local primesub = getsub(parent)
+ setfield(prev,"scriptorder",prevsub and 2 or 1) -- sub first
+ if primesup and not prevsup then
+ setsup(prev,primesup)
+ primesup = nil
end
- elseif sup then
- -- print("[char] --- sup")
- else
- local prev = getprev(parent)
- if prev and getid(prev) == noad_code then
- local psub = getsub(prev)
- local psup = getsup(prev)
- if psub then
- if psup then
- -- print("sub sup [char] --- ---")
- else
- -- print("sub --- [char] --- ---")
- move_none_psub(parent,prev,nuc,oldchar,newchar)
- end
- elseif psup then
- -- print("--- sup [char] --- ---")
- else
- -- print("[char] --- ---")
- move_none_none(parent,prev,nuc,oldchar,newchar)
- end
- else
- -- print("no prev [char]")
+ if primesub and not prevsub then
+ setsub(prev,primesub)
+ primesub = nil
+ end
+ setfield(prev,"prime",nuc)
+ setnucleus(parent)
+ if not primesup then
+ setsup(parent)
+ end
+ if not primesub then
+ setsub(parent)
+ end
+ if not (primesup or primesub) then
+ setlink(prev,getnext(parent))
+ flushnode(parent)
+ return true, prev, prev
end
end
- else
- -- print("[char]")
end
end
end
@@ -2119,10 +2085,12 @@ do
[ordinarynoad_code] = "trace:db",
[binarynoad_code] = "trace:dg",
[opennoad_code] = "trace:dm",
+ [middlenoad_code] = "trace:dm",
[closenoad_code] = "trace:dm",
[punctuationnoad_code] = "trace:dc",
-- [operatornoad_code] = "",
-- [innernoad_code = "",
+ -- [fencednoad_code = "",
-- [undernoad_code] = "",
-- [overnoad_code] = "",
-- [vcenternoad_code] = "",
@@ -2176,6 +2144,7 @@ do
relation = relationnoad_code,
punctuation = punctuationnoad_code,
inner = innernoad_code,
+ fenced = fencednoad_code,
-- fraction = fractionnoad_code,
-- radical = radicalnoad_code,
}
diff --git a/tex/context/base/mkxl/math-pln.mkxl b/tex/context/base/mkxl/math-pln.mkxl
index 81008f37b..354f33a5f 100644
--- a/tex/context/base/mkxl/math-pln.mkxl
+++ b/tex/context/base/mkxl/math-pln.mkxl
@@ -26,7 +26,7 @@
\permanent\protected\def\hrulefill{\leaders\hrule\hfill}
%protected\def\dotfill {\cleaders\hbox{\normalstartimath\mathsurround\zeropoint\mkern1.5mu.\mkern1.5mu\normalstopimath}\hfill}
-% will move
+% will move .. not used anyway
\permanent\def\oalign#1%
{\leavevmode % plain tex uses this
@@ -41,9 +41,9 @@
% needs checking
-\permanent\protected\def\choose{\atopwithdelims()}
-\permanent\protected\def\brack {\atopwithdelims[]}
-\permanent\protected\def\brace {\atopwithdelims\{\}}
+\permanent\protected\def\choose{\atopwithdelims()} % used in korean test file, has to go
+%permanent\protected\def\brack {\atopwithdelims[]}
+%permanent\protected\def\brace {\atopwithdelims\{\}}
% needs checking
diff --git a/tex/context/base/mkxl/math-rad.mklx b/tex/context/base/mkxl/math-rad.mklx
index 041681f0b..de8c2e9a6 100644
--- a/tex/context/base/mkxl/math-rad.mklx
+++ b/tex/context/base/mkxl/math-rad.mklx
@@ -30,19 +30,19 @@
\protected\def\sqrt{\doifelsenextoptionalcs\rootwithdegree\rootwithoutdegree} % will be redefined
-\permanent\protected\def\styledrootradical#1#2% so that \text works ok ... \rootradical behaves somewhat weird
- {\normalexpanded{\rootradical
- {\normalunexpanded{#1}}%
- {\noexpand\triggermathstyle{\number\normalmathstyle}%
- \normalunexpanded{#2}}}}
+% \permanent\protected\def\styledrootradical#1#2% so that \text works ok ... \rootradical behaves somewhat weird
+% {\normalexpanded{\math_radical_common
+% {\normalunexpanded{#1}}%
+% {\noexpand\triggermathstyle{\number\normalmathstyle}%
+% \normalunexpanded{#2}}}}
% experimental new keyword: (maybe keywords should come after the symbol)
%
% \permanent\protected\def\styledrootradical#1#2% so that \text works ok ... \rootradical behaves somewhat weird
% {\Uroot style \normalmathstyle "0 "221A {#1}{#2}}
-\permanent\protected\def\rootwithdegree[#1]{\rootradical{#1}}
-\permanent\protected\def\rootwithoutdegree {\rootradical {}}
+\permanent\protected\def\rootwithdegree[#1]{\math_radical_common{#1}}
+\permanent\protected\def\rootwithoutdegree {\math_radical_common {}}
%D Even older stuff:
@@ -89,7 +89,8 @@
\setupmathradical
[\c!alternative=\v!normal,
- \c!mpoffset=.25\exheight]
+ \c!mpoffset=.25\exheight,
+ \c!source=\zerocount]
\appendtoks
\frozen\protected\instance\edefcsname\currentmathradical\endcsname{\math_radical_handle{\currentmathradical}}
@@ -98,10 +99,17 @@
\mutable\let\currentmathradical \empty
\mutable\let\currentmathradicaldegree\empty
-\tolerant\protected\def\math_radical_handle#tag#*[#degree]#:#body%
+\setmathignore\Umathradicaldegreebefore\plusone
+
+\tolerant\protected\def\math_radical_handle#tag#*[#settings]#*[#degree]#:#body%
{\begingroup
\edef\currentmathradical{#tag}%
- \edef\currentmathradicaldegree{#degree}%
+ \ifparameter#degree\or
+ \edef\currentmathradicaldegree{#degree}%
+ \setupcurrentmathradical[#settings]%
+ \else
+ \edef\currentmathradicaldegree{#settings}%
+ \fi
\ifempty\currentmathradicaldegree
\let\currentmathradicaldegree\m_math_no_degree
\fi
@@ -110,24 +118,38 @@
\def\m_math_no_degree{{}}
+% for every font
+%
+% \appendtoks
+% \Umathradicaldegreebefore\allmathstyles\zeropoint
+% \to \everymathematics
+
% style width [options: left middle right]
\def\math_radical_alternative{\csname\??mathradicalalternative\mathradicalparameter\c!alternative\endcsname}
+\integerdef\c_radical_unicode "221A
+
+\protected\def\math_radical_common
+ {\Uroot
+ \s!source\numexpr\namedboxanchor{\mathradicalparameter\c!source}\relax
+ \s!style \normalmathstyle
+ \zerocount \c_radical_unicode}
+
\defcsname\??mathradicalalternative\v!default\endcsname % #body%
- {\rootradical{\currentmathradicaldegree}} % {#body}}
+ {\math_radical_common{\currentmathradicaldegree}} % {#body}}
\defcsname\??mathradicalalternative\v!normal\endcsname#body%
{\edef\p_color{\mathradicalparameter\c!color}%
\ifempty\p_color
- \styledrootradical{\currentmathradicaldegree}{#body}% {} really needed as \rootradical expands first
+ \math_radical_common{\currentmathradicaldegree}{#body}% {} really needed as \rootradical expands first
\orelse\ifempty\currentmathradicaldegree
\pushcolor[\p_color]%
- \styledrootradical{\currentmathradicaldegree}%
+ \math_radical_common{\currentmathradicaldegree}%
{\popcolor#body}%
\else
\pushcolor[\p_color]%
- \styledrootradical{\popcolor\currentmathradicaldegree\pushcolor[\p_color]}%
+ \math_radical_common{\popcolor\currentmathradicaldegree\pushcolor[\p_color]}%
{\popcolor#body}%
\fi}
@@ -206,7 +228,8 @@
\c!mpoffset=.25\exheight]
\appendtoks
- \frozen\instance\setuevalue{\currentmathornament}{\math_ornament_handle{\currentmathornament}}%
+ \frozen\protected\instance\edefcsname\currentmathornament\endcsname
+ {\math_ornament_handle{\currentmathornament}}%
\to \everydefinemathornament
\protected\def\math_ornament_handle#tag#body%
diff --git a/tex/context/base/mkxl/math-scr.mkxl b/tex/context/base/mkxl/math-scr.mkxl
index 555f549f1..207f7fbf6 100644
--- a/tex/context/base/mkxl/math-scr.mkxl
+++ b/tex/context/base/mkxl/math-scr.mkxl
@@ -28,7 +28,7 @@
{\math_scripts_raised_symbol_indeed3\txx{#1}}}
\def\math_scripts_raised_symbol_indeed#1#2#3%
- {\mathord{{#2\raise.#1ex\hbox{#2\symbol[#3]}}}}
+ {\mathord{#2\raise.#1\exheight\hbox{#2\symbol[#3]}}} % redundant {} removed
\def\math_scripts_raised_number#1%
{\mathchoice
diff --git a/tex/context/base/mkxl/math-spa.lmt b/tex/context/base/mkxl/math-spa.lmt
new file mode 100644
index 000000000..35684847f
--- /dev/null
+++ b/tex/context/base/mkxl/math-spa.lmt
@@ -0,0 +1,83 @@
+if not modules then modules = { } end modules ['math-spa'] = {
+ version = 1.001,
+ comment = "companion to math-ini.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- for the moment (when testing) we use a penalty 1
+
+local boundary_code = nodes.nodecodes.boundary
+local glue_code = nodes.nodecodes.glue
+
+local nuts = nodes.nuts
+local tonut = nodes.tonut
+local tonode = nodes.tonode
+
+local getid = nuts.getid
+local getnext = nuts.getnext
+local getwidth = nuts.getwidth
+local setglue = nuts.setglue
+local getdimensions = nuts.dimensions
+local nextglue = nuts.traversers.glue
+
+local texsetdimen = tex.setdimen
+
+local v_none = interfaces.variables.none
+local v_auto = interfaces.variables.auto
+
+local method = v_none
+local distance = 0
+
+function noads.handlers.align(h)
+ if method ~= v_none then
+ if method == v_auto then
+ local s = h
+ while s do
+ local id = getid(s)
+ local n = getnext(s)
+ if id == boundary_code then -- check some type
+ if n and getid(n) == glue_code then
+ s = n
+ n = getnext(s)
+ end
+ local w = getdimensions(h,n) + distance
+ texsetdimen("global","d_strc_math_indent",w)
+ break
+ end
+ s = n
+ end
+ else
+ texsetdimen("global","d_strc_math_indent",distance)
+ end
+ for n in nextglue, h do
+ setglue(n,getwidth(n),0,0)
+ end
+ else
+ -- texsetdimen("global","d_strc_math_indent",0)
+ end
+end
+
+interfaces.implement {
+ name = "setmathhang",
+ arguments = {
+ {
+ { "method", "string" },
+ { "distance", "dimension" },
+ }
+ },
+ actions = function(t)
+ method = t.method or v_none
+ distance = t.distance or 0
+ end
+}
+
+interfaces.implement {
+ name = "resetmathhang",
+ actions = function(t)
+ method = v_none
+ distance = 0
+ end
+}
+
diff --git a/tex/context/base/mkxl/math-stc.mklx b/tex/context/base/mkxl/math-stc.mklx
index 5ae8857dd..970e1352d 100644
--- a/tex/context/base/mkxl/math-stc.mklx
+++ b/tex/context/base/mkxl/math-stc.mklx
@@ -153,7 +153,7 @@
\let\math_stackers_skip \hskip}
\def\math_stackers_skip_indeed#amount%
- {\filledhboxk{\unsetteststrut\strut\hskip#amount}} % \dontshowstruts
+ {\filledhboxk{\strut\hskip#amount}}
\let\math_stackers_start_tagged_mid\relax
\let\math_stackers_start_tagged_top\relax
@@ -179,7 +179,7 @@
\c!right=,
\c!mathclass=\s!rel,
\c!alternative=\v!normal,
- \c!voffset=.25\mathexheight,
+ \c!voffset=.25\mathexheight, % maybe less
\c!hoffset=\zeropoint,
\c!topoffset=\zeropoint, % for manual italic correction
\c!distance=\mathstackersparameter\c!voffset, % distance between symbol and base (can be different from voffset)
@@ -492,9 +492,9 @@
\permanent\tolerant\protected\def\definemathextensible[#1]#*[#2]#*[#3]% category name unicode
{\ifarguments\or\or
- \frozen\setuevalue{#1}{\math_stackers_auto_normal\noexpand\currentmathstackers{\number#2}}%
+ \frozen\protected\edefcsname#1\endcsname{\math_stackers_auto_normal\noexpand\currentmathstackers{\number#2}}%
\or
- \frozen\setuevalue{#2}{\math_stackers_auto_normal{#1}{\number#3}}%
+ \frozen\protected\edefcsname#2\endcsname{\math_stackers_auto_normal{#1}{\number#3}}%
\fi}
\tolerant\protected\def\math_stackers_auto_normal#1#2#*[#3]#:#=#*#=%
@@ -522,20 +522,6 @@
{\math_stackers_triplet\zerocount{#category}{#codepoint}{#toptext}{#bottomtext}%
\endgroup}
-%D The next one deals with under and over extensibles (arrows mostly):
-
-\installcorenamespace {mathclasses}
-
-\letcsname\??mathclasses \endcsname\mathord
-\letcsname\??mathclasses rel\endcsname\mathrel
-\letcsname\??mathclasses ord\endcsname\mathord
-
-\def\math_class_by_parameter#1%
- {\normalexpanded{\noexpand\math_class_by_parameter_indeed{#1\c!mathclass}}}
-
-\def\math_class_by_parameter_indeed#1%
- {\csname\??mathclasses\ifcsname\??mathclasses#1\endcsname#1\fi\endcsname}
-
% 1 0 name n 0 | 0 1 name n 0 | 1 1 name n n
\let\math_stackers_stop_group\endgroup
@@ -680,33 +666,33 @@
\permanent\tolerant\protected\def\definemathoverextensible[#1]#*[#2]#*[#3]%
{\ifparameter#3\or
- \frozen\setuevalue{#2}{\math_stackers_make_double\plusone \zerocount{#1}{\number#3}{0}}%
+ \frozen\protected\edefcsname#2\endcsname{\math_stackers_make_double\plusone \zerocount{#1}{\number#3}{0}}%
\else
- \frozen\setuevalue{#1}{\math_stackers_make_double\plusone \zerocount\noexpand\currentmathstackers{\number#2}{0}}%
+ \frozen\protected\edefcsname#1\endcsname{\math_stackers_make_double\plusone \zerocount\noexpand\currentmathstackers{\number#2}{0}}%
\fi}
\permanent\tolerant\protected\def\definemathunderextensible[#1]#*[#2]#*[#3]%
{\ifparameter#3\or
- \frozen\setuevalue{#2}{\math_stackers_make_double\zerocount\plusone{#1}{\number#3}{0}}%
+ \frozen\protected\edefcsname#2\endcsname{\math_stackers_make_double\zerocount\plusone{#1}{\number#3}{0}}%
\else
- \frozen\setuevalue{#1}{\math_stackers_make_double\zerocount\plusone\noexpand\currentmathstackers{\number#2}{0}}%
+ \frozen\protected\edefcsname#1\endcsname{\math_stackers_make_double\zerocount\plusone\noexpand\currentmathstackers{\number#2}{0}}%
\fi}
\permanent\tolerant\protected\def\definemathdoubleextensible[#1]#*[#2]#*[#3]#*[#4]%
{\ifparameter#4\or
- \frozen\setuevalue{#2}{\math_stackers_make_double\plusone \plusone{#1}{\number#3}{\number#4}}%
+ \frozen\protected\edefcsname#2\endcsname{\math_stackers_make_double\plusone \plusone{#1}{\number#3}{\number#4}}%
\else
- \frozen\setuevalue{#1}{\math_stackers_make_double\plusone \plusone\noexpand\currentmathstackers{\number#2}{\number#3}}%
+ \frozen\protected\edefcsname#1\endcsname{\math_stackers_make_double\plusone \plusone\noexpand\currentmathstackers{\number#2}{\number#3}}%
\fi}
\permanent\tolerant\protected\def\definemathover[#category]#spacer[#command]#spacer[#topcode]%
- {\frozen\setuvalue{#command}{\math_stackers_handle_direct\plusone\zerocount{#category}{#topcode}{0}}}
+ {\frozen\protected\defcsname#command\endcsname{\math_stackers_handle_direct\plusone\zerocount{#category}{#topcode}{0}}}
\permanent\tolerant\protected\def\definemathunder[#category]#spacer[#command]#spacer[#bottomcode]%
- {\frozen\setuvalue{#command}{\math_stackers_handle_direct\zerocount\plusone{#category}{#bottomcode}{0}}}
+ {\frozen\protected\defcsname#command\endcsname{\math_stackers_handle_direct\zerocount\plusone{#category}{#bottomcode}{0}}}
\permanent\tolerant\protected\def\definemathdouble[#category]#spacer[#command]#spacer[#topcode]#spacer[#bottomcode]%
- {\frozen\setuvalue{#command}{\math_stackers_handle_direct\plusone\plusone{#category}{#topcode}{#bottomcode}}}
+ {\frozen\protected\defcsname#command\endcsname{\math_stackers_handle_direct\plusone\plusone{#category}{#topcode}{#bottomcode}}}
\permanent\tolerant\protected\def\mathover[#category]#spacer[#settings]#:#topcode#text%
{\begingroup
@@ -883,16 +869,16 @@
\permanent\tolerant\protected\def\definemathovertextextensible[#1]#*[#2]#*[#3]%
{\ifparameter#3\or
- \frozen\setuevalue{#2}{\math_stackers_make_double_text\plusone{#1}{\number#3}}%
+ \frozen\protected\edefcsname#2\endcsname{\math_stackers_make_double_text\plusone{#1}{\number#3}}%
\else
- \frozen\setuevalue{#1}{\math_stackers_make_double_text\plusone\noexpand\currentmathstackers{\number#2}}%
+ \frozen\protected\edefcsname#1\endcsname{\math_stackers_make_double_text\plusone\noexpand\currentmathstackers{\number#2}}%
\fi}
\permanent\tolerant\protected\def\definemathundertextextensible[#1]#*[#2]#*[#3]%
{\ifparameter#3\or
- \frozen\setuevalue{#2}{\math_stackers_make_double_text\zerocount{#1}{\number#3}}%
+ \frozen\protected\edefcsname#2\endcsname{\math_stackers_make_double_text\zerocount{#1}{\number#3}}%
\else
- \frozen\setuevalue{#1}{\math_stackers_make_double_text\zerocount\noexpand\currentmathstackers{\number#2}}%
+ \frozen\protected\edefcsname#1\endcsname{\math_stackers_make_double_text\zerocount\noexpand\currentmathstackers{\number#2}}%
\fi}
\permanent\tolerant\protected\def\mathovertext[#category]%
@@ -917,11 +903,11 @@
\permanent\tolerant\protected\def\definemathtriplet[#1]#*[#2]#*[#3]% category name default
{\ifarguments\or
- \frozen\setuevalue{#1}{\math_stackers_auto_triplet_nop[\noexpand\currentmathstackers]}%
+ \frozen\protected\edefcsname#1\endcsname{\math_stackers_auto_triplet_nop[\noexpand\currentmathstackers]}%
\or
- \frozen\setuevalue{#2}{\math_stackers_auto_triplet_nop[#1]}%
+ \frozen\protected\edefcsname#2\endcsname{\math_stackers_auto_triplet_nop[#1]}%
\or
- \frozen\setuevalue{#2}{\math_stackers_auto_triplet_yes[#1][#3]}%
+ \frozen\protected\edefcsname#2\endcsname{\math_stackers_auto_triplet_yes[#1][#3]}%
\fi}
\tolerant\protected\def\math_stackers_auto_triplet_yes[#1][#2]#*[#3]#:#=#*#=% [#2]% #2 gobble spaces
@@ -1171,39 +1157,78 @@
% alternatively we can move the original to FE*
-\definemathoverextensible [\v!vfenced] [overbar] ["FE33E] % ["203E]
-\definemathunderextensible [\v!vfenced] [underbar] ["FE33F] % ["203E]
-\definemathdoubleextensible [\v!vfenced] [doublebar] ["FE33E] ["FE33F]
+% \definemathoverextensible [\v!vfenced] [overbar] ["FE33E] % ["203E]
+% \definemathunderextensible [\v!vfenced] [underbar] ["FE33F] % ["203E]
+% \definemathdoubleextensible [\v!vfenced] [doublebar] ["FE33E] ["FE33F]
+%
+% \definemathoverextensible [\v!vfenced] [overbrace] ["FE3DE] % ["023DE]
+% \definemathunderextensible [\v!vfenced] [underbrace] ["FE3DF] % ["023DF]
+% \definemathdoubleextensible [\v!vfenced] [doublebrace] ["FE3DE] ["FE3DF]
+%
+% \definemathoverextensible [\v!vfenced] [overparent] ["FE3DC] % ["023DC]
+% \definemathunderextensible [\v!vfenced] [underparent] ["FE3DD] % ["023DD]
+% \definemathdoubleextensible [\v!vfenced] [doubleparent] ["FE3DC] ["FE3DD]
+%
+% \definemathoverextensible [\v!vfenced] [overbracket] ["FE3B4] % ["023B4]
+% \definemathunderextensible [\v!vfenced] [underbracket] ["FE3B5] % ["023B5]
+% \definemathdoubleextensible [\v!vfenced] [doublebracket] ["FE3B4] ["FE3B5]
+
+% \definemathoverextensible [\v!vfenced] [overbar] ["203E]
+% \definemathunderextensible [\v!vfenced] [underbar] ["203E]
+% \definemathdoubleextensible [\v!vfenced] [doublebar] ["203E] ["203E]
-\definemathoverextensible [\v!vfenced] [overbrace] ["FE3DE] % ["023DE]
-\definemathunderextensible [\v!vfenced] [underbrace] ["FE3DF] % ["023DF]
-\definemathdoubleextensible [\v!vfenced] [doublebrace] ["FE3DE] ["FE3DF]
+\definemathoverextensible [\v!vfenced] [overbar] ["203E]
+\definemathunderextensible [\v!vfenced] [underbar] ["203E] % ["0332]
+\definemathdoubleextensible [\v!vfenced] [doublebar] ["203E] ["203E] % ["0332]
-\definemathoverextensible [\v!vfenced] [overparent] ["FE3DC] % ["023DC]
-\definemathunderextensible [\v!vfenced] [underparent] ["FE3DD] % ["023DD]
-\definemathdoubleextensible [\v!vfenced] [doubleparent] ["FE3DC] ["FE3DD]
+\definemathoverextensible [\v!vfenced] [overbrace] ["23DE]
+\definemathunderextensible [\v!vfenced] [underbrace] ["23DF]
+\definemathdoubleextensible [\v!vfenced] [doublebrace] ["23DE] ["23DF]
-\definemathoverextensible [\v!vfenced] [overbracket] ["FE3B4] % ["023B4]
-\definemathunderextensible [\v!vfenced] [underbracket] ["FE3B5] % ["023B5]
-\definemathdoubleextensible [\v!vfenced] [doublebracket] ["FE3B4] ["FE3B5]
+\definemathoverextensible [\v!vfenced] [overparent] ["23DC]
+\definemathunderextensible [\v!vfenced] [underparent] ["23DD]
+\definemathdoubleextensible [\v!vfenced] [doubleparent] ["23DC] ["23DD]
+
+\definemathoverextensible [\v!vfenced] [overbracket] ["23B4]
+\definemathunderextensible [\v!vfenced] [underbracket] ["23B5]
+\definemathdoubleextensible [\v!vfenced] [doublebracket] ["23B4] ["23B5]
+
+% If we do this, we need to adapt the dimensions, so wel leave them accents:
+%
+% \definemathoverextensible[\v!vfenced][widebar] ["0305]
+% \definemathoverextensible[\v!vfenced][widetilde]["0303]
% \protected\def\mathopwithlimits#1#2{\mathop{#1{#2}}\limits}
%D For mathml:
-\definemathdoubleextensible [\v!both] [overbarunderbar] ["FE33E] ["FE33F]
-\definemathdoubleextensible [\v!both] [overbraceunderbrace] ["FE3DE] ["FE3DF]
-\definemathdoubleextensible [\v!both] [overparentunderparent] ["FE3DC] ["FE3DD]
-\definemathdoubleextensible [\v!both] [overbracketunderbracket] ["FE3B4] ["FE3B5]
-
-\definemathovertextextensible [\v!bothtext] [overbartext] ["FE33E]
-\definemathundertextextensible [\v!bothtext] [underbartext] ["FE33F]
-\definemathovertextextensible [\v!bothtext] [overbracetext] ["FE3DE]
-\definemathundertextextensible [\v!bothtext] [underbracetext] ["FE3DF]
-\definemathovertextextensible [\v!bothtext] [overparenttext] ["FE3DC]
-\definemathundertextextensible [\v!bothtext] [underparenttext] ["FE3DD]
-\definemathovertextextensible [\v!bothtext] [overbrackettext] ["FE3B4]
-\definemathundertextextensible [\v!bothtext] [underbrackettext] ["FE3B5]
+% \definemathdoubleextensible [\v!both] [overbarunderbar] ["FE33E] ["FE33F]
+% \definemathdoubleextensible [\v!both] [overbraceunderbrace] ["FE3DE] ["FE3DF]
+% \definemathdoubleextensible [\v!both] [overparentunderparent] ["FE3DC] ["FE3DD]
+% \definemathdoubleextensible [\v!both] [overbracketunderbracket] ["FE3B4] ["FE3B5]
+%
+% \definemathovertextextensible [\v!bothtext] [overbartext] ["FE33E]
+% \definemathundertextextensible [\v!bothtext] [underbartext] ["FE33F]
+% \definemathovertextextensible [\v!bothtext] [overbracetext] ["FE3DE]
+% \definemathundertextextensible [\v!bothtext] [underbracetext] ["FE3DF]
+% \definemathovertextextensible [\v!bothtext] [overparenttext] ["FE3DC]
+% \definemathundertextextensible [\v!bothtext] [underparenttext] ["FE3DD]
+% \definemathovertextextensible [\v!bothtext] [overbrackettext] ["FE3B4]
+% \definemathundertextextensible [\v!bothtext] [underbrackettext] ["FE3B5]
+
+\definemathdoubleextensible [\v!both] [overbarunderbar] ["203E] ["203E]
+\definemathdoubleextensible [\v!both] [overbraceunderbrace] ["23DE] ["23DF]
+\definemathdoubleextensible [\v!both] [overparentunderparent] ["23DC] ["23DD]
+\definemathdoubleextensible [\v!both] [overbracketunderbracket] ["23B4] ["23B5]
+
+\definemathovertextextensible [\v!bothtext] [overbartext] ["203E]
+\definemathundertextextensible [\v!bothtext] [underbartext] ["203E]
+\definemathovertextextensible [\v!bothtext] [overbracetext] ["23DE]
+\definemathundertextextensible [\v!bothtext] [underbracetext] ["23DF]
+\definemathovertextextensible [\v!bothtext] [overparenttext] ["23DC]
+\definemathundertextextensible [\v!bothtext] [underparenttext] ["23DD]
+\definemathovertextextensible [\v!bothtext] [overbrackettext] ["23B4]
+\definemathundertextextensible [\v!bothtext] [underbrackettext] ["23B5]
%D Some bonus ones (for the moment here):
@@ -1326,9 +1351,9 @@
\permanent\tolerant\protected\def\definemathunstacked[#1]#*[#2]#*[#3]% category name unicode
{\ifarguments\or\or
- \frozen\setuevalue{#1}{\math_stackers_unstacked_normal\noexpand\currentmathstackers{\number#2}}%
+ \frozen\protected\edefcsname#1\endcsname{\math_stackers_unstacked_normal\noexpand\currentmathstackers{\number#2}}%
\else
- \frozen\setuevalue{#2}{\math_stackers_unstacked_normal{#1}{\number#3}}%
+ \frozen\protected\edefcsname#2\endcsname{\math_stackers_unstacked_normal{#1}{\number#3}}%
\fi}
\protected\def\math_stackers_unstacked_normal#category#codepoint%
diff --git a/tex/context/base/mkxl/math-tag.lmt b/tex/context/base/mkxl/math-tag.lmt
index 9ecc7047a..429191546 100644
--- a/tex/context/base/mkxl/math-tag.lmt
+++ b/tex/context/base/mkxl/math-tag.lmt
@@ -98,7 +98,6 @@ local chardata = characters.data
local getmathcodes = tex.getmathcodes
local mathcodes = mathematics.codes
local ordinary_mathcode = mathcodes.ordinary
-local variable_mathcode = mathcodes.variable
local fromunicode16 = fonts.mappings.fromunicode16
local fontcharacters = fonts.hashes.characters
@@ -223,7 +222,8 @@ process = function(start) -- we cannot use the processor as we have no finalizer
local char = getchar(start)
local code = getmathcodes(char)
local tag
- if code == ordinary_mathcode or code == variable_mathcode then
+ -- todo: we have way more now
+ if code == ordinary_mathcode then
local ch = chardata[char]
local mc = ch and ch.mathclass
if mc == "number" then
diff --git a/tex/context/base/mkxl/math-vfu.lmt b/tex/context/base/mkxl/math-vfu.lmt
index abe336f53..0540331ab 100644
--- a/tex/context/base/mkxl/math-vfu.lmt
+++ b/tex/context/base/mkxl/math-vfu.lmt
@@ -85,7 +85,7 @@ local shared = { }
local function brace(main,characters,id,size,unicode,first,rule,left,right,rule,last)
if not characters[unicode] then
characters[unicode] = {
- hvariants = {
+ hparts = {
{ extender = 0, glyph = first },
{ extender = 1, glyph = rule },
{ extender = 0, glyph = left },
@@ -123,7 +123,7 @@ local function extension(main,characters,id,size,unicode,first,middle,last)
if lw == 0 then
lw = 1
end
- chr.hvariants = {
+ chr.hparts = {
{ extender = 0, glyph = first, ["end"] = fw/2, start = 0, advance = fw },
{ extender = 1, glyph = middle, ["end"] = mw/2, start = mw/2, advance = mw },
{ extender = 0, glyph = last, ["end"] = 0, start = lw/2, advance = lw },
@@ -133,7 +133,7 @@ end
local function parent(main,characters,id,size,unicode,first,rule,last)
if not characters[unicode] then
characters[unicode] = {
- hvariants = {
+ hparts = {
{ extender = 0, glyph = first },
{ extender = 1, glyph = rule },
{ extender = 0, glyph = last },
@@ -661,10 +661,10 @@ local function copy_glyph(main,target,original,unicode,slot)
break -- safeguard (when testing stuff)
end
end
- local hv = olddata.hvariants
+ local hv = olddata.hparts
if hv then
hv = fastcopy(hv)
- newdata.hvariants = hv
+ newdata.hparts = hv
for i=1,#hv do
local hvi = hv[i]
local oldglyph = hvi.glyph
@@ -679,10 +679,10 @@ local function copy_glyph(main,target,original,unicode,slot)
hvi.glyph = addprivate(main,formatters["M-H-%H"](oldglyph),newdata)
end
end
- local vv = olddata.vvariants
+ local vv = olddata.vparts
if vv then
vv = fastcopy(vv)
- newdata.vvariants = vv
+ newdata.vparts = vv
for i=1,#vv do
local vvi = vv[i]
local oldglyph = vvi.glyph
@@ -1017,30 +1017,30 @@ function vfmath.define(specification,set,goodies)
if n then
t.next = offset + n
elseif variants_done then
- local vv = fci.vvariants
+ local vv = fci.vparts
if vv then
- t.vvariants = vv
+ t.vparts = vv
end
- local hv = fci.hvariants
+ local hv = fci.hparts
if hv then
- t.hvariants = hv
+ t.hparts = hv
end
else
- local vv = fci.vvariants
+ local vv = fci.vparts
if vv then
for i=1,#vv do
local vvi = vv[i]
vvi.glyph = vvi.glyph + offset
end
- t.vvariants = vv
+ t.vparts = vv
end
- local hv = fci.hvariants
+ local hv = fci.hparts
if hv then
for i=1,#hv do
local hvi = hv[i]
hvi.glyph = hvi.glyph + offset
end
- t.hvariants = hv
+ t.hparts = hv
end
end
characters[offset + index] = t
@@ -1122,13 +1122,18 @@ function vfmath.define(specification,set,goodies)
main.properties.math_is_scaled = true -- signal
fonts.constructors.assignmathparameters(main,main)
--
- main.MathConstants = main.mathparameters -- we directly pass it to TeX (bypasses the scaler) so this is needed
+ main.mathconstants = main.mathparameters -- we directly pass it to TeX (bypasses the scaler) so this is needed
--
if trace_virtual or trace_timings then
report_virtual("loading and virtualizing font %a at size %p took %0.3f seconds",name,size,os.clock()-start)
end
--
- main.oldmath = true
+ -- main.oldmath = true
+ --
+ -- We bypass the scaler so ...
+ --
+ main.MathConstants = main.mathconstants
+ main.nomath = false
return main
end
diff --git a/tex/context/base/mkxl/mlib-int.lmt b/tex/context/base/mkxl/mlib-int.lmt
index 208370a3c..e294a4fe5 100644
--- a/tex/context/base/mkxl/mlib-int.lmt
+++ b/tex/context/base/mkxl/mlib-int.lmt
@@ -153,18 +153,18 @@ registerdirect("OverlayRegion", function() return getmacro("m_overlay_reg
-- registerscript("OnRightPage", function() return mpboolean(on_right_page ()) end)
-- registerscript("OnOddPage", function() return mpboolean(is_odd_page ()) end)
-- registerscript("InPageBody", function() return mpboolean(in_body_page ()) end)
--- registerscript("LayoutHasChanged", function() return mpboolean(layout_has_changed()) end)
registerdirect("PageFraction", function() return page_fraction () end)
registerdirect("OnRightPage", function() return on_right_page () end)
registerdirect("OnOddPage", function() return is_odd_page () end)
registerdirect("InPageBody", function() return in_body_page () end)
-registerdirect("LayoutHasChanged", function() return layout_has_changed() end)
+registerdirect("LastChangedLayoutPage",function() return getcount("c_page_layouts_changed") end)
+registerdirect("SwapMarginDimensions", function() token.expandmacro("swapmargindimensions") end)
registerdirect("PageFraction", page_fraction )
registerdirect("OnRightPage", on_right_page )
registerdirect("OnOddPage", is_odd_page )
registerdirect("InPageBody", in_body_page )
-registerdirect("LayoutHasChanged", layout_has_changed)
+-- registerdirect("LayoutHasChanged", layout_has_changed)
registerdirect("defaultcolormodel", defaultcolormodel)
diff --git a/tex/context/base/mkxl/mult-aux.mkxl b/tex/context/base/mkxl/mult-aux.mkxl
index 864516ad5..e5850668b 100644
--- a/tex/context/base/mkxl/mult-aux.mkxl
+++ b/tex/context/base/mkxl/mult-aux.mkxl
@@ -1073,6 +1073,22 @@
\expandafter\noexpand\csname current#2parent\endcsname
\expandafter\noexpand\csname inject#2parent\endcsname}}
+%D Cheaper (assumes grouping at some point):
+
+\permanent\protected\def\mult_interfaces_install_local_current_injector#1#2#3#4%
+ {\protected\def#4##1%
+ {\advance#2\plusone
+ \edef#3{##1:\the#2}% \currentXXX
+ \edefcsname#1#3:\s!parent\endcsname{#1##1}}}
+
+\permanent\protected\def\installlocalcurrenthandler#1#2% \??XXX {XXX}
+ {\expandafter\newcount\csname#1:\s!counter\endcsname
+ \normalexpanded{\mult_interfaces_install_local_current_injector
+ {\noexpand#1}%
+ \expandafter\noexpand\csname #1:\s!counter\endcsname
+ \expandafter\noexpand\csname current#2\endcsname
+ \expandafter\noexpand\csname setlocal#2current\endcsname}}
+
% The \LUA\ based variant is twice as fast as the above but as said, we don't use
% this one that often. It's more about less tracing than speed here.
diff --git a/tex/context/base/mkxl/mult-sys.mkxl b/tex/context/base/mkxl/mult-sys.mkxl
index 1eae000e4..9ac124808 100644
--- a/tex/context/base/mkxl/mult-sys.mkxl
+++ b/tex/context/base/mkxl/mult-sys.mkxl
@@ -114,12 +114,14 @@
\definesystemconstant {all}
\definesystemconstant {ampersand}
\definesystemconstant {anchor}
+\definesystemconstant {anchors}
\definesystemconstant {ascii}
\definesystemconstant {attribute}
\definesystemconstant {attr}
\definesystemconstant {author}
\definesystemconstant {auto}
\definesystemconstant {axis}
+\definesystemconstant {noaxis}
\definesystemconstant {exact}
\definesystemconstant {a}
\definesystemconstant {bf}
@@ -151,9 +153,12 @@
\definesystemconstant {cg}
\definesystemconstant {chain}
\definesystemconstant {check}
+\definesystemconstant {char}
\definesystemconstant {child}
\definesystemconstant {cite}
\definesystemconstant {class}
+\definesystemconstant {leftclass}
+\definesystemconstant {rightclass}
\definesystemconstant {clone}
\definesystemconstant {cmyk}
\definesystemconstant {cm}
@@ -198,6 +203,7 @@
\definesystemconstant {fallbacks}
\definesystemconstant {fallback}
\definesystemconstant {false}
+\definesystemconstant {fam}
\definesystemconstant {fax}
\definesystemconstant {features}
\definesystemconstant {file}
@@ -205,6 +211,7 @@
\definesystemconstant {fill}
\definesystemconstant {fil}
\definesystemconstant {first}
+\definesystemconstant {fixed}
\definesystemconstant {float}
\definesystemconstant {font}
\definesystemconstant {forget}
@@ -226,6 +233,7 @@
\definesystemconstant {hastitle}
\definesystemconstant {head}
\definesystemconstant {height}
+\definesystemconstant {hfactor}
\definesystemconstant {hw}
\definesystemconstant {hyphenmin}
\definesystemconstant {indeed}
@@ -380,7 +388,8 @@
\definesystemconstant {Support}
\definesystemconstant {sygreek}
\definesystemconstant {symbol}
-\definesystemconstant {system} % not yet interfaces messages
+\definesystemconstant {system}
+\definesystemconstant {style}
\definesystemconstant {text}
\definesystemconstant {tex}
\definesystemconstant {tf}
@@ -397,12 +406,14 @@
\definesystemconstant {ucgreek}
\definesystemconstant {uncramped}
\definesystemconstant {unexpanded}
-\definesystemconstant {Unicode}
+\definesystemconstant {unpack}
\definesystemconstant {unknown}
+\definesystemconstant {Unicode}
\definesystemconstant {userdata}
\definesystemconstant {userpage}
\definesystemconstant {user}
\definesystemconstant {vfrac}
+\definesystemconstant {vfactor}
\definesystemconstant {white}
\definesystemconstant {width}
\definesystemconstant {xml}
diff --git a/tex/context/base/mkxl/node-bck.mkxl b/tex/context/base/mkxl/node-bck.mkxl
index 3c2fa015c..357180710 100644
--- a/tex/context/base/mkxl/node-bck.mkxl
+++ b/tex/context/base/mkxl/node-bck.mkxl
@@ -76,7 +76,7 @@
\permanent\protected\def\backgroundline{\dontleavehmode\node_backgrounds_boxes_add\hbox}
\def\node_backgrounds_boxes_add#1[#2]%
- {\clf_enablebackgroundboxes
+ {\localcontrolled{\clf_enablebackgroundboxes}% permits assignment
#1\backgroundcolorattr{#2}}
\protect \endinput
diff --git a/tex/context/base/mkxl/node-ini.lmt b/tex/context/base/mkxl/node-ini.lmt
index 2b09485db..75a97408b 100644
--- a/tex/context/base/mkxl/node-ini.lmt
+++ b/tex/context/base/mkxl/node-ini.lmt
@@ -20,32 +20,16 @@ local sortedhash, sortedkeys, swapped = table.sortedhash, table.sortedkeys, tabl
few helper functions. These functions are rather optimized.</p>
--ldx]]--
-nodes = nodes or { }
-local nodes = nodes
-nodes.handlers = nodes.handlers or { }
+nodes = nodes or { }
+local nodes = nodes
+nodes.handlers = nodes.handlers or { }
-local mark = utilities.storage.mark
-local allocate = utilities.storage.allocate
-local formatcolumns = utilities.formatters.formatcolumns
+local mark = utilities.storage.mark
+local allocate = utilities.storage.allocate
+local formatcolumns = utilities.formatters.formatcolumns
-local getsubtypes = node.subtypes
-local getvalues = node.values
-
-tex.magicconstants = { -- we use tex.constants for something else
- running = -1073741824, -- null_flag
- maxdimen = 1073741823, -- max_dimen
- -- trueinch = 4736286, -- obsolete
-}
-
-do
- local c = status.getconstants()
- local t = { }
- for k, v in next, c do
- t[gsub(k,"_","")] = v
- end
-
- tex.magicconstants = table.setmetatableindex(t,c)
-end
+local getsubtypes = node.subtypes
+local getvalues = node.values
local listcodes = mark(getsubtypes("list"))
local rulecodes = mark(getsubtypes("rule"))
@@ -151,6 +135,7 @@ noadcodes.rel = noadcodes.rel or noadcodes.relation
noadcodes.punct = noadcodes.punct or noadcodes.punctuation
noadcodes.rad = noadcodes.rad or noadcodes.radical
noadcodes.frac = noadcodes.frac or noadcodes.fraction
+noadcodes.acc = noadcodes.acc or noadcodes.accent
-- so for now:
@@ -161,6 +146,7 @@ noadcodes.relation = noadcodes.relation or noadcodes.rel
noadcodes.punctuation = noadcodes.punctuation or noadcodes.punct
noadcodes.radical = noadcodes.radical or noadcodes.rad
noadcodes.fraction = noadcodes.fraction or noadcodes.frac
+noadcodes.accent = noadcodes.accent or noadcodes.acc
local subtypes = allocate {
glue = gluecodes,
diff --git a/tex/context/base/mkxl/node-res.lmt b/tex/context/base/mkxl/node-res.lmt
index 93dc65b7b..da4283e7f 100644
--- a/tex/context/base/mkxl/node-res.lmt
+++ b/tex/context/base/mkxl/node-res.lmt
@@ -181,12 +181,13 @@ local lefttoright_code = nodes.dirvalues.lefttoright
local rule = register_nut(new_nut(rule_code)) -- setdirection(rule, lefttoright_code)
local emptyrule = register_nut(new_nut(rule_code,rulecodes.empty)) -- setdirection(rule, lefttoright_code)
+local strutrule = register_nut(new_nut(rule_code,rulecodes.strut)) -- setdirection(rule, lefttoright_code)
local userrule = register_nut(new_nut(rule_code,rulecodes.user)) -- setdirection(rule, lefttoright_code)
local outlinerule = register_nut(new_nut(rule_code,rulecodes.outline)) -- setdirection(rule, lefttoright_code)
local imagerule = register_nut(new_nut(rule_code,rulecodes.image)) -- setdirection(rule, lefttoright_code)
local boxrule = register_nut(new_nut(rule_code,rulecodes.box)) -- setdirection(rule, lefttoright_code)
-local hlist = register_nut(new_nut(nodecodes.hlist)) setdirection(hlist,lefttoright_code)
-local vlist = register_nut(new_nut(nodecodes.vlist)) setdirection(vlist,lefttoright_code)
+local hlist = register_nut(new_nut(nodecodes.hlist)) setdirection(hlist,lefttoright_code)
+local vlist = register_nut(new_nut(nodecodes.vlist)) setdirection(vlist,lefttoright_code)
function nutpool.glyph(fnt,chr)
local n = copy_nut(glyph)
@@ -357,6 +358,14 @@ function nutpool.emptyrule(width,height,depth) -- w/h/d == nil will let them ada
return n
end
+function nutpool.strutrule(width,height,depth) -- w/h/d == nil will let them adapt
+ local n = copy_nut(strutrule)
+ if width or height or depth then
+ setwhd(n,width,height,depth)
+ end
+ return n
+end
+
function nutpool.userrule(width,height,depth) -- w/h/d == nil will let them adapt
local n = copy_nut(userrule)
if width or height or depth then
diff --git a/tex/context/base/mkxl/norm-ctx.mkxl b/tex/context/base/mkxl/norm-ctx.mkxl
index fb67c5f24..0ec925896 100644
--- a/tex/context/base/mkxl/norm-ctx.mkxl
+++ b/tex/context/base/mkxl/norm-ctx.mkxl
@@ -15,118 +15,8 @@
%D A few more might end up here (like the weird ones in syst-ini).
-\let\normalreqno\normaleqno
-
-% more friendly in setups:
-
-\aliased\let\ordordspacing \Umathordordspacing
-\aliased\let\ordopspacing \Umathordopspacing
-\aliased\let\ordbinspacing \Umathordbinspacing
-\aliased\let\ordrelspacing \Umathordrelspacing
-\aliased\let\ordopenspacing \Umathordopenspacing
-\aliased\let\ordclosespacing \Umathordclosespacing
-\aliased\let\ordpunctspacing \Umathordpunctspacing
-\aliased\let\ordinnerspacing \Umathordinnerspacing
-\aliased\let\ordfracspacing \Umathordfracspacing
-\aliased\let\ordradspacing \Umathordradspacing
-
-\aliased\let\opordspacing \Umathopordspacing
-\aliased\let\opopspacing \Umathopopspacing
-\aliased\let\opbinspacing \Umathopbinspacing
-\aliased\let\oprelspacing \Umathoprelspacing
-\aliased\let\opopenspacing \Umathopopenspacing
-\aliased\let\opclosespacing \Umathopclosespacing
-\aliased\let\oppunctspacing \Umathoppunctspacing
-\aliased\let\opinnerspacing \Umathopinnerspacing
-\aliased\let\opfracspacing \Umathopfracspacing
-\aliased\let\opradspacing \Umathopradspacing
-
-\aliased\let\binordspacing \Umathbinordspacing
-\aliased\let\binopspacing \Umathbinopspacing
-\aliased\let\binbinspacing \Umathbinbinspacing
-\aliased\let\binrelspacing \Umathbinrelspacing
-\aliased\let\binopenspacing \Umathbinopenspacing
-\aliased\let\binclosespacing \Umathbinclosespacing
-\aliased\let\binpunctspacing \Umathbinpunctspacing
-\aliased\let\bininnerspacing \Umathbininnerspacing
-\aliased\let\binfracspacing \Umathbinfracspacing
-\aliased\let\binradspacing \Umathbinradspacing
-
-\aliased\let\relordspacing \Umathrelordspacing
-\aliased\let\relopspacing \Umathrelopspacing
-\aliased\let\relbinspacing \Umathrelbinspacing
-\aliased\let\relrelspacing \Umathrelrelspacing
-\aliased\let\relopenspacing \Umathrelopenspacing
-\aliased\let\relclosespacing \Umathrelclosespacing
-\aliased\let\relpunctspacing \Umathrelpunctspacing
-\aliased\let\relinnerspacing \Umathrelinnerspacing
-\aliased\let\relfracspacing \Umathrelfracspacing
-\aliased\let\relradspacing \Umathrelradspacing
-
-\aliased\let\openordspacing \Umathopenordspacing
-\aliased\let\openopspacing \Umathopenopspacing
-\aliased\let\openbinspacing \Umathopenbinspacing
-\aliased\let\openrelspacing \Umathopenrelspacing
-\aliased\let\openopenspacing \Umathopenopenspacing
-\aliased\let\openclosespacing \Umathopenclosespacing
-\aliased\let\openpunctspacing \Umathopenpunctspacing
-\aliased\let\openinnerspacing \Umathopeninnerspacing
-\aliased\let\openfracspacing \Umathopenfracspacing
-\aliased\let\openradspacing \Umathopenradspacing
-
-\aliased\let\closeordspacing \Umathcloseordspacing
-\aliased\let\closeopspacing \Umathcloseopspacing
-\aliased\let\closebinspacing \Umathclosebinspacing
-\aliased\let\closerelspacing \Umathcloserelspacing
-\aliased\let\closeopenspacing \Umathcloseopenspacing
-\aliased\let\closeclosespacing \Umathcloseclosespacing
-\aliased\let\closepunctspacing \Umathclosepunctspacing
-\aliased\let\closeinnerspacing \Umathcloseinnerspacing
-\aliased\let\closefracspacing \Umathclosefracspacing
-\aliased\let\closeradspacing \Umathcloseradspacing
-
-\aliased\let\punctordspacing \Umathpunctordspacing
-\aliased\let\punctopspacing \Umathpunctopspacing
-\aliased\let\punctbinspacing \Umathpunctbinspacing
-\aliased\let\punctrelspacing \Umathpunctrelspacing
-\aliased\let\punctopenspacing \Umathpunctopenspacing
-\aliased\let\punctclosespacing \Umathpunctclosespacing
-\aliased\let\punctpunctspacing \Umathpunctpunctspacing
-\aliased\let\punctinnerspacing \Umathpunctinnerspacing
-\aliased\let\punctfracspacing \Umathpunctfracspacing
-\aliased\let\punctradspacing \Umathpunctradspacing
-
-\aliased\let\innerordspacing \Umathinnerordspacing
-\aliased\let\inneropspacing \Umathinneropspacing
-\aliased\let\innerbinspacing \Umathinnerbinspacing
-\aliased\let\innerrelspacing \Umathinnerrelspacing
-\aliased\let\inneropenspacing \Umathinneropenspacing
-\aliased\let\innerclosespacing \Umathinnerclosespacing
-\aliased\let\innerpunctspacing \Umathinnerpunctspacing
-\aliased\let\innerinnerspacing \Umathinnerinnerspacing
-\aliased\let\innerfracspacing \Umathinnerfracspacing
-\aliased\let\innerradspacing \Umathinnerradspacing
-
-\aliased\let\fracordspacing \Umathfracordspacing
-\aliased\let\fracopspacing \Umathfracopspacing
-\aliased\let\fracbinspacing \Umathfracbinspacing
-\aliased\let\fracrelspacing \Umathfracrelspacing
-\aliased\let\fracopenspacing \Umathfracopenspacing
-\aliased\let\fracclosespacing \Umathfracclosespacing
-\aliased\let\fracpunctspacing \Umathfracpunctspacing
-\aliased\let\fracinnerspacing \Umathfracinnerspacing
-\aliased\let\fracfracspacing \Umathfracfracspacing
-\aliased\let\fracradspacing \Umathfracradspacing
-
-\aliased\let\radordspacing \Umathradordspacing
-\aliased\let\radopspacing \Umathradopspacing
-\aliased\let\radbinspacing \Umathradbinspacing
-\aliased\let\radrelspacing \Umathradrelspacing
-\aliased\let\radopenspacing \Umathradopenspacing
-\aliased\let\radclosespacing \Umathradclosespacing
-\aliased\let\radpunctspacing \Umathradpunctspacing
-\aliased\let\radinnerspacing \Umathradinnerspacing
-\aliased\let\radfracspacing \Umathradfracspacing
-\aliased\let\radradspacing \Umathradradspacing
+\let\normalreqno \normaleqno
+%let\mathtopaccent \normaloverline
+%let\mathbottomaccent\normalunderline
\protect \endinput
diff --git a/tex/context/base/mkxl/pack-box.mkxl b/tex/context/base/mkxl/pack-box.mkxl
index 9ed90a885..831ec1707 100644
--- a/tex/context/base/mkxl/pack-box.mkxl
+++ b/tex/context/base/mkxl/pack-box.mkxl
@@ -1118,13 +1118,13 @@
[\c!width=\overlaywidth,\c!height=\overlayheight]
{\overlayimage{#1}}}
-%D Here is an end December 2021 experimental feature: anchored boxes. This will move to
-%D pack-box.mkxl
+%D Here is an end December 2021 experimental feature: anchored boxes.
\installcorenamespace{boxanchor}
\installcorenamespace{boxanchorid}
\installcorenamespace{boxanchorbox}
\installcorenamespace{boxpreset}
+\installcorenamespace{boxanchors}
\installparameterhandler \??boxanchor {boxanchor}
\installsetuphandler \??boxanchor {boxanchor}
@@ -1221,16 +1221,16 @@
\expandafter\integerdef\csname\??boxpreset\v!left,\v!top \endcsname\leftheightlistanchorcode
\expandafter\integerdef\csname\??boxpreset\v!left,\v!depth \endcsname\leftdepthlistanchorcode
\expandafter\integerdef\csname\??boxpreset\v!left,\v!bottom \endcsname\leftdepthlistanchorcode
-%
+
\expandafter\integerdef\csname\??boxpreset\v!right \endcsname\rightoriginlistanchorcode
\expandafter\integerdef\csname\??boxpreset\v!right,\v!height \endcsname\rightheightlistanchorcode
\expandafter\integerdef\csname\??boxpreset\v!right,\v!top \endcsname\rightheightlistanchorcode
\expandafter\integerdef\csname\??boxpreset\v!right,\v!depth \endcsname\rightdepthlistanchorcode
\expandafter\integerdef\csname\??boxpreset\v!right,\v!bottom \endcsname\rightdepthlistanchorcode
-% \centeroriginlistanchorcode
-% \centerheightlistanchorcode
-% \centerdepthlistanchorcode
+\expandafter\integerdef\csname\??boxpreset\v!line \endcsname\centeroriginlistanchorcode
+\expandafter\integerdef\csname\??boxpreset\v!height \endcsname\centerheightlistanchorcode
+\expandafter\integerdef\csname\??boxpreset\v!depth \endcsname\centerdepthlistanchorcode
\expandafter\integerdef\csname\??boxpreset\v!middle \endcsname\halfwaytotallistanchorcode
\expandafter\integerdef\csname\??boxpreset\v!middle,\v!height\endcsname\halfwayheightlistanchorcode
@@ -1240,6 +1240,67 @@
\expandafter\integerdef\csname\??boxpreset\v!middle,\v!left \endcsname\halfwayleftlistanchorcode
\expandafter\integerdef\csname\??boxpreset\v!middle,\v!right \endcsname\halfwayrightlistanchorcode
+% Musical timestamp: 2022-02-07 while listening Hypneurotic from The Blurred Horizon (n times);
+% Jim Matheos with Gavin Harrison; very hypnotic indeed.
+
+\permanent\def\boxanchorpresetcode#1%
+ {\ifcsname\??boxpreset#1\endcsname\lastnamedcs\else\halfwaytotallistanchorcode\fi}
+
+\newcount\registeredboxanchor
+
+\permanent\protected\def\registerboxanchor
+ {\global\advance\registeredboxanchor\minusone}
+
+\permanent\protected\def\defineboxanchor[#1]%
+ {\registerboxanchor
+ \expandafter\integerdef\csname\??boxanchors#1\endcsname\registeredboxanchor}
+
+\permanent\def\namedboxanchor#1%
+ {\normalexpanded{\ifcsname\??boxanchors#1\endcsname\lastnamedcs\orelse\ifchknum#1\or#1\else\zerocount\fi}}
+
+\installcorenamespace{boxanchorcontent}
+
+\installparameterhandler \??boxanchorcontent {boxanchorcontent}
+\installsetuphandler \??boxanchorcontent {boxanchorcontent}
+
+\setupboxanchorcontent
+ [\c!yoffset=\zeropoint,
+ \c!xoffset=\zeropoint,
+ \c!width=\zeropoint,
+ \c!location=\v!height,
+ \c!corner=\v!depth]
+
+\permanent\tolerant\protected\def\setboxanchor[#1]#*[#2]#*% assumes \defineboxanchor[#1]
+ {\begingroup
+ \dowithnextbox
+ {\setupcurrentboxanchorcontent[#2]%
+ \scratchxoffset\boxanchorcontentparameter\c!xoffset
+ \scratchyoffset\boxanchorcontentparameter\c!yoffset
+ \scratchcounter\namedboxanchor{#1}%
+ \registeranchorbox
+ \scratchcounter
+ \plusone % order
+ \hbox
+ \s!anchors % check order of these:
+ \boxanchorpresetcode{\boxanchorcontentparameter\c!corner}
+ \boxanchorpresetcode{\boxanchorcontentparameter\c!location}
+ \ifzeropt\scratchxoffset\else \s!xoffset \scratchxoffset\fi
+ \ifzeropt\scratchyoffset\else \s!yoffset \scratchyoffset\fi
+ \s!target \scratchcounter
+ {\box\nextbox}%
+ \endgroup}}
+
+% to be used as:
+%
+% \scratchcounter\registeredboxanchor
+%
+% \registeranchorbox
+% \scratchcounter
+% \plusone
+% \ruledhbox{...}
+%
+% \hbox source \scratchcounter
+
% \negatexlistsigncode
% \negateylistsigncode
% \negatelistsigncode
diff --git a/tex/context/base/mkxl/pack-lyr.mkxl b/tex/context/base/mkxl/pack-lyr.mkxl
index 3c0352bf3..3b7e2324d 100644
--- a/tex/context/base/mkxl/pack-lyr.mkxl
+++ b/tex/context/base/mkxl/pack-lyr.mkxl
@@ -661,7 +661,7 @@
\ifx\p_pack_layers_position\v!yes
\edef\p_pack_layers_region{\layerparameter\c!region}%
\ifempty\p_pack_layers_region\else
- \anch_mark_tagged_box\nextbox\p_pack_layers_region % was \layeranchor
+ \anch_mark_tagged_box\nextbox\p_pack_layers_region\zerocount % was \layeranchor
\fi
\fi
\box\nextbox
diff --git a/tex/context/base/mkxl/pack-mat.mkxl b/tex/context/base/mkxl/pack-mat.mkxl
new file mode 100644
index 000000000..c0aa1cc94
--- /dev/null
+++ b/tex/context/base/mkxl/pack-mat.mkxl
@@ -0,0 +1,84 @@
+%D \module
+%D [ file=pack-rul, % was core-rul,
+%D version=2022.02.23,
+%D title=\CONTEXT\ Packaging Macros,
+%D subtitle=Ruled Math,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+\writestatus{loading}{ConTeXt Packaging Macros / Ruled Math}
+
+%D This is a by product of the math improvement activity by Mikael Sundqvist and
+%D myself. More might end up here and more control might be added.
+
+\unprotect
+
+\newconditional \c_framed_math_framed
+
+\installtextracker
+ {framed.math}
+ {\settrue \c_framed_math_framed}
+ {\setfalse\c_framed_math_framed}
+
+\tolerant\protected\def\mathframed[#1]#:#2%
+ {\begingroup
+ \ifconditional\c_framed_math_framed
+ \defineboxanchor[temp]%
+ \fi
+ \setmathatomrule\mathbegincode\mathbincode\allmathstyles\mathbegincode\mathbincode
+ \normalexpanded
+ {\setbox\scratchbox\hpack
+ \ifconditional\c_framed_math_framed
+ \s!source \namedboxanchor{temp}
+ \fi
+ \s!ymove \Umathaxis\Ustyle\mathstyle
+ \bgroup
+ \framed
+ [\c!location=\v!middle,#1]
+ {\startimath
+ \Ustyle\mathstyle
+ #2%
+ \stopimath}%
+ \egroup}%
+ \scratchcounterone\lastleftclass
+ \scratchcountertwo\lastrightclass
+ % \writestatus{!!}{[\number\lastleftclass,\number\lastrightclass]}%
+ \mathatom
+ \s!class \mathexplicitcode
+ \ifnum\scratchcounterone<\zerocount\else\s!leftclass \scratchcounterone\fi
+ \ifnum\scratchcountertwo<\zerocount\else\s!rightclass\scratchcountertwo\fi
+ \bgroup
+ \ifconditional\c_framed_math_framed
+ \setboxanchor[temp][\c!corner={\v!left,\v!bottom},\c!location={\v!right,\v!height}]
+ \hpack{\smallinfofont \the\scratchcounterone}%
+ \setboxanchor[temp][\c!corner={\v!right,\v!bottom},\c!location={\v!left,\v!height}]
+ \hpack{\smallinfofont \the\scratchcountertwo}%
+ \fi
+ \box\scratchbox
+ \egroup
+ \endgroup}
+
+%D \starttyping
+%D \enabletrackers[framed.math]
+%D
+%D \startTEXpage[offset=10pt,width=40dk]
+%D \showmakeup[mathglue]
+%D \def\MyTest#1%
+%D {$ x #1 x $\quad
+%D $ x \mathframed[offset=0pt]{#1} x $\quad
+%D $\displaystyle x #1 x $\quad
+%D $\displaystyle x \mathframed[offset=0pt]{#1} x $}
+%D \MyTest{>}\blank
+%D \MyTest{+}\blank
+%D \MyTest{!}\blank
+%D \MyTest{+\frac{1}{2}+}\blank
+%D \MyTest{\frac{1}{2}}\blank
+%D \stopTEXpage
+%D \stoptyping
+
+\protect
diff --git a/tex/context/base/mkxl/page-bck.mkxl b/tex/context/base/mkxl/page-bck.mkxl
index e955325e5..5c9b96fd7 100644
--- a/tex/context/base/mkxl/page-bck.mkxl
+++ b/tex/context/base/mkxl/page-bck.mkxl
@@ -354,7 +354,7 @@
\def\page_backgrounds_set_box#1% #2%
{\global\setbox#1\vpack
{\dontcomplain
- \page_layouts_swap_margins
+ \page_layouts_swap_margins\v!background
\ifconditional\swapbackgroundmargins
\doifelsemarginswap \donothing
{\enforced\swapcsvalues\v!rightmargin\v!leftmargin
@@ -362,9 +362,6 @@
\fi
\calculatereducedvsizes
\offinterlineskip
- % \ifconditional#2\relax
- % \page_layouts_swap_margins_indeed % hm, this one gets nilled in \page_layouts_swap_margin anyway
- % \fi
\ifdim\topheight>\zeropoint
\kern\dimexpr-\topheight-\topdistance\relax
\page_backgrounds_set_box_row\v!top\topheight
diff --git a/tex/context/base/mkxl/page-box.mklx b/tex/context/base/mkxl/page-box.mklx
index c962b831a..56cb73f7a 100644
--- a/tex/context/base/mkxl/page-box.mklx
+++ b/tex/context/base/mkxl/page-box.mklx
@@ -250,11 +250,22 @@
% nearly always some displacement so no speedup test needed
+% \def\page_boxes_apply_offsets#1%
+% {\setbox#1\vpack to \paperheight
+% {\hsize\paperwidth
+% \vkern\topspace
+% \hkern\doifbothsides\backspace\backspace{\dimexpr\paperwidth-\backspace-\makeupwidth\relax}%
+% \box#1}%
+% \dp#1\zeropoint}
+
\def\page_boxes_apply_offsets#1%
{\setbox#1\vpack to \paperheight
{\hsize\paperwidth
\vkern\topspace
\hkern\doifbothsides\backspace\backspace{\dimexpr\paperwidth-\backspace-\makeupwidth\relax}%
+% \hkern\doifbothsides\backspace\backspace\cutspace
+% \page_layouts_swap_margins\v!page
+% \hkern\backspace
\box#1}%
\dp#1\zeropoint}
diff --git a/tex/context/base/mkxl/page-flt.mkxl b/tex/context/base/mkxl/page-flt.mkxl
index a97cc7f0d..a360dc42f 100644
--- a/tex/context/base/mkxl/page-flt.mkxl
+++ b/tex/context/base/mkxl/page-flt.mkxl
@@ -55,7 +55,7 @@
\newconditional\c_page_floats_center_box \settrue\c_page_floats_center_box
\newconditional\c_page_floats_center_box_local
\newconditional\c_page_floats_center_box_global
-\newconditional\c_page_floats_compress_flushed \settrue\c_page_floats_compress_flushed
+\newconditional\c_page_floats_compress_flushed \settrue\c_page_floats_compress_flushed
\newdimen \d_page_floats_compress_distance
diff --git a/tex/context/base/mkxl/page-lay.mkxl b/tex/context/base/mkxl/page-lay.mkxl
index 835a3ca4b..4527759b3 100644
--- a/tex/context/base/mkxl/page-lay.mkxl
+++ b/tex/context/base/mkxl/page-lay.mkxl
@@ -123,7 +123,7 @@
\doifnothing{\directlayoutparameter\c!state}{\letlayoutparameter\c!state\v!start}%
\to \everydefinelayout
-\newconditional \layouthaschanged \settrue\layouthaschanged % used in mp
+\newcount\c_page_layouts_changed
\appendtoks
\ifcase\layoutsetupmode
@@ -155,13 +155,9 @@
\page_layouts_synchronize
\page_layouts_check_next
\fi
- \global\settrue\layouthaschanged
+ \global\c_page_layouts_changed\realpageno
\to \everysetuplayout
-\appendtoks
- \global\setfalse\layouthaschanged
-\to \everyaftershipout
-
\permanent\def\doifelselayoutdefined#1%
{\ifcsname\namedlayouthash{#1}\c!state\endcsname % maybe a helper
\expandafter\firstoftwoarguments
@@ -218,12 +214,22 @@
\newtoks\everyswapmargins % watch the order !
+\newconditional\marginsareswapped
+
\appendtoks
+ \ifconditional\marginsareswapped
+ \setfalse\marginsareswapped
+ \else
+ \settrue\marginsareswapped
+ \fi
+ %
\enforced\swapcsvalues\leftmargindistance\rightmargindistance
\enforced\swapcsvalues\leftedgedistance \rightedgedistance
\enforced\swapcsvalues\leftmarginwidth \rightmarginwidth
\enforced\swapcsvalues\leftedgewidth \rightedgewidth
%
+ \enforced\swapcsvalues\backspace \cutspace
+ %
\enforced\swapcsvalues\leftmargintotal \rightmargintotal
\enforced\swapcsvalues\leftedgetotal \rightedgetotal
\enforced\swapcsvalues\leftsidetotal \rightsidetotal
@@ -754,9 +760,9 @@
\ifx\p_direction\v!reverse
\enforced\global\swapcsvalues\naturalleftedgedistance \naturalrightedgedistance
\enforced\global\swapcsvalues\naturalleftmargindistance\naturalrightmargindistance
- \enforced\global\swapcsvalues\leftedgedistance \rightedgedistance
\enforced\global\swapcsvalues\leftmargindistance \rightmargindistance
\enforced\global\swapcsvalues\leftmarginwidth \rightmarginwidth
+ \enforced\global\swapcsvalues\leftedgedistance \rightedgedistance
\enforced\global\swapcsvalues\leftedgewidth \rightedgewidth
\enforced\global\swapcsvalues\backspace \cutspace
\expandafter\setsystemmode
@@ -1256,13 +1262,16 @@
\aliased\let\doifmarginswapelse\doifelsemarginswap
\protected\def\page_layouts_swap_margins % name will change, frozen?
- {\doifelsemarginswap\relax\page_layouts_swap_margins_indeed}
+ {\doifelsemarginswap\gobbleoneargument\page_layouts_swap_margins_indeed}
-\protected\def\page_layouts_swap_margins_indeed
- {\let\page_layouts_swap_margins \relax % to prevent local swapping
- \let\page_layouts_swap_margins_indeed\relax % to prevent local swapping
+\protected\def\page_layouts_swap_margins_indeed#1%
+ {\let\page_layouts_swap_margins\gobbleoneargument % to prevent local swapping
+ %\writestatus\m!layouts{swapping margins for #1}%
\the\everyswapmargins}
+\permanent\protected\def\swapmargindimensions
+ {\page_layouts_swap_margins\v!page}
+
\permanent\def\rightorleftpageaction
{\ifdoublesided
\expandafter\page_layouts_right_or_left_page_action
@@ -1353,6 +1362,15 @@
\glet\page_grids_add_to_one\gobbleoneargument
\glet\page_grids_add_to_mix\gobbleoneargument
+%D Play safe:
+
+\appendtoks
+ \ifnum\realpageno>\plusone
+ \page[\v!odd]%
+ \setuplayout
+ \fi
+\to \everysetuppagenumbering
+
%D The default dimensions are quite old and will not change. The funny fractions
%D were introduced when we went from fixed dimensions to relative ones. Since
%D \CONTEXT\ is a dutch package, the dimensions are based on the metric system. The
diff --git a/tex/context/base/mkxl/page-mbk.mklx b/tex/context/base/mkxl/page-mbk.mklx
index 05b09c79e..9999fb8c7 100644
--- a/tex/context/base/mkxl/page-mbk.mklx
+++ b/tex/context/base/mkxl/page-mbk.mklx
@@ -69,6 +69,12 @@
\c!inbetween=\blank,
\c!bottom=\vfill]
+\definesystemconstant{marginblock}
+
+\resetboxesincache \s!marginblock \s!marginblock
+
+\setfalse\c_page_margin_blocks_enabled
+
\permanent\tolerant\protected\def\startmarginblock[#tag]%
{\begingroup
\edef\currentmarginblock{#tag}%
@@ -77,60 +83,45 @@
\page_margin_blocks_start_block_nop}
\permanent\protected\def\stopmarginblock
- {\doifelse{\marginblockparameter\c!state}\v!start
- \page_margin_blocks_stop_block_yes
- \page_margin_blocks_stop_block_nop
+ {\page_margin_blocks_stop_block
\endgroup}
-\def\page_margin_blocks_start_block_yes % 2 maal \vbox ivm \unvbox elders
- {\showmessage\m!layouts4\empty
- \global\settrue\c_page_margin_blocks_present
- \global\setbox\b_page_margin_blocks\vtop\bgroup\vbox\bgroup
- \hsize\marginblockparameter\c!width
- \ifvoid\b_page_margin_blocks\else
- \unvbox\b_page_margin_blocks
- \marginblockparameter\c!inbetween
- \fi
- \usealignparameter\marginblockparameter
- \usemarginblockstyleandcolor\c!style\c!color
- \begstrut
- \ignorespaces}
+\def\page_margin_blocks_start_block_yes
+ {%\showmessage\m!layouts4\empty
+ \global\settrue\c_page_margin_blocks_enabled
+ \dowithnextboxcs
+ \page_margin_blocks_start_block_save
+ \vbox\bgroup
+ \let\page_margin_blocks_stop_block\page_margin_blocks_stop_block_yes
+ \hsize\marginblockparameter\c!width
+ \usealignparameter\marginblockparameter
+ \usemarginblockstyleandcolor\c!style\c!color
+ \begstrut
+ \ignorespaces}
\def\page_margin_blocks_stop_block_yes
{\removeunwantedspaces
\endstrut
- \egroup
\egroup}
+\def\page_margin_blocks_start_block_save
+ {\putboxincache\s!marginblock{+}\nextbox}
+
\def\page_margin_blocks_start_block_nop
- {\showmessage\m!layouts5\empty
+ {%\showmessage\m!layouts5\empty
\marginblockparameter\c!before
\bgroup
+ \let\page_margin_blocks_stop_block\page_margin_blocks_stop_block_nop
\usemarginblockstyleandcolor\c!style\c!color}
\def\page_margin_blocks_stop_block_nop
{\egroup
\marginblockparameter\c!after}
-\def\page_margin_blocks_reshape
- {\ifdim\ht\b_page_margin_blocks_prepared>\zeropoint
- \beginofshapebox
- \unvbox\b_page_margin_blocks_prepared
- \endofshapebox
- \reshapebox
- {\box\shapebox}%
- \setbox\b_page_margin_blocks_prepared\vbox to \textheight
- {\marginblockparameter\c!top
- \flushshapebox
- \marginblockparameter\c!bottom}%
- \fi}
-
\permanent\protected\def\checkmarginblocks
- {\ifvoid\b_page_margin_blocks
- \global\setfalse\c_page_margin_blocks_present
- \else
- \page_margin_blocks_check_indeed
- \fi}
+ {\ifconditional\c_page_margin_blocks_enabled\ifcase\getboxcountfromcache\s!marginblock\else
+ \expandafter\page_margin_blocks_check_indeed
+ \fi\fi}
\def\page_margin_blocks_check_indeed
{\ifcsname\??marginblocklocation\marginblockparameter\c!location\endcsname
@@ -138,39 +129,58 @@
\csname\??marginblocklocation\marginblockparameter\c!location\endcsname
\else
\global\setbox\b_page_margin_blocks\emptybox
- \global\setfalse\c_page_margin_blocks_present
\fi}
\def\page_margin_blocks_prepare_box
- {\setbox\b_page_margin_blocks_prepared\vbox
- {\forgetall
- \splittopskip\topskip
- \ifvoid\b_page_margin_blocks\else
- \ifdim\ht\b_page_margin_blocks>\textheight
- \vsplit\b_page_margin_blocks to \textheight
- \else
- \unvbox\b_page_margin_blocks
- \fi
+ {\begingroup
+ \scratchcounter\zerocount
+ \localcontrolledloop \plusone \getboxcountfromcache\s!marginblock \plusone
+ {\scratchcounter\currentloopiterator
+ \setbox\scratchbox\vbox\bgroup
+ \marginblockparameter\c!top
+ \localcontrolledloop \plusone \scratchcounter \plusone
+ {\ifcase\currentloopiterator\or
+ \marginblockparameter\c!before
+ \else
+ \marginblockparameter\c!inbetween
+ \fi
+ \setbox\scratchbox\emptyvbox
+ \ht\scratchbox\getboxhtfromcache\s!marginblock{\number\currentloopiterator}%
+ \dp\scratchbox\getboxdpfromcache\s!marginblock{\number\currentloopiterator}%
+ \box\scratchbox
+ \marginblockparameter\c!after}%
+ \marginblockparameter\c!bottom
+ \egroup
+ \ifdim\htdp\scratchbox>\textheight
+ \advance\scratchcounter\minusone
+ %\writestatus{quit}{\the\scratchcounter=>\the\htdp\scratchbox}
+ \quitloop
+ \else
+ %\writestatus{progress}{\the\htdp\scratchbox}
\fi}%
- \page_margin_blocks_reshape
- \setbox\b_page_margin_blocks_prepared\vbox
- {\marginblockparameter\c!before
- \box\b_page_margin_blocks_prepared
- \marginblockparameter\c!after}}
+ \ifcase\scratchcounter\else
+ \global\setbox\b_page_margin_blocks_prepared\vbox to \textheight\bgroup
+ \marginblockparameter\c!top
+ \localcontrolledloop \plusone \scratchcounter \plusone
+ {\ifcase\currentloopiterator\or
+ \marginblockparameter\c!before
+ \else
+ \marginblockparameter\c!inbetween
+ \fi
+ \getboxfromcache\s!marginblock{\number\currentloopiterator}\scratchbox
+ \box\scratchbox
+ \marginblockparameter\c!after}%
+ \marginblockparameter\c!bottom
+ \egroup
+ \pruneboxesincache\s!marginblock
+ \ifcase\getboxcountfromcache\s!marginblock\relax
+ \global\settrue\c_page_margin_blocks_enabled
+ \fi
+ \fi
+ \endgroup}
% inner outer
-\setvalue{\??marginblocklocation\v!left }{\page_margin_blocks_set_l_box}
-\setvalue{\??marginblocklocation\v!right }{\page_margin_blocks_set_r_box}
-\setvalue{\??marginblocklocation\v!inmargin}{\doifbothsidesoverruled
- \page_margin_blocks_set_r_box
- \page_margin_blocks_set_r_box
- \page_margin_blocks_set_l_box}
-\setvalue{\??marginblocklocation\v!middle }{\doifbothsidesoverruled
- \page_margin_blocks_set_r_box
- \page_margin_blocks_set_l_box
- \page_margin_blocks_set_r_box}
-
\permanent\protected\def\page_margin_blocks_place_r_yes
{\setbox\b_page_margin_blocks_prepared\hbox to \rightmarginwidth
{\marginblockparameter\c!left
@@ -196,6 +206,21 @@
\def\page_margin_blocks_set_r_box{\enforced\aliased\let\placerightmarginblock\page_margin_blocks_place_r_yes}
\def\page_margin_blocks_set_l_box{\enforced\aliased\let\placeleftmarginblock \page_margin_blocks_place_l_yes}
+\letcsname\??marginblocklocation\v!left \endcsname\page_margin_blocks_set_l_box
+\letcsname\??marginblocklocation\v!right\endcsname\page_margin_blocks_set_r_box
+
+\defcsname\??marginblocklocation\v!inmargin\endcsname
+ {\doifbothsidesoverruled
+ \page_margin_blocks_set_r_box
+ \page_margin_blocks_set_r_box
+ \page_margin_blocks_set_l_box}
+
+\defcsname\??marginblocklocation\v!middle\endcsname
+ {\doifbothsidesoverruled
+ \page_margin_blocks_set_r_box
+ \page_margin_blocks_set_l_box
+ \page_margin_blocks_set_r_box}
+
% margin floats (keyword 'margin' in option list)
\protected\def\page_margin_blocks_process_float
@@ -204,40 +229,41 @@
\page_margin_blocks_process_float_nop}
\def\page_margin_blocks_process_float_yes
- {\global\setbox\b_page_margin_blocks\vbox
- {\hsize\marginblockparameter\c!width
- \unvcopy\b_page_margin_blocks
- \ifvoid\b_page_margin_blocks\else
- \expandafter\marginblockparameter\expandafter\c!inbetween
- \fi
- \box\floatbox
- \filbreak}%
- \ifdim\ht\b_page_margin_blocks>\textheight
- % page_floats_report_saved % no saving done anyway
- \else
- \page_floats_report_total
- \fi}
+ {\global\settrue\c_page_margin_blocks_enabled
+ \putboxincache\s!marginblock{+}\floatbox}
\def\page_margin_blocks_process_float_nop
{\handlefloatmethod\v!here}
-\def\page_margin_blocks_float_before
- {\ifconditional\c_page_margin_blocks_enabled
- \doifinset\v!margin\floatlocation\endgraf
- \fi}
-
-\def\page_margin_blocks_float_set_hsize
- {\ifconditional\c_page_margin_blocks_enabled
- \doifinset\v!margin\floatlocation{\hsize\rootmarginblockparameter\c!width}%
- \fi}
-
\appendtoks
- \ifvoid\b_page_margin_blocks \else
+ \ifcase\getboxcountfromcache\s!marginblock\else
\writestatus\m!layouts{beware: there are left-over margin floats!}%
\fi
\to \everystoptext
\permanent\protected\def\flushmarginblocks
- {\page_otr_command_flush_margin_blocks}
+ {\ifconditional\c_page_margin_blocks_enabled
+ \page_otr_command_flush_margin_blocks
+ \fi}
+
+\permanent\tolerant\protected\def\flushallmarginblocks[#1]%
+ {\ifconditional\c_page_margin_blocks_enabled
+ \begingroup
+ \scratchcounterone\getboxcountfromcache\s!marginblock\relax
+ \ifcase\scratchcounterone\else
+ \scratchcountertwo\ifparameter#1\or\numexpr\scratchcounterone-#1+\plusone\relax\else\plusone\fi
+ \localcontrolledloop \scratchcountertwo \scratchcounterone \plusone
+ {\ifcase\currentloopiterator\or
+ \marginblockparameter\c!before
+ \else
+ \marginblockparameter\c!inbetween
+ \fi
+ \getboxfromcache\s!marginblock{\number\currentloopiterator}\scratchbox
+ \box\scratchbox
+ \marginblockparameter\c!after}%
+ \pruneboxesincache\s!marginblock
+ \fi
+ \endgroup
+ \fi}
\protect \endinput
diff --git a/tex/context/base/mkxl/page-one.mkxl b/tex/context/base/mkxl/page-one.mkxl
index 61f9172ea..f900d561d 100644
--- a/tex/context/base/mkxl/page-one.mkxl
+++ b/tex/context/base/mkxl/page-one.mkxl
@@ -284,6 +284,7 @@
% baseline
\unskip % new per 2019-06-18, otherwise weird bottom floats
\vkern\dimexpr\maxdepth-\d_page_one_natural_depth\relax
+ % \srule depth \dimexpr\maxdepth-\d_page_one_natural_depth\relax
\page_otr_command_flush_bottom_insertions
\fi
\fakepagenotes}%
diff --git a/tex/context/base/mkxl/page-sid.mkxl b/tex/context/base/mkxl/page-sid.mkxl
index 1ff587120..8959a0e3d 100644
--- a/tex/context/base/mkxl/page-sid.mkxl
+++ b/tex/context/base/mkxl/page-sid.mkxl
@@ -534,7 +534,7 @@
\egroup}}
\def\page_sides_flush_floats_normal
- {\ifdim\scratchdimen>\htdp\strutbox
+ {\ifdim\scratchdimen>\struthtdp
\strut
\else
\m_pages_strut
diff --git a/tex/context/base/mkxl/page-str.lmt b/tex/context/base/mkxl/page-str.lmt
new file mode 100644
index 000000000..9c2562cc4
--- /dev/null
+++ b/tex/context/base/mkxl/page-str.lmt
@@ -0,0 +1,320 @@
+if not modules then modules = { } end modules ['page-str'] = {
+ version = 1.001,
+ comment = "companion to page-str.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- streams -> managers.streams
+
+-- work in progresss .. unfinished .. non-optimized
+
+local concat, insert, remove = table.concat, table.insert, table.remove
+
+local nodes, node = nodes, node
+
+local tasks = nodes.tasks
+
+local implement = interfaces.implement
+
+local nodecodes = nodes.nodecodes
+
+local nuts = nodes.nuts
+local tonut = nodes.tonut
+local slide_node_list = nuts.slide
+local write_node = nuts.write
+local flushnode = nuts.flush
+local copy_node_list = nuts.copylist
+local vpack_node_list = nuts.vpack
+local new_strut = nuts.pool.strutrule
+
+----- getbox = nuts.getbox
+local setlink = nuts.setlink
+local getlist = nuts.getlist
+local setlist = nuts.setlist
+local getwhd = nuts.getwhd
+local setwhd = nuts.setwhd
+local setattrlist = nuts.setattrlist
+
+local settings_to_array = utilities.parsers.settings_to_array
+
+local enableaction = nodes.tasks.enableaction
+
+local texgetdimen = tex.getdimen
+
+local trace_collecting = false trackers.register("streams.collecting", function(v) trace_collecting = v end)
+local trace_flushing = false trackers.register("streams.flushing", function(v) trace_flushing = v end)
+
+local report_streams = logs.reporter("streams")
+
+streams = streams or { } -- might move to the builders namespace
+local streams = streams
+
+-- maybe store head and tail ... first we need usage
+
+local data = { }
+local name = nil
+local stack = { }
+
+function streams.enable(newname)
+ if newname == "default" then
+ name = nil
+ else
+ name = newname
+ end
+end
+
+function streams.disable()
+ name = stack[#stack]
+end
+
+function streams.start(newname)
+ insert(stack,name)
+ name = newname
+end
+
+function streams.stop(newname)
+ name = remove(stack)
+end
+
+function streams.collect(head,where)
+ if name and head and name ~= "default" then
+ local head = tonut(head)
+ local dana = data[name]
+ if not dana then
+ dana = { }
+ data[name] = dana
+ end
+ local last = dana[#dana]
+ if last then
+ local tail = slide_node_list(last)
+ setlink(tail,head)
+ elseif last == false then
+ dana[#dana] = head
+ else
+ dana[1] = head
+ end
+ if trace_collecting then
+ report_streams("appending snippet %a to slot %s",name,#dana)
+ end
+ return nil
+ else
+ return head
+ end
+end
+
+function streams.push(thename)
+ if not thename or thename == "" then
+ thename = name
+ end
+ if thename and thename ~= "" then
+ local dana = data[thename]
+ if dana then
+ dana[#dana+1] = false
+ if trace_collecting then
+ report_streams("pushing snippet %a",thename)
+ end
+ end
+ end
+end
+
+function streams.flush(name,copy) -- problem: we need to migrate afterwards
+ local dana = data[name]
+ if dana then
+ local dn = #dana
+ if dn == 0 then
+ -- nothing to flush
+ elseif copy then
+ if trace_flushing then
+ report_streams("flushing copies of %s slots of %a",dn,name)
+ end
+ for i=1,dn do
+ local di = dana[i]
+ if di then
+ write_node(copy_node_list(getlist(di))) -- list, will be option
+ end
+ end
+ if copy then
+ data[name] = nil
+ end
+ else
+ if trace_flushing then
+ report_streams("flushing %s slots of %a",dn,name)
+ end
+ for i=1,dn do
+ local di = dana[i]
+ if di then
+ write_node(getlist(di)) -- list, will be option
+ setlist(di)
+ flushnode(di)
+ end
+ end
+ end
+ end
+end
+
+function streams.synchronize(list) -- this is an experiment !
+ -- we don't optimize this as we want to trace in detail
+ list = settings_to_array(list)
+ local max = 0
+ if trace_flushing then
+ report_streams("synchronizing list: % t",list)
+ end
+ for i=1,#list do
+ local dana = data[list[i]]
+ if dana then
+ local n = #dana
+ if n > max then
+ max = n
+ end
+ end
+ end
+ if trace_flushing then
+ report_streams("maximum number of slots: %s",max)
+ end
+ for m=1,max do
+ local height, depth = 0, 0
+ for i=1,#list do
+ local name = list[i]
+ local dana = data[name]
+ if dana then
+ local slot = dana[m]
+ if slot then
+ local vbox = vpack_node_list(slot)
+ local wd, ht, dp = getwhd(vbox)
+ if ht > height then
+ height = ht
+ end
+ if dp > depth then
+ depth = dp
+ end
+ dana[m] = vbox
+ if trace_flushing then
+ report_streams("slot %s of %a is packed to height %p and depth %p",m,name,ht,dp)
+ end
+ end
+ end
+ end
+ if trace_flushing then
+ report_streams("slot %s has max height %p and max depth %p",m,height,depth)
+ end
+ local strutht = texgetdimen("globalbodyfontstrutheight")
+ local strutdp = texgetdimen("globalbodyfontstrutdepth")
+ local struthtdp = strutht + strutdp
+ for i=1,#list do
+ local name = list[i]
+ local dana = data[name]
+ if dana then
+ local vbox = dana[m]
+ if vbox then
+ local wd, ht, dp = getwhd(vbox)
+ local delta_height = height - ht
+ local delta_depth = depth - dp
+ if delta_height > 0 or delta_depth > 0 then
+ if false then
+ -- actually we need to add glue and repack
+ setwhd(vbox,false,height,depth)
+ if trace_flushing then
+ report_streams("slot %s of %a with delta (%p,%p) is compensated",m,i,delta_height,delta_depth)
+ end
+ else
+ -- this is not yet ok as we also need to keep an eye on vertical spacing
+ -- so we might need to do some splitting or whatever
+ local list = getlist(vbox)
+ local tail = list and slide_node_list(list)
+ local n = 0
+ local delta = delta_height -- for tracing
+ while delta > 0 do
+ -- we need to add some interline penalties
+ local strut = new_strut(0,strutht,strutdp)
+ setattrlist(strut,vbox)
+ if tail then
+ -- todo: inject at a better place
+ setlink(tail,strut)
+ end
+ tail = strut
+ n = n + 1
+ delta = delta - struthtdp
+ end
+ dana[m] = vpack_node_list(getlist(vbox))
+ setlist(vbox)
+ flushnode(vbox)
+ if trace_flushing then
+ report_streams("slot %s:%s with delta (%p,%p) is compensated by %s lines",m,i,delta_height,delta_depth,n)
+ end
+ end
+ end
+ end
+ else
+ -- make dummy
+ end
+ end
+ end
+end
+
+-- hm, nut or node
+
+tasks.appendaction("mvlbuilders", "normalizers", "streams.collect")
+
+tasks.disableaction("mvlbuilders", "streams.collect")
+
+function streams.initialize()
+ enableaction("mvlbuilders","streams.collect")
+ function streams.initialize() end
+end
+
+-- todo: remove empty last { }'s
+-- todo: better names, enable etc
+
+implement {
+ name = "initializestream",
+ actions = streams.initialize,
+ onlyonce = true,
+}
+
+implement {
+ name = "enablestream",
+ actions = streams.enable,
+ arguments = "string"
+}
+
+implement {
+ name = "disablestream",
+ actions = streams.disable
+}
+
+implement {
+ name = "startstream",
+ actions = streams.start,
+ arguments = "string"
+}
+
+implement {
+ name = "stopstream",
+ actions = streams.stop
+}
+
+implement {
+ name = "flushstream",
+ actions = streams.flush,
+ arguments = "string"
+}
+
+implement {
+ name = "flushstreamcopy",
+ actions = streams.flush,
+ arguments = { "string", true }
+}
+
+implement {
+ name = "synchronizestream",
+ actions = streams.synchronize,
+ arguments = "string"
+}
+
+implement {
+ name = "pushstream",
+ actions = streams.push,
+ arguments = "string"
+}
diff --git a/tex/context/base/mkxl/page-str.mkxl b/tex/context/base/mkxl/page-str.mkxl
index d6e01ea59..067283ee0 100644
--- a/tex/context/base/mkxl/page-str.mkxl
+++ b/tex/context/base/mkxl/page-str.mkxl
@@ -27,7 +27,7 @@
%D
%D Remark: marknotes are gone, at least for a while.
-\registerctxluafile{page-str}{}
+\registerctxluafile{page-str}{autosuffix}
\unprotect
diff --git a/tex/context/base/mkxl/page-txt.mklx b/tex/context/base/mkxl/page-txt.mklx
index 4d80cfa76..a66dc0829 100644
--- a/tex/context/base/mkxl/page-txt.mklx
+++ b/tex/context/base/mkxl/page-txt.mklx
@@ -866,7 +866,7 @@
{\setbox\b_page_layouts_element\vpack
{\dontcomplain
\calculatereducedvsizes
- \page_layouts_swap_margins
+ \page_layouts_swap_margins\v!text
\offinterlineskip
\vkern\dimexpr-\topheight-\topdistance\relax
\the\toptextcontent
@@ -896,12 +896,12 @@
{\offinterlineskip
\calculatereducedvsizes
\calculatehsizes
- \page_layouts_swap_margins
+ \page_layouts_swap_margins\v!page
\vkern\dimexpr\headerheight+\headerdistance+\textdistance\relax
\dontleavehmode
\hpack to \makeupwidth
{\begingroup
- \page_layouts_swap_margins
+ % \page_layouts_swap_margins\v!page
\goleftonpage
\ifdim\leftedgewidth>\zeropoint
\the\leftedgetextcontent
diff --git a/tex/context/base/mkxl/spac-hor.mkxl b/tex/context/base/mkxl/spac-hor.mkxl
index c8ac4c74c..ee9001e62 100644
--- a/tex/context/base/mkxl/spac-hor.mkxl
+++ b/tex/context/base/mkxl/spac-hor.mkxl
@@ -23,6 +23,7 @@
\bitwiseflip \normalizelinemode \normalizelinenormalizecode
\bitwiseflip \normalizelinemode \clipwidthnormalizecode
\bitwiseflip \normalizelinemode \flattendiscretionariesnormalizecode
+\bitwiseflip \normalizelinemode \flattenleadersnormalizecode % neglectable overhead
%bitwiseflip \normalizelinemode \discardzerotabskipsnormalizecode
\let\v_spac_indentation_current\empty % amount/keyword
@@ -900,6 +901,8 @@
% \box\b_spac_indentations_a
% \endgroup}
+%D Struts are done differently now.
+%D
%D The only complication lays in \type{\strut}. In \PLAIN\ \TEX\ a \type{\strut} is
%D defined as:
%D
diff --git a/tex/context/base/mkxl/spac-par.mkxl b/tex/context/base/mkxl/spac-par.mkxl
index d382a6c8c..098595dfe 100644
--- a/tex/context/base/mkxl/spac-par.mkxl
+++ b/tex/context/base/mkxl/spac-par.mkxl
@@ -39,7 +39,7 @@
+ \widowpenaltyfrozenparcode
+ \clubpenaltyfrozenparcode
+ \brokenpenaltyfrozenparcode
- + \shapingpenaltiesfrozenparcode
+ + \shapingpenaltyfrozenparcode
+ \orphanpenaltyfrozenparcode
\relax
@@ -83,7 +83,7 @@
+ \shapefrozenparcode % \parshape
% \linefrozenparcode % \baselineskip \lineskip \lineskiplimit
+ \hyphenationfrozenparcode % \hyphenationmode
- + \shapingpenaltiesfrozenparcode % \shapingpenaltiesmode
+ + \shapingpenaltyfrozenparcode % \shapingpenaltymode
+ \orphanpenaltyfrozenparcode
\relax
diff --git a/tex/context/base/mkxl/spac-ver.mkxl b/tex/context/base/mkxl/spac-ver.mkxl
index 3f40d98cf..68f74c9ee 100644
--- a/tex/context/base/mkxl/spac-ver.mkxl
+++ b/tex/context/base/mkxl/spac-ver.mkxl
@@ -825,22 +825,20 @@
%D
%D But we do things differently.
-\newbox\strutbox
+\newbox\b_strut_box
+\newbox\b_strut_tmp
-\setbox\strutbox\hpack{\vrule\s!height8.5pt\s!depth3.5pt\s!width\zeropoint} % just a start
-
-% \permanent\protected\def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox}
-%
-% \protected\def\strut
-% {\relax
-% \ifmmode\copy\else\dontleavehmode\unhcopy\fi\strutbox}
-%
-% \aliased\let\normalstrut\strut
+\permanent\protected\def\strutbox % not to be used but this is sort of an alias
+ {\beginlocalcontrol
+ \setbox\b_strut_tmp\hpack{\normalsrule\s!height\strutht\s!depth\strutdp}% just a start
+ \endlocalcontrol
+ \b_strut_tmp}
%D The double \type {\hbox} construction enables us to backtrack boxes.
-\overloaded\let\strutht\undefined \newdimen\strutht
-\overloaded\let\strutdp\undefined \newdimen\strutdp
+\overloaded\let\strutht \undefined \newdimen\strutht
+\overloaded\let\strutdp \undefined \newdimen\strutdp
+\overloaded\let\struthtdp\undefined \newdimen\struthtdp
\permanent\protected\def\setstrut
{\ifgridsnapping
@@ -884,9 +882,9 @@
\dosetstrut}
\permanent\protected\def\setcharstrut#1%
- {\setbox\strutbox\hbox{#1}% no \hpack, in case we have smallcaps
- \strutht\ht\strutbox
- \strutdp\dp\strutbox
+ {\setbox\b_strut_box\hbox{#1}% no \hpack, in case we have smallcaps
+ \strutht\ht\b_strut_box
+ \strutdp\dp\b_strut_box
\dosetstrut}
\permanent\protected\def\settightstrut
@@ -903,13 +901,17 @@
\permanent\protected\def\charhtstrut
{\begingroup
\setcharstrut{GJY}%
- \vrule\s!width\zeropoint\s!depth\zeropoint\s!height\strutht
+ \normalsrule
+ \s!depth \zeropoint
+ \s!height\strutht
\endgroup}
\permanent\protected\def\chardpstrut
{\begingroup
\setcharstrut{gjy}%
- \vrule\s!width\zeropoint\s!depth\strutdp\s!height\zeropoint
+ \normalsrule
+ \s!depth \strutdp
+ \s!height\zeropoint
\endgroup}
%D Because of all the callbacks in mkiv, we avoid unnecessary boxes ... maybe use an
@@ -919,143 +921,82 @@
\permanent\protected\def\dosetstrut
{\enforced\let\strut\normalstrut
- \ifabsnum\dimexpr\strutht+\strutdp-\lineheight\relax<\plustwo
+ \ifabsnum\dimexpr\struthtdp-\lineheight\relax<\plustwo
% compensate rounding error /- 1sp to avoid too many
% 1sp baselineskips in for instance verbatim
% \strutht\dimexpr\lineheight-\strutdp\relax
% better:
\strutdp\dimexpr\lineheight-\strutht\relax
\struttotal\lineheight
- \else
- \struttotal\dimexpr\strutht+\strutdp\relax
\fi
+ \struthtdp\dimexpr\strutht+\strutdp\relax
\strutheight\strutht
\strutdepth \strutdp
- \ifdim\strutwidth=\zeropoint
- \spac_struts_set_hide
- \else
- \spac_struts_set_vide
- \fi}
-
-\def\spac_struts_set_hide
- {\setbox\strutbox\hpack
- {\vrule
- \s!width \zeropoint
- \s!height\strutht
- \s!depth \strutdp}}
+ \struttotal \struthtdp}
\newconstant\c_strut_visual_mode
-\def\spac_struts_set_vide
- {\setbox\strutbox\hpack % at some time this extra wrapping was needed
- {\spac_struts_vide_hbox to \zeropoint
- {\ifcase\c_strut_visual_mode
- \spac_struts_black
- \or
- \spac_struts_color
- \else
- \spac_struts_black
- \fi}}}
-
-\def\spac_struts_black
- {\vrule
- \s!width \strutwidth
- \s!height\strutht
- \s!depth \strutdp
- \hss}
-
-\def\spac_struts_color
- {\hss % new, will be option
- \scratchwidth.1\struthtdp
- \begingroup
- \directcolor[f:b:t]%
- \vrule
- \s!width \scratchwidth
- \s!height\strutht
- \s!depth \strutdp
- \kern-\scratchwidth
- \vrule
- \s!width \scratchwidth
- \s!height\zeropoint
- \s!depth \strutdp
- \endgroup
- \kern-.625\scratchwidth
- \vrule
- \s!width .25\scratchwidth
- \s!height\strutht
- \s!depth \strutdp
- \hss}
-
-\let\spac_struts_vide_hbox\hbox % overloaded in trac-vis.mkiv
-
%D The dimen \type {\struttotal} holds the exact size of the strut; occasionally a
%D one scaled point difference can show up with the lineheight. This is more
%D efficient (less callbacks):
-\newbox\b_spac_struts_empty \setbox\b_spac_struts_empty\emptyhbox
-
-\def\spac_struts_set_hide
- {\setbox\strutbox\copy\b_spac_struts_empty
- \ht\strutbox\strutht
- \dp\strutbox\strutdp}
-
\permanent\protected\def\strut % still callbacks for \hbox{\strut}
{\relax
\dontleavehmode
- \copy\strutbox}
-
-% \protected\def\strut % slightly faster
-% {\relax
-% \ifmmode\copy\else\dontleavehmode\unhcopy\fi\strutbox}
+ \normalsrule
+ \s!height\strutht
+ \s!depth \strutdp
+ \relax}
\aliased\let\normalstrut\strut
\permanent\protected\def\halfstrut
{\relax
\dontleavehmode
- \begingroup
- \setbox\scratchbox\copy\strutbox
- \ht\scratchbox\dimexpr\strutht/\plustwo\relax
- \dp\scratchbox\dimexpr\strutdp/\plustwo\relax
- \box\scratchbox
- \endgroup}
+ \normalsrule
+ \s!height.5\strutht
+ \s!depth .5\strutdp
+ \relax}
\permanent\protected\def\quarterstrut
{\relax
\dontleavehmode
- \begingroup
- \setbox\scratchbox\copy\strutbox
- \ht\scratchbox\dimexpr\strutht/\plusfour\relax
- \dp\scratchbox\dimexpr\strutdp/\plusfour\relax
- \box\scratchbox
- \endgroup}
+ \normalsrule
+ \s!height.25\strutht
+ \s!depth .25\strutdp
+ \relax}
\permanent\protected\def\depthstrut
{\relax
\dontleavehmode
- \begingroup
- \setbox\scratchbox\copy\strutbox
- \ht\scratchbox\dimexpr\strutht-\struthtdp/\plustwo\relax % assumes that ht > lineheight/2
- \box\scratchbox
- \endgroup}
+ \normalsrule
+ \s!height\dimexpr\strutht-\struthtdp/\plustwo\relax
+ \s!depth \strutdp
+ \relax}
\permanent\protected\def\halflinestrut
{\relax
\dontleavehmode
- \begingroup
- \setbox\scratchbox\copy\strutbox
- \ht\scratchbox\dimexpr\strutht-.5\strutht-.5\strutdp\relax
- \box\scratchbox
- \endgroup}
+ \normalsrule
+ \s!height\dimexpr\strutht-.5\struthtdp\relax
+ \s!depth \strutdp
+ \relax}
\permanent\protected\def\noheightstrut
{\relax
\dontleavehmode
- \begingroup
- \setbox\scratchbox\copy\strutbox
- \ht\scratchbox\zeropoint
- \box\scratchbox
- \endgroup}
+ \normalsrule
+ \s!height\zeropoint
+ \s!depth \strutdp
+ \relax}
+
+\permanent\protected\def\nodepthstrut
+ {\relax
+ \dontleavehmode
+ \normalsrule
+ \s!height\strutht
+ \s!depth \zeropoint
+ \relax}
%D Sometimes a capstrut comes in handy
%D
@@ -1095,32 +1036,16 @@
\fi}
\permanent\protected\def\showstruts % adapts .. is wrong
- {\c_strut_visual_mode\zerocount
- \setteststrut
- \settestcrlf}
-
-\permanent\protected\def\showcolorstruts % adapts .. is wrong
- {\c_strut_visual_mode\plusone
- \setteststrut
+ {\showmakeup[strut]%
\settestcrlf}
-\permanent\protected\def\setteststrut
- {\strutwidth.8\onepoint
- \setstrut}
-
-\permanent\protected\def\dontshowstruts
- {\unsetteststrut
- \settestcrlf}
-
-\permanent\protected\def\unsetteststrut
- {\strutwidth\zeropoint
- \setstrut}
+\aliased\let\showcolorstruts\showstruts
\mutable\def\autostrutfactor{1.1}
\permanent\protected\def\setautostrut
{\begingroup
- \setbox\scratchbox\copy\strutbox
+ \setbox\scratchbox\copy\b_strut_box
\setstrut
\ifdim\strutht>\autostrutfactor\ht\scratchbox
\endgroup \setstrut
@@ -1138,7 +1063,6 @@
{\the\everysetnostrut}
\appendtoks
- \setbox\strutbox\copy\nostrutbox
\enforced\let\strut \empty
\enforced\let\endstrut\empty
\enforced\let\begstrut\empty
@@ -1468,10 +1392,10 @@
%D To be checked:
-\newbox\b_spac_struts_saved
-
-\permanent\protected\def\savestrut {\setbox\b_spac_struts_saved\copy\strutbox}
-\permanent\protected\def\savedstrut{\copy \b_spac_struts_saved}
+% \newbox\b_spac_struts_saved
+%
+% \permanent\protected\def\savestrut {\setbox\b_spac_struts_saved\copy\b_strut_box}
+% \permanent\protected\def\savedstrut{\copy \b_spac_struts_saved}
%D Good old blank redone:
diff --git a/tex/context/base/mkxl/strc-flt.mklx b/tex/context/base/mkxl/strc-flt.mklx
index 862aa7ff9..5eb18baac 100644
--- a/tex/context/base/mkxl/strc-flt.mklx
+++ b/tex/context/base/mkxl/strc-flt.mklx
@@ -1533,7 +1533,7 @@
\whitespace
\blank[\rootfloatparameter\c!spacebefore]%
\doifnotinset\v!tall\floatlocation
- {\dp\floatbox\openstrutdepth}% dp\strutbox}% % toegevoegd
+ {\dp\floatbox\openstrutdepth}% \strutdp % toegevoegd
\box\floatbox
\dostoptagged
\blank[\rootfloatparameter\c!spaceafter]%
diff --git a/tex/context/base/mkxl/strc-mat.mkxl b/tex/context/base/mkxl/strc-mat.mkxl
index 39c70fe87..edfe9d97f 100644
--- a/tex/context/base/mkxl/strc-mat.mkxl
+++ b/tex/context/base/mkxl/strc-mat.mkxl
@@ -874,8 +874,8 @@
% for the moment (when testing) we use a penalty 1
-\protected\def\strc_math_align_here{\ifmmode\penalty\plusone\fi}%
-\protected\def\strc_math_break_here{\ifmmode\hfill\break \fi}%
+\protected\def\strc_math_align_here{\ifmmode\boundary\plusone\fi}%
+\protected\def\strc_math_break_here{\ifmmode\hfill\break\fi}%
\ifdefined\alignhere \else \aliased\let\alignhere\relax \fi
\ifdefined\breakhere \else \aliased\let\breakhere\relax \fi
diff --git a/tex/context/base/mkxl/strc-ref.mklx b/tex/context/base/mkxl/strc-ref.mklx
index d5e054962..61c1085f1 100644
--- a/tex/context/base/mkxl/strc-ref.mklx
+++ b/tex/context/base/mkxl/strc-ref.mklx
@@ -444,8 +444,8 @@
{\referenceprefix}%
{#label}%
{%
- height \ht\strutbox
- depth \dp\strutbox
+ height \strutht
+ depth \strutdp
\extrareferencearguments
}%
\relax
@@ -1483,8 +1483,8 @@
{\referenceprefix}%
{#label}%
{%
- height \ht\strutbox
- depth \dp\strutbox
+ height \strutht
+ depth \strutdp
\extrareferencearguments
}%
\relax
@@ -1535,8 +1535,8 @@
\iflocation
\clf_doifelsereference{\referenceprefix}{#label}{\extrareferencearguments}%
{\clf_injectcurrentreferencehtdp
- \ht\strutbox
- \dp\strutbox
+ \strutht
+ \strutdp
\relax
\setlocationattributes
\setstrut % can be option
@@ -1592,8 +1592,8 @@
\protected\def\strc_references_start_goto_yes
{\clf_injectcurrentreferencehtdp
- \ht\strutbox
- \dp\strutbox
+ \strutht
+ \strutdp
\relax
\setlocationattributes
\setstrut % can be option
diff --git a/tex/context/base/mkxl/supp-box.lmt b/tex/context/base/mkxl/supp-box.lmt
index 93b97b48e..ae4e32353 100644
--- a/tex/context/base/mkxl/supp-box.lmt
+++ b/tex/context/base/mkxl/supp-box.lmt
@@ -602,6 +602,20 @@ do
setbox(box,b or nil)
end
+ function boxes.prune(category)
+ -- this one assumes an indexed list
+ local c = cache[category]
+ local t = { }
+ local n = 0
+ for i=1,#c do
+ local ci = c[i]
+ if ci then
+ n = n + 1 ; t[n] = ci
+ end
+ end
+ cache[category] = t
+ end
+
local function dimensions(category,name)
name = tonumber(name) or name
local b = cache[category][name]
@@ -703,6 +717,14 @@ do
}
implement {
+ name = "pruneboxesincache",
+ public = true,
+ protected = true,
+ arguments = "string",
+ actions = boxes.prune,
+ }
+
+ implement {
name = "disposeboxesincache",
public = true,
protected = true,
@@ -760,6 +782,18 @@ do
}
implement {
+ name = "getboxhtdpfromcache",
+ arguments = "2 strings",
+ public = true,
+ protected = true,
+ usage = "value",
+ actions = function(category,name)
+ local w, h, d = dimensions(category,name)
+ return dimension_value, h + d
+ end,
+ }
+
+ implement {
name = "putnextboxincache",
public = true,
protected = true,
diff --git a/tex/context/base/mkxl/supp-box.mkxl b/tex/context/base/mkxl/supp-box.mkxl
index b980107e4..fe96505a0 100644
--- a/tex/context/base/mkxl/supp-box.mkxl
+++ b/tex/context/base/mkxl/supp-box.mkxl
@@ -40,10 +40,10 @@
%D not, you're in trouble). These shortcuts can be used like a dimension, opposite
%D to the core macros \type {\strutdepth} and alike, which are values.
- \def\strutdp {\dp\strutbox} % overloaded in spac-ver
- \def\strutht {\ht\strutbox} % overloaded in spac-ver
+ \def\strutdp {\dp\strutbox} % overloaded in spac-ver
+ \def\strutht {\ht\strutbox} % overloaded in spac-ver
\permanent\protected\def\strutwd {\wd\strutbox}
-\permanent\protected\def\struthtdp{\dimexpr\strutht+\strutdp\relax}
+ \def\struthtdp{\htdp\strutbox} % overloaded in spac-ver
\permanent\protected\def\strutgap {\dimexpr\strutht-\strutdp\relax}
%D \macros
@@ -330,7 +330,7 @@
%D We also define plain's \type {\mathstrut}.
-\permanent\protected\def\mathstrut{\vphantom(} % can be made faster by inlining
+\permanent\protected\def\mathstrut{\Ustack{\vphantom(}} % can be made faster by inlining
%D \macros
%D {getboxheight}
@@ -2027,7 +2027,7 @@
\permanent\protected\def\bbox{\hpack\bgroup\dowithnextboxcs\syst_boxes_bbox_finish\hbox}
\def\syst_boxes_tbox_finish
- {\scratchheight\ht\strutbox
+ {\scratchheight\strutht
\scratchdepth\dimexpr\htdp\nextbox-\scratchheight\relax
\ht\nextbox\scratchheight
\dp\nextbox\scratchdepth
@@ -2036,7 +2036,7 @@
\egroup}
\def\syst_boxes_bbox_finish
- {\scratchdepth\dp\strutbox
+ {\scratchdepth\strutdp
\scratchheight\dimexpr\htdp\nextbox-\scratchdepth\relax
\dp\nextbox\scratchdepth
\ht\nextbox\scratchheight
@@ -2457,6 +2457,7 @@
% \getboxwdfromcache % {category} {name}
% \getboxhtfromcache % {category} {name}
% \getboxdpfromcache % {category} {name}
+% \getboxhtdpfromcache % {category} {name}
%D \macros
%D {removedepth, obeydepth}
@@ -2812,10 +2813,10 @@
\permanent\protected\def\linebox
{\hpack\bgroup\dowithnextbox
- {\scratchdimen\dimexpr\dimexpr\htdp\nextbox-\lineheight\relax/2+\dp\strutbox\relax
+ {\scratchdimen\dimexpr\dimexpr\htdp\nextbox-\lineheight\relax/2+\strutdp\relax
\setbox\nextbox\hpack{\lower\scratchdimen\box\nextbox}%
- \ht\nextbox\ht\strutbox
- \dp\nextbox\dp\strutbox
+ \ht\nextbox\strutht
+ \dp\nextbox\strutdp
\box\nextbox
\egroup}
\hbox}
diff --git a/tex/context/base/mkxl/symb-ini.mkxl b/tex/context/base/mkxl/symb-ini.mkxl
index ce489ee5a..e26892e4d 100644
--- a/tex/context/base/mkxl/symb-ini.mkxl
+++ b/tex/context/base/mkxl/symb-ini.mkxl
@@ -143,7 +143,7 @@
\csname\??symbol#1\endcsname\relax
\endgroup}
-\letvalue{\??symbol}\firstofoneargument
+\letcsname\??symbol\endcsname\firstofoneargument
\permanent\def\directsymbol#1#2% no \relax, there can be an argument, see lists
{\begincsname\??symbol#1:#2\endcsname}
diff --git a/tex/context/base/mkxl/syst-aux.mkxl b/tex/context/base/mkxl/syst-aux.mkxl
index aceb52aac..ced19dcd2 100644
--- a/tex/context/base/mkxl/syst-aux.mkxl
+++ b/tex/context/base/mkxl/syst-aux.mkxl
@@ -4186,6 +4186,21 @@
%D {\groupedcommand{\raggedcenter\bf}{\par}}
%D \stoptyping
+%D For math we use this:
+
+\permanent\protected\def\mathgroupedcommandcs#1%
+ {\let\m_syst_helpers_handle_group_b#1%
+ \futureexpandis\bgroup\syst_helpers_handle_math_group_normal\syst_helpers_handle_math_group_nop}
+
+\protected\def\syst_helpers_handle_math_group_normal#1%
+ {\beginmathgroup
+ \m_syst_helpers_handle_group_b
+ #1%
+ \endmathgroup}
+
+\protected\def\syst_helpers_handle_math_group_nop
+ {\m_syst_helpers_handle_group_b}
+
% %D \macros
% %D {checkdefined}
% %D
@@ -5903,7 +5918,7 @@
%D \setdimensionwithunit\scratchdimen{10cm}{cm}
%D \setdimensionwithunit\scratchdimen{10cm}{}
%D \freezedimensionwithunit\SomeWidth{\textwidth}
-%D \freezedimensionwithunit\SomeDepth{\dp\strutbox}
+%D \freezedimensionwithunit\SomeDepth{\strutdp}
%D \stoptyping
%D
%D As an alternative for the next macro we can use a global assignment inside a box.
diff --git a/tex/context/base/mkxl/syst-fnt.mkxl b/tex/context/base/mkxl/syst-fnt.mkxl
index e6029d805..62239917f 100644
--- a/tex/context/base/mkxl/syst-fnt.mkxl
+++ b/tex/context/base/mkxl/syst-fnt.mkxl
@@ -23,13 +23,25 @@
\immutable\protected\def\fontemwidth {\scaledfontdimen\plussix }
\immutable\protected\def\fontextraspace {\scaledfontdimen\plusseven}
-\immutable\protected\def\slantperpoint {\scaledfontdimen\plusone \font}
-\immutable\protected\def\interwordspace {\scaledfontdimen\plustwo \font}
-\immutable\protected\def\interwordstretch {\scaledfontdimen\plusthree\font}
-\immutable\protected\def\interwordshrink {\scaledfontdimen\plusfour \font}
-\immutable\protected\def\exheight {\scaledfontdimen\plusfive \font}
-\immutable\protected\def\emwidth {\scaledfontdimen\plussix \font}
-\immutable\protected\def\extraspace {\scaledfontdimen\plusseven\font}
+%immutable\protected\def\slantperpoint {\scaledfontdimen\plusone \font}
+%immutable\protected\def\interwordspace {\scaledfontdimen\plustwo \font}
+%immutable\protected\def\interwordstretch {\scaledfontdimen\plusthree\font}
+%immutable\protected\def\interwordshrink {\scaledfontdimen\plusfour \font}
+%immutable\protected\def\exheight {\scaledfontdimen\plusfive \font}
+%immutable\protected\def\emwidth {\scaledfontdimen\plussix \font}
+%immutable\protected\def\extraspace {\scaledfontdimen\plusseven\font}
+
+%D This saves a little bit of overhead but more important, it gives less tracing,
+%D and for practical reasone we keep this indirectness because we syntax highlight
+%D these pseudo constants different than primitives.
+
+\immutable\aliased\let\slantperpoint \scaledslantperpoint
+\immutable\aliased\let\interwordspace \scaledinterwordspace
+\immutable\aliased\let\interwordstretch \scaledinterwordstretch
+\immutable\aliased\let\interwordshrink \scaledinterwordshrink
+\immutable\aliased\let\exheight \scaledexheight
+\immutable\aliased\let\emwidth \scaledemwidth
+\immutable\aliased\let\extraspace \scaledextraspace
\aliased\let\mathaxisheight\Umathaxis % takes style
diff --git a/tex/context/base/mkxl/syst-ini.mkxl b/tex/context/base/mkxl/syst-ini.mkxl
index 605a4c334..6f3ccd89f 100644
--- a/tex/context/base/mkxl/syst-ini.mkxl
+++ b/tex/context/base/mkxl/syst-ini.mkxl
@@ -296,30 +296,44 @@
% 255 : page
% 256 - : user defined
-%D Later on, the \type {\c_syst_max_allocated_register} variable will be halfed so
-%D that while local allocators will use the 22* range. So we have plenty of room
-%D reserved for more private ones.
+%D Later on, the \type {\c_syst_max_allocated_*} variables will be halfed so that
+%D while local allocators will use the 23* range. So we have plenty of room reserved
+%D for more private ones.
+
+\directlua {tex.magicconstants = status.getconstants()} % this will be reset later on
\permanent\countdef\c_syst_min_allocated_register = 201 \c_syst_min_allocated_register = 256 % can change
-\permanent\countdef\c_syst_max_allocated_register = 202 \c_syst_max_allocated_register = 65535 % is adapted later on
+
\permanent\countdef\c_syst_min_allocated_iohandle = 203 \c_syst_min_allocated_iohandle = 0
\permanent\countdef\c_syst_max_allocated_iohandle = 204 \c_syst_max_allocated_iohandle = 1023
-\permanent\countdef\c_syst_min_allocated_attribute = 205 \c_syst_min_allocated_attribute = 1024 % 0-1023 : private
-\permanent\countdef\c_syst_min_allocated_mark = 206 \c_syst_min_allocated_mark = 16 % a few scratch ones
-\permanent\countdef\c_syst_max_allocated_mark = 207 \c_syst_max_allocated_mark = 1024 % max 10K in luametatex anyway
-
-\permanent\countdef\c_syst_last_allocated_count = 211 \c_syst_last_allocated_count = \c_syst_min_allocated_register
-\permanent\countdef\c_syst_last_allocated_dimen = 212 \c_syst_last_allocated_dimen = \c_syst_min_allocated_register
-\permanent\countdef\c_syst_last_allocated_skip = 213 \c_syst_last_allocated_skip = \c_syst_min_allocated_register
-\permanent\countdef\c_syst_last_allocated_muskip = 214 \c_syst_last_allocated_muskip = \c_syst_min_allocated_register
-\permanent\countdef\c_syst_last_allocated_box = 215 \c_syst_last_allocated_box = \c_syst_min_allocated_register
-\permanent\countdef\c_syst_last_allocated_toks = 216 \c_syst_last_allocated_toks = \c_syst_min_allocated_register
-\permanent\countdef\c_syst_last_allocated_read = 217 \c_syst_last_allocated_read = \c_syst_min_allocated_iohandle
-\permanent\countdef\c_syst_last_allocated_write = 218 \c_syst_last_allocated_write = \c_syst_min_allocated_iohandle
-\permanent\countdef\c_syst_last_allocated_marks = 219 \c_syst_last_allocated_marks = \c_syst_min_allocated_mark
-
-\permanent\countdef\c_syst_min_counter_value = 253 \c_syst_min_counter_value = -"7FFFFFFF
-\permanent\countdef\c_syst_max_counter_value = 254 \c_syst_max_counter_value = "7FFFFFFF
+
+\permanent\countdef\c_syst_min_allocated_mark = 205 \c_syst_min_allocated_mark = 16 % a few scratch ones
+\permanent\countdef\c_syst_max_allocated_mark = 206 \c_syst_max_allocated_mark = 1024 % max 10K in luametatex anyway
+
+\permanent\countdef\c_syst_min_allocated_attribute = 207 \c_syst_min_allocated_attribute = 1024 % 0-1023 : private
+\permanent\countdef\c_syst_max_allocated_attribute = 208 \c_syst_min_allocated_attribute = \directlua{tex.write(tex.magicconstants.max_attribute_register_index)} % 65535 % no allocator, managed differently
+
+\permanent\countdef\c_syst_max_allocated_count = 211 \c_syst_max_allocated_count = \directlua{tex.write(tex.magicconstants.max_int_register_index)} % 65535 % is adapted later on
+\permanent\countdef\c_syst_max_allocated_dimen = 212 \c_syst_max_allocated_dimen = \directlua{tex.write(tex.magicconstants.max_dimen_register_index)} % idem
+\permanent\countdef\c_syst_max_allocated_skip = 213 \c_syst_max_allocated_skip = \directlua{tex.write(tex.magicconstants.max_glue_register_index)} % idem
+\permanent\countdef\c_syst_max_allocated_muskip = 214 \c_syst_max_allocated_muskip = \directlua{tex.write(tex.magicconstants.max_mu_glue_register_index)} % idem
+\permanent\countdef\c_syst_max_allocated_box = 215 \c_syst_max_allocated_box = \directlua{tex.write(tex.magicconstants.max_box_register_index)} % idem
+\permanent\countdef\c_syst_max_allocated_toks = 216 \c_syst_max_allocated_toks = \directlua{tex.write(tex.magicconstants.max_toks_register_index)} % idem
+\permanent\countdef\c_syst_max_allocated_read = 217 \c_syst_max_allocated_read = \c_syst_max_allocated_iohandle
+\permanent\countdef\c_syst_max_allocated_write = 218 \c_syst_max_allocated_write = \c_syst_max_allocated_iohandle
+
+\permanent\countdef\c_syst_last_allocated_count = 221 \c_syst_last_allocated_count = \c_syst_min_allocated_register
+\permanent\countdef\c_syst_last_allocated_dimen = 222 \c_syst_last_allocated_dimen = \c_syst_min_allocated_register
+\permanent\countdef\c_syst_last_allocated_skip = 223 \c_syst_last_allocated_skip = \c_syst_min_allocated_register
+\permanent\countdef\c_syst_last_allocated_muskip = 224 \c_syst_last_allocated_muskip = \c_syst_min_allocated_register
+\permanent\countdef\c_syst_last_allocated_box = 225 \c_syst_last_allocated_box = \c_syst_min_allocated_register
+\permanent\countdef\c_syst_last_allocated_toks = 226 \c_syst_last_allocated_toks = \c_syst_min_allocated_register
+\permanent\countdef\c_syst_last_allocated_read = 227 \c_syst_last_allocated_read = \c_syst_min_allocated_iohandle
+\permanent\countdef\c_syst_last_allocated_write = 228 \c_syst_last_allocated_write = \c_syst_min_allocated_iohandle
+\permanent\countdef\c_syst_last_allocated_marks = 229 \c_syst_last_allocated_marks = \c_syst_min_allocated_mark
+
+\permanent\countdef\c_syst_min_counter_value = 253 \c_syst_min_counter_value = -"7FFFFFFF
+\permanent\countdef\c_syst_max_counter_value = 254 \c_syst_max_counter_value = "7FFFFFFF
\immutable\integerdef\zerocount 0
\immutable\integerdef\plusone 1
@@ -339,15 +353,15 @@
%D The allocators share a common helper macro. Marks might be changed to work in lower
%D regions and we always assumes allocation.
-\permanent\protected\def\newcount {\syst_basics_allocate\c_syst_last_allocated_count \count \countdef \c_syst_max_allocated_register}
-\permanent\protected\def\newdimen {\syst_basics_allocate\c_syst_last_allocated_dimen \dimen \dimendef \c_syst_max_allocated_register}
-\permanent\protected\def\newskip {\syst_basics_allocate\c_syst_last_allocated_skip \skip \skipdef \c_syst_max_allocated_register}
-\permanent\protected\def\newmuskip{\syst_basics_allocate\c_syst_last_allocated_muskip\muskip\muskipdef \c_syst_max_allocated_register}
-\permanent\protected\def\newbox {\syst_basics_allocate\c_syst_last_allocated_box \box \integerdef\c_syst_max_allocated_register}
-\permanent\protected\def\newtoks {\syst_basics_allocate\c_syst_last_allocated_toks \toks \toksdef \c_syst_max_allocated_register}
-\permanent\protected\def\newread {\syst_basics_allocate\c_syst_last_allocated_read \read \integerdef\c_syst_max_allocated_iohandle}
-\permanent\protected\def\newwrite {\syst_basics_allocate\c_syst_last_allocated_write \write \integerdef\c_syst_max_allocated_iohandle}
-\permanent\protected\def\newmarks {\syst_basics_allocate\c_syst_last_allocated_marks \marks \integerdef\c_syst_max_allocated_mark }
+\permanent\protected\def\newcount {\syst_basics_allocate\c_syst_last_allocated_count \count \countdef \c_syst_max_allocated_count}
+\permanent\protected\def\newdimen {\syst_basics_allocate\c_syst_last_allocated_dimen \dimen \dimendef \c_syst_max_allocated_dimen}
+\permanent\protected\def\newskip {\syst_basics_allocate\c_syst_last_allocated_skip \skip \skipdef \c_syst_max_allocated_skip}
+\permanent\protected\def\newmuskip{\syst_basics_allocate\c_syst_last_allocated_muskip\muskip\muskipdef \c_syst_max_allocated_muskip}
+\permanent\protected\def\newbox {\syst_basics_allocate\c_syst_last_allocated_box \box \integerdef\c_syst_max_allocated_box}
+\permanent\protected\def\newtoks {\syst_basics_allocate\c_syst_last_allocated_toks \toks \toksdef \c_syst_max_allocated_toks}
+\permanent\protected\def\newread {\syst_basics_allocate\c_syst_last_allocated_read \read \integerdef\c_syst_max_allocated_read}
+\permanent\protected\def\newwrite {\syst_basics_allocate\c_syst_last_allocated_write \write \integerdef\c_syst_max_allocated_write}
+\permanent\protected\def\newmarks {\syst_basics_allocate\c_syst_last_allocated_marks \marks \integerdef\c_syst_max_allocated_mark}
\firstvalidlanguage \plusone % so zero is ignored in hyphenation, this might become the default
@@ -424,9 +438,6 @@
%D Since the number of chars exceed 256 now, we can use \type {\chardef} instead of
%D the more limited \type {\mathchardef}.
-% \protected\def\newbox {\syst_basics_allocate\c_syst_last_allocated_box \box \chardef\c_syst_max_allocated_register}
-% \protected\def\newmarks{\syst_basics_allocate\c_syst_last_allocated_marks\marks\chardef\c_syst_max_allocated_register}
-
%D Attributes are something very \LUATEX. In \CONTEXT\ you are not supposed to use
%D the attributes directly but always allocate then first. For instance attribute~0
%D is reserved for special purposes (this might change). Attributes in the range
@@ -434,7 +445,7 @@
\immutable\integerdef\attributeunsetvalue\c_syst_min_counter_value % used to be \minusone
-% \permanent\protected\def\newattribute{\syst_basics_allocate\c_syst_last_allocated_attribute\attribute\attributedef\c_syst_max_allocated_register}
+% \permanent\protected\def\newattribute{\syst_basics_allocate\c_syst_last_allocated_attribute\attribute\attributedef\c_syst_max_allocated_attribute}
% %D Not used by \CONTEXT\ but for instance \PICTEX\ needs it. It's a trick to force
% %D strings instead of tokens that take more memory.
@@ -739,14 +750,16 @@
% For now:
-\permanent\protected\def\defUmathtopaccent #1#2#3#4{\global\immutable\protected\def#1{\Umathaccent "#2 "#3 "#4 }}
-\permanent\protected\def\defUmathbotaccent #1#2#3#4{\global\immutable\protected\def#1{\Umathbotaccent "#2 "#3 "#4 }}
-\permanent\protected\def\defUdelimiterover #1#2#3#4{\global\immutable\protected\def#1{\Udelimiterover "#2 "#3 }}
-\permanent\protected\def\defUdelimiterunder #1#2#3#4{\global\immutable\protected\def#1{\Udelimiterunder "#2 "#3 }}
-\permanent\protected\def\defUdelimiter #1#2#3#4{\global\immutable\protected\def#1{\Udelimiter "#2 "#3 "#4 }}
-\permanent\protected\def\defUradical #1#2#3{\global\immutable\protected\def#1{\Uradical "#2 "#3 }}
-\permanent\protected\def\defUroot #1#2#3{\global\immutable\protected\def#1{\Uroot "#2 "#3 }}
-\permanent\protected\def\defUmathchar #1#2#3#4{\global\immutable\Umathchardef #1 "#2 "#3 "#4 }
+\permanent\protected\def\defUmathfixedtopaccent#1#2#3#4{\global\immutable\protected\def#1{\Umathtopaccent \s!fixed "#2 "#3 "#4 }}
+\permanent\protected\def\defUmathfixedbotaccent#1#2#3#4{\global\immutable\protected\def#1{\Umathbotaccent \s!fixed "#2 "#3 "#4 }}
+\permanent\protected\def\defUmathtopaccent #1#2#3#4{\global\immutable\protected\def#1{\Umathtopaccent "#2 "#3 "#4 }}
+\permanent\protected\def\defUmathbotaccent #1#2#3#4{\global\immutable\protected\def#1{\Umathbotaccent "#2 "#3 "#4 }}
+\permanent\protected\def\defUdelimiterover #1#2#3#4{\global\immutable\protected\def#1{\Udelimiterover "#2 "#3 }}
+\permanent\protected\def\defUdelimiterunder #1#2#3#4{\global\immutable\protected\def#1{\Udelimiterunder "#2 "#3 }}
+\permanent\protected\def\defUdelimiter #1#2#3#4{\global\immutable\protected\def#1{\Udelimiter "#2 "#3 "#4 }}
+\permanent\protected\def\defUradical #1#2#3{\global\immutable\protected\def#1{\Uradical "#2 "#3 }}
+\permanent\protected\def\defUroot #1#2#3{\global\immutable\protected\def#1{\Uroot "#2 "#3 }}
+\permanent\protected\def\defUmathchar #1#2#3#4{\global\immutable\Umathchardef #1 "#2 "#3 "#4 }
%D For a while we keep the following, as systems like tikz need it. Best not use
%D that one \CONTEXT. It will probably move to the tikz loader.
@@ -1130,7 +1143,7 @@
\permanent\def\hidewidth % for alignment entries that can stick out
{\hskip\hideskip}
-\permanent\def\ialign % initialized \halign
+\permanent\def\ialign % initialized \halign, to be used grouped!
{\everycr\emptytoks
\tabskip\zeroskip
\halign}
@@ -1308,29 +1321,28 @@
%D
%D There is a little extra overhead in the overload protection but not that much.
-\permanent\countdef\c_syst_local_count = 221 \c_syst_local_count = \c_syst_max_allocated_register
-\permanent\countdef\c_syst_local_dimen = 222 \c_syst_local_dimen = \c_syst_local_count
-\permanent\countdef\c_syst_local_skip = 223 \c_syst_local_skip = \c_syst_local_count
-\permanent\countdef\c_syst_local_muskip = 224 \c_syst_local_muskip = \c_syst_local_count
-\permanent\countdef\c_syst_local_box = 225 \c_syst_local_box = \c_syst_local_count
-\permanent\countdef\c_syst_local_toks = 226 \c_syst_local_toks = \c_syst_local_count
-\permanent\countdef\c_syst_local_read = 227 \c_syst_local_read = \c_syst_local_count
-\permanent\countdef\c_syst_local_write = 228 \c_syst_local_write = \c_syst_local_count
-
-\c_syst_max_allocated_register \numexpr\c_syst_max_allocated_register:2\relax % floor
+\permanent\countdef\c_syst_local_count = 231 \c_syst_local_count = \c_syst_max_allocated_count
+\permanent\countdef\c_syst_local_dimen = 232 \c_syst_local_dimen = \c_syst_max_allocated_dimen
+\permanent\countdef\c_syst_local_skip = 233 \c_syst_local_skip = \c_syst_max_allocated_skip
+\permanent\countdef\c_syst_local_muskip = 234 \c_syst_local_muskip = \c_syst_max_allocated_muskip
+\permanent\countdef\c_syst_local_box = 235 \c_syst_local_box = \c_syst_max_allocated_box
+\permanent\countdef\c_syst_local_toks = 236 \c_syst_local_toks = \c_syst_max_allocated_toks
+\permanent\countdef\c_syst_local_read = 237 \c_syst_local_read = \c_syst_max_allocated_read
+\permanent\countdef\c_syst_local_write = 238 \c_syst_local_write = \c_syst_max_allocated_write
+
+\c_syst_max_allocated_count \numexpr\c_syst_max_allocated_count :2\relax % floor
+\c_syst_max_allocated_dimen \numexpr\c_syst_max_allocated_dimen :2\relax % floor
+\c_syst_max_allocated_skip \numexpr\c_syst_max_allocated_skip :2\relax % floor
+\c_syst_max_allocated_muskip \numexpr\c_syst_max_allocated_muskip :2\relax % floor
+\c_syst_max_allocated_toks \numexpr\c_syst_max_allocated_toks :2\relax % floor
+\c_syst_max_allocated_box \numexpr\c_syst_max_allocated_box :2\relax % floor
+\c_syst_max_allocated_read \numexpr\c_syst_max_allocated_read :2\relax % floor
+\c_syst_max_allocated_write \numexpr\c_syst_max_allocated_write :2\relax % floor
\permanent\protected\def\syst_local_overflow#1#2{\writestatus\m!system{no room for local #1 \string#2}\wait}
-\permanent\protected\def\setnewlocaldimen#1%
- {\ifnum\c_syst_local_dimen>\c_syst_max_allocated_register
- \advance\c_syst_local_dimen\minusone\dimendef#1\c_syst_local_dimen
- \else
- \syst_local_overflow_dimen#1%
- \fi
- #1}
-
\permanent\protected\def\setnewlocalcount#1%
- {\ifnum\c_syst_local_count>\c_syst_max_allocated_register
+ {\ifnum\c_syst_local_count>\c_syst_max_allocated_count
\advance\c_syst_local_count\minusone
\overloaded\frozen\countdef#1\c_syst_local_count
\else
@@ -1338,8 +1350,16 @@
\fi
#1}
+\permanent\protected\def\setnewlocaldimen#1%
+ {\ifnum\c_syst_local_dimen>\c_syst_max_allocated_dimen
+ \advance\c_syst_local_dimen\minusone\dimendef#1\c_syst_local_dimen
+ \else
+ \syst_local_overflow_dimen#1%
+ \fi
+ #1}
+
\permanent\protected\def\setnewlocalskip#1%
- {\ifnum\c_syst_local_skip>\c_syst_max_allocated_register
+ {\ifnum\c_syst_local_skip>\c_syst_max_allocated_skip
\advance\c_syst_local_skip\minusone
\overloaded\frozen\skipdef#1\c_syst_local_skip
\else
@@ -1348,7 +1368,7 @@
#1}
\permanent\protected\def\setnewlocalmuskip#1%
- {\ifnum\c_syst_local_muskip>\c_syst_max_allocated_register
+ {\ifnum\c_syst_local_muskip>\c_syst_max_allocated_muskip
\advance\c_syst_local_muskip\minusone
\overloaded\frozen\muskipdef#1\c_syst_local_muskip
\else
@@ -1357,7 +1377,7 @@
#1}
\permanent\protected\def\setnewlocaltoks#1%
- {\ifnum\c_syst_local_toks>\c_syst_max_allocated_register
+ {\ifnum\c_syst_local_toks>\c_syst_max_allocated_toks
\advance\c_syst_local_toks\minusone
\overloaded\frozen\toksdef#1\c_syst_local_toks
\else
@@ -1366,7 +1386,7 @@
#1}
\permanent\protected\def\setnewlocalbox#1%
- {\ifnum\c_syst_local_box>\c_syst_max_allocated_register
+ {\ifnum\c_syst_local_box>\c_syst_max_allocated_box
\advance\c_syst_local_box\minusone
\overloaded\frozen\integerdef#1\c_syst_local_box
\else
@@ -1375,7 +1395,7 @@
\setbox#1}
\permanent\protected\def\newlocalread#1% so no set
- {\ifnum\c_syst_local_read>\c_syst_max_allocated_register
+ {\ifnum\c_syst_local_read>\c_syst_max_allocated_read
\advance\c_syst_local_read\minusone
\overloaded\frozen\integerdef#1\c_syst_local_read
\else
@@ -1383,7 +1403,7 @@
\fi}
\permanent\protected\def\newlocalwrite#1% so no set
- {\ifnum\c_syst_local_write>\c_syst_max_allocated_register
+ {\ifnum\c_syst_local_write>\c_syst_max_allocated_write
\advance\c_syst_local_write\minusone
\overloaded\frozen\integerdef#1\c_syst_local_write
\else
@@ -1435,4 +1455,8 @@
\tracingfullboxes\zerocount
+%D We don't do this:
+
+% \setdefaultmathcodes % initializes traditional codes
+
\protect \endinput
diff --git a/tex/context/base/mkxl/toks-aux.lmt b/tex/context/base/mkxl/toks-aux.lmt
index c7d2fb2fc..f1bac2093 100644
--- a/tex/context/base/mkxl/toks-aux.lmt
+++ b/tex/context/base/mkxl/toks-aux.lmt
@@ -10,6 +10,24 @@ local max = math.max
local formatters, gsub, char, gmatch = string.formatters, string.gsub, string.char, string.gmatch
local concat = table.concat
+do
+
+ -- tex.magicconstants = { -- we use tex.constants for something else
+ -- running = -1073741824, -- null_flag
+ -- maxdimen = 1073741823, -- max_dimen
+ -- -- trueinch = 4736286, -- obsolete
+ -- }
+
+ local c = status.getconstants()
+ local t = { }
+ for k, v in next, c do
+ t[gsub(k,"_","")] = v
+ end
+
+ tex.magicconstants = table.setmetatableindex(t,c)
+
+end
+
-- todo : locals from scanners
local function flags(t)
@@ -165,8 +183,8 @@ tex.glyphoptioncodes = getthem(tex.getglyphoptionvalues, "glyphoptioncode")
tex.groupcodes = getthem(tex.getgroupvalues, "groupcode")
tex.hyphenationcodes = getthem(tex.gethyphenationvalues, "hyphenationcode")
tex.mathcontrolcodes = getthem(tex.getmathcontrolvalues, "mathcontrolcode")
-tex.mathflattencodes = getthem(tex.getmathflattenvalues, "mathflattencode")
-tex.mathoptioncodes = getthem(tex.getmathoptionvalues, "") -- only at lua end
+---.mathflattencodes = getthem(tex.getmathflattenvalues, "mathflattencode")
+tex.noadoptioncodes = getthem(tex.getnoadoptionvalues, "") -- only at lua end
tex.normalizecodes = getthem(tex.getnormalizevalues, "normalizecode")
tex.automigrationcodes = getthem(tex.getautomigrationvalues, "automigrationcode") -- only at lua end
tex.parcontextcodes = getthem(tex.getparcontextvalues, "parcontextcode")
diff --git a/tex/context/base/mkxl/trac-vis.lmt b/tex/context/base/mkxl/trac-vis.lmt
index e2c4133b4..255e26230 100644
--- a/tex/context/base/mkxl/trac-vis.lmt
+++ b/tex/context/base/mkxl/trac-vis.lmt
@@ -40,6 +40,7 @@ local setsubtype = nuts.setsubtype
local setattr = nuts.setattr
local setwidth = nuts.setwidth
local setshift = nuts.setshift
+local setoffsets = nuts.setoffsets
local getid = nuts.getid
local getfont = nuts.getfont
@@ -410,7 +411,7 @@ local function sometext(str,layer,color,textcolor,lap,variant)
info = hpack_nodes(info)
local width = getwidth(info)
if variant then
- nuts.setoffsets(info,0,variant*exheight)
+ setoffsets(info,0,variant*exheight)
end
if lap then
info = new_hlist(setlink(new_kern(-width),info))
@@ -835,7 +836,14 @@ local ruledbox do
local info = setlink(
this and copylist(this) or nil,
(force_origin and emptyrule(wd,ht,dp)) -- we accept some overhead
- or (dp == 0 and outlinerule and outlinerule(wd,ht,dp,linewidth))
+ or dp == 0 and userrule {
+ width = wd,
+ height = ht,
+ line = linewidth,
+ type = "box",
+ baseline = false,
+
+ }
or userrule {
width = wd,
height = ht,
@@ -843,6 +851,7 @@ local ruledbox do
line = linewidth,
type = "box",
dashed = 3*size,
+
}
)
--
@@ -972,6 +981,7 @@ end
local ruledglue, ruledmathglue do
local effectiveglue = nuts.effectiveglue
+ local iszeroglue = nuts.iszeroglue
local gluecodes = nodes.gluecodes
@@ -1002,6 +1012,7 @@ local ruledglue, ruledmathglue do
local g_cache_is = caches["indentskip"]
local g_cache_cs = caches["correctionskip"]
local g_cache_gn = caches["gluename"]
+ local g_cache_gz = caches["gluezero"]
local tags = {
-- [userskip_code] = "US",
@@ -1051,18 +1062,43 @@ local ruledglue, ruledmathglue do
-- we sometimes pass previous as we can have issues in math (not watertight for all)
- local f_amount = formatters["%s:%0.3f"]
- local mathvalues = nodes.mathvalues
+ local f_amount = formatters["%s:%0.3f"]
+ local mathvalues = nodes.mathvalues
+
+ mathvalues[-1] = "left"
+ mathvalues[-2] = "right"
+
+ local morehack = setmetatableindex(function(t,k)
+ local v = mathematics.classnames[k] -- yet unknown
+-- v = v and string.sub(v,1,4) or string.formatters["x%02x"](k)
+ v = v and string.sub(v,1,3) or string.formatters["x%02x"](k)
+ t[k] = v
+ return v
+ end)
- local function gluename(name,layer,color)
- local info = g_cache_gn[name]
+ local temphack = setmetatableindex(function(t,k)
+ local v = mathvalues[k]
+ if v then
+ v = gsub(v,"spacing","") -- old
+ else
+ v = k - 256
+ v = morehack[v//64] ..morehack[v%64]
+ end
+ t[k] = v
+ return v
+ end)
+
+ local function gluename(current,layer,color)
+ local name = getfont(current)
+ local zero = iszeroglue(current)
+ local info = zero and g_cache_gz[name] or g_cache_gn[name]
if not info then
- local text = hpack_string((gsub(mathvalues[name],"spacing","")),usedfont)
- local rule = new_rule(emwidth/fraction,2*exheight,2.75*exheight)
+ local text = hpack_string(temphack[name],usedfont)
+ local rule = new_rule(emwidth/fraction,2*exheight,(zero and 4.25 or 2.75)*exheight)
local list = getlist(text)
setlisttransparency(list,color)
settransparency(rule,color)
- setshift(text,2*exheight)
+ setshift(text,(zero and 3.5 or 2)*exheight)
info = new_hlist(setlink(rule,text))
setattr(info,a_layer,layer)
g_cache_gn[name] = info
@@ -1071,7 +1107,7 @@ local ruledglue, ruledmathglue do
end
ruledmathglue = function(head,current)
- return insertnodebefore(head,current,gluename(getfont(current),l_glue,"trace:m"))
+ return insertnodebefore(head,current,gluename(current,l_glue,"trace:m"))
end
ruledglue = function(head,current,vertical,parent)
@@ -1182,6 +1218,23 @@ local ruledkern do
end
+local ruledstrut do
+
+ local strut_size = 65536 / 2
+ local strut_code = nodes.rulecodes.strut
+
+ ruledstrut = function(head,current)
+ if getsubtype(current) == strut_code and getwidth(current) == 0 then
+ -- maybe force gray
+ setwidth(current,strut_size)
+ setattr(current,a_layer,l_strut)
+ head, current = insertnodeafter(head,current,new_kern(-strut_size))
+ end
+ return head, getnext(current)
+ end
+
+end
+
local ruleditalic do
local i_cache = caches["italic"]
@@ -1340,6 +1393,7 @@ do
local par_code = nodecodes.par
local mark_code = nodecodes.mark
local insert_code = nodecodes.insert
+ local rule_code = nodecodes.rule
local kerncodes = nodes.kerncodes
local fontkern_code = kerncodes.fontkern
@@ -1481,9 +1535,10 @@ do
elseif a == unsetvalue then
goto list
end
- if trace_strut then
- setattr(current,a_layer,l_strut)
- elseif id == glyph_code then
+ -- if trace_strut then
+ -- setattr(current,a_layer,l_strut)
+ -- else
+ if id == glyph_code then
if trace_glyph then
head, current = ruledglyph(head,current,previous)
end
@@ -1515,6 +1570,10 @@ do
end
elseif id == hlist_code or id == vlist_code then
goto list
+ elseif id == rule_code then
+ if trace_strut then
+ head, current = ruledstrut(head,current)
+ end
elseif id == whatsit_code then
if trace_whatsit then
head, current = ruledwhatsit(head,current)
@@ -1766,7 +1825,7 @@ do
actions = { setvisual, context }
}
- implement {
+ implement {
name = "setvisuallayer",
arguments = "string",
actions = visualizers.setlayer
diff --git a/tex/context/base/mkxl/type-imp-bengali.mkxl b/tex/context/base/mkxl/type-imp-bengali.mkxl
new file mode 100644
index 000000000..84a0b6402
--- /dev/null
+++ b/tex/context/base/mkxl/type-imp-bengali.mkxl
@@ -0,0 +1,73 @@
+%D \module
+%D [ file=type-imp-bengali,
+%D version=2022.02.02,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Bengali,
+%D author=śrīrāma (Sreeram),
+%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.
+
+\starttypescriptcollection[bengali]
+
+ \doifunknownfontfeature {bengali-bold-30} {\definefontfeature[bengali-bold-30][boldened-30]}
+
+ % Symbolic names for fonts:
+
+ \starttypescript [\s!serif] [murty-bangla]
+ \definefontsynonym [MurtyBengali-Regular] [\s!name:murtybanglaregular] [\s!features=bengali-two]
+ \definefontsynonym [MurtyBengali-Bold] [\s!name:murtybanglaregular] [\s!features={bengali-two,bengali-bold-30}]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [baloo-da, baloo-da-extrabold]
+ \definefontsynonym [BalooDa2-Regular] [\s!name:balooda2regular] [\s!features=bengali-two]
+ \definefontsynonym [BalooDa2-Medium] [\s!name:balooda2medium] [\s!features=bengali-two]
+ \definefontsynonym [BalooDa2-Semibold] [\s!name:balooda2semibold] [\s!features=bengali-two]
+ \definefontsynonym [BalooDa2-Bold] [\s!name:balooda2bold] [\s!features=bengali-two]
+ \definefontsynonym [BalooDa2-Extrabold] [\s!name:balooda2extrabold] [\s!features=bengali-two]
+ \stoptypescript
+
+ % Grouping of styles:
+
+ \starttypescript [\s!sans] [baloo-da] [\s!name]
+ \setups[\s!font:\s!fallback:\s!serif]
+ \definefontsynonym [\s!Sans] [BalooDa2-Regular]
+ \definefontsynonym [\s!SansSlanted] [BalooDa2-Medium]
+ \definefontsynonym [\s!SansBold] [BalooDa2-Bold]
+ \definefontsynonym [\s!SansBoldSlanted] [BalooDa2-Semibold]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [baloo-da-extrabold] [\s!name]
+ \setups[\s!font:\s!fallback:\s!serif]
+ \definefontsynonym [\s!Sans] [BalooDa2-Medium]
+ \definefontsynonym [\s!SansSlanted] [BalooDa2-Semibold]
+ \definefontsynonym [\s!SansBold] [BalooDa2-Extrabold]
+ \definefontsynonym [\s!SansBoldSlanted] [BalooDa2-Bold]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [murty-bangla] [\s!name]
+ \setups[\s!font:\s!fallback:\s!serif]
+ \definefontsynonym [\s!Serif] [MurtyBengali-Regular]
+ \definefontsynonym [\s!SerifBold] [MurtyBengali-Bold]
+ \stoptypescript
+
+ % Typefaces:
+
+ \starttypescript [baloo-da, baloo-da-extrabold]
+ \definetypeface [\typescriptone] [\s!ss] [\s!sans] [\typescriptone] [\s!default] [\s!rscale=1.1]
+ \definetypeface [\typescriptone] [\s!rm] [\s!serif] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!mm] [\s!math] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!tt] [\s!mono] [dejavu] [\s!default]
+ \stoptypescript
+
+ \starttypescript [murty-bangla]
+ \definetypeface [murty-bangla] [\s!rm] [\s!serif] [murty-bangla] [\s!default] [\s!rscale=1.1]
+ \definetypeface [\typescriptone] [\s!ss] [\s!sans] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!mm] [\s!math] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!tt] [\s!mono] [dejavu] [\s!default]
+ \stoptypescript
+
+\stoptypescriptcollection
diff --git a/tex/context/base/mkxl/type-imp-devanagari.mkxl b/tex/context/base/mkxl/type-imp-devanagari.mkxl
new file mode 100644
index 000000000..4fb082094
--- /dev/null
+++ b/tex/context/base/mkxl/type-imp-devanagari.mkxl
@@ -0,0 +1,244 @@
+%D \module
+%D [ file=type-imp-devanagari,
+%D version=2022.02.02,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Devanagari,
+%D author=śrīrāma (Sreeram),
+%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.
+
+%D This collection uses rscaling so that the fonts can be used alongside.
+
+\starttypescriptcollection[devanagari]
+
+ \definefontfeature
+ [shobhikafeatures]
+ [devanagari-two]
+ [goodies=shobhika.lfg,
+ indic={movematra=auto,conjuncts=quit},
+ sanitizer=dev2rkrf]
+
+ \definefontfeature
+ [baloofeatures]
+ [shobhikafeatures]
+
+ \definefontfeature
+ [amitafeatures]
+ [devanagari-two]
+ [goodies=shobhika.lfg,
+ sanitizer=dev2rkrf]
+
+ \definefontfeature
+ [jainifeatures]
+ [shobhikafeatures]
+ [\s!ss01=yes,ss05=yes]
+
+ \definefontfeature
+ [adishilafeatures]
+ [devanagari-one]
+ [indic={movematra=auto,conjuncts=quit}]
+
+ % Symbolic names for fonts:
+
+ \starttypescript [\s!serif] [adishila]
+ \definefontsynonym [Adishila-Regular] [\s!name:adishilaregular] [\s!features=adishilafeatures]
+ \definefontsynonym [Adishila-Bold] [\s!name:adishilabold] [\s!features=adishilafeatures]
+ \definefontsynonym [Adishila-Italic] [\s!name:adishilaitalic] [\s!features=adishilafeatures]
+ \definefontsynonym [Adishila-BoldItalic] [\s!name:adishilabolditalic] [\s!features=adishilafeatures]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [adishila-semibold]
+ \definefontsynonym [AdishilaSemibold-Regular] [\s!name:adishilasemiboldregular] [\s!features=adishilafeatures]
+ \definefontsynonym [AdishilaSemibold-Italic] [\s!name:adishilasemibolditalic] [\s!features=adishilafeatures]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [adishila-heavy]
+ \definefontsynonym [AdishilaHeavy-Regular] [\s!name:adishilaheavyregular] [\s!features=adishilafeatures]
+ \definefontsynonym [AdishilaHeavy-Italic] [\s!name:adishilaheavyitalic] [\s!features=adishilafeatures]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [adishila-dev]
+ \definefontsynonym [AdishilaDev-Regular] [\s!name:adishiladevregular] [\s!features=adishilafeatures]
+ \definefontsynonym [AdishilaDev-Bold] [\s!name:adishiladevbold] [\s!features=adishilafeatures]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [adishila-dev-guru]
+ \definefontsynonym [AdishilaDev-Guru] [\s!name:adishiladevguru] [\s!features=adishilafeatures]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [adishila-san]
+ \definefontsynonym [AdishilaSan-Regular] [\s!name:adishilasanregular] [\s!features=adishilafeatures]
+ \definefontsynonym [AdishilaSan-Bold] [\s!name:adishilasanbold] [\s!features=adishilafeatures]
+ \definefontsynonym [AdishilaSan-Italic] [\s!name:adishilasanitalic] [\s!features=adishilafeatures]
+ \definefontsynonym [AdishilaSan-BoldItalic] [\s!name:adishilasanbolditalic] [\s!features=adishilafeatures]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [adishila-san-letterpress]
+ \definefontsynonym [AdishilaSanLetterpress-Regular] [\s!name:adishilasanletterpressregular] [\s!features=adishilafeatures]
+ \definefontsynonym [AdishilaSanLetterpress-Bold] [\s!name:adishilasanletterpressbold] [\s!features=adishilafeatures]
+ \definefontsynonym [AdishilaSanLetterpress-Italic] [\s!name:adishilasanletterpressitalic] [\s!features=adishilafeatures]
+ \definefontsynonym [AdishilaSanLetterpress-BoldItalic] [\s!name:adishilasanletterpressbolditalic] [\s!features=adishilafeatures]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [shobhika]
+ \definefontsynonym [Shobhika-Regular] [\s!name:shobhikaregular] [\s!features=shobhikafeatures]
+ \definefontsynonym [Shobhika-Bold] [\s!name:shobhikabold] [\s!features=shobhikafeatures]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [baloo,baloo-extrabold]
+ \definefontsynonym [Baloo2-Regular] [\s!name:baloo2regular] [\s!features=baloofeatures]
+ \definefontsynonym [Baloo2-Medium] [\s!name:baloo2medium] [\s!features=baloofeatures]
+ \definefontsynonym [Baloo2-Semibold] [\s!name:baloo2semibold] [\s!features=baloofeatures]
+ \definefontsynonym [Baloo2-Bold] [\s!name:baloo2bold] [\s!features=baloofeatures]
+ \definefontsynonym [Baloo2-Extrabold] [\s!name:baloo2extrabold] [\s!features=baloofeatures]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [jaini]
+ \definefontsynonym [Jaini-Regular] [\s!name:jainiregular] [\s!features=jainifeatures]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [jaini-purva]
+ \definefontsynonym [JainiPurva-Regular] [\s!name:jainipurvaregular] [\s!features=jainifeatures]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [amita]
+ \definefontsynonym [Amita-Regular] [\s!name:amitaregular] [\s!features=amitafeatures]
+ \definefontsynonym [Amita-Bold] [\s!name:amitabold] [\s!features=amitafeatures]
+ \stoptypescript
+
+ % Grouping of styles:
+
+ \starttypescript [\s!serif] [adishila] [\s!name]
+ \definefontsynonym [\s!Serif] [Adishila-Regular]
+ \definefontsynonym [\s!SerifBold] [Adishila-Bold]
+ \definefontsynonym [\s!SerifItalic] [Adishila-Italic]
+ \definefontsynonym [\s!SerifBoldItalic] [Adishila-BoldItalic]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [adishila-semibold] [\s!name]
+ \definefontsynonym [\s!Serif] [AdishilaSemibold-Regular]
+ \definefontsynonym [\s!SerifItalic] [AdishilaSemibold-Italic]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [adishila-heavy] [\s!name]
+ \definefontsynonym [\s!Serif] [AdishilaHeavy-Regular]
+ \definefontsynonym [\s!SerifItalic] [AdishilaHeavy-Italic]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [adishila-dev] [\s!name]
+ \definefontsynonym [\s!Serif] [AdishilaDev-Regular]
+ \definefontsynonym [\s!SerifBold] [AdishilaDev-Bold]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [adishila-dev-guru] [\s!name]
+ \definefontsynonym [\s!Serif] [AdishilaDev-Guru]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [adishila-san] [\s!name]
+ \definefontsynonym [\s!Serif] [AdishilaSan-Regular]
+ \definefontsynonym [\s!SerifBold] [AdishilaSan-Bold]
+ \definefontsynonym [\s!SerifItalic] [AdishilaSan-Italic]
+ \definefontsynonym [\s!SerifBoldItalic] [AdishilaSan-BoldItalic]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [adishila-san-letterpress] [\s!name]
+ \definefontsynonym [\s!Serif] [AdishilaSanLetterpress-Regular]
+ \definefontsynonym [\s!SerifBold] [AdishilaSanLetterpress-Bold]
+ \definefontsynonym [\s!SerifItalic] [AdishilaSanLetterpress-Italic]
+ \definefontsynonym [\s!SerifBoldItalic] [AdishilaSanLetterpress-BoldItalic]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [shobhika] [\s!name]
+ \definefontsynonym [\s!Serif] [Shobhika-Regular]
+ \definefontsynonym [\s!SerifBold] [Shobhika-Bold]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [baloo] [\s!name]
+ \definefontsynonym [\s!Sans] [Baloo2-Regular]
+ \definefontsynonym [\s!SansBold] [Baloo2-Bold]
+ \definefontsynonym [\s!SansItalic] [Baloo2-Medium]
+ \definefontsynonym [\s!SansBoldItalic] [Baloo2-Semibold]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [baloo-extrabold] [\s!name]
+ \definefontsynonym [\s!Sans] [Baloo2-Medium]
+ \definefontsynonym [\s!SansItalic] [Baloo2-Semibold]
+ \definefontsynonym [\s!SansBoldItalic] [Baloo2-Bold]
+ \definefontsynonym [\s!SansBold] [Baloo2-Extrabold]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [jaini] [\s!name]
+ \definefontsynonym [\s!Serif] [Jaini-Regular]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [jaini-purva] [\s!name]
+ \definefontsynonym [\s!Serif] [JainiPurva-Regular]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [amita] [\s!name]
+ \definefontsynonym [\s!Serif] [Amita-Regular]
+ \definefontsynonym [\s!SerifBold] [Amita-Bold]
+ \stoptypescript
+
+ % Typefaces:
+
+ \starttypescript [adishila]
+ \definetypeface [\typescriptone] [\s!rm] [\s!serif] [\typescriptone] [\s!default] [\s!rscale=1.42]
+ \definetypeface [\typescriptone] [\s!ss] [\s!sans] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!mm] [\s!math] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!tt] [\s!mono] [dejavu] [\s!default]
+ \stoptypescript
+ \starttypescript [adishila-semibold,adishila-heavy]
+ \definetypeface [\typescriptone] [\s!rm] [\s!serif] [\typescriptone] [\s!default] [\s!rscale=1.46]
+ \definetypeface [\typescriptone] [\s!ss] [\s!sans] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!mm] [\s!math] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!tt] [\s!mono] [dejavu] [\s!default]
+ \stoptypescript
+
+ \starttypescript [adishila-dev]
+ \definetypeface [\typescriptone] [\s!rm] [\s!serif] [\typescriptone] [\s!default] [\s!rscale=1.65]
+ \definetypeface [\typescriptone] [\s!ss] [\s!sans] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!mm] [\s!math] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!tt] [\s!mono] [dejavu] [\s!default]
+ \stoptypescript
+
+ \starttypescript [adishila-dev-guru,adishila-san,adishila-san-letterpress]
+ \definetypeface [\typescriptone] [\s!rm] [\s!serif] [\typescriptone] [\s!default] [\s!rscale=1.62]
+ \definetypeface [\typescriptone] [\s!ss] [\s!sans] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!mm] [\s!math] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!tt] [\s!mono] [dejavu] [\s!default]
+ \stoptypescript
+
+ \starttypescript [shobhika]
+ \definetypeface [\typescriptone] [\s!rm] [\s!serif] [\typescriptone] [\s!default]
+ \definetypeface [\typescriptone] [\s!ss] [\s!sans] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!mm] [\s!math] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!tt] [\s!mono] [dejavu] [\s!default]
+ \stoptypescript
+
+ \starttypescript [baloo,baloo-extrabold]
+ \definetypeface [\typescriptone] [\s!ss] [\s!sans] [\typescriptone] [\s!default]
+ \definetypeface [\typescriptone] [\s!rm] [\s!serif] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!mm] [\s!math] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!tt] [\s!mono] [dejavu] [\s!default]
+ \stoptypescript
+
+ \starttypescript [jaini,jaini-purva]
+ \definetypeface [\typescriptone] [\s!rm] [\s!serif] [\typescriptone] [\s!default] [\s!rscale=1.5]
+ \definetypeface [\typescriptone] [\s!ss] [\s!sans] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!mm] [\s!math] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!tt] [\s!mono] [dejavu] [\s!default]
+ \stoptypescript
+
+ \starttypescript [amita]
+ \definetypeface [\typescriptone] [\s!rm] [\s!serif] [\typescriptone] [\s!default] [\s!rscale=1.2]
+ \definetypeface [\typescriptone] [\s!ss] [\s!sans] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!mm] [\s!math] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!tt] [\s!mono] [dejavu] [\s!default]
+ \stoptypescript
+
+\stoptypescriptcollection
diff --git a/tex/context/base/mkxl/type-imp-gujarati.mkxl b/tex/context/base/mkxl/type-imp-gujarati.mkxl
new file mode 100644
index 000000000..d7f3f7072
--- /dev/null
+++ b/tex/context/base/mkxl/type-imp-gujarati.mkxl
@@ -0,0 +1,77 @@
+%D \module
+%D [ file=type-imp-gujarati,
+%D version=2022.02.02,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Gujarati,
+%D author=śrīrāma (Sreeram),
+%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.
+
+\starttypescriptcollection[gujarati]
+
+ \definefontfeature
+ [baloobhaifeatures]
+ [gujarati-two]
+ [goodies=bhai.lfg,
+ indic={movematra=auto,conjuncts=quit},
+ sanitizer=gjr2rkrf]
+
+ % Symbolic names for fonts:
+ \starttypescript [\s!serif] [noto-serif-gujarati]
+ \definefontsynonym [NotoSerifGujarati-Regular] [\s!name:notoserifgujaratiregular] [\s!features=baloobhaifeatures]
+ \definefontsynonym [NotoSerifGujarati-Bold] [\s!name:notoserifgujaratibold] [\s!features=baloobhaifeatures]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [baloo-bhai, baloo-bhai-extrabold]
+ \definefontsynonym [BalooBhai2-Regular] [\s!name:baloobhai2regular] [\s!features=baloobhaifeatures]
+ \definefontsynonym [BalooBhai2-Medium] [\s!name:baloobhai2medium] [\s!features=baloobhaifeatures]
+ \definefontsynonym [BalooBhai2-Semibold] [\s!name:baloobhai2semibold] [\s!features=baloobhaifeatures]
+ \definefontsynonym [BalooBhai2-Bold] [\s!name:baloobhai2bold] [\s!features=baloobhaifeatures]
+ \definefontsynonym [BalooBhai2-Extrabold] [\s!name:baloobhai2extrabold] [\s!features=baloobhaifeatures]
+ \stoptypescript
+
+ % Grouping of styles:
+
+ \starttypescript [\s!serif] [noto-serif-gujarati] [\s!name]
+ \setups[\s!font:\s!fallback:\s!serif]
+ \definefontsynonym [\s!Serif] [NotoSerifGujarati-Regular]
+ \definefontsynonym [\s!SerifBold] [NotoSerifGujarati-Bold]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [baloo-bhai] [\s!name]
+ \setups[\s!font:\s!fallback:\s!serif]
+ \definefontsynonym [\s!Sans] [BalooBhai2-Regular]
+ \definefontsynonym [\s!SansSlanted] [BalooBhai2-Medium]
+ \definefontsynonym [\s!SansBold] [BalooBhai2-Bold]
+ \definefontsynonym [\s!SansBoldSlanted] [BalooBhai2-Semibold]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [baloo-bhai-extrabold] [\s!name]
+ \setups[\s!font:\s!fallback:\s!serif]
+ \definefontsynonym [\s!Sans] [BalooBhai2-Medium]
+ \definefontsynonym [\s!SansSlanted] [BalooBhai2-Semibold]
+ \definefontsynonym [\s!SansBold] [BalooBhai2-Extrabold]
+ \definefontsynonym [\s!SansBoldSlanted] [BalooBhai2-Bold]
+ \stoptypescript
+
+ % Typefaces:
+
+ \starttypescript [baloo-bhai, baloo-bhai-extrabold]
+ \definetypeface [\typescriptone] [\s!ss] [\s!sans] [\typescriptone] [\s!default] [\s!rscale=1.1]
+ \definetypeface [\typescriptone] [\s!rm] [\s!serif] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!mm] [\s!math] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!tt] [\s!mono] [dejavu] [\s!default]
+ \stoptypescript
+
+ \starttypescript [noto-serif-gujarati]
+ \definetypeface [\typescriptone] [\s!rm] [\s!serif] [\typescriptone] [\s!default] [\s!rscale=1.1]
+ \definetypeface [\typescriptone] [\s!ss] [\s!sans] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!mm] [\s!math] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!tt] [\s!mono] [dejavu] [\s!default]
+ \stoptypescript
+
+\stoptypescriptcollection
diff --git a/tex/context/base/mkxl/type-imp-indic.mkxl b/tex/context/base/mkxl/type-imp-indic.mkxl
new file mode 100644
index 000000000..aeda08337
--- /dev/null
+++ b/tex/context/base/mkxl/type-imp-indic.mkxl
@@ -0,0 +1,800 @@
+%D \module
+%D [ file=type-imp-indic,
+%D version=2022.02.02,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=A Collection of Indic Fonts,
+%D author=Sreeram & Hans,
+%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.
+
+%D This file is a compation to the other indic typescript that evolved out
+%D of a series of experiments with fonts and extensive research by Sreeram
+%D with respect to them either or not supporting level one and level two
+%D features. When there are issues, just ask on the mailing list.
+
+\definefilesynonym [type-imp-adishila.mkxl] [type-imp-devanagari.mkxl]
+\definefilesynonym [type-imp-adishila-semibold.mkxl] [type-imp-devanagari.mkxl]
+\definefilesynonym [type-imp-adishila-heavy.mkxl] [type-imp-devanagari.mkxl]
+\definefilesynonym [type-imp-adishila-dev.mkxl] [type-imp-devanagari.mkxl]
+\definefilesynonym [type-imp-adishila-dev-guru.mkxl] [type-imp-devanagari.mkxl]
+\definefilesynonym [type-imp-adishila-san.mkxl] [type-imp-devanagari.mkxl]
+\definefilesynonym [type-imp-adishila-san-letterpress.mkxl] [type-imp-devanagari.mkxl]
+\definefilesynonym [type-imp-shobhika.mkxl] [type-imp-devanagari.mkxl]
+\definefilesynonym [type-imp-baloo-extrabold.mkxl] [type-imp-devanagari.mkxl]
+\definefilesynonym [type-imp-baloo.mkxl] [type-imp-devanagari.mkxl]
+\definefilesynonym [type-imp-jaini.mkxl] [type-imp-devanagari.mkxl]
+\definefilesynonym [type-imp-jaini-purva.mkxl] [type-imp-devanagari.mkxl]
+\definefilesynonym [type-imp-amita.mkxl] [type-imp-devanagari.mkxl]
+
+\definefilesynonym [type-imp-rit-rachana.mkxl] [type-imp-malayalam.mkxl]
+\definefilesynonym [type-imp-panmana.mkxl] [type-imp-malayalam.mkxl]
+\definefilesynonym [type-imp-ezhuthu.mkxl] [type-imp-malayalam.mkxl]
+\definefilesynonym [type-imp-karumbi.mkxl] [type-imp-malayalam.mkxl]
+\definefilesynonym [type-imp-chilanka.mkxl] [type-imp-malayalam.mkxl]
+\definefilesynonym [type-imp-anjali-oldlipi.mkxl] [type-imp-malayalam.mkxl]
+\definefilesynonym [type-imp-dyuthi.mkxl] [type-imp-malayalam.mkxl]
+\definefilesynonym [type-imp-tn-joy.mkxl] [type-imp-malayalam.mkxl]
+\definefilesynonym [type-imp-tn-joy-extrabold.mkxl] [type-imp-malayalam.mkxl]
+\definefilesynonym [type-imp-gayathri.mkxl] [type-imp-malayalam.mkxl]
+\definefilesynonym [type-imp-gayathri-thin.mkxl] [type-imp-malayalam.mkxl]
+\definefilesynonym [type-imp-manjari.mkxl] [type-imp-malayalam.mkxl]
+\definefilesynonym [type-imp-manjari-thin.mkxl] [type-imp-malayalam.mkxl]
+\definefilesynonym [type-imp-baloo-chettan.mkxl] [type-imp-malayalam.mkxl]
+\definefilesynonym [type-imp-baloo-chettan-extrabold.mkxl] [type-imp-malayalam.mkxl]
+\definefilesynonym [type-imp-rit-sundar.mkxl] [type-imp-malayalam.mkxl]
+
+\definefilesynonym [type-imp-baloo-tammudu.mkxl] [type-imp-telugu.mkxl]
+\definefilesynonym [type-imp-baloo-tammudu-extrabold.mkxl] [type-imp-telugu.mkxl]
+\definefilesynonym [type-imp-murty-telugu.mkxl] [type-imp-telugu.mkxl]
+
+\definefilesynonym [type-imp-murty-kannada.mkxl] [type-imp-kannada.mkxl]
+
+\definefilesynonym [type-imp-baloo-thambi.mkxl] [type-imp-tamil.mkxl]
+\definefilesynonym [type-imp-baloo-thambi-extrabold.mkxl] [type-imp-tamil.mkxl]
+
+\definefilesynonym [type-imp-baloo-bhai.mkxl] [type-imp-gujarati.mkxl]
+\definefilesynonym [type-imp-baloo-bhai-extrabold.mkxl] [type-imp-gujarati.mkxl]
+\definefilesynonym [type-imp-noto-serif-gujarati.mkxl] [type-imp-gujarati.mkxl]
+
+\definefilesynonym [type-imp-baloo-da.mkxl] [type-imp-bengali.mkxl]
+\definefilesynonym [type-imp-baloo-da-extrabold.mkxl] [type-imp-bengali.mkxl]
+\definefilesynonym [type-imp-murty-bangla.mkxl] [type-imp-bengali.mkxl]
+
+\continueifinputfile{type-imp-indic.mkxl}
+
+% \usetypescriptfile[type-imp-indic]
+
+\usemodule[article-basics]
+
+\setupbodyfont
+ [pagella]
+
+\setuphead
+ [title]
+ [alternative=middle,
+ hidenumber=yes,
+ after={\blank[halfline]},
+ before={\blank[line]},
+ page=no,
+ style=\bfb]
+
+\definedescription
+ [fs]
+ [alternative=left,
+ title=yes,
+ width=3cm,
+ distance=0cm,
+ before=,
+ after=,
+ headstyle={\switchtobodyfont[pagella]}]
+
+\usetransliteration
+ [indic]
+
+\definetransliteration
+ [devatoiast]
+ [color=blue,
+ vector={deva to iast},
+ before=]
+
+\definetransliteration
+ [devatomlym]
+ [vector={deva to mlym}]
+
+\definetransliteration
+ [devatotlgu]
+ [vector={deva to tlgu}]
+
+\definetransliteration
+ [devatoknda]
+ [vector={deva to knda}]
+
+\definetransliteration
+ [devatogujr]
+ [vector={deva to gujr}]
+
+\definetransliteration
+ [devatobngl]
+ [vector={deva to bngl}]
+
+\definebuffer[words]
+\definebuffer[iastbuffer]
+
+\language[sa]
+
+\starttext
+
+\startbuffer[words]
+दंष्ट्रा श्रेयस्करी त्रेता विक्रेता तच्छ्री अङ्कित शृङ्गार क्व्य शार्ङ्ग निरृति
+क्रतुवित्त बर्हिस् प्रेप्सित अङ्घ्रि पङ्क्ति कर्त्तव्य कर्तव्य श्लाघ्यम्
+अवप्लुतम् युङ्क्ष्वा क्षेत्रज्ञ अग्निमीळे चँद्र हर्त्रे श्री आर्द्रं
+\stopbuffer
+
+\startbuffer
+\getbuffer[words]
+\stopbuffer
+
+
+% \startbuffer[iastbuffer]
+% \startdevatoiast[before=\blank,after=\blank]
+% \getbuffer
+% \stopdevatoiast
+% \stopbuffer
+%
+% \getbuffer[iastbuffer]
+
+%
+%
+% Devanagari
+%
+%
+\starttitle[title={Adishila}]
+ \start
+ \switchtobodyfont[adishila]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{Bold}
+ {\bf\getbuffer}
+ \stopfs
+ \startfs{Italic}
+ {\it\getbuffer}
+ \stopfs
+ \startfs{Bold Italic}
+ {\bi\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Adishila Semibold}]
+ \start
+ \switchtobodyfont[adishila-semibold]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{Italic}
+ {\it\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Adishila Heavy}]
+ \start
+ \switchtobodyfont[adishila-heavy]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{Italic}
+ {\it\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Adishila Dev}]
+ \start
+ \switchtobodyfont[adishila-dev]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{Bold}
+ {\bf\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Adishila Dev}]
+ \start
+ \switchtobodyfont[adishila-dev-guru]
+ \startfs{Guru}
+ \getbuffer
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Adishila San}]
+ \start
+ \switchtobodyfont[adishila-san]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{Bold}
+ {\bf\getbuffer}
+ \stopfs
+ \startfs{Italic}
+ {\it\getbuffer}
+ \stopfs
+ \startfs{Bold Italic}
+ {\bi\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Adishila San Letterpress}]
+ \start
+ \switchtobodyfont[adishila-san-letterpress]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{Bold}
+ {\bf\getbuffer}
+ \stopfs
+ \startfs{Italic}
+ {\it\getbuffer}
+ \stopfs
+ \startfs{Bold Italic}
+ {\bi\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Shobhika}]
+ \start
+ \switchtobodyfont[shobhika]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{Bold}
+ {\bf\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Baloo 2 Extra Bold}]
+ \start
+ \switchtobodyfont[baloo-extrabold]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{Bold}
+ {\bf\getbuffer}
+ \stopfs
+ \startfs{Italic}
+ {\it\getbuffer}
+ \stopfs
+ \startfs{Bold Italic}
+ {\bi\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Baloo 2}]
+ \start
+ \switchtobodyfont[baloo]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{Bold}
+ {\bf\getbuffer}
+ \stopfs
+ \startfs{Italic}
+ {\it\getbuffer}
+ \stopfs
+ \startfs{Bold Italic}
+ {\bi\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Jaini}]
+ \start
+ \switchtobodyfont[jaini]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Jaini Purva}]
+ \start
+ \switchtobodyfont[jaini-purva]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Amita}]
+ \start
+ \switchtobodyfont[amita]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{Bold}
+ {\bf\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+%
+%
+% Malayalam
+%
+%
+\startbuffer
+\startdevatomlym
+\getbuffer[words]
+\stopdevatomlym
+\stopbuffer
+
+\starttitle[title={RIT Rachana}]
+ \start
+ \switchtobodyfont[rit-rachana]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{Bold}
+ {\bf\getbuffer}
+ \stopfs
+ \startfs{Italic}
+ {\it\getbuffer}
+ \stopfs
+ \startfs{Bold Italic}
+ {\bi\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Panmana}]
+ \start
+ \switchtobodyfont[panmana]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{Bold}
+ {\bf\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Ezhuthu}]
+ \start
+ \switchtobodyfont[ezhuthu]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{Bold}
+ {\bf\getbuffer}
+ \stopfs
+ \startfs{Slanted}
+ {\sl\getbuffer}
+ \stopfs
+ \startfs{Bold Slanted}
+ {\bs\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Karumbi}]
+ \start
+ \switchtobodyfont[karumbi]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Chilanka}]
+ \start
+ \switchtobodyfont[chilanka]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Anjali Old Lipi}]
+ \start
+ \switchtobodyfont[anjali-oldlipi]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Dyuthi}]
+ \start
+ \switchtobodyfont[dyuthi]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={TN Joy}]
+ \start
+ \switchtobodyfont[tn-joy]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{Bold}
+ {\bf\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={TN Joy Extrabold}]
+ \start
+ \switchtobodyfont[tn-joy-extrabold]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{Bold}
+ {\bf\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Gayathri}]
+ \start
+ \switchtobodyfont[gayathri]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{Bold}
+ {\sl\getbuffer}
+ \stopfs
+ \startfs{Bold}
+ {\bf\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Gayathri Thin}]
+ \start
+ \switchtobodyfont[gayathri-thin]
+ \startfs{Thin (R)}
+ \getbuffer
+ \stopfs
+ \startfs{Bold*}
+ {\bf\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Manjari}]
+ \start
+ \switchtobodyfont[manjari]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{Bold}
+ {\bf\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Manjari Thin}]
+ \start
+ \switchtobodyfont[manjari-thin]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{Bold}
+ {\bf\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Baloo Chettan 2}]
+ \start
+ \switchtobodyfont[baloo-chettan]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{Bold}
+ {\bf\getbuffer}
+ \stopfs
+ \startfs{Medium \type{\sl}}
+ {\sl\getbuffer}
+ \stopfs
+ \startfs{Semibold \type{\bs}}
+ {\bs\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Baloo Chettan 2 Extrabold}]
+ \start
+ \switchtobodyfont[baloo-chettan-extrabold]
+ \startfs{Medium \type{\tf}}
+ \getbuffer
+ \stopfs
+ \startfs{Extrabold \type{\bf}}
+ {\bf\getbuffer}
+ \stopfs
+ \startfs{Semibold \type{\sl}}
+ {\sl\getbuffer}
+ \stopfs
+ \startfs{Bold \type{\bs}}
+ {\bs\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={RIT Sundar}]
+ \start
+ \switchtobodyfont[rit-sundar]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{Bold}
+ {\bf\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+%
+%
+% Telugu
+%
+%
+\startbuffer
+\startdevatotlgu
+\getbuffer[words]
+\stopdevatotlgu
+\stopbuffer
+
+\starttitle[title={Baloo Tammudu 2}]
+ \start
+ \switchtobodyfont[baloo-tammudu]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{Bold}
+ {\bf\getbuffer}
+ \stopfs
+ \startfs{Slanted}
+ {\sl\getbuffer}
+ \stopfs
+ \startfs{Bold Slanted}
+ {\bs\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Baloo Tammudu 2 Extrabold}]
+ \start
+ \switchtobodyfont[baloo-tammudu-extrabold]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{Bold}
+ {\bf\getbuffer}
+ \stopfs
+ \startfs{Italic}
+ {\sl\getbuffer}
+ \stopfs
+ \startfs{Bold Italic}
+ {\bs\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Murty Telugu}]
+ \start
+ \switchtobodyfont[murty-telugu]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{Regular}
+ {\sl\getbuffer}
+ \stopfs
+ \startfs{Regular}
+ {\bf\getbuffer}
+ \stopfs
+ \startfs{Regular}
+ {\bs\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+%
+%
+% Kannada
+%
+%
+\startbuffer
+\startdevatoknda
+\getbuffer[words]
+\stopdevatoknda
+\stopbuffer
+
+\starttitle[title={Murty Kannada}]
+ \start
+ \switchtobodyfont[murty-kannada]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{Regular}
+ {\bf\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+%
+%
+% Tamil
+%
+%
+\start
+\language[ta]
+\startbuffer
+சிற்றமபலம் புயல் காற்று முன்னர் அதே எதெ அதை ஔவையார்
+தொடர்கதை கிழால்லி அழைப்பு வாயிலாக இயற்கை நுழைவாயில்
+இளமை காஞ்சி கச்சி இல்க்கியம் ஸ்ரீ
+\stopbuffer
+
+\starttitle[title={Baloo Thambi 2}]
+ \start
+ \switchtobodyfont[baloo-thambi]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{ஂMedium \type{\sl}}
+ {\sl\getbuffer}
+ \stopfs
+ \startfs{Semibold \type{\bs}}
+ {\bs\getbuffer}
+ \stopfs
+ \startfs{Bold}
+ {\bf\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Baloo Thambi 2 Extrabold}]
+ \start
+ \switchtobodyfont[baloo-thambi-extrabold]
+ \startfs{Medium}
+ \getbuffer
+ \stopfs
+ \startfs{Semibold \type{\sl}}
+ {\sl\getbuffer}
+ \stopfs
+ \startfs{Bold \type{\bs}}
+ {\bs\getbuffer}
+ \stopfs
+ \startfs{Extrabold}
+ {\bf\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+\stop
+%
+%
+% Gujarati
+%
+%
+\startbuffer
+\startdevatogujr
+\getbuffer[words]
+\stopdevatogujr
+\stopbuffer
+
+\starttitle[title={Baloo Bhai 2}]
+ \start
+ \switchtobodyfont[baloo-bhai]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{ஂMedium \type{\sl}}
+ {\sl\getbuffer}
+ \stopfs
+ \startfs{Semibold \type{\bs}}
+ {\bs\getbuffer}
+ \stopfs
+ \startfs{Bold}
+ {\bf\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Baloo Bhai 2 Extrabold}]
+ \start
+ \switchtobodyfont[baloo-bhai-extrabold]
+ \startfs{Medium}
+ \getbuffer
+ \stopfs
+ \startfs{Semibold \type{\sl}}
+ {\sl\getbuffer}
+ \stopfs
+ \startfs{Bold \type{\bs}}
+ {\bs\getbuffer}
+ \stopfs
+ \startfs{Extrabold}
+ {\bf\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Noto Serif Gujarati}]
+ \start
+ \switchtobodyfont[noto-serif-gujarati]
+ \startfs{Medium}
+ \getbuffer
+ \stopfs
+ \startfs{Extrabold}
+ {\bf\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+%
+%
+% Bengali
+%
+%
+\startbuffer
+\startdevatobngl
+\getbuffer[words]
+\stopdevatobngl
+\stopbuffer
+
+\starttitle[title={Baloo Da 2}]
+ \start
+ \switchtobodyfont[baloo-da]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{Medium \type{\sl}}
+ {\sl\getbuffer}
+ \stopfs
+ \startfs{Semibold \type{\bs}}
+ {\bs\getbuffer}
+ \stopfs
+ \startfs{Bold}
+ {\bf\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Baloo Da 2 Extrabold}]
+ \start
+ \switchtobodyfont[baloo-da-extrabold]
+ \startfs{Medium}
+ \getbuffer
+ \stopfs
+ \startfs{Semibold \type{\sl}}
+ {\sl\getbuffer}
+ \stopfs
+ \startfs{Bold \type{\bs}}
+ {\bs\getbuffer}
+ \stopfs
+ \startfs{Extrabold}
+ {\bf\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\starttitle[title={Murty Bengali}]
+ \start
+ \switchtobodyfont[murty-bangla]
+ \startfs{Regular}
+ \getbuffer
+ \stopfs
+ \startfs{Regular}
+ {\bf\getbuffer}
+ \stopfs
+ \stop
+\stoptitle
+
+\stoptext
diff --git a/tex/context/base/mkxl/type-imp-kannada.mkxl b/tex/context/base/mkxl/type-imp-kannada.mkxl
new file mode 100644
index 000000000..4838075b2
--- /dev/null
+++ b/tex/context/base/mkxl/type-imp-kannada.mkxl
@@ -0,0 +1,73 @@
+%D \module
+%D [ file=type-imp-kannada,
+%D version=2022.01.27,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Dekannada,
+%D author=śrīrāma (Sreeram),
+%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.
+
+\starttypescriptcollection[kannada]
+
+ \doifunknownfontfeature {kannada-bold-30} {\definefontfeature[kannada-bold-30][boldened-30]}
+
+ % Symbolic names for fonts:
+
+ \starttypescript [\s!serif] [murty-kannada]
+ \definefontsynonym [MurtyKannada-Regular] [\s!name:murtykannadaregular] [\s!features=kannada-two]
+ \definefontsynonym [MurtyKannada-Bold] [\s!name:murtykannadaregular] [\s!features={kannada-two,kannada-bold-30}]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [baloo-tamma, baloo-tamma-extrabold]
+ \definefontsynonym [BalooTamma2-Regular] [\s!name:balootamma2regular] [\s!features=kannada-two]
+ \definefontsynonym [BalooTamma2-Medium] [\s!name:balootamma2medium] [\s!features=kannada-two]
+ \definefontsynonym [BalooTamma2-Semibold] [\s!name:balootamma2semibold] [\s!features=kannada-two]
+ \definefontsynonym [BalooTamma2-Bold] [\s!name:balootamma2bold] [\s!features=kannada-two]
+ \definefontsynonym [BalooTamma2-Extrabold] [\s!name:balootamma2extrabold] [\s!features=kannada-two]
+ \stoptypescript
+
+ % Grouping of styles:
+
+ \starttypescript [\s!sans] [baloo-tamma] [\s!name]
+ \setups[\s!font:\s!fallback:\s!serif]
+ \definefontsynonym [\s!Sans] [BalooTamma2-Regular]
+ \definefontsynonym [\s!SansSlanted] [BalooTamma2-Medium]
+ \definefontsynonym [\s!SansBold] [BalooTamma2-Bold]
+ \definefontsynonym [\s!SansBoldSlanted] [BalooTamma2-Semibold]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [baloo-tamma-extrabold] [\s!name]
+ \setups[\s!font:\s!fallback:\s!serif]
+ \definefontsynonym [\s!Sans] [BalooTamma2-Medium]
+ \definefontsynonym [\s!SansSlanted] [BalooTamma2-Semibold]
+ \definefontsynonym [\s!SansBold] [BalooTamma2-Extrabold]
+ \definefontsynonym [\s!SansBoldSlanted] [BalooTamma2-Bold]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [murty-kannada] [\s!name]
+ \setups[\s!font:\s!fallback:\s!serif]
+ \definefontsynonym [\s!Serif] [MurtyKannada-Regular]
+ \definefontsynonym [\s!SerifBold] [MurtyKannada-Bold]
+ \stoptypescript
+
+ % Typefaces:
+
+ \starttypescript [baloo-tamma, baloo-tamma-extrabold]
+ \definetypeface [\typescriptone] [\s!ss] [\s!sans] [\typescriptone] [\s!default]
+ \definetypeface [\typescriptone] [\s!rm] [\s!serif] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!mm] [\s!math] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!tt] [\s!mono] [dejavu] [\s!default]
+ \stoptypescript
+
+ \starttypescript [murty-kannada]
+ \definetypeface [murty-kannada] [\s!rm] [\s!serif] [murty-kannada] [\s!default]
+ \definetypeface [\typescriptone] [\s!ss] [\s!sans] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!mm] [\s!math] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!tt] [\s!mono] [dejavu] [\s!default]
+ \stoptypescript
+
+\stoptypescriptcollection
diff --git a/tex/context/base/mkxl/type-imp-malayalam.mkxl b/tex/context/base/mkxl/type-imp-malayalam.mkxl
new file mode 100644
index 000000000..67a35d472
--- /dev/null
+++ b/tex/context/base/mkxl/type-imp-malayalam.mkxl
@@ -0,0 +1,224 @@
+%D \module
+%D [ file=type-imp-malayam,
+%D version=2022.01.27,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Demalayalam,
+%D author=śrīrāma (Sreeram),
+%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.
+
+%D This collection uses rscaling so that the fonts can be used alongside.
+
+\starttypescriptcollection[malayalam]
+
+ \doifunknownfontfeature {malayalam-bold-30} {\definefontfeature[malayalam-bold-30][boldened-30]}
+
+ % Symbolic names for fonts:
+
+ \starttypescript [\s!serif] [rit-rachana]
+ \definefontsynonym [RITRachana-Regular] [\s!name:ritrachanaregular] [\s!features=malayalam-two]
+ \definefontsynonym [RITRachana-Bold] [\s!name:ritrachanabold] [\s!features=malayalam-two]
+ \definefontsynonym [RITRachana-Italic] [\s!name:ritrachanaitalic] [\s!features=malayalam-two]
+ \definefontsynonym [RITRachana-BoldItalic] [\s!name:ritrachanabolditalic] [\s!features=malayalam-two]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [panmana]
+ \definefontsynonym [Panmana-Regular] [\s!name:panmanaregular] [\s!features=malayalam-two]
+ \definefontsynonym [Panmana-Bold] [\s!name:panmanaregular] [\s!features={malayalam-two,malayalam-bold-30}]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [rit-sundar]
+ \definefontsynonym [RITSundar-Regular] [\s!name:ritsundarbold] [\s!features=malayalam-two]
+ \definefontsynonym [RITSundar-Bold] [\s!name:ritsundarbold] [\s!features={malayalam-two,malayalam-bold-30}]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [tn-joy, tn-joy-extrabold]
+ \definefontsynonym [TNJoy-Regular] [\s!name:tnjoyregular] [\s!features=malayalam-two]
+ \definefontsynonym [TNJoy-Bold] [\s!name:tnjoybold] [\s!features=malayalam-two]
+ \definefontsynonym [TNJoy-Extrabold] [\s!name:tnjoyextrabold] [\s!features=malayalam-two]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [ezhuthu]
+ \definefontsynonym [Ezhuthu-Regular] [\s!name:ezhuthuregular] [\s!features=malayalam-two]
+ \definefontsynonym [Ezhuthu-Bold] [\s!name:ezhuthuregular] [\s!features={malayalam-two,malayalam-bold-30}]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [baloo-chettan,baloo-chettan-extrabold]
+ \definefontsynonym [BalooChettan2-Regular] [\s!name:baloochettan2regular] [\s!features=malayalam-two]
+ \definefontsynonym [BalooChettan2-Medium] [\s!name:baloochettan2medium] [\s!features=malayalam-two]
+ \definefontsynonym [BalooChettan2-Semibold] [\s!name:baloochettan2semibold] [\s!features=malayalam-two]
+ \definefontsynonym [BalooChettan2-Bold] [\s!name:baloochettan2bold] [\s!features=malayalam-two]
+ \definefontsynonym [BalooChettan2-Extrabold] [\s!name:baloochettan2extrabold] [\s!features=malayalam-two]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [gayathri, gayathri-thin]
+ \definefontsynonym [Gayathri-Regular] [\s!name:gayathriregular] [\s!features=malayalam-two]
+ \definefontsynonym [Gayathri-Bold] [\s!name:gayathribold] [\s!features=malayalam-two]
+ \definefontsynonym [Gayathri-Thin] [\s!name:gayathrithin] [\s!features=malayalam-two]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [manjari,manjari-thin]
+ \definefontsynonym [Manjari-Regular] [\s!name:manjariregular] [\s!features=malayalam-two]
+ \definefontsynonym [Manjari-Bold] [\s!name:manjaribold] [\s!features=malayalam-two]
+ \definefontsynonym [Manjari-Thin] [\s!name:manjarithin] [\s!features=malayalam-two]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [karumbi]
+ \definefontsynonym [Karumbi-Regular] [\s!name:karumbiregular] [\s!features=malayalam-two]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [chilanka]
+ \definefontsynonym [Chilanka-Regular] [\s!name:chilankaregular] [\s!features=malayalam-two]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [anjali-oldlipi]
+ \definefontsynonym [Anjali-Oldlipi-Regular] [\s!name:anjalioldlipiregular] [\s!features=malayalam-two]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [dyuthi]
+ \definefontsynonym [Dyuthi-Regular] [\s!name:dyuthiregular] [\s!features=malayalam-two]
+ \stoptypescript
+
+ % Grouping of styles:
+
+ \starttypescript [\s!serif] [rit-rachana] [\s!name]
+ \setups[\s!font:\s!fallback:\s!serif]
+ \definefontsynonym [\s!Serif] [RITRachana-Regular]
+ \definefontsynonym [\s!SerifBold] [RITRachana-Bold]
+ \definefontsynonym [\s!SerifItalic] [RITRachana-Italic]
+ \definefontsynonym [\s!SerifBoldItalic] [RITRachana-BoldItalic]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [panmana] [\s!name]
+ \setups[\s!font:\s!fallback:\s!serif]
+ \definefontsynonym [\s!Serif] [Panmana-Regular]
+ \definefontsynonym [\s!SerifBold] [Panmana-Bold]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [rit-sundar] [\s!name]
+ \setups[\s!font:\s!fallback:\s!serif]
+ \definefontsynonym [\s!Serif] [RITSundar-Regular]
+ \definefontsynonym [\s!SerifBold] [RITSundar-Bold]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [tn-joy] [\s!name]
+ \setups[\s!font:\s!fallback:\s!sans]
+ \definefontsynonym [\s!Sans] [TNJoy-Regular]
+ \definefontsynonym [\s!SansBold] [TNJoy-Bold]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [tn-joy-extrabold] [\s!name]
+ \setups[\s!font:\s!fallback:\s!sans]
+ \definefontsynonym [\s!Sans] [TNJoy-Bold]
+ \definefontsynonym [\s!SansBold] [TNJoy-Extrabold]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [ezhuthu] [\s!name]
+ \setups[\s!font:\s!fallback:\s!sans]
+ \definefontsynonym [\s!Sans] [Ezhuthu-Regular]
+ \definefontsynonym [\s!SansBold] [Ezhuthu-Bold]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [karumbi] [\s!name]
+ \setups[\s!font:\s!fallback:\s!sans]
+ \definefontsynonym [\s!Sans] [Karumbi-Regular]
+ \definefontsynonym [\s!SansBold] [Karumbi-Bold]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [chilanka] [\s!name]
+ \setups[\s!font:\s!fallback:\s!sans]
+ \definefontsynonym [\s!Sans] [Chilanka-Regular]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [anjali-oldlipi] [\s!name]
+ \setups[\s!font:\s!fallback:\s!sans]
+ \definefontsynonym [\s!Sans] [Anjali-Oldlipi-Regular]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [dyuthi] [\s!name]
+ \setups[\s!font:\s!fallback:\s!sans]
+ \definefontsynonym [\s!Sans] [Dyuthi-Regular]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [gayathri] [\s!name]
+ \setups[\s!font:\s!fallback:\s!sans]
+ \definefontsynonym [\s!Sans] [Gayathri-Regular]
+ \definefontsynonym [\s!SansBold] [Gayathri-Bold]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [gayathri-thin] [\s!name]
+ \setups[\s!font:\s!fallback:\s!sans]
+ \definefontsynonym [\s!Sans] [Gayathri-Thin]
+ \definefontsynonym [\s!SansBold] [Gayathri-Regular]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [manjari] [\s!name]
+ \setups[\s!font:\s!fallback:\s!sans]
+ \definefontsynonym [\s!Sans ] [Manjari-Regular]
+ \definefontsynonym [\s!SansBold] [Manjari-Bold]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [manjari-thin] [\s!name]
+ \setups[\s!font:\s!fallback:\s!sans]
+ \definefontsynonym [\s!Sans] [Manjari-Thin]
+ \definefontsynonym [\s!SansBold] [Manjari-Regular]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [baloo-chettan] [\s!name]
+ \setups[\s!font:\s!fallback:\s!sans]
+ \definefontsynonym [\s!Sans] [BalooChettan2-Regular]
+ \definefontsynonym [\s!SansBold] [BalooChettan2-Bold]
+ \definefontsynonym [\s!SansSlanted] [BalooChettan2-Medium]
+ \definefontsynonym [\s!SansBoldSlanted] [BalooChettan2-Semibold]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [baloo-chettan-extrabold] [name]
+ \setups[\s!font:\s!fallback:\s!sans]
+ \definefontsynonym [\s!Sans] [BalooChettan2-Medium]
+ \definefontsynonym [\s!SansSlanted] [BalooChettan2-Semibold]
+ \definefontsynonym [\s!SansBoldSlanted] [BalooChettan2-Bold]
+ \definefontsynonym [\s!SansBold] [BalooChettan2-Extrabold]
+ \stoptypescript
+
+ % Typefaces:
+
+ \starttypescript [rit-rachana,rit-sundar,panmana]
+ \definetypeface [\typescriptone] [\s!rm] [\s!serif] [\typescriptone] [\s!default] [\s!rscale=1.25]
+ \definetypeface [\typescriptone] [\s!ss] [\s!sans] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!mm] [\s!math] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!tt] [\s!mono] [dejavu] [\s!default]
+ \stoptypescript
+
+ \starttypescript [ezhuthu,karumbi,tn-joy,tn-joy-extrabold]
+ \definetypeface [\typescriptone] [\s!ss] [\s!sans] [\typescriptone] [\s!default] [\s!rscale=1.25]
+ \definetypeface [\typescriptone] [\s!rm] [\s!serif] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!mm] [\s!math] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!tt] [\s!mono] [dejavu] [\s!default]
+ \stoptypescript
+
+ \starttypescript [chilanka,anjali-oldlipi]
+ \definetypeface [\typescriptone] [\s!ss] [\s!sans] [\typescriptone] [\s!default]
+ \definetypeface [\typescriptone] [\s!rm] [\s!serif] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!mm] [\s!math] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!tt] [\s!mono] [dejavu] [\s!default]
+ \stoptypescript
+
+ \starttypescript [dyuthi,gayathri,gayathri-thin,manjari,manjari-thin]
+ \definetypeface [\typescriptone] [\s!ss] [\s!sans] [\typescriptone] [\s!default] [\s!rscale=1.1]
+ \definetypeface [\typescriptone] [\s!rm] [\s!serif] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!mm] [\s!math] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!tt] [\s!mono] [dejavu] [\s!default]
+ \stoptypescript
+
+ \starttypescript [baloo-chettan,baloo-chettan-extrabold]
+ \definetypeface [\typescriptone] [\s!ss] [\s!sans] [baloo-chettan] [\s!default]
+ \definetypeface [\typescriptone] [\s!rm] [\s!serif] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!mm] [\s!math] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!tt] [\s!mono] [dejavu] [\s!default]
+ \stoptypescript
+
+\stoptypescriptcollection
diff --git a/tex/context/base/mkxl/type-imp-tamil.mkxl b/tex/context/base/mkxl/type-imp-tamil.mkxl
new file mode 100644
index 000000000..90516365e
--- /dev/null
+++ b/tex/context/base/mkxl/type-imp-tamil.mkxl
@@ -0,0 +1,53 @@
+%D \module
+%D [ file=type-imp-tamil,
+%D version=2022.02.02,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Tamil,
+%D author=śrīrāma (Sreeram),
+%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.
+
+\starttypescriptcollection[tamil]
+
+ % Symbolic names for fonts:
+
+ \starttypescript [\s!sans] [baloo-thambi, baloo-thambi-extrabold]
+ \definefontsynonym [BalooThambi2-Regular] [\s!name:baloothambi2regular] [\s!features=tamil-two]
+ \definefontsynonym [BalooThambi2-Medium] [\s!name:baloothambi2medium] [\s!features=tamil-two]
+ \definefontsynonym [BalooThambi2-Semibold] [\s!name:baloothambi2semibold] [\s!features=tamil-two]
+ \definefontsynonym [BalooThambi2-Bold] [\s!name:baloothambi2bold] [\s!features=tamil-two]
+ \definefontsynonym [BalooThambi2-Extrabold] [\s!name:baloothambi2extrabold] [\s!features=tamil-two]
+ \stoptypescript
+
+ % Grouping of styles:
+
+ \starttypescript [\s!sans] [baloo-thambi] [\s!name]
+ \setups[\s!font:\s!fallback:\s!serif]
+ \definefontsynonym [\s!Sans] [BalooThambi2-Regular]
+ \definefontsynonym [\s!SansSlanted] [BalooThambi2-Medium]
+ \definefontsynonym [\s!SansBold] [BalooThambi2-Bold]
+ \definefontsynonym [\s!SansBoldSlanted] [BalooThambi2-Semibold]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [baloo-thambi-extrabold] [\s!name]
+ \setups[\s!font:\s!fallback:\s!serif]
+ \definefontsynonym [\s!Sans] [BalooThambi2-Medium]
+ \definefontsynonym [\s!SansSlanted] [BalooThambi2-Semibold]
+ \definefontsynonym [\s!SansBold] [BalooThambi2-Extrabold]
+ \definefontsynonym [\s!SansBoldSlanted] [BalooThambi2-Bold]
+ \stoptypescript
+
+ % Typefaces:
+
+ \starttypescript [baloo-thambi, baloo-thambi-extrabold]
+ \definetypeface [\typescriptone] [\s!ss] [\s!sans] [\typescriptone] [\s!default]
+ \definetypeface [\typescriptone] [\s!rm] [\s!serif] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!mm] [\s!math] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!tt] [\s!mono] [dejavu] [\s!default]
+ \stoptypescript
+
+\stoptypescriptcollection
diff --git a/tex/context/base/mkxl/type-imp-telugu.mkxl b/tex/context/base/mkxl/type-imp-telugu.mkxl
new file mode 100644
index 000000000..33d07664c
--- /dev/null
+++ b/tex/context/base/mkxl/type-imp-telugu.mkxl
@@ -0,0 +1,74 @@
+%D \module
+%D [ file=type-imp-telugu,
+%D version=2022.01.27,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Telugu,
+%D author=śrīrāma (Sreeram),
+%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.
+
+\starttypescriptcollection[telugu]
+
+ \doifunknownfontfeature {telugu-bold-30} {\definefontfeature[telugu-bold-30][boldened-30]}
+ \doifunknownfontfeature {telugu-slant} {\definefontfeature[telugu-slant][slant=0.25]}
+
+ % Symbolic names for fonts:
+
+ \starttypescript [\s!serif] [murty-telugu]
+ \definefontsynonym [MurtyTelugu-Regular] [\s!name:murtyteluguregular] [\s!features=telugu-two]
+ \definefontsynonym [MurtyTelugu-Bold] [\s!name:murtyteluguregular] [\s!features={telugu-two,telugu-bold-30}]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [baloo-tammudu, baloo-tammudu-extrabold]
+ \definefontsynonym [BalooTammudu2-Regular] [\s!name:balootammudu2regular] [\s!features=telugu-two]
+ \definefontsynonym [BalooTammudu2-Medium] [\s!name:balootammudu2medium] [\s!features=telugu-two]
+ \definefontsynonym [BalooTammudu2-Semibold] [\s!name:balootammudu2semibold] [\s!features=telugu-two]
+ \definefontsynonym [BalooTammudu2-Bold] [\s!name:balootammudu2bold] [\s!features=telugu-two]
+ \definefontsynonym [BalooTammudu2-Extrabold] [\s!name:balootammudu2extrabold] [\s!features=telugu-two]
+ \stoptypescript
+
+ % Grouping of styles:
+
+ \starttypescript [\s!sans] [baloo-tammudu] [\s!name]
+ \setups[\s!font:\s!fallback:\s!serif]
+ \definefontsynonym [\s!Sans] [BalooTammudu2-Regular]
+ \definefontsynonym [\s!SansSlanted] [BalooTammudu2-Medium]
+ \definefontsynonym [\s!SansBold] [BalooTammudu2-Bold]
+ \definefontsynonym [\s!SansBoldSlanted] [BalooTammudu2-Semibold]
+ \stoptypescript
+
+ \starttypescript [\s!sans] [baloo-tammudu-extrabold] [\s!name]
+ \setups[\s!font:\s!fallback:\s!serif]
+ \definefontsynonym [\s!Sans] [BalooTammudu2-Medium]
+ \definefontsynonym [\s!SansSlanted] [BalooTammudu2-Semibold]
+ \definefontsynonym [\s!SansBold] [BalooTammudu2-Extrabold]
+ \definefontsynonym [\s!SansBoldSlanted] [BalooTammudu2-Bold]
+ \stoptypescript
+
+ \starttypescript [\s!serif] [murty-telugu] [\s!name]
+ \setups[\s!font:\s!fallback:\s!serif]
+ \definefontsynonym [\s!Serif] [MurtyTelugu-Regular]
+ \definefontsynonym [\s!SerifBold] [MurtyTelugu-Bold]
+ \stoptypescript
+
+ % Typefaces:
+
+ \starttypescript [baloo-tammudu, baloo-tammudu-extrabold]
+ \definetypeface [\typescriptone] [\s!ss] [\s!sans] [\typescriptone] [\s!default]
+ \definetypeface [\typescriptone] [\s!rm] [\s!serif] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!mm] [\s!math] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!tt] [\s!mono] [dejavu] [\s!default]
+ \stoptypescript
+
+ \starttypescript [murty-telugu]
+ \definetypeface [\typescriptone] [\s!rm] [\s!serif] [murty-telugu] [\s!default]
+ \definetypeface [\typescriptone] [\s!ss] [\s!sans] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!mm] [\s!math] [dejavu] [\s!default]
+ \definetypeface [\typescriptone] [\s!tt] [\s!mono] [dejavu] [\s!default]
+ \stoptypescript
+
+\stoptypescriptcollection
diff --git a/tex/context/base/mkxl/typo-mar.lmt b/tex/context/base/mkxl/typo-mar.lmt
index b590c9ecf..87eafb062 100644
--- a/tex/context/base/mkxl/typo-mar.lmt
+++ b/tex/context/base/mkxl/typo-mar.lmt
@@ -82,8 +82,6 @@ local setwidth = nuts.setwidth
local getheight = nuts.getheight
local setattrlist = nuts.setattrlist
-
-local getbox = nuts.getbox
local takebox = nuts.takebox
local setprop = nuts.setprop
@@ -105,6 +103,7 @@ local new_usernode = nodepool.usernode
local latelua = nodepool.latelua
local texgetdimen = tex.getdimen
+
local texgetcount = tex.getcount
local texget = tex.get
@@ -270,8 +269,8 @@ function margins.save(t)
if t.number then
local leftmargindistance = texgetdimen("naturalleftmargindistance")
local rightmargindistance = texgetdimen("naturalrightmargindistance")
- local strutbox = getbox("strutbox")
- local _, strutht, strutdp = getwhd(strutbox)
+ local strutht = texgetdimen("strutht")
+ local strutdp = texgetdimen("strutdp")
-- better make a new table and make t entry in t
t.box = content
t.n = nofsaved
diff --git a/tex/context/base/mkxl/typo-mar.mkxl b/tex/context/base/mkxl/typo-mar.mkxl
index 4862ee671..242797a5d 100644
--- a/tex/context/base/mkxl/typo-mar.mkxl
+++ b/tex/context/base/mkxl/typo-mar.mkxl
@@ -174,7 +174,7 @@
\docheckpagestate\s!margintext\nofmargintexts
%\doifelserightpagestate\s!margintext\nofmargintexts\relax\relax
\realpageno\realpagestateno
- \page_layouts_swap_margins}
+ \page_layouts_swap_margins\v!margin}
\permanent\protected\def\margindata
{\iftrialtypesetting