diff options
Diffstat (limited to 'tex/context/base')
81 files changed, 5131 insertions, 1432 deletions
diff --git a/tex/context/base/mkii/cont-new.mkii b/tex/context/base/mkii/cont-new.mkii index 545627d07..6bcff2af2 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.09.16 14:39} +\newcontextversion{2022.10.14 10:13} %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 90eea4118..e02334f8d 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.09.16 14:39} +\edef\contextversion{2022.10.14 10:13} %D For those who want to use this: diff --git a/tex/context/base/mkiv/char-def.lua b/tex/context/base/mkiv/char-def.lua index 57061735b..a5a21687b 100644 --- a/tex/context/base/mkiv/char-def.lua +++ b/tex/context/base/mkiv/char-def.lua @@ -45,6 +45,43 @@ local variants_dotted={ [0xFE00]="dotted form", } +local variants_90={ + [0xFE00]="rotated 90 degrees", +} + +local variants_180={ + [0xFE01]="rotated 180 degrees", +} + +local variants_270={ + [0xFE02]="rotated 270 degrees", +} + +local variants_expanded={ + [0xFE00]="expanded", +} + +local variants_90_180={ + [0xFE00]="rotated 90 degrees", + [0xFE01]="rotated 180 degrees", +} + +local variants_90_180_270={ + [0xFE00]="rotated 90 degrees", + [0xFE01]="rotated 180 degrees", + [0xFE02]="rotated 270 degrees", +} + +local variants_180_270={ + [0xFE01]="rotated 180 degrees", + [0xFE02]="rotated 270 degrees", +} + +local variants_90_270={ + [0xFE00]="rotated 90 degrees", + [0xFE02]="rotated 270 degrees", +} + characters = characters or { } characters.data={ @@ -480,9 +517,9 @@ characters.data={ direction="es", linebreak="hy", mathclass="ordinary", - mathgroup="binary arithmetic", mathextensible="h", mathfiller="relfill", + mathgroup="binary arithmetic", mathname="mathhyphen", mathsymbol=0x2212, synonyms={ "hyphen or minus sign", "hyphus" }, @@ -701,8 +738,8 @@ characters.data={ }, { class="relation", - name="Relbar", comment="useless", + name="Relbar", }, }, unicodeslot=0x3D, @@ -1048,8 +1085,8 @@ characters.data={ { adobename="asciicircum", category="sk", - comment="the Hat looks rediculous in most fonts", cjkwd="na", + comment="the Hat looks rediculous in most fonts", contextname="textasciicircum", description="CIRCUMFLEX ACCENT", direction="on", @@ -23219,6 +23256,7 @@ characters.data={ direction="l", indic="c", linebreak="al", + synonyms={ "bangla khanda ta" }, unicodeslot=0x9CE, }, [0x9D7]={ @@ -28096,6 +28134,13 @@ characters.data={ linebreak="al", unicodeslot=0xCF2, }, + [0xCF3]={ + category="mc", + description="KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT", + direction="l", + linebreak="cm", + unicodeslot=0xCF3, + }, [0xD00]={ category="mn", description="MALAYALAM SIGN COMBINING ANUSVARA ABOVE", @@ -30909,6 +30954,13 @@ characters.data={ linebreak="sa", unicodeslot=0xECD, }, + [0xECE]={ + category="mn", + description="LAO YAMAKKAN", + direction="nsm", + linebreak="sa", + unicodeslot=0xECE, + }, [0xED0]={ category="nd", description="LAO DIGIT ZERO", @@ -56408,7 +56460,7 @@ characters.data={ combining=0xEA, description="COMBINING DOUBLE CIRCUMFLEX ABOVE", direction="nsm", - linebreak="cm", + linebreak="gl", unicodeslot=0x1DCD, }, [0x1DCE]={ @@ -56784,7 +56836,7 @@ characters.data={ combining=0xE9, description="COMBINING DOUBLE INVERTED BREVE BELOW", direction="nsm", - linebreak="cm", + linebreak="gl", unicodeslot=0x1DFC, }, [0x1DFD]={ @@ -63092,7 +63144,7 @@ characters.data={ category="po", description="QUADRUPLE PRIME", direction="on", - linebreak="al", + linebreak="po", mathclass="prime", mathname="quadrupleprime", specials={ "compat", 0x2032, 0x2032, 0x2032, 0x2032 }, @@ -63195,6 +63247,7 @@ characters.data={ linebreak="al", mathclass="ghost", mathname="invisiblecomma", + synonyms={ "invisible comma" }, unicodeslot=0x2063, }, [0x2064]={ @@ -66926,8 +66979,8 @@ characters.data={ description="EMPTY SET", direction="on", linebreak="al", - mathgroup="constant set", mathclass="ordinary", + mathgroup="constant set", mathname="emptyset", synonyms={ "null set" }, unicodeslot=0x2205, @@ -67102,8 +67155,8 @@ characters.data={ }, { class="relation", - name="relbar", comment="useless", + name="relbar", }, }, unicodeslot=0x2212, @@ -159588,6 +159641,30 @@ characters.data={ linebreak="al", unicodeslot=0x10EB1, }, + [0x10EFD]={ + category="mn", + combining=0xDC, + description="ARABIC SMALL LOW WORD SAKTA", + direction="nsm", + linebreak="cm", + unicodeslot=0x10EFD, + }, + [0x10EFE]={ + category="mn", + combining=0xDC, + description="ARABIC SMALL LOW WORD QASR", + direction="nsm", + linebreak="cm", + unicodeslot=0x10EFE, + }, + [0x10EFF]={ + category="mn", + combining=0xDC, + description="ARABIC SMALL LOW WORD MADDA", + direction="nsm", + linebreak="cm", + unicodeslot=0x10EFF, + }, [0x10F00]={ category="lo", description="OLD SOGDIAN LETTER ALEPH", @@ -164352,6 +164429,27 @@ characters.data={ linebreak="cm", unicodeslot=0x1123E, }, + [0x1123F]={ + category="lo", + description="KHOJKI LETTER QA", + direction="l", + linebreak="al", + unicodeslot=0x1123F, + }, + [0x11240]={ + category="lo", + description="KHOJKI LETTER SHORT I", + direction="l", + linebreak="al", + unicodeslot=0x11240, + }, + [0x11241]={ + category="mn", + description="KHOJKI VOWEL SIGN VOCALIC R", + direction="nsm", + linebreak="cm", + unicodeslot=0x11241, + }, [0x11280]={ category="lo", description="MULTANI LETTER A", @@ -172828,6 +172926,76 @@ characters.data={ linebreak="al", unicodeslot=0x11AF8, }, + [0x11B00]={ + category="po", + description="DEVANAGARI HEAD MARK", + direction="l", + linebreak="bb", + unicodeslot=0x11B00, + }, + [0x11B01]={ + category="po", + description="DEVANAGARI HEAD MARK WITH HEADSTROKE", + direction="l", + linebreak="bb", + unicodeslot=0x11B01, + }, + [0x11B02]={ + category="po", + description="DEVANAGARI SIGN BHALE", + direction="l", + linebreak="bb", + unicodeslot=0x11B02, + }, + [0x11B03]={ + category="po", + description="DEVANAGARI SIGN BHALE WITH HOOK", + direction="l", + linebreak="bb", + unicodeslot=0x11B03, + }, + [0x11B04]={ + category="po", + description="DEVANAGARI SIGN EXTENDED BHALE", + direction="l", + linebreak="bb", + unicodeslot=0x11B04, + }, + [0x11B05]={ + category="po", + description="DEVANAGARI SIGN EXTENDED BHALE WITH HOOK", + direction="l", + linebreak="bb", + unicodeslot=0x11B05, + }, + [0x11B06]={ + category="po", + description="DEVANAGARI SIGN WESTERN FIVE-LIKE BHALE", + direction="l", + linebreak="bb", + unicodeslot=0x11B06, + }, + [0x11B07]={ + category="po", + description="DEVANAGARI SIGN WESTERN NINE-LIKE BHALE", + direction="l", + linebreak="bb", + unicodeslot=0x11B07, + }, + [0x11B08]={ + category="po", + description="DEVANAGARI SIGN REVERSED NINE-LIKE BHALE", + direction="l", + linebreak="bb", + unicodeslot=0x11B08, + }, + [0x11B09]={ + category="po", + description="DEVANAGARI SIGN MINDU", + direction="l", + linebreak="bb", + unicodeslot=0x11B09, + }, [0x11C00]={ category="lo", description="BHAIKSUKI LETTER A", @@ -175129,6 +175297,610 @@ characters.data={ linebreak="al", unicodeslot=0x11EF8, }, + [0x11F00]={ + category="mn", + description="KAWI SIGN CANDRABINDU", + direction="nsm", + linebreak="cm", + unicodeslot=0x11F00, + }, + [0x11F01]={ + category="mn", + description="KAWI SIGN ANUSVARA", + direction="nsm", + linebreak="cm", + unicodeslot=0x11F01, + }, + [0x11F02]={ + category="lo", + description="KAWI SIGN REPHA", + direction="l", + linebreak="al", + unicodeslot=0x11F02, + }, + [0x11F03]={ + category="mc", + description="KAWI SIGN VISARGA", + direction="l", + linebreak="cm", + unicodeslot=0x11F03, + }, + [0x11F04]={ + category="lo", + description="KAWI LETTER A", + direction="l", + linebreak="al", + unicodeslot=0x11F04, + }, + [0x11F05]={ + category="lo", + description="KAWI LETTER AA", + direction="l", + linebreak="al", + unicodeslot=0x11F05, + }, + [0x11F06]={ + category="lo", + description="KAWI LETTER I", + direction="l", + linebreak="al", + unicodeslot=0x11F06, + }, + [0x11F07]={ + category="lo", + description="KAWI LETTER II", + direction="l", + linebreak="al", + unicodeslot=0x11F07, + }, + [0x11F08]={ + category="lo", + description="KAWI LETTER U", + direction="l", + linebreak="al", + unicodeslot=0x11F08, + }, + [0x11F09]={ + category="lo", + description="KAWI LETTER UU", + direction="l", + linebreak="al", + unicodeslot=0x11F09, + }, + [0x11F0A]={ + category="lo", + description="KAWI LETTER VOCALIC R", + direction="l", + linebreak="al", + unicodeslot=0x11F0A, + }, + [0x11F0B]={ + category="lo", + description="KAWI LETTER VOCALIC RR", + direction="l", + linebreak="al", + unicodeslot=0x11F0B, + }, + [0x11F0C]={ + category="lo", + description="KAWI LETTER VOCALIC L", + direction="l", + linebreak="al", + unicodeslot=0x11F0C, + }, + [0x11F0D]={ + category="lo", + description="KAWI LETTER VOCALIC LL", + direction="l", + linebreak="al", + unicodeslot=0x11F0D, + }, + [0x11F0E]={ + category="lo", + description="KAWI LETTER E", + direction="l", + linebreak="al", + unicodeslot=0x11F0E, + }, + [0x11F0F]={ + category="lo", + description="KAWI LETTER AI", + direction="l", + linebreak="al", + unicodeslot=0x11F0F, + }, + [0x11F10]={ + category="lo", + description="KAWI LETTER O", + direction="l", + linebreak="al", + unicodeslot=0x11F10, + }, + [0x11F12]={ + category="lo", + description="KAWI LETTER KA", + direction="l", + linebreak="al", + unicodeslot=0x11F12, + }, + [0x11F13]={ + category="lo", + description="KAWI LETTER KHA", + direction="l", + linebreak="al", + unicodeslot=0x11F13, + }, + [0x11F14]={ + category="lo", + description="KAWI LETTER GA", + direction="l", + linebreak="al", + unicodeslot=0x11F14, + }, + [0x11F15]={ + category="lo", + description="KAWI LETTER GHA", + direction="l", + linebreak="al", + unicodeslot=0x11F15, + }, + [0x11F16]={ + category="lo", + description="KAWI LETTER NGA", + direction="l", + linebreak="al", + unicodeslot=0x11F16, + }, + [0x11F17]={ + category="lo", + description="KAWI LETTER CA", + direction="l", + linebreak="al", + unicodeslot=0x11F17, + }, + [0x11F18]={ + category="lo", + description="KAWI LETTER CHA", + direction="l", + linebreak="al", + unicodeslot=0x11F18, + }, + [0x11F19]={ + category="lo", + description="KAWI LETTER JA", + direction="l", + linebreak="al", + unicodeslot=0x11F19, + }, + [0x11F1A]={ + category="lo", + description="KAWI LETTER JHA", + direction="l", + linebreak="al", + unicodeslot=0x11F1A, + }, + [0x11F1B]={ + category="lo", + description="KAWI LETTER NYA", + direction="l", + linebreak="al", + unicodeslot=0x11F1B, + }, + [0x11F1C]={ + category="lo", + description="KAWI LETTER TTA", + direction="l", + linebreak="al", + unicodeslot=0x11F1C, + }, + [0x11F1D]={ + category="lo", + description="KAWI LETTER TTHA", + direction="l", + linebreak="al", + unicodeslot=0x11F1D, + }, + [0x11F1E]={ + category="lo", + description="KAWI LETTER DDA", + direction="l", + linebreak="al", + unicodeslot=0x11F1E, + }, + [0x11F1F]={ + category="lo", + description="KAWI LETTER DDHA", + direction="l", + linebreak="al", + unicodeslot=0x11F1F, + }, + [0x11F20]={ + category="lo", + description="KAWI LETTER NNA", + direction="l", + linebreak="al", + unicodeslot=0x11F20, + }, + [0x11F21]={ + category="lo", + description="KAWI LETTER TA", + direction="l", + linebreak="al", + unicodeslot=0x11F21, + }, + [0x11F22]={ + category="lo", + description="KAWI LETTER THA", + direction="l", + linebreak="al", + unicodeslot=0x11F22, + }, + [0x11F23]={ + category="lo", + description="KAWI LETTER DA", + direction="l", + linebreak="al", + unicodeslot=0x11F23, + }, + [0x11F24]={ + category="lo", + description="KAWI LETTER DHA", + direction="l", + linebreak="al", + unicodeslot=0x11F24, + }, + [0x11F25]={ + category="lo", + description="KAWI LETTER NA", + direction="l", + linebreak="al", + unicodeslot=0x11F25, + }, + [0x11F26]={ + category="lo", + description="KAWI LETTER PA", + direction="l", + linebreak="al", + unicodeslot=0x11F26, + }, + [0x11F27]={ + category="lo", + description="KAWI LETTER PHA", + direction="l", + linebreak="al", + unicodeslot=0x11F27, + }, + [0x11F28]={ + category="lo", + description="KAWI LETTER BA", + direction="l", + linebreak="al", + unicodeslot=0x11F28, + }, + [0x11F29]={ + category="lo", + description="KAWI LETTER BHA", + direction="l", + linebreak="al", + unicodeslot=0x11F29, + }, + [0x11F2A]={ + category="lo", + description="KAWI LETTER MA", + direction="l", + linebreak="al", + unicodeslot=0x11F2A, + }, + [0x11F2B]={ + category="lo", + description="KAWI LETTER YA", + direction="l", + linebreak="al", + unicodeslot=0x11F2B, + }, + [0x11F2C]={ + category="lo", + description="KAWI LETTER RA", + direction="l", + linebreak="al", + unicodeslot=0x11F2C, + }, + [0x11F2D]={ + category="lo", + description="KAWI LETTER LA", + direction="l", + linebreak="al", + unicodeslot=0x11F2D, + }, + [0x11F2E]={ + category="lo", + description="KAWI LETTER WA", + direction="l", + linebreak="al", + unicodeslot=0x11F2E, + }, + [0x11F2F]={ + category="lo", + description="KAWI LETTER SHA", + direction="l", + linebreak="al", + unicodeslot=0x11F2F, + }, + [0x11F30]={ + category="lo", + description="KAWI LETTER SSA", + direction="l", + linebreak="al", + unicodeslot=0x11F30, + }, + [0x11F31]={ + category="lo", + description="KAWI LETTER SA", + direction="l", + linebreak="al", + unicodeslot=0x11F31, + }, + [0x11F32]={ + category="lo", + description="KAWI LETTER HA", + direction="l", + linebreak="al", + unicodeslot=0x11F32, + }, + [0x11F33]={ + category="lo", + description="KAWI LETTER JNYA", + direction="l", + linebreak="al", + unicodeslot=0x11F33, + }, + [0x11F34]={ + category="mc", + description="KAWI VOWEL SIGN AA", + direction="l", + linebreak="cm", + unicodeslot=0x11F34, + }, + [0x11F35]={ + category="mc", + description="KAWI VOWEL SIGN ALTERNATE AA", + direction="l", + linebreak="cm", + unicodeslot=0x11F35, + }, + [0x11F36]={ + category="mn", + description="KAWI VOWEL SIGN I", + direction="nsm", + linebreak="cm", + unicodeslot=0x11F36, + }, + [0x11F37]={ + category="mn", + description="KAWI VOWEL SIGN II", + direction="nsm", + linebreak="cm", + unicodeslot=0x11F37, + }, + [0x11F38]={ + category="mn", + description="KAWI VOWEL SIGN U", + direction="nsm", + linebreak="cm", + unicodeslot=0x11F38, + }, + [0x11F39]={ + category="mn", + description="KAWI VOWEL SIGN UU", + direction="nsm", + linebreak="cm", + unicodeslot=0x11F39, + }, + [0x11F3A]={ + category="mn", + description="KAWI VOWEL SIGN VOCALIC R", + direction="nsm", + linebreak="cm", + unicodeslot=0x11F3A, + }, + [0x11F3E]={ + category="mc", + description="KAWI VOWEL SIGN E", + direction="l", + linebreak="cm", + unicodeslot=0x11F3E, + }, + [0x11F3F]={ + category="mc", + description="KAWI VOWEL SIGN AI", + direction="l", + linebreak="cm", + unicodeslot=0x11F3F, + }, + [0x11F40]={ + category="mn", + description="KAWI VOWEL SIGN EU", + direction="nsm", + linebreak="cm", + unicodeslot=0x11F40, + }, + [0x11F41]={ + category="mc", + combining=0x9, + description="KAWI SIGN KILLER", + direction="l", + linebreak="cm", + unicodeslot=0x11F41, + }, + [0x11F42]={ + category="mn", + combining=0x9, + description="KAWI CONJOINER", + direction="nsm", + linebreak="cm", + unicodeslot=0x11F42, + }, + [0x11F43]={ + category="po", + description="KAWI DANDA", + direction="l", + linebreak="ba", + unicodeslot=0x11F43, + }, + [0x11F44]={ + category="po", + description="KAWI DOUBLE DANDA", + direction="l", + linebreak="ba", + unicodeslot=0x11F44, + }, + [0x11F45]={ + category="po", + description="KAWI PUNCTUATION SECTION MARKER", + direction="l", + linebreak="id", + unicodeslot=0x11F45, + }, + [0x11F46]={ + category="po", + description="KAWI PUNCTUATION ALTERNATE SECTION MARKER", + direction="l", + linebreak="id", + unicodeslot=0x11F46, + }, + [0x11F47]={ + category="po", + description="KAWI PUNCTUATION FLOWER", + direction="l", + linebreak="id", + unicodeslot=0x11F47, + }, + [0x11F48]={ + category="po", + description="KAWI PUNCTUATION SPACE FILLER", + direction="l", + linebreak="id", + unicodeslot=0x11F48, + }, + [0x11F49]={ + category="po", + description="KAWI PUNCTUATION DOT", + direction="l", + linebreak="id", + unicodeslot=0x11F49, + }, + [0x11F4A]={ + category="po", + description="KAWI PUNCTUATION DOUBLE DOT", + direction="l", + linebreak="id", + unicodeslot=0x11F4A, + }, + [0x11F4B]={ + category="po", + description="KAWI PUNCTUATION TRIPLE DOT", + direction="l", + linebreak="id", + unicodeslot=0x11F4B, + }, + [0x11F4C]={ + category="po", + description="KAWI PUNCTUATION CIRCLE", + direction="l", + linebreak="id", + unicodeslot=0x11F4C, + }, + [0x11F4D]={ + category="po", + description="KAWI PUNCTUATION FILLED CIRCLE", + direction="l", + linebreak="id", + unicodeslot=0x11F4D, + }, + [0x11F4E]={ + category="po", + description="KAWI PUNCTUATION SPIRAL", + direction="l", + linebreak="id", + unicodeslot=0x11F4E, + }, + [0x11F4F]={ + category="po", + description="KAWI PUNCTUATION CLOSING SPIRAL", + direction="l", + linebreak="id", + unicodeslot=0x11F4F, + }, + [0x11F50]={ + category="nd", + description="KAWI DIGIT ZERO", + direction="l", + linebreak="nu", + unicodeslot=0x11F50, + }, + [0x11F51]={ + category="nd", + description="KAWI DIGIT ONE", + direction="l", + linebreak="nu", + unicodeslot=0x11F51, + }, + [0x11F52]={ + category="nd", + description="KAWI DIGIT TWO", + direction="l", + linebreak="nu", + unicodeslot=0x11F52, + }, + [0x11F53]={ + category="nd", + description="KAWI DIGIT THREE", + direction="l", + linebreak="nu", + unicodeslot=0x11F53, + }, + [0x11F54]={ + category="nd", + description="KAWI DIGIT FOUR", + direction="l", + linebreak="nu", + unicodeslot=0x11F54, + }, + [0x11F55]={ + category="nd", + description="KAWI DIGIT FIVE", + direction="l", + linebreak="nu", + unicodeslot=0x11F55, + }, + [0x11F56]={ + category="nd", + description="KAWI DIGIT SIX", + direction="l", + linebreak="nu", + unicodeslot=0x11F56, + }, + [0x11F57]={ + category="nd", + description="KAWI DIGIT SEVEN", + direction="l", + linebreak="nu", + unicodeslot=0x11F57, + }, + [0x11F58]={ + category="nd", + description="KAWI DIGIT EIGHT", + direction="l", + linebreak="nu", + unicodeslot=0x11F58, + }, + [0x11F59]={ + category="nd", + description="KAWI DIGIT NINE", + direction="l", + linebreak="nu", + unicodeslot=0x11F59, + }, [0x11FB0]={ category="lo", description="LISU LETTER YHA", @@ -185847,6 +186619,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13091, + variants=variants_90, }, [0x13092]={ category="lo", @@ -185854,6 +186627,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13092, + variants=variants_90, }, [0x13093]={ category="lo", @@ -185861,6 +186635,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13093, + variants=variants_180, }, [0x13094]={ category="lo", @@ -186015,6 +186790,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x130A9, + variants=variants_180, }, [0x130AA]={ category="lo", @@ -186729,6 +187505,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x1310F, + variants=variants_90, }, [0x13110]={ category="lo", @@ -186785,6 +187562,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13117, + variants=variants_270, }, [0x13118]={ category="lo", @@ -186820,6 +187598,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x1311C, + variants=variants_90, }, [0x1311D]={ category="lo", @@ -186855,6 +187634,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13121, + variants=variants_90, }, [0x13122]={ category="lo", @@ -186897,6 +187677,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13127, + variants=variants_90, }, [0x13128]={ category="lo", @@ -187023,6 +187804,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13139, + variants=variants_90_270, }, [0x1313A]={ category="lo", @@ -187541,6 +188323,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13183, + variants=variants_270, }, [0x13184]={ category="lo", @@ -187569,6 +188352,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13187, + variants=variants_180, }, [0x13188]={ category="lo", @@ -187744,6 +188528,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x131A0, + variants=variants_90_270, }, [0x131A1]={ category="lo", @@ -187863,6 +188648,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x131B1, + variants=variants_90_180, }, [0x131B2]={ category="lo", @@ -187912,6 +188698,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x131B8, + variants=variants_90, }, [0x131B9]={ category="lo", @@ -187919,6 +188706,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x131B9, + variants=variants_90, }, [0x131BA]={ category="lo", @@ -187926,6 +188714,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x131BA, + variants=variants_270, }, [0x131BB]={ category="lo", @@ -188045,6 +188834,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x131CB, + variants=variants_90, }, [0x131CC]={ category="lo", @@ -188290,6 +189080,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x131EE, + variants=variants_180_270, }, [0x131EF]={ category="lo", @@ -188360,6 +189151,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x131F8, + variants=variants_180, }, [0x131F9]={ category="lo", @@ -188367,6 +189159,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x131F9, + variants=variants_90_180, }, [0x131FA]={ category="lo", @@ -188374,6 +189167,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x131FA, + variants=variants_90_180, }, [0x131FB]={ category="lo", @@ -188570,6 +189364,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13216, + variants=variants_270, }, [0x13217]={ category="lo", @@ -189025,6 +189820,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13257, + variants=variants_180, }, [0x13258]={ category="lo", @@ -189277,6 +190073,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x1327B, + variants=variants_270, }, [0x1327C]={ category="lo", @@ -189305,6 +190102,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x1327F, + variants=variants_90_180, }, [0x13280]={ category="lo", @@ -189347,6 +190145,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13285, + variants=variants_90, }, [0x13286]={ category="lo", @@ -189396,6 +190195,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x1328C, + variants=variants_90, }, [0x1328D]={ category="lo", @@ -189564,6 +190364,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x132A4, + variants=variants_180_270, }, [0x132A5]={ category="lo", @@ -189606,6 +190407,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x132AA, + variants=variants_90, }, [0x132AB]={ category="lo", @@ -189837,6 +190639,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x132CB, + variants=variants_90, }, [0x132CC]={ category="lo", @@ -189956,6 +190759,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x132DC, + variants=variants_90, }, [0x132DD]={ category="lo", @@ -190033,6 +190837,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x132E7, + variants=variants_90_270, }, [0x132E8]={ category="lo", @@ -190047,6 +190852,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x132E9, + variants=variants_270, }, [0x132EA]={ category="lo", @@ -190152,6 +190958,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x132F8, + variants=variants_270, }, [0x132F9]={ category="lo", @@ -190187,6 +190994,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x132FD, + variants=variants_270, }, [0x132FE]={ category="lo", @@ -190222,6 +191030,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13302, + variants=variants_270, }, [0x13303]={ category="lo", @@ -190229,6 +191038,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13303, + variants=variants_270, }, [0x13304]={ category="lo", @@ -190257,6 +191067,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13307, + variants=variants_90, }, [0x13308]={ category="lo", @@ -190264,6 +191075,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13308, + variants=variants_180, }, [0x13309]={ category="lo", @@ -190320,6 +191132,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13310, + variants=variants_270, }, [0x13311]={ category="lo", @@ -190327,6 +191140,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13311, + variants=variants_270, }, [0x13312]={ category="lo", @@ -190334,6 +191148,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13312, + variants=variants_180_270, }, [0x13313]={ category="lo", @@ -190341,6 +191156,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13313, + variants=variants_180_270, }, [0x13314]={ category="lo", @@ -190348,6 +191164,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13314, + variants=variants_180_270, }, [0x13315]={ category="lo", @@ -190397,6 +191214,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x1331B, + variants=variants_90_180, }, [0x1331C]={ category="lo", @@ -190404,6 +191222,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x1331C, + variants=variants_270, }, [0x1331D]={ category="lo", @@ -190439,6 +191258,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13321, + variants=variants_180_270, }, [0x13322]={ category="lo", @@ -190446,6 +191266,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13322, + variants=variants_90_180, }, [0x13323]={ category="lo", @@ -190551,6 +191372,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13331, + variants=variants_180_270, }, [0x13332]={ category="lo", @@ -190621,6 +191443,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x1333B, + variants=variants_90, }, [0x1333C]={ category="lo", @@ -190628,6 +191451,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x1333C, + variants=variants_90, }, [0x1333D]={ category="lo", @@ -190726,6 +191550,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x1334A, + variants=variants_270, }, [0x1334B]={ category="lo", @@ -190887,6 +191712,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13361, + variants=variants_270, }, [0x13362]={ category="lo", @@ -191013,6 +191839,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13373, + variants=variants_270, }, [0x13374]={ category="lo", @@ -191041,6 +191868,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13377, + variants=variants_90, }, [0x13378]={ category="lo", @@ -191048,6 +191876,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13378, + variants=variants_90, }, [0x13379]={ category="lo", @@ -191083,6 +191912,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x1337D, + variants=variants_270, }, [0x1337E]={ category="lo", @@ -191139,6 +191969,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13385, + variants=variants_270, }, [0x13386]={ category="lo", @@ -191279,6 +192110,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13399, + variants=variants_90, }, [0x1339A]={ category="lo", @@ -191286,6 +192118,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x1339A, + variants=variants_90, }, [0x1339B]={ category="lo", @@ -191433,6 +192266,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x133AF, + variants=variants_270, }, [0x133B0]={ category="lo", @@ -191440,6 +192274,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x133B0, + variants=variants_270, }, [0x133B1]={ category="lo", @@ -191545,6 +192380,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x133BF, + variants=variants_270, }, [0x133C0]={ category="lo", @@ -191685,6 +192521,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x133D3, + variants=variants_90, }, [0x133D4]={ category="lo", @@ -191755,6 +192592,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x133DD, + variants=variants_270, }, [0x133DE]={ category="lo", @@ -191902,6 +192740,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x133F2, + variants=variants_90, }, [0x133F3]={ category="lo", @@ -191923,6 +192762,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x133F5, + variants=variants_90, }, [0x133F6]={ category="lo", @@ -191930,6 +192770,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x133F6, + variants=variants_90, }, [0x133F7]={ category="lo", @@ -192021,6 +192862,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13403, + variants=variants_90, }, [0x13404]={ category="lo", @@ -192154,6 +192996,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13416, + variants=variants_90, }, [0x13417]={ category="lo", @@ -192175,6 +193018,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13419, + variants=variants_90_180_270, }, [0x1341A]={ category="lo", @@ -192182,6 +193026,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x1341A, + variants=variants_90, }, [0x1341B]={ category="lo", @@ -192245,6 +193090,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x13423, + variants=variants_90, }, [0x13424]={ category="lo", @@ -192308,6 +193154,7 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x1342C, + variants=variants_270, }, [0x1342D]={ category="lo", @@ -192322,6 +193169,14 @@ characters.data={ direction="l", linebreak="al", unicodeslot=0x1342E, + variants=variants_270, + }, + [0x1342F]={ + category="lo", + description="EGYPTIAN HIEROGLYPH V011D", + direction="l", + linebreak="al", + unicodeslot=0x1342F, }, [0x13430]={ category="cf", @@ -192386,6 +193241,213 @@ characters.data={ linebreak="cl", unicodeslot=0x13438, }, + [0x13439]={ + category="cf", + description="EGYPTIAN HIEROGLYPH INSERT AT MIDDLE", + direction="l", + linebreak="gl", + unicodeslot=0x13439, + }, + [0x1343A]={ + category="cf", + description="EGYPTIAN HIEROGLYPH INSERT AT TOP", + direction="l", + linebreak="gl", + unicodeslot=0x1343A, + }, + [0x1343B]={ + category="cf", + description="EGYPTIAN HIEROGLYPH INSERT AT BOTTOM", + direction="l", + linebreak="gl", + unicodeslot=0x1343B, + }, + [0x1343C]={ + category="cf", + description="EGYPTIAN HIEROGLYPH BEGIN ENCLOSURE", + direction="l", + linebreak="op", + unicodeslot=0x1343C, + }, + [0x1343D]={ + category="cf", + description="EGYPTIAN HIEROGLYPH END ENCLOSURE", + direction="l", + linebreak="cl", + unicodeslot=0x1343D, + }, + [0x1343E]={ + category="cf", + description="EGYPTIAN HIEROGLYPH BEGIN WALLED ENCLOSURE", + direction="l", + linebreak="op", + unicodeslot=0x1343E, + }, + [0x1343F]={ + category="cf", + description="EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE", + direction="l", + linebreak="cl", + unicodeslot=0x1343F, + }, + [0x13440]={ + category="mn", + description="EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY", + direction="nsm", + linebreak="cm", + unicodeslot=0x13440, + }, + [0x13441]={ + category="lo", + description="EGYPTIAN HIEROGLYPH FULL BLANK", + direction="l", + linebreak="al", + unicodeslot=0x13441, + }, + [0x13442]={ + category="lo", + description="EGYPTIAN HIEROGLYPH HALF BLANK", + direction="l", + linebreak="al", + unicodeslot=0x13442, + }, + [0x13443]={ + category="lo", + description="EGYPTIAN HIEROGLYPH LOST SIGN", + direction="l", + linebreak="al", + unicodeslot=0x13443, + variants=variants_expanded, + }, + [0x13444]={ + category="lo", + description="EGYPTIAN HIEROGLYPH HALF LOST SIGN", + direction="l", + linebreak="al", + unicodeslot=0x13444, + variants=variants_expanded, + }, + [0x13445]={ + category="lo", + description="EGYPTIAN HIEROGLYPH TALL LOST SIGN", + direction="l", + linebreak="al", + unicodeslot=0x13445, + variants=variants_expanded, + }, + [0x13446]={ + category="lo", + description="EGYPTIAN HIEROGLYPH WIDE LOST SIGN", + direction="l", + linebreak="al", + unicodeslot=0x13446, + variants=variants_expanded, + }, + [0x13447]={ + category="mn", + description="EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START", + direction="nsm", + linebreak="cm", + unicodeslot=0x13447, + }, + [0x13448]={ + category="mn", + description="EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM START", + direction="nsm", + linebreak="cm", + unicodeslot=0x13448, + }, + [0x13449]={ + category="mn", + description="EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START", + direction="nsm", + linebreak="cm", + unicodeslot=0x13449, + }, + [0x1344A]={ + category="mn", + description="EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP END", + direction="nsm", + linebreak="cm", + unicodeslot=0x1344A, + }, + [0x1344B]={ + category="mn", + description="EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP", + direction="nsm", + linebreak="cm", + unicodeslot=0x1344B, + }, + [0x1344C]={ + category="mn", + description="EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM START AND TOP END", + direction="nsm", + linebreak="cm", + unicodeslot=0x1344C, + }, + [0x1344D]={ + category="mn", + description="EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START AND TOP", + direction="nsm", + linebreak="cm", + unicodeslot=0x1344D, + }, + [0x1344E]={ + category="mn", + description="EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM END", + direction="nsm", + linebreak="cm", + unicodeslot=0x1344E, + }, + [0x1344F]={ + category="mn", + description="EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START AND BOTTOM END", + direction="nsm", + linebreak="cm", + unicodeslot=0x1344F, + }, + [0x13450]={ + category="mn", + description="EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM", + direction="nsm", + linebreak="cm", + unicodeslot=0x13450, + }, + [0x13451]={ + category="mn", + description="EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START AND BOTTOM", + direction="nsm", + linebreak="cm", + unicodeslot=0x13451, + }, + [0x13452]={ + category="mn", + description="EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT END", + direction="nsm", + linebreak="cm", + unicodeslot=0x13452, + }, + [0x13453]={ + category="mn", + description="EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP AND END", + direction="nsm", + linebreak="cm", + unicodeslot=0x13453, + }, + [0x13454]={ + category="mn", + description="EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM AND END", + direction="nsm", + linebreak="cm", + unicodeslot=0x13454, + }, + [0x13455]={ + category="mn", + description="EGYPTIAN HIEROGLYPH MODIFIER DAMAGED", + direction="nsm", + linebreak="cm", + unicodeslot=0x13455, + }, [0x14400]={ category="lo", description="ANATOLIAN HIEROGLYPH A001", @@ -216633,6 +217695,14 @@ characters.data={ linebreak="id", unicodeslot=0x1B122, }, + [0x1B132]={ + category="lo", + cjkwd="w", + description="HIRAGANA LETTER SMALL KO", + direction="l", + linebreak="cj", + unicodeslot=0x1B132, + }, [0x1B150]={ category="lo", cjkwd="w", @@ -216657,6 +217727,14 @@ characters.data={ linebreak="cj", unicodeslot=0x1B152, }, + [0x1B155]={ + category="lo", + cjkwd="w", + description="KATAKANA LETTER SMALL KO", + direction="l", + linebreak="cj", + unicodeslot=0x1B155, + }, [0x1B164]={ category="lo", cjkwd="w", @@ -226073,6 +227151,146 @@ characters.data={ linebreak="al", unicodeslot=0x1D245, }, + [0x1D2C0]={ + category="no", + description="KAKTOVIK NUMERAL ZERO", + direction="l", + linebreak="al", + unicodeslot=0x1D2C0, + }, + [0x1D2C1]={ + category="no", + description="KAKTOVIK NUMERAL ONE", + direction="l", + linebreak="al", + unicodeslot=0x1D2C1, + }, + [0x1D2C2]={ + category="no", + description="KAKTOVIK NUMERAL TWO", + direction="l", + linebreak="al", + unicodeslot=0x1D2C2, + }, + [0x1D2C3]={ + category="no", + description="KAKTOVIK NUMERAL THREE", + direction="l", + linebreak="al", + unicodeslot=0x1D2C3, + }, + [0x1D2C4]={ + category="no", + description="KAKTOVIK NUMERAL FOUR", + direction="l", + linebreak="al", + unicodeslot=0x1D2C4, + }, + [0x1D2C5]={ + category="no", + description="KAKTOVIK NUMERAL FIVE", + direction="l", + linebreak="al", + unicodeslot=0x1D2C5, + }, + [0x1D2C6]={ + category="no", + description="KAKTOVIK NUMERAL SIX", + direction="l", + linebreak="al", + unicodeslot=0x1D2C6, + }, + [0x1D2C7]={ + category="no", + description="KAKTOVIK NUMERAL SEVEN", + direction="l", + linebreak="al", + unicodeslot=0x1D2C7, + }, + [0x1D2C8]={ + category="no", + description="KAKTOVIK NUMERAL EIGHT", + direction="l", + linebreak="al", + unicodeslot=0x1D2C8, + }, + [0x1D2C9]={ + category="no", + description="KAKTOVIK NUMERAL NINE", + direction="l", + linebreak="al", + unicodeslot=0x1D2C9, + }, + [0x1D2CA]={ + category="no", + description="KAKTOVIK NUMERAL TEN", + direction="l", + linebreak="al", + unicodeslot=0x1D2CA, + }, + [0x1D2CB]={ + category="no", + description="KAKTOVIK NUMERAL ELEVEN", + direction="l", + linebreak="al", + unicodeslot=0x1D2CB, + }, + [0x1D2CC]={ + category="no", + description="KAKTOVIK NUMERAL TWELVE", + direction="l", + linebreak="al", + unicodeslot=0x1D2CC, + }, + [0x1D2CD]={ + category="no", + description="KAKTOVIK NUMERAL THIRTEEN", + direction="l", + linebreak="al", + unicodeslot=0x1D2CD, + }, + [0x1D2CE]={ + category="no", + description="KAKTOVIK NUMERAL FOURTEEN", + direction="l", + linebreak="al", + unicodeslot=0x1D2CE, + }, + [0x1D2CF]={ + category="no", + description="KAKTOVIK NUMERAL FIFTEEN", + direction="l", + linebreak="al", + unicodeslot=0x1D2CF, + }, + [0x1D2D0]={ + category="no", + description="KAKTOVIK NUMERAL SIXTEEN", + direction="l", + linebreak="al", + unicodeslot=0x1D2D0, + }, + [0x1D2D1]={ + category="no", + description="KAKTOVIK NUMERAL SEVENTEEN", + direction="l", + linebreak="al", + unicodeslot=0x1D2D1, + }, + [0x1D2D2]={ + category="no", + description="KAKTOVIK NUMERAL EIGHTEEN", + direction="l", + linebreak="al", + unicodeslot=0x1D2D2, + }, + [0x1D2D3]={ + category="no", + description="KAKTOVIK NUMERAL NINETEEN", + direction="l", + linebreak="al", + unicodeslot=0x1D2D3, + }, [0x1D2E0]={ category="no", description="MAYAN NUMERAL ZERO", @@ -240727,6 +241945,48 @@ characters.data={ linebreak="al", unicodeslot=0x1DF1E, }, + [0x1DF25]={ + category="ll", + description="LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK", + direction="l", + linebreak="al", + unicodeslot=0x1DF25, + }, + [0x1DF26]={ + category="ll", + description="LATIN SMALL LETTER L WITH MID-HEIGHT LEFT HOOK", + direction="l", + linebreak="al", + unicodeslot=0x1DF26, + }, + [0x1DF27]={ + category="ll", + description="LATIN SMALL LETTER N WITH MID-HEIGHT LEFT HOOK", + direction="l", + linebreak="al", + unicodeslot=0x1DF27, + }, + [0x1DF28]={ + category="ll", + description="LATIN SMALL LETTER R WITH MID-HEIGHT LEFT HOOK", + direction="l", + linebreak="al", + unicodeslot=0x1DF28, + }, + [0x1DF29]={ + category="ll", + description="LATIN SMALL LETTER S WITH MID-HEIGHT LEFT HOOK", + direction="l", + linebreak="al", + unicodeslot=0x1DF29, + }, + [0x1DF2A]={ + category="ll", + description="LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK", + direction="l", + linebreak="al", + unicodeslot=0x1DF2A, + }, [0x1E000]={ category="mn", combining=0xE6, @@ -241031,6 +242291,510 @@ characters.data={ linebreak="cm", unicodeslot=0x1E02A, }, + [0x1E030]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL A", + direction="l", + linebreak="al", + specials={ "super", 0x430 }, + unicodeslot=0x1E030, + }, + [0x1E031]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL BE", + direction="l", + linebreak="al", + specials={ "super", 0x431 }, + unicodeslot=0x1E031, + }, + [0x1E032]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL VE", + direction="l", + linebreak="al", + specials={ "super", 0x432 }, + unicodeslot=0x1E032, + }, + [0x1E033]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL GHE", + direction="l", + linebreak="al", + specials={ "super", 0x433 }, + unicodeslot=0x1E033, + }, + [0x1E034]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL DE", + direction="l", + linebreak="al", + specials={ "super", 0x434 }, + unicodeslot=0x1E034, + }, + [0x1E035]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL IE", + direction="l", + linebreak="al", + specials={ "super", 0x435 }, + unicodeslot=0x1E035, + }, + [0x1E036]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL ZHE", + direction="l", + linebreak="al", + specials={ "super", 0x436 }, + unicodeslot=0x1E036, + }, + [0x1E037]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL ZE", + direction="l", + linebreak="al", + specials={ "super", 0x437 }, + unicodeslot=0x1E037, + }, + [0x1E038]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL I", + direction="l", + linebreak="al", + specials={ "super", 0x438 }, + unicodeslot=0x1E038, + }, + [0x1E039]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL KA", + direction="l", + linebreak="al", + specials={ "super", 0x43A }, + unicodeslot=0x1E039, + }, + [0x1E03A]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL EL", + direction="l", + linebreak="al", + specials={ "super", 0x43B }, + unicodeslot=0x1E03A, + }, + [0x1E03B]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL EM", + direction="l", + linebreak="al", + specials={ "super", 0x43C }, + unicodeslot=0x1E03B, + }, + [0x1E03C]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL O", + direction="l", + linebreak="al", + specials={ "super", 0x43E }, + unicodeslot=0x1E03C, + }, + [0x1E03D]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL PE", + direction="l", + linebreak="al", + specials={ "super", 0x43F }, + unicodeslot=0x1E03D, + }, + [0x1E03E]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL ER", + direction="l", + linebreak="al", + specials={ "super", 0x440 }, + unicodeslot=0x1E03E, + }, + [0x1E03F]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL ES", + direction="l", + linebreak="al", + specials={ "super", 0x441 }, + unicodeslot=0x1E03F, + }, + [0x1E040]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL TE", + direction="l", + linebreak="al", + specials={ "super", 0x442 }, + unicodeslot=0x1E040, + }, + [0x1E041]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL U", + direction="l", + linebreak="al", + specials={ "super", 0x443 }, + unicodeslot=0x1E041, + }, + [0x1E042]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL EF", + direction="l", + linebreak="al", + specials={ "super", 0x444 }, + unicodeslot=0x1E042, + }, + [0x1E043]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL HA", + direction="l", + linebreak="al", + specials={ "super", 0x445 }, + unicodeslot=0x1E043, + }, + [0x1E044]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL TSE", + direction="l", + linebreak="al", + specials={ "super", 0x446 }, + unicodeslot=0x1E044, + }, + [0x1E045]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL CHE", + direction="l", + linebreak="al", + specials={ "super", 0x447 }, + unicodeslot=0x1E045, + }, + [0x1E046]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL SHA", + direction="l", + linebreak="al", + specials={ "super", 0x448 }, + unicodeslot=0x1E046, + }, + [0x1E047]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL YERU", + direction="l", + linebreak="al", + specials={ "super", 0x44B }, + unicodeslot=0x1E047, + }, + [0x1E048]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL E", + direction="l", + linebreak="al", + specials={ "super", 0x44D }, + unicodeslot=0x1E048, + }, + [0x1E049]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL YU", + direction="l", + linebreak="al", + specials={ "super", 0x44E }, + unicodeslot=0x1E049, + }, + [0x1E04A]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL DZZE", + direction="l", + linebreak="al", + specials={ "super", 0xA689 }, + unicodeslot=0x1E04A, + }, + [0x1E04B]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL SCHWA", + direction="l", + linebreak="al", + specials={ "super", 0x4D9 }, + unicodeslot=0x1E04B, + }, + [0x1E04C]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL BYELORUSSIAN-UKRAINIAN I", + direction="l", + linebreak="al", + specials={ "super", 0x456 }, + unicodeslot=0x1E04C, + }, + [0x1E04D]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL JE", + direction="l", + linebreak="al", + specials={ "super", 0x458 }, + unicodeslot=0x1E04D, + }, + [0x1E04E]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL BARRED O", + direction="l", + linebreak="al", + specials={ "super", 0x4E9 }, + unicodeslot=0x1E04E, + }, + [0x1E04F]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL STRAIGHT U", + direction="l", + linebreak="al", + specials={ "super", 0x4AF }, + unicodeslot=0x1E04F, + }, + [0x1E050]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL PALOCHKA", + direction="l", + linebreak="al", + specials={ "super", 0x4CF }, + unicodeslot=0x1E050, + }, + [0x1E051]={ + category="lm", + description="CYRILLIC SUBSCRIPT SMALL LETTER A", + direction="l", + linebreak="al", + specials={ "sub", 0x430 }, + unicodeslot=0x1E051, + }, + [0x1E052]={ + category="lm", + description="CYRILLIC SUBSCRIPT SMALL LETTER BE", + direction="l", + linebreak="al", + specials={ "sub", 0x431 }, + unicodeslot=0x1E052, + }, + [0x1E053]={ + category="lm", + description="CYRILLIC SUBSCRIPT SMALL LETTER VE", + direction="l", + linebreak="al", + specials={ "sub", 0x432 }, + unicodeslot=0x1E053, + }, + [0x1E054]={ + category="lm", + description="CYRILLIC SUBSCRIPT SMALL LETTER GHE", + direction="l", + linebreak="al", + specials={ "sub", 0x433 }, + unicodeslot=0x1E054, + }, + [0x1E055]={ + category="lm", + description="CYRILLIC SUBSCRIPT SMALL LETTER DE", + direction="l", + linebreak="al", + specials={ "sub", 0x434 }, + unicodeslot=0x1E055, + }, + [0x1E056]={ + category="lm", + description="CYRILLIC SUBSCRIPT SMALL LETTER IE", + direction="l", + linebreak="al", + specials={ "sub", 0x435 }, + unicodeslot=0x1E056, + }, + [0x1E057]={ + category="lm", + description="CYRILLIC SUBSCRIPT SMALL LETTER ZHE", + direction="l", + linebreak="al", + specials={ "sub", 0x436 }, + unicodeslot=0x1E057, + }, + [0x1E058]={ + category="lm", + description="CYRILLIC SUBSCRIPT SMALL LETTER ZE", + direction="l", + linebreak="al", + specials={ "sub", 0x437 }, + unicodeslot=0x1E058, + }, + [0x1E059]={ + category="lm", + description="CYRILLIC SUBSCRIPT SMALL LETTER I", + direction="l", + linebreak="al", + specials={ "sub", 0x438 }, + unicodeslot=0x1E059, + }, + [0x1E05A]={ + category="lm", + description="CYRILLIC SUBSCRIPT SMALL LETTER KA", + direction="l", + linebreak="al", + specials={ "sub", 0x43A }, + unicodeslot=0x1E05A, + }, + [0x1E05B]={ + category="lm", + description="CYRILLIC SUBSCRIPT SMALL LETTER EL", + direction="l", + linebreak="al", + specials={ "sub", 0x43B }, + unicodeslot=0x1E05B, + }, + [0x1E05C]={ + category="lm", + description="CYRILLIC SUBSCRIPT SMALL LETTER O", + direction="l", + linebreak="al", + specials={ "sub", 0x43E }, + unicodeslot=0x1E05C, + }, + [0x1E05D]={ + category="lm", + description="CYRILLIC SUBSCRIPT SMALL LETTER PE", + direction="l", + linebreak="al", + specials={ "sub", 0x43F }, + unicodeslot=0x1E05D, + }, + [0x1E05E]={ + category="lm", + description="CYRILLIC SUBSCRIPT SMALL LETTER ES", + direction="l", + linebreak="al", + specials={ "sub", 0x441 }, + unicodeslot=0x1E05E, + }, + [0x1E05F]={ + category="lm", + description="CYRILLIC SUBSCRIPT SMALL LETTER U", + direction="l", + linebreak="al", + specials={ "sub", 0x443 }, + unicodeslot=0x1E05F, + }, + [0x1E060]={ + category="lm", + description="CYRILLIC SUBSCRIPT SMALL LETTER EF", + direction="l", + linebreak="al", + specials={ "sub", 0x444 }, + unicodeslot=0x1E060, + }, + [0x1E061]={ + category="lm", + description="CYRILLIC SUBSCRIPT SMALL LETTER HA", + direction="l", + linebreak="al", + specials={ "sub", 0x445 }, + unicodeslot=0x1E061, + }, + [0x1E062]={ + category="lm", + description="CYRILLIC SUBSCRIPT SMALL LETTER TSE", + direction="l", + linebreak="al", + specials={ "sub", 0x446 }, + unicodeslot=0x1E062, + }, + [0x1E063]={ + category="lm", + description="CYRILLIC SUBSCRIPT SMALL LETTER CHE", + direction="l", + linebreak="al", + specials={ "sub", 0x447 }, + unicodeslot=0x1E063, + }, + [0x1E064]={ + category="lm", + description="CYRILLIC SUBSCRIPT SMALL LETTER SHA", + direction="l", + linebreak="al", + specials={ "sub", 0x448 }, + unicodeslot=0x1E064, + }, + [0x1E065]={ + category="lm", + description="CYRILLIC SUBSCRIPT SMALL LETTER HARD SIGN", + direction="l", + linebreak="al", + specials={ "sub", 0x44A }, + unicodeslot=0x1E065, + }, + [0x1E066]={ + category="lm", + description="CYRILLIC SUBSCRIPT SMALL LETTER YERU", + direction="l", + linebreak="al", + specials={ "sub", 0x44B }, + unicodeslot=0x1E066, + }, + [0x1E067]={ + category="lm", + description="CYRILLIC SUBSCRIPT SMALL LETTER GHE WITH UPTURN", + direction="l", + linebreak="al", + specials={ "sub", 0x491 }, + unicodeslot=0x1E067, + }, + [0x1E068]={ + category="lm", + description="CYRILLIC SUBSCRIPT SMALL LETTER BYELORUSSIAN-UKRAINIAN I", + direction="l", + linebreak="al", + specials={ "sub", 0x456 }, + unicodeslot=0x1E068, + }, + [0x1E069]={ + category="lm", + description="CYRILLIC SUBSCRIPT SMALL LETTER DZE", + direction="l", + linebreak="al", + specials={ "sub", 0x455 }, + unicodeslot=0x1E069, + }, + [0x1E06A]={ + category="lm", + description="CYRILLIC SUBSCRIPT SMALL LETTER DZHE", + direction="l", + linebreak="al", + specials={ "sub", 0x45F }, + unicodeslot=0x1E06A, + }, + [0x1E06B]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL ES WITH DESCENDER", + direction="l", + linebreak="al", + specials={ "super", 0x4AB }, + unicodeslot=0x1E06B, + }, + [0x1E06C]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL YERU WITH BACK YER", + direction="l", + linebreak="al", + specials={ "super", 0xA651 }, + unicodeslot=0x1E06C, + }, + [0x1E06D]={ + category="lm", + description="MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE", + direction="l", + linebreak="al", + specials={ "super", 0x4B1 }, + unicodeslot=0x1E06D, + }, + [0x1E08F]={ + category="mn", + combining=0xE6, + description="COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I", + direction="nsm", + linebreak="cm", + unicodeslot=0x1E08F, + }, [0x1E100]={ category="lo", description="NYIAKENG PUACHUE HMONG LETTER MA", @@ -242170,6 +243934,304 @@ characters.data={ linebreak="pr", unicodeslot=0x1E2FF, }, + [0x1E4D0]={ + category="lo", + description="NAG MUNDARI LETTER O", + direction="l", + linebreak="al", + unicodeslot=0x1E4D0, + }, + [0x1E4D1]={ + category="lo", + description="NAG MUNDARI LETTER OP", + direction="l", + linebreak="al", + unicodeslot=0x1E4D1, + }, + [0x1E4D2]={ + category="lo", + description="NAG MUNDARI LETTER OL", + direction="l", + linebreak="al", + unicodeslot=0x1E4D2, + }, + [0x1E4D3]={ + category="lo", + description="NAG MUNDARI LETTER OY", + direction="l", + linebreak="al", + unicodeslot=0x1E4D3, + }, + [0x1E4D4]={ + category="lo", + description="NAG MUNDARI LETTER ONG", + direction="l", + linebreak="al", + unicodeslot=0x1E4D4, + }, + [0x1E4D5]={ + category="lo", + description="NAG MUNDARI LETTER A", + direction="l", + linebreak="al", + unicodeslot=0x1E4D5, + }, + [0x1E4D6]={ + category="lo", + description="NAG MUNDARI LETTER AJ", + direction="l", + linebreak="al", + unicodeslot=0x1E4D6, + }, + [0x1E4D7]={ + category="lo", + description="NAG MUNDARI LETTER AB", + direction="l", + linebreak="al", + unicodeslot=0x1E4D7, + }, + [0x1E4D8]={ + category="lo", + description="NAG MUNDARI LETTER ANY", + direction="l", + linebreak="al", + unicodeslot=0x1E4D8, + }, + [0x1E4D9]={ + category="lo", + description="NAG MUNDARI LETTER AH", + direction="l", + linebreak="al", + unicodeslot=0x1E4D9, + }, + [0x1E4DA]={ + category="lo", + description="NAG MUNDARI LETTER I", + direction="l", + linebreak="al", + unicodeslot=0x1E4DA, + }, + [0x1E4DB]={ + category="lo", + description="NAG MUNDARI LETTER IS", + direction="l", + linebreak="al", + unicodeslot=0x1E4DB, + }, + [0x1E4DC]={ + category="lo", + description="NAG MUNDARI LETTER IDD", + direction="l", + linebreak="al", + unicodeslot=0x1E4DC, + }, + [0x1E4DD]={ + category="lo", + description="NAG MUNDARI LETTER IT", + direction="l", + linebreak="al", + unicodeslot=0x1E4DD, + }, + [0x1E4DE]={ + category="lo", + description="NAG MUNDARI LETTER IH", + direction="l", + linebreak="al", + unicodeslot=0x1E4DE, + }, + [0x1E4DF]={ + category="lo", + description="NAG MUNDARI LETTER U", + direction="l", + linebreak="al", + unicodeslot=0x1E4DF, + }, + [0x1E4E0]={ + category="lo", + description="NAG MUNDARI LETTER UC", + direction="l", + linebreak="al", + unicodeslot=0x1E4E0, + }, + [0x1E4E1]={ + category="lo", + description="NAG MUNDARI LETTER UD", + direction="l", + linebreak="al", + unicodeslot=0x1E4E1, + }, + [0x1E4E2]={ + category="lo", + description="NAG MUNDARI LETTER UK", + direction="l", + linebreak="al", + unicodeslot=0x1E4E2, + }, + [0x1E4E3]={ + category="lo", + description="NAG MUNDARI LETTER UR", + direction="l", + linebreak="al", + unicodeslot=0x1E4E3, + }, + [0x1E4E4]={ + category="lo", + description="NAG MUNDARI LETTER E", + direction="l", + linebreak="al", + unicodeslot=0x1E4E4, + }, + [0x1E4E5]={ + category="lo", + description="NAG MUNDARI LETTER ENN", + direction="l", + linebreak="al", + unicodeslot=0x1E4E5, + }, + [0x1E4E6]={ + category="lo", + description="NAG MUNDARI LETTER EG", + direction="l", + linebreak="al", + unicodeslot=0x1E4E6, + }, + [0x1E4E7]={ + category="lo", + description="NAG MUNDARI LETTER EM", + direction="l", + linebreak="al", + unicodeslot=0x1E4E7, + }, + [0x1E4E8]={ + category="lo", + description="NAG MUNDARI LETTER EN", + direction="l", + linebreak="al", + unicodeslot=0x1E4E8, + }, + [0x1E4E9]={ + category="lo", + description="NAG MUNDARI LETTER ETT", + direction="l", + linebreak="al", + unicodeslot=0x1E4E9, + }, + [0x1E4EA]={ + category="lo", + description="NAG MUNDARI LETTER ELL", + direction="l", + linebreak="al", + unicodeslot=0x1E4EA, + }, + [0x1E4EB]={ + category="lm", + description="NAG MUNDARI SIGN OJOD", + direction="l", + linebreak="al", + unicodeslot=0x1E4EB, + }, + [0x1E4EC]={ + category="mn", + combining=0xE8, + description="NAG MUNDARI SIGN MUHOR", + direction="nsm", + linebreak="cm", + unicodeslot=0x1E4EC, + }, + [0x1E4ED]={ + category="mn", + combining=0xE8, + description="NAG MUNDARI SIGN TOYOR", + direction="nsm", + linebreak="cm", + unicodeslot=0x1E4ED, + }, + [0x1E4EE]={ + category="mn", + combining=0xDC, + description="NAG MUNDARI SIGN IKIR", + direction="nsm", + linebreak="cm", + unicodeslot=0x1E4EE, + }, + [0x1E4EF]={ + category="mn", + combining=0xE6, + description="NAG MUNDARI SIGN SUTUH", + direction="nsm", + linebreak="cm", + unicodeslot=0x1E4EF, + }, + [0x1E4F0]={ + category="nd", + description="NAG MUNDARI DIGIT ZERO", + direction="l", + linebreak="nu", + unicodeslot=0x1E4F0, + }, + [0x1E4F1]={ + category="nd", + description="NAG MUNDARI DIGIT ONE", + direction="l", + linebreak="nu", + unicodeslot=0x1E4F1, + }, + [0x1E4F2]={ + category="nd", + description="NAG MUNDARI DIGIT TWO", + direction="l", + linebreak="nu", + unicodeslot=0x1E4F2, + }, + [0x1E4F3]={ + category="nd", + description="NAG MUNDARI DIGIT THREE", + direction="l", + linebreak="nu", + unicodeslot=0x1E4F3, + }, + [0x1E4F4]={ + category="nd", + description="NAG MUNDARI DIGIT FOUR", + direction="l", + linebreak="nu", + unicodeslot=0x1E4F4, + }, + [0x1E4F5]={ + category="nd", + description="NAG MUNDARI DIGIT FIVE", + direction="l", + linebreak="nu", + unicodeslot=0x1E4F5, + }, + [0x1E4F6]={ + category="nd", + description="NAG MUNDARI DIGIT SIX", + direction="l", + linebreak="nu", + unicodeslot=0x1E4F6, + }, + [0x1E4F7]={ + category="nd", + description="NAG MUNDARI DIGIT SEVEN", + direction="l", + linebreak="nu", + unicodeslot=0x1E4F7, + }, + [0x1E4F8]={ + category="nd", + description="NAG MUNDARI DIGIT EIGHT", + direction="l", + linebreak="nu", + unicodeslot=0x1E4F8, + }, + [0x1E4F9]={ + category="nd", + description="NAG MUNDARI DIGIT NINE", + direction="l", + linebreak="nu", + unicodeslot=0x1E4F9, + }, [0x1E7E0]={ category="lo", description="ETHIOPIC SYLLABLE HHYA", @@ -258294,6 +260356,14 @@ characters.data={ linebreak="id", unicodeslot=0x1F6D7, }, + [0x1F6DC]={ + category="so", + cjkwd="w", + description="WIRELESS", + direction="on", + linebreak="id", + unicodeslot=0x1F6DC, + }, [0x1F6DD]={ category="so", cjkwd="w", @@ -259332,6 +261402,62 @@ characters.data={ linebreak="al", unicodeslot=0x1F773, }, + [0x1F774]={ + category="so", + description="LOT OF FORTUNE", + direction="on", + linebreak="id", + unicodeslot=0x1F774, + }, + [0x1F775]={ + category="so", + description="OCCULTATION", + direction="on", + linebreak="id", + unicodeslot=0x1F775, + }, + [0x1F776]={ + category="so", + description="LUNAR ECLIPSE", + direction="on", + linebreak="id", + unicodeslot=0x1F776, + }, + [0x1F77B]={ + category="so", + description="HAUMEA", + direction="on", + linebreak="id", + unicodeslot=0x1F77B, + }, + [0x1F77C]={ + category="so", + description="MAKEMAKE", + direction="on", + linebreak="id", + unicodeslot=0x1F77C, + }, + [0x1F77D]={ + category="so", + description="GONGGONG", + direction="on", + linebreak="id", + unicodeslot=0x1F77D, + }, + [0x1F77E]={ + category="so", + description="QUAOAR", + direction="on", + linebreak="id", + unicodeslot=0x1F77E, + }, + [0x1F77F]={ + category="so", + description="ORCUS", + direction="on", + linebreak="id", + unicodeslot=0x1F77F, + }, [0x1F780]={ category="so", description="BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE", @@ -259956,6 +262082,13 @@ characters.data={ linebreak="id", unicodeslot=0x1F7D8, }, + [0x1F7D9]={ + category="so", + description="NINE POINTED WHITE STAR", + direction="on", + linebreak="id", + unicodeslot=0x1F7D9, + }, [0x1F7E0]={ category="so", cjkwd="w", @@ -263879,6 +266012,30 @@ characters.data={ linebreak="id", unicodeslot=0x1FA74, }, + [0x1FA75]={ + category="so", + cjkwd="w", + description="LIGHT BLUE HEART", + direction="on", + linebreak="id", + unicodeslot=0x1FA75, + }, + [0x1FA76]={ + category="so", + cjkwd="w", + description="GREY HEART", + direction="on", + linebreak="id", + unicodeslot=0x1FA76, + }, + [0x1FA77]={ + category="so", + cjkwd="w", + description="PINK HEART", + direction="on", + linebreak="id", + unicodeslot=0x1FA77, + }, [0x1FA78]={ category="so", cjkwd="w", @@ -263975,6 +266132,22 @@ characters.data={ linebreak="id", unicodeslot=0x1FA86, }, + [0x1FA87]={ + category="so", + cjkwd="w", + description="MARACAS", + direction="on", + linebreak="id", + unicodeslot=0x1FA87, + }, + [0x1FA88]={ + category="so", + cjkwd="w", + description="FLUTE", + direction="on", + linebreak="id", + unicodeslot=0x1FA88, + }, [0x1FA90]={ category="so", cjkwd="w", @@ -264207,6 +266380,30 @@ characters.data={ linebreak="id", unicodeslot=0x1FAAC, }, + [0x1FAAD]={ + category="so", + cjkwd="w", + description="FOLDING HAND FAN", + direction="on", + linebreak="id", + unicodeslot=0x1FAAD, + }, + [0x1FAAE]={ + category="so", + cjkwd="w", + description="HAIR PICK", + direction="on", + linebreak="id", + unicodeslot=0x1FAAE, + }, + [0x1FAAF]={ + category="so", + cjkwd="w", + description="KHANDA", + direction="on", + linebreak="id", + unicodeslot=0x1FAAF, + }, [0x1FAB0]={ category="so", cjkwd="w", @@ -264295,6 +266492,38 @@ characters.data={ linebreak="id", unicodeslot=0x1FABA, }, + [0x1FABB]={ + category="so", + cjkwd="w", + description="HYACINTH", + direction="on", + linebreak="id", + unicodeslot=0x1FABB, + }, + [0x1FABC]={ + category="so", + cjkwd="w", + description="JELLYFISH", + direction="on", + linebreak="id", + unicodeslot=0x1FABC, + }, + [0x1FABD]={ + category="so", + cjkwd="w", + description="WING", + direction="on", + linebreak="id", + unicodeslot=0x1FABD, + }, + [0x1FABF]={ + category="so", + cjkwd="w", + description="GOOSE", + direction="on", + linebreak="id", + unicodeslot=0x1FABF, + }, [0x1FAC0]={ category="so", cjkwd="w", @@ -264343,6 +266572,22 @@ characters.data={ linebreak="eb", unicodeslot=0x1FAC5, }, + [0x1FACE]={ + category="so", + cjkwd="w", + description="MOOSE", + direction="on", + linebreak="id", + unicodeslot=0x1FACE, + }, + [0x1FACF]={ + category="so", + cjkwd="w", + description="DONKEY", + direction="on", + linebreak="id", + unicodeslot=0x1FACF, + }, [0x1FAD0]={ category="so", cjkwd="w", @@ -264423,6 +266668,22 @@ characters.data={ linebreak="id", unicodeslot=0x1FAD9, }, + [0x1FADA]={ + category="so", + cjkwd="w", + description="GINGER ROOT", + direction="on", + linebreak="id", + unicodeslot=0x1FADA, + }, + [0x1FADB]={ + category="so", + cjkwd="w", + description="PEA POD", + direction="on", + linebreak="id", + unicodeslot=0x1FADB, + }, [0x1FAE0]={ category="so", cjkwd="w", @@ -264487,6 +266748,14 @@ characters.data={ linebreak="id", unicodeslot=0x1FAE7, }, + [0x1FAE8]={ + category="so", + cjkwd="w", + description="SHAKING FACE", + direction="on", + linebreak="id", + unicodeslot=0x1FAE8, + }, [0x1FAF0]={ category="so", cjkwd="w", @@ -264543,6 +266812,22 @@ characters.data={ linebreak="eb", unicodeslot=0x1FAF6, }, + [0x1FAF7]={ + category="so", + cjkwd="w", + description="LEFTWARDS PUSHING HAND", + direction="on", + linebreak="eb", + unicodeslot=0x1FAF7, + }, + [0x1FAF8]={ + category="so", + cjkwd="w", + description="RIGHTWARDS PUSHING HAND", + direction="on", + linebreak="eb", + unicodeslot=0x1FAF8, + }, [0x1FB00]={ category="so", description="BLOCK SEXTANT-1", diff --git a/tex/context/base/mkiv/char-ini.lua b/tex/context/base/mkiv/char-ini.lua index 9dcac8033..4deb21401 100644 --- a/tex/context/base/mkiv/char-ini.lua +++ b/tex/context/base/mkiv/char-ini.lua @@ -213,6 +213,7 @@ local blocks = allocate { ["arabic"] = { first = 0x00600, last = 0x006FF, otf="arab", description = "Arabic" }, ["arabicextendeda"] = { first = 0x008A0, last = 0x008FF, description = "Arabic Extended-A" }, ["arabicextendedb"] = { first = 0x00870, last = 0x0089F, description = "Arabic Extended-B" }, + ["arabicextendedc"] = { first = 0x10EC0, last = 0x10EFF, description = "Arabic Extended-C" }, ["arabicmathematicalalphabeticsymbols"] = { first = 0x1EE00, last = 0x1EEFF, description = "Arabic Mathematical Alphabetic Symbols" }, ["arabicpresentationformsa"] = { first = 0x0FB50, last = 0x0FDFF, otf="arab", description = "Arabic Presentation Forms-A" }, ["arabicpresentationformsb"] = { first = 0x0FE70, last = 0x0FEFF, otf="arab", description = "Arabic Presentation Forms-B" }, @@ -260,6 +261,7 @@ local blocks = allocate { ["cjkunifiedideographsextensione"] = { first = 0x2B820, last = 0x2CEAF, description = "CJK Unified Ideographs Extension E" }, ["cjkunifiedideographsextensionf"] = { first = 0x2CEB0, last = 0x2EBEF, description = "CJK Unified Ideographs Extension F" }, ["cjkunifiedideographsextensiong"] = { first = 0x30000, last = 0x3134F, description = "CJK Unified Ideographs Extension G" }, + ["cjkunifiedideographsextensionh"] = { first = 0x31350, last = 0x323AF, description = "CJK Unified Ideographs Extension H" }, ["combiningdiacriticalmarks"] = { first = 0x00300, last = 0x0036F, description = "Combining Diacritical Marks" }, ["combiningdiacriticalmarksextended"] = { first = 0x01AB0, last = 0x01AFF, description = "Combining Diacritical Marks Extended" }, ["combiningdiacriticalmarksforsymbols"] = { first = 0x020D0, last = 0x020FF, description = "Combining Diacritical Marks for Symbols" }, @@ -279,10 +281,12 @@ local blocks = allocate { ["cyrillicextendeda"] = { first = 0x02DE0, last = 0x02DFF, otf="cyrl", description = "Cyrillic Extended-A" }, ["cyrillicextendedb"] = { first = 0x0A640, last = 0x0A69F, otf="cyrl", description = "Cyrillic Extended-B" }, ["cyrillicextendedc"] = { first = 0x01C80, last = 0x01C8F, description = "Cyrillic Extended-C" }, + ["cyrillicextendedd"] = { first = 0x1E030, last = 0x1E08F, description = "Cyrillic Extended-D" }, ["cyrillicsupplement"] = { first = 0x00500, last = 0x0052F, otf="cyrl", description = "Cyrillic Supplement" }, ["deseret"] = { first = 0x10400, last = 0x1044F, otf="dsrt", description = "Deseret" }, ["devanagari"] = { first = 0x00900, last = 0x0097F, otf="deva", description = "Devanagari" }, ["devanagariextended"] = { first = 0x0A8E0, last = 0x0A8FF, description = "Devanagari Extended" }, + ["devanagariextendeda"] = { first = 0x11B00, last = 0x11B5F, description = "Devanagari Extended-A" }, ["digitsarabicindic"] = { first = 0x00660, last = 0x00669, math = true }, -- ["digitsbengali"] = { first = 0x009E6, last = 0x009EF, math = true }, ["digitsbold"] = { first = 0x1D7CE, last = 0x1D7D7, math = true }, @@ -314,7 +318,7 @@ local blocks = allocate { ["dominotiles"] = { first = 0x1F030, last = 0x1F09F, description = "Domino Tiles" }, ["duployan"] = { first = 0x1BC00, last = 0x1BC9F, description = "Duployan" }, ["earlydynasticcuneiform"] = { first = 0x12480, last = 0x1254F, description = "Early Dynastic Cuneiform" }, - ["egyptianhieroglyphformatcontrols"] = { first = 0x13430, last = 0x1343F, description = "Egyptian Hieroglyph Format Controls" }, + ["egyptianhieroglyphformatcontrols"] = { first = 0x13430, last = 0x1345F, description = "Egyptian Hieroglyph Format Controls" }, ["egyptianhieroglyphs"] = { first = 0x13000, last = 0x1342F, description = "Egyptian Hieroglyphs" }, ["elbasan"] = { first = 0x10500, last = 0x1052F, description = "Elbasan" }, ["elymaic"] = { first = 0x10FE0, last = 0x10FFF, description = "Elymaic" }, @@ -365,6 +369,7 @@ local blocks = allocate { ["ipaextensions"] = { first = 0x00250, last = 0x002AF, description = "IPA Extensions" }, ["javanese"] = { first = 0x0A980, last = 0x0A9DF, description = "Javanese" }, ["kaithi"] = { first = 0x11080, last = 0x110CF, description = "Kaithi" }, + ["kaktoviknumerals"] = { first = 0x1D2C0, last = 0x1D2DF, description = "Kaktovik Numerals" }, ["kanaextendeda"] = { first = 0x1B100, last = 0x1B12F, description = "Kana Extended-A" }, ["kanaextendedb"] = { first = 0x1AFF0, last = 0x1AFFF, description = "Kana Extended-B" }, ["kanasupplement"] = { first = 0x1B000, last = 0x1B0FF, description = "Kana Supplement" }, @@ -374,6 +379,7 @@ local blocks = allocate { ["katakana"] = { first = 0x030A0, last = 0x030FF, otf="kana", description = "Katakana" }, ["katakanaphoneticextensions"] = { first = 0x031F0, last = 0x031FF, otf="kana", description = "Katakana Phonetic Extensions" }, ["kayahli"] = { first = 0x0A900, last = 0x0A92F, description = "Kayah Li" }, + ["kawi"] = { first = 0x11F00, last = 0x11F5F, description = "Kawi" }, ["kharoshthi"] = { first = 0x10A00, last = 0x10A5F, otf="khar", description = "Kharoshthi" }, ["khitansmallscript"] = { first = 0x18B00, last = 0x18CFF, description = "Khitan Small Script" }, ["khmer"] = { first = 0x01780, last = 0x017FF, otf="khmr", description = "Khmer" }, @@ -456,6 +462,7 @@ local blocks = allocate { ["myanmarextendeda"] = { first = 0x0AA60, last = 0x0AA7F, description = "Myanmar Extended-A" }, ["myanmarextendedb"] = { first = 0x0A9E0, last = 0x0A9FF, description = "Myanmar Extended-B" }, ["nabataean"] = { first = 0x10880, last = 0x108AF, description = "Nabataean" }, + ["nagmundari"] = { first = 0x1E4D0, last = 0x1E4FF, description = "Nag Mundari" }, ["nandinagari"] = { first = 0x119A0, last = 0x119FF, description = "Nandinagari" }, ["newa"] = { first = 0x11400, last = 0x1147F, description = "Newa" }, ["newtailue"] = { first = 0x01980, last = 0x019DF, description = "New Tai Lue" }, @@ -585,7 +592,20 @@ local blocks = allocate { ["yiradicals"] = { first = 0x0A490, last = 0x0A4CF, otf="yi", description = "Yi Radicals" }, ["yisyllables"] = { first = 0x0A000, last = 0x0A48F, otf="yi", description = "Yi Syllables" }, ["zanabazarsquare"] = { first = 0x11A00, last = 0x11A4F, description = "Zanabazar Square" }, - ["znamennymusicalnotation"] = { first = 0x1CF00, last = 0x1CFCF, description = "Znamenny Musical Notation" } + ["znamennymusicalnotation"] = { first = 0x1CF00, last = 0x1CFCF, description = "Znamenny Musical Notation" }, + + -- we need this early on: + + ["lowercasecalligraphic"] = { first = 0x100000, last = 0x100019, math = true }, + ["uppercasecalligraphic"] = { first = 0x100020, last = 0x100039, math = true }, + ["lowercaseboldcalligraphic"] = { first = 0x100040, last = 0x100059, math = true }, + ["uppercaseboldcalligraphic"] = { first = 0x100060, last = 0x100079, math = true }, + -- ["lowercasesansgreek"] = { first = 0x100040, last = 0x100059, math = true }, -- reserved for future use + -- ["uppercasesansgreek"] = { first = 0x100060, last = 0x100079, math = true }, -- reserved for future use + -- ["lowercaseitalicsansgreek"] = { first = 0x100080, last = 0x100099, math = true }, -- reserved for future use + -- ["uppercaseitalicsansgreek"] = { first = 0x1000A0, last = 0x1000B9, math = true }, -- reserved for future use + -- ["lowercaseblackboarditalic"] = { first = 0x1000C0, last = 0x1000D9, math = true }, -- reserved for future use + -- ["uppercaseblackboarditalic"] = { first = 0x1000E0, last = 0x1000F9, math = true }, -- reserved for future use } -- moved from math-act.lua to here: diff --git a/tex/context/base/mkiv/cont-new.mkiv b/tex/context/base/mkiv/cont-new.mkiv index 40594ad05..688232bf2 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.09.16 14:39} +\newcontextversion{2022.10.14 10:13} %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 1de2ec104..7b5df628c 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.09.16 14:39} +\edef\contextversion{2022.10.14 10:13} %D Kind of special: diff --git a/tex/context/base/mkiv/font-cff.lua b/tex/context/base/mkiv/font-cff.lua index 114d7dd07..4b60cd6c0 100644 --- a/tex/context/base/mkiv/font-cff.lua +++ b/tex/context/base/mkiv/font-cff.lua @@ -348,11 +348,11 @@ do top = 0 end + P("\10") / function() - result.strhw = stack[top] + result.stdhw = stack[top] top = 0 end + P("\11") / function() - result.strvw = stack[top] + result.stdvw = stack[top] top = 0 end + P("\13") / function() @@ -453,7 +453,7 @@ do top = 0 end + P("\10") / function() - result.bluesnap = stack[top] + result.blueshift = stack[top] top = 0 end + P("\11") / function() @@ -528,7 +528,7 @@ do -- the second variant is much faster. Not that it matters much as we don't see -- such numbers often. - local remap = { + local remap_1 = { ["\x00"] = "00", ["\x01"] = "01", ["\x02"] = "02", ["\x03"] = "03", ["\x04"] = "04", ["\x05"] = "05", ["\x06"] = "06", ["\x07"] = "07", ["\x08"] = "08", ["\x09"] = "09", ["\x0A"] = "0.", ["\x0B"] = "0E", ["\x0C"] = "0E-", ["\x0D"] = "0", ["\x0E"] = "0-", ["\x0F"] = "0", ["\x10"] = "10", ["\x11"] = "11", ["\x12"] = "12", ["\x13"] = "13", ["\x14"] = "14", ["\x15"] = "15", ["\x16"] = "16", ["\x17"] = "17", ["\x18"] = "18", ["\x19"] = "19", ["\x1A"] = "1.", ["\x1B"] = "1E", ["\x1C"] = "1E-", ["\x1D"] = "1", ["\x1E"] = "1-", ["\x1F"] = "1", ["\x20"] = "20", ["\x21"] = "21", ["\x22"] = "22", ["\x23"] = "23", ["\x24"] = "24", ["\x25"] = "25", ["\x26"] = "26", ["\x27"] = "27", ["\x28"] = "28", ["\x29"] = "29", ["\x2A"] = "2.", ["\x2B"] = "2E", ["\x2C"] = "2E-", ["\x2D"] = "2", ["\x2E"] = "2-", ["\x2F"] = "2", @@ -544,11 +544,18 @@ do ["\xC0"] = "E-0", ["\xC1"] = "E-1", ["\xC2"] = "E-2", ["\xC3"] = "E-3", ["\xC4"] = "E-4", ["\xC5"] = "E-5", ["\xC6"] = "E-6", ["\xC7"] = "E-7", ["\xC8"] = "E-8", ["\xC9"] = "E-9", ["\xCA"] = "E-.", ["\xCB"] = "E-E", ["\xCC"] = "E-E-", ["\xCD"] = "E-", ["\xCE"] = "E--", ["\xCF"] = "E-", ["\xD0"] = "-0", ["\xD1"] = "-1", ["\xD2"] = "-2", ["\xD3"] = "-3", ["\xD4"] = "-4", ["\xD5"] = "-5", ["\xD6"] = "-6", ["\xD7"] = "-7", ["\xD8"] = "-8", ["\xD9"] = "-9", ["\xDA"] = "-.", ["\xDB"] = "-E", ["\xDC"] = "-E-", ["\xDD"] = "-", ["\xDE"] = "--", ["\xDF"] = "-", } + local remap_2 = { + ["\x0F"] = "0", ["\x1F"] = "1", ["\x2F"] = "2", ["\x3F"] = "3", ["\x4F"] = "4", + ["\x5F"] = "5", ["\x6F"] = "6", ["\x7F"] = "7", ["\x8F"] = "8", ["\x9F"] = "9", + } + + local p_last_1 = S("\x0F\x1F\x2F\x3F\x4F\x5F\x6F\x7F\x8F\x9F\xAF\xBF") + local p_last_2 = R("\xF0\xFF") - local p_last = S("\x0F\x1F\x2F\x3F\x4F\x5F\x6F\x7F\x8F\x9F\xAF\xBF") - + R("\xF0\xFF") + -- tricky, we don't want to append last - local p_nibbles = P("\30") * Cs(((1-p_last)/remap)^0 * (P(1)/remap)) / function(n) + -- local p_nibbles = P("\30") * Cs(((1-p_last)/remap)^0 * (P(1)/remap)) / function(n) + local p_nibbles = P("\30") * Cs(((1-(p_last_1+p_last_2))/remap_1)^0 * (p_last_1/remap_2 + p_last_2/"")) / function(n) -- 0-9=digit a=. b=E c=E- d=reserved e=- f=finish top = top + 1 stack[top] = tonumber(n) or 0 @@ -2715,6 +2722,8 @@ function readers.cff(f,fontdata,specification) cffinfo.bluefuzz = data.bluefuzz cffinfo.stdhw = data.stdhw cffinfo.stdvw = data.stdvw + cffinfo.stemsnaph = data.stemsnaph + cffinfo.stemsnapv = data.stemsnapv end end cleanup(data,dictionaries) diff --git a/tex/context/base/mkiv/font-dsp.lua b/tex/context/base/mkiv/font-dsp.lua index 8f65ed9d9..1735b4cdc 100644 --- a/tex/context/base/mkiv/font-dsp.lua +++ b/tex/context/base/mkiv/font-dsp.lua @@ -2177,6 +2177,8 @@ do -- local usedlookups = false -- setmetatableindex("number") -- + local allsteps = { } -- new per 2022-09-25 + for lookupid=1,noflookups do local lookup = lookups[lookupid] local lookuptype = lookup.type @@ -2214,6 +2216,7 @@ do steps[nofsteps] = step local rules = step.rules if rules then + allsteps[#allsteps+1] = step -- new per 2022-09-25 for i=1,#rules do local rule = rules[i] local before = rule.before @@ -2337,11 +2340,14 @@ do end end - for i=lastsequence+1,nofsequences do - local sequence = sequences[i] - local steps = sequence.steps - for i=1,#steps do - local step = steps[i] + -- for i=lastsequence+1,nofsequences do + -- local sequence = sequences[i] + -- local steps = sequence.steps + -- for i=1,#steps do + -- local step = steps[i] + + for i=1,#allsteps do -- new per 2022-09-25 + local step = allsteps[i] -- new per 2022-09-25 local rules = step.rules if rules then for i=1,#rules do @@ -2419,7 +2425,7 @@ do end end end - end + -- end -- new per 2022-09-25 for i, n in sortedhash(sublookupcheck) do local l = lookups[i] @@ -2881,7 +2887,7 @@ local function readmathglyphinfo(f,fontdata,offset) if not math then glyph.math = { accent = accent } else - math.accent = accent + math.accent = accent -- will become math.topanchor end end end diff --git a/tex/context/base/mkiv/font-imp-italics.lua b/tex/context/base/mkiv/font-imp-italics.lua index 6c432d7cf..10a419daf 100644 --- a/tex/context/base/mkiv/font-imp-italics.lua +++ b/tex/context/base/mkiv/font-imp-italics.lua @@ -6,7 +6,7 @@ if not modules then modules = { } end modules ['font-imp-italics'] = { license = "see context related readme files" } -local next = next +local next, tonumber = next, tonumber local fonts = fonts local handlers = fonts.handlers @@ -14,11 +14,13 @@ local registerotffeature = handlers.otf.features.register local registerafmfeature = handlers.afm.features.register local function initialize(tfmdata,key,value) + local factor = tonumber(value) or 1 for unicode, character in next, tfmdata.characters do local olditalic = character.italic if olditalic and olditalic ~= 0 then - character.width = character.width + olditalic - character.italic = 0 + character.width = character.width + olditalic + character.italic = 0 + character.bottomright = -factor * olditalic end end end diff --git a/tex/context/base/mkiv/font-mis.lua b/tex/context/base/mkiv/font-mis.lua index c294bd638..5ae6659c5 100644 --- a/tex/context/base/mkiv/font-mis.lua +++ b/tex/context/base/mkiv/font-mis.lua @@ -21,7 +21,7 @@ local readers = otf.readers if readers then - otf.version = otf.version or 3.120 + otf.version = otf.version or 3.121 otf.cache = otf.cache or containers.define("fonts", "otl", otf.version, true) function fonts.helpers.getfeatures(name,save) diff --git a/tex/context/base/mkiv/font-osd.lua b/tex/context/base/mkiv/font-osd.lua index ecf8009f9..f35be2cd1 100644 --- a/tex/context/base/mkiv/font-osd.lua +++ b/tex/context/base/mkiv/font-osd.lua @@ -6,16 +6,6 @@ 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: @@ -1392,16 +1382,13 @@ 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 @@ -1415,7 +1402,6 @@ 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 @@ -1435,7 +1421,6 @@ 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) @@ -1449,17 +1434,14 @@ 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 @@ -1467,7 +1449,6 @@ 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) @@ -1936,8 +1917,6 @@ 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 @@ -2064,7 +2043,7 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas end end - local current, base, firstcons = start, nil, nil + local current, base, firstcons, subnotafterbase, postnotafterbase = start, nil, nil, nil, nil if getstate(start,s_rphf) then -- if syllable starts with Ra + H and script has 'Reph' then exclude Reph from candidates for base consonants @@ -2125,10 +2104,17 @@ 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) +-- IF PATCHED THEN +-- if current == subpos then +-- subnotafterbase = current +-- end +-- if current == postpos then +-- postnotafterbase = current +-- end +-- END if consonant[getchar(current)] then if not (current ~= stop and next ~= stop and halant[getchar(next)] and getchar(getnext(next)) == c_zwj) then if not firstcons then @@ -2138,6 +2124,14 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas local a = getstate(current) if not (a == s_blwf or a == s_pstf or (a ~= s_rphf and a ~= s_blwf and ra[getchar(current)])) then base = current +-- IF PATCHED THEN +-- if subnotafterbase then +-- subpos = base +-- end +-- if postnotafterbase then +-- postpos = base +-- end +-- END end end end @@ -2195,12 +2189,17 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas end end -- --- print("char: " .. char) --- if not moved[current] and dependent_vowel[char] then - if dependent_vowel[char] then --- print(">>!! dependent vowel") +-- IF PATCHED THEN +-- if dependent_vowel[char] then +-- ELSE + if not moved[current] and dependent_vowel[char] then +-- END if pre_mark[char] then -- or: if before_main or before_half +-- IF PATCHED THEN +-- -- nothing +-- ELSE moved[current] = true +-- END -- can be helper to remove one node local prev, next = getboth(current) setlink(prev,next) @@ -2251,6 +2250,13 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas end elseif above_mark[char] then -- after main consonant +-- IF PATCHED +-- target = subpos +-- if postpos == subpos then +-- postpos = current +-- end +-- subpos = current +-- ELSE target = basepos if subpos == basepos then subpos = current @@ -2259,6 +2265,7 @@ local function reorder_two(head,start,stop,font,attr,nbspaces) -- maybe do a pas postpos = current end basepos = current +-- END elseif below_mark[char] then -- after subjoined consonants target = subpos @@ -2502,12 +2509,16 @@ local function analyze_next_chars_one(c,font,variant) -- skip one dependent vowe if pre_mark[v] and not already_pre_mark then already_pre_mark = true elseif post_mark[v] and not already_post_mark then - if devanagarihash[font].conjuncts == "mixed" then - -- for messy fonts - return c - else - already_post_mark = true - end +-- IF PATCHED THEN +-- already_post_mark = true +-- ELSE + if devanagarihash[font].conjuncts == "mixed" then + -- for messy fonts + return c + else + already_post_mark = true + end +-- END elseif below_mark[v] and not already_below_mark then already_below_mark = true elseif above_mark[v] and not already_above_mark then @@ -2710,10 +2721,6 @@ 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 @@ -2731,12 +2738,16 @@ local function analyze_next_chars_two(c,font) if pre_mark[v] and not already_pre_mark then already_pre_mark = true elseif post_mark[v] and not already_post_mark then - if devanagarihash[font].conjuncts == "mixed" then - -- for messy fonts - return c - else - already_post_mark = true - end +-- IF PATCHED THEN +-- already_post_mark = true +-- ELSE + if devanagarihash[font].conjuncts == "mixed" then + -- for messy fonts + return c + else + already_post_mark = true + end +-- END elseif below_mark[v] and not already_below_mark then already_below_mark = true elseif above_mark[v] and not already_above_mark then @@ -3068,15 +3079,12 @@ 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 @@ -3090,12 +3098,10 @@ 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 ! @@ -3104,7 +3110,6 @@ 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 67b77b111..f83c3e8ec 100644 --- a/tex/context/base/mkiv/font-otc.lua +++ b/tex/context/base/mkiv/font-otc.lua @@ -142,6 +142,12 @@ local function addfeature(data,feature,specifications,prepareonly) local descriptions = data.descriptions local resources = data.resources + + if not descriptions or not resources then + report_otf("missing specification") + return + end + local features = resources.features local sequences = resources.sequences diff --git a/tex/context/base/mkiv/font-otl.lua b/tex/context/base/mkiv/font-otl.lua index f36e533ca..9493bd03c 100644 --- a/tex/context/base/mkiv/font-otl.lua +++ b/tex/context/base/mkiv/font-otl.lua @@ -52,7 +52,7 @@ local report_otf = logs.reporter("fonts","otf loading") local fonts = fonts local otf = fonts.handlers.otf -otf.version = 3.120 -- beware: also sync font-mis.lua and in mtx-fonts +otf.version = 3.121 -- beware: also sync font-mis.lua and in mtx-fonts otf.cache = containers.define("fonts", "otl", otf.version, true) otf.svgcache = containers.define("fonts", "svg", otf.version, true) otf.pngcache = containers.define("fonts", "png", otf.version, true) diff --git a/tex/context/base/mkiv/font-ots.lua b/tex/context/base/mkiv/font-ots.lua index 7de108d4c..b3055976a 100644 --- a/tex/context/base/mkiv/font-ots.lua +++ b/tex/context/base/mkiv/font-ots.lua @@ -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 @@ -165,13 +170,8 @@ local forcepairadvance = false -- for testing local repeatablemultiples = context or false -directives.register("otf.forcediscretionaries",function(v) - forcediscretionaries = v -end) - -directives.register("otf.forcepairadvance",function(v) - forcepairadvance = v -end) +directives.register("otf.forcediscretionaries", function(v) forcediscretionaries = v end) +directives.register("otf.forcepairadvance", function(v) forcepairadvance = v end) local report_direct = logs.reporter("fonts","otf direct") local report_subchain = logs.reporter("fonts","otf subchain") @@ -197,7 +197,6 @@ local setboth = nuts.setboth local getid = nuts.getid local getstate = nuts.getstate local getsubtype = nuts.getsubtype -local setsubtype = nuts.setsubtype local getchar = nuts.getchar local setchar = nuts.setchar local getdisc = nuts.getdisc @@ -229,10 +228,10 @@ local ischar = nuts.ischar local usesfont = nuts.usesfont local insertnodeafter = nuts.insertafter -local copy_node = nuts.copy -local copy_node_list = nuts.copylist -local remove_node = nuts.remove -local find_node_tail = nuts.tail +local copynode = nuts.copy +local copynodelist = nuts.copylist +local removenode = nuts.remove +local findnodetail = nuts.tail local flushnodelist = nuts.flushlist local flushnode = nuts.flushnode local endofmath = nuts.endofmath @@ -244,12 +243,8 @@ local setmetatableindex = table.setmetatableindex local nextnode = nuts.traversers.node ------ zwnj = 0x200C ------ zwj = 0x200D - local nodecodes = nodes.nodecodes local glyphcodes = nodes.glyphcodes -local disccodes = nodes.disccodes local glyph_code = nodecodes.glyph local glue_code = nodecodes.glue @@ -261,8 +256,7 @@ local par_code = nodecodes.par local lefttoright_code = nodes.dirvalues.lefttoright local righttoleft_code = nodes.dirvalues.righttoleft -local discretionarydisc_code = disccodes.discretionary -local ligatureglyph_code = glyphcodes.ligature +local discretionarydisc_code = nodes.disccodes.discretionary local a_noligature = attributes.private("noligature") @@ -377,7 +371,7 @@ local function cref(dataset,sequence,index) return "no valid dataset" end local merged = sequence.merged and "merged " or "" - if index then + if index and index > 1 then return formatters["feature %a, type %a, %schain lookup %a, index %a"]( dataset[4],sequence.type,merged,sequence.name,index) else @@ -455,7 +449,7 @@ end local function appenddisc(disc,list) local pre, post, replace, pretail, posttail, replacetail = getdisc(disc,true) local posthead = list - local replacehead = copy_node_list(list) + local replacehead = copynodelist(list) if post then setlink(posttail,posthead) else @@ -483,7 +477,6 @@ local function markstoligature(head,start,stop,char) end resetinjection(base) setchar(base,char) - setsubtype(base,ligatureglyph_code) setcomponents(base,start) setlink(prev,base,next) flushcomponents(start) @@ -536,7 +529,6 @@ local function toligature(head,start,stop,char,dataset,sequence,skiphash,discfou end resetinjection(base) setchar(base,char) - setsubtype(base,ligatureglyph_code) setcomponents(base,comp) setlink(prev,base,next) if not discfound then @@ -560,7 +552,7 @@ local function toligature(head,start,stop,char,dataset,sequence,skiphash,discfou if trace_marks then logwarning("%s: keep ligature mark %s, gets index %s",pref(dataset,sequence),gref(char),getligaindex(start)) end - local n = copy_node(start) + local n = copynode(start) copyinjection(n,start) -- is this ok ? we position later anyway head, current = insertnodeafter(head,current,n) -- unlikely that mark has components elseif trace_marks then @@ -634,67 +626,68 @@ end local function multiple_glyphs(head,start,multiple,skiphash,what,stop) -- what to do with skiphash matches here local nofmultiples = #multiple if nofmultiples > 0 then + local first = start resetinjection(start) setchar(start,multiple[1]) if nofmultiples > 1 then - local sn = getnext(start) - for k=2,nofmultiples do + -- local sn = getnext(start) + for i=2,nofmultiples do -- untested: -- -- while ignoremarks and marks[getchar(sn)] then -- local sn = getnext(sn) -- end - local n = copy_node(start) -- ignore components + local n = copynode(start) -- ignore components resetinjection(n) - setchar(n,multiple[k]) + setchar(n,multiple[i]) insertnodeafter(head,start,n) start = n end - if what ~= true and repeatablemultiples then - -- This is just some experimental code; we might introduce gsub_extensible - -- some day instead. Beware: when we have a feature that mixes alternates and - -- multiples we need to make sure we don't handle the alternate string values - -- here. This might eventually become an lmtx only feature. - local kind = type(what) - local m, f, l - if kind == "string" then - local what, n = string.match(what,"^repeat(.-)[:=](%d+)$") - if what == "middle" then - m = tonumber(n) - elseif what == "first" then - f = tonumber(n) - elseif what == "last" then - l = tonumber(n) - end - elseif kind == "table" then - -- won't happen because currently we don't split these values - m = what.middle - f = what.first - l = what.last + end + if what ~= true and repeatablemultiples then + -- This is just some experimental code; we might introduce gsub_extensible + -- some day instead. Beware: when we have a feature that mixes alternates and + -- multiples we need to make sure we don't handle the alternate string values + -- here. + local kind = type(what) + local m, f, l + if kind == "string" then + local what, n = string.match(what,"^repeat(.-)[:=](%d+)$") + if what == "middle" then + m = tonumber(n) + elseif what == "first" then + f = tonumber(n) + elseif what == "last" then + l = tonumber(n) end - if f or m or l then - if m and m > 1 and nofmultiples == 3 then - local middle = getnext(first) - for i=2,m do - local n = copynode(middle) -- ignore components - resetinjection(n) - insertnodeafter(head,first,n) - end + elseif kind == "table" then + -- won't happen because currently we don't split these values + m = what.middle + f = what.first + l = what.last + end + if f or m or l then + if m and m > 1 and nofmultiples == 3 then + local middle = getnext(first) + for i=2,m do + local n = copynode(middle) -- ignore components + resetinjection(n) + insertnodeafter(head,first,n) end - if f and f > 1 then - for i=2,f do - local n = copynode(first) -- ignore components - resetinjection(n) - insertnodeafter(head,first,n) - end + end + if f and f > 1 then + for i=2,f do + local n = copynode(first) -- ignore components + resetinjection(n) + insertnodeafter(head,first,n) end - if l and l > 1 then - for i=2,l do - local n = copynode(start) -- ignore components - resetinjection(n) - insertnodeafter(head,start,n) - start = n - end + end + if l and l > 1 then + for i=2,l do + local n = copynode(start) -- ignore components + resetinjection(n) + insertnodeafter(head,start,n) + start = n end end end @@ -894,9 +887,9 @@ function handlers.gsub_ligature(head,start,dataset,sequence,ligature,rlmode,skip local prev = getprev(start) if stop then setnext(stop) - local copy = copy_node_list(start) + local copy = copynodelist(start) local tail = stop -- was: getprev(stop) -- Kai: needs checking on your samples - local liat = find_node_tail(copy) + local liat = findnodetail(copy) if pre then setlink(liat,pre) end @@ -907,7 +900,7 @@ function handlers.gsub_ligature(head,start,dataset,sequence,ligature,rlmode,skip replace = start else setnext(start) - local copy = copy_node(start) + local copy = copynode(start) if pre then setlink(copy,pre) end @@ -1321,7 +1314,7 @@ as less as needed but that would also make the code even more messy.</p> -- To be done (example needed): what if > 1 steps --- this is messy: do we need this disc checking also in alternaties? +-- this is messy: do we need this disc checking also in alternates? local function reportzerosteps(dataset,sequence) logwarning("%s: no steps",cref(dataset,sequence)) @@ -1357,7 +1350,7 @@ function chainprocs.gsub_remove(head,start,stop,dataset,sequence,currentlookup,r if trace_chains then logprocess("%s: removing character %s",cref(dataset,sequence,chainindex),gref(getchar(start))) end - head, start = remove_node(head,start,true) + head, start = removenode(head,start,true) return head, getprev(start), true end @@ -1952,7 +1945,7 @@ do if not userkern then -- generic local setkern = nuts.setkern -- not injections.setkern userkern = function(k) - local n = copy_node(thekern) + local n = copynode(thekern) setkern(n,k) return n end @@ -1994,12 +1987,11 @@ end local noflags = { false, false, false, false } -local function chainrun(head,start,last,dataset,sequence,rlmode,skiphash,ck) +local function chainrun(head,start,last,dataset,sequence,rlmode,skiphash,ck,where) local size = ck[5] - ck[4] + 1 local chainlookups = ck[6] local done = false - -- current match if chainlookups then -- Lookups can be like { 1, false, 3 } or { false, 2 } or basically anything and @@ -2010,23 +2002,30 @@ local function chainrun(head,start,last,dataset,sequence,rlmode,skiphash,ck) -- if nofchainlookups > size then -- -- bad rules -- end - local chainlookup = chainlookups[1] - for j=1,#chainlookup do - local chainstep = chainlookup[j] - local chainkind = chainstep.type - local chainproc = chainprocs[chainkind] - if chainproc then - local ok - -- HH: chainindex 1 added here (for KAI to check too), there are weird ligatures e.g. - -- char + mark -> char where mark has to disappear - head, start, ok = chainproc(head,start,last,dataset,sequence,chainstep,rlmode,skiphash,1) - if ok then - done = true + if chainlookup then + for j=1,#chainlookup do + local chainstep = chainlookup[j] + if chainstep then + local chainkind = chainstep.type + local chainproc = chainprocs[chainkind] + if chainproc then + local ok + -- HH: chainindex 1 added here (for KAI to check too), there are weird ligatures e.g. + -- char + mark -> char where mark has to disappear + head, start, ok = chainproc(head,start,last,dataset,sequence,chainstep,rlmode,skiphash,1) + if ok then + done = true + end + else + logprocess("%s: %s is not yet supported (1)",cref(dataset,sequence),chainkind) + end + else + logprocess("%s: has an issue (1)",cref(dataset,sequence)) end - else - logprocess("%s: %s is not yet supported (1)",cref(dataset,sequence),chainkind) end + else + -- whatever end else @@ -2067,23 +2066,28 @@ local function chainrun(head,start,last,dataset,sequence,rlmode,skiphash,ck) if chainlookup then for j=1,#chainlookup do local chainstep = chainlookup[j] - local chainkind = chainstep.type - local chainproc = chainprocs[chainkind] - if chainproc then - local ok, n - head, start, ok, n = chainproc(head,start,last,dataset,sequence,chainstep,rlmode,skiphash,i) - -- messy since last can be changed ! - if ok then - done = true - if n and n > 1 and i + n > nofchainlookups then - -- this is a safeguard, we just ignore the rest of the lookups - i = size -- prevents an advance - break + if chainstep then + local chainkind = chainstep.type + local chainproc = chainprocs[chainkind] + if chainproc then + local ok, n + head, start, ok, n = chainproc(head,start,last,dataset,sequence,chainstep,rlmode,skiphash,i) + -- messy since last can be changed ! + if ok then + done = true + if n and n > 1 and i + n > nofchainlookups then + -- this is a safeguard, we just ignore the rest of the lookups + i = size -- prevents an advance + break + end end + else + -- actually an error + logprocess("%s: %s is not yet supported (2)",cref(dataset,sequence),chainkind) end else -- actually an error - logprocess("%s: %s is not yet supported (2)",cref(dataset,sequence),chainkind) + logprocess("%s: has an issue (2)",cref(dataset,sequence)) end end else @@ -2111,7 +2115,7 @@ local function chainrun(head,start,last,dataset,sequence,rlmode,skiphash,ck) else done = true if trace_contexts then - logprocess("%s: skipping match",cref(dataset,sequence)) + logprocess("%s: skipping match @ %i",cref(dataset,sequence),where) end end end @@ -2141,6 +2145,8 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck) local last = start local prev = getprev(start) local hasglue = false + local useddisc = nil -- new 2022-09-25 + local usedstart = start -- new 2022-09-25 -- fishy: so we can overflow and then go on in the sweep? -- todo : id can also be glue_code as we checked spaces @@ -2211,7 +2217,7 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck) tail = prev setprev(current,sweepnode) else - tail = find_node_tail(head) + tail = findnodetail(head) end setnext(sweepnode,current) setprev(head) @@ -2302,15 +2308,14 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck) end end end + local done = false if lookaheaddisc then - local cf = start local cl = getprev(lookaheaddisc) local cprev = getprev(start) local insertedmarks = 0 - while cprev do local char = ischar(cf,currentfont) if char and marks[char] then @@ -2329,13 +2334,13 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck) head = lookaheaddisc end local pre, post, replace = getdisc(lookaheaddisc) - local new = copy_node_list(cf) -- br, how often does that happen + local new = copynodelist(cf) -- br, how often does that happen local cnew = new if pre then - setlink(find_node_tail(cf),pre) + setlink(findnodetail(cf),pre) end if replace then - local tail = find_node_tail(new) + local tail = findnodetail(new) setlink(tail,replace) end for i=1,insertedmarks do @@ -2349,14 +2354,14 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck) end if not notmatchpre[lookaheaddisc] then local ok = false - cf, start, ok = chainrun(cf,start,cl,dataset,sequence,rlmode,skiphash,ck) + cf, start, ok = chainrun(cf,start,cl,dataset,sequence,rlmode,skiphash,ck,1) if ok then done = true end end if not notmatchreplace[lookaheaddisc] then local ok = false - new, cnew, ok = chainrun(new,cnew,clast,dataset,sequence,rlmode,skiphash,ck) + new, cnew, ok = chainrun(new,cnew,clast,dataset,sequence,rlmode,skiphash,ck,2) if ok then done = true end @@ -2367,16 +2372,14 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck) setdisc(lookaheaddisc,cf,post,new) end start = getprev(lookaheaddisc) + useddisc = lookaheaddisc -- new 2022-09-25 sweephead[cf] = getnext(clast) or false sweephead[new] = getnext(cl) or false - elseif backtrackdisc then - local cf = getnext(backtrackdisc) local cl = start local cnext = getnext(start) local insertedmarks = 0 - while cnext do local char = ischar(cnext,currentfont) if char and marks[char] then @@ -2391,8 +2394,8 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck) setprev(cf) setnext(cl) local pre, post, replace, pretail, posttail, replacetail = getdisc(backtrackdisc,true) - local new = copy_node_list(cf) - local cnew = find_node_tail(new) + local new = copynodelist(cf) + local cnew = findnodetail(new) for i=1,insertedmarks do cnew = getprev(cnew) end @@ -2402,14 +2405,14 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck) end if not notmatchpost[backtrackdisc] then local ok = false - cf, start, ok = chainrun(cf,start,last,dataset,sequence,rlmode,skiphash,ck) + cf, start, ok = chainrun(cf,start,last,dataset,sequence,rlmode,skiphash,ck,3) if ok then done = true end end if not notmatchreplace[backtrackdisc] then local ok = false - new, cnew, ok = chainrun(new,cnew,clast,dataset,sequence,rlmode,skiphash,ck) + new, cnew, ok = chainrun(new,cnew,clast,dataset,sequence,rlmode,skiphash,ck,4) if ok then done = true end @@ -2430,33 +2433,57 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck) setdisc(backtrackdisc,pre,post,replace) end start = getprev(backtrackdisc) + useddisc = backtrackdisc -- new 2022-09-25 sweephead[post] = getnext(clast) or false sweephead[replace] = getnext(last) or false - else local ok = false - head, start, ok = chainrun(head,start,last,dataset,sequence,rlmode,skiphash,ck) + head, start, ok = chainrun(head,start,last,dataset,sequence,rlmode,skiphash,ck,5) if ok then done = true end end - - return head, start, done + if useddisc and start ~= usedstart then -- make this option per font -- new 2022-09-25 + start = getnext(start) -- new 2022-09-25 + end -- new 2022-09-25 + return head, start, done, useddisc -- new 2022-09-25 end -local function chaintrac(head,start,dataset,sequence,rlmode,skiphash,ck,match,discseen,sweepnode) - local rule = ck[1] - local lookuptype = ck[8] or ck[2] - local nofseq = #ck[3] - local first = ck[4] - local last = ck[5] - local char = getchar(start) - logwarning("%s: rule %s %s at char %s for (%s,%s,%s) chars, lookuptype %a, %sdisc seen, %ssweeping", - cref(dataset,sequence),rule,match and "matches" or "nomatch", - gref(char),first-1,last-first+1,nofseq-last,lookuptype, - discseen and "" or "no ", sweepnode and "" or "not ") +local chaintrac do + + local level = 0 + local last = { } + + chaintrac = function(head,start,dataset,sequence,rlmode,skiphash,ck,match,discseen,sweepnode) + if dataset then + level = level + 1 + last[level] = start + local rule = ck[1] + local lookuptype = ck[8] or ck[2] + local nofseq = #ck[3] -- ck[3].n + local first = ck[4] + local last = ck[5] + local char = getchar(start) + logwarning("+ %i : %s: rule %s %s at char %s for (%s,%s,%s) chars, lookuptype %a, %sdisc seen, %ssweeping", + level,cref(dataset,sequence),rule,match and "matches" or "nomatch", + gref(char),first-1,last-first+1,nofseq-last,lookuptype, + discseen and "" or "no ", sweepnode and "" or "not ") + else + -- (start,done) + local what = start and "done" or "continue" + local where = head == last[level] and "same" or "different" + local char = getchar(head) + if char then + logwarning("- %i : %s at char %s, %s node",level,what,gref(char),where) + else + logwarning("- %i : %s, %s node",level,what,where) + end + level = level - 1 + end + end + end -- The next one is quite optimized but still somewhat slow, fonts like ebgaramond @@ -2470,6 +2497,9 @@ end -- the previous disc .. such be it (<before><disc><current=fl><after> with only f done) local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,skiphash) + if not contexts then + return head, start, false + end -- optimizing for rlmode gains nothing local sweepnode = sweepnode local sweeptype = sweeptype @@ -2510,10 +2540,10 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s for k=1,nofcontexts do -- does this disc mess work well with n > 1 - local ck = contexts[k] - local seq = ck[3] - local f = ck[4] -- first current -local last = start + local ck = contexts[k] + local seq = ck[3] + local f = ck[4] -- first current + local last = start if not startchar or not seq[f][startchar] then -- report("no hit in %a at %i of %i contexts",sequence.type,k,nofcontexts) goto next @@ -2524,7 +2554,7 @@ local last = start else local l = ck[5] -- last current local current = start --- local last = start + -- local last = start -- current match @@ -2638,7 +2668,7 @@ local last = start -- before if f > 1 then - if startprev then + -- if startprev then -- new 2022-09-25 local prev = startprev if prereplace and prev == checkdisc then prev = getprev(sweepnode) @@ -2762,9 +2792,9 @@ local last = start else goto next end - else - goto next - end + -- else -- new 2022-09-25 + -- goto next -- new 2022-09-25 + -- end -- new 2022-09-25 end -- after @@ -2888,24 +2918,25 @@ local last = start end end end - if trace_contexts then chaintrac(head,start,dataset,sequence,rlmode,skipped and skiphash,ck,true,discseen,sweepnode) end if discseen or sweepnode then + -- When we process a disc we can collapse and therefore we backtrack one node (start) and + -- reprocess. This is needed because there might be more in the collapsed list. head, start, done = chaindisk(head,start,dataset,sequence,rlmode,skipped and skiphash,ck) else - head, start, done = chainrun(head,start,last,dataset,sequence,rlmode,skipped and skiphash,ck) + head, start, done = chainrun(head,start,last,dataset,sequence,rlmode,skipped and skiphash,ck,6) + end + if trace_contexts then + chaintrac(start,done) end if done then break -- else -- next context end - ::next:: - -- if trace_chains then - -- chaintrac(head,start,dataset,sequence,rlmode,skipped and skiphash,ck,false,discseen,sweepnode) - -- end + ::next:: end if discseen then notmatchpre = { } @@ -2924,21 +2955,46 @@ handlers.gsub_reversecontextchain = handle_contextchain handlers.gpos_contextchain = handle_contextchain handlers.gpos_context = handle_contextchain --- this needs testing +-- local function chained_contextchain(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash) +-- local steps = currentlookup.steps +-- local nofsteps = currentlookup.nofsteps +-- if nofsteps > 1 then +-- reportmoresteps(dataset,sequence) +-- end +-- -- probably wrong +-- local l = steps[1].coverage[getchar(start)] +-- if l then +-- return handle_contextchain(head,start,dataset,sequence,l,rlmode,skiphash) +-- else +-- return head, start, false +-- end +-- end +-- new 2022-09-25 + local function chained_contextchain(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash) local steps = currentlookup.steps local nofsteps = currentlookup.nofsteps - if nofsteps > 1 then - reportmoresteps(dataset,sequence) - end - -- probably wrong - local l = steps[1].coverage[getchar(start)] - if l then - return handle_contextchain(head,start,dataset,sequence,l,rlmode,skiphash) + local char = getchar(start) + if nofsteps == 1 then + local s = steps[1] + local l = s.coverage[char] + if l then + return handle_contextchain(head,start,dataset,sequence,l,rlmode,skiphash) + end else - return head, start, false + for i=1,nofsteps do + local s = steps[i] + local l = s.coverage[char] + if l then + local h, s, d = handle_contextchain(head,start,dataset,sequence,l,rlmode,skiphash) + if d then + return h, s, d + end + end + end end + return head, start, false end chainprocs.gsub_context = chained_contextchain @@ -3077,7 +3133,7 @@ do -- overcome local limit end -- Functions like kernrun, comprun etc evolved over time and in the end look rather --- complex. It's a bit of a compromis between extensive copying and creating subruns. +-- complex. It's a bit of a compromise between extensive copying and creating subruns. -- The logic has been improved a lot by Kai and Ivo who use complex fonts which -- really helped to identify border cases on the one hand and get insight in the diverse -- ways fonts implement features (not always that consistent and efficient). At the same @@ -3184,7 +3240,8 @@ local function kernrun(disc,k_run,font,attr,...) if done and trace_testruns then report_disc("done",disc) end - return nextstart, done + -- return nextstart, done + return nextstart end -- fonts like ebgaramond do ligatures this way (less efficient than e.g. dejavu which @@ -3237,12 +3294,19 @@ local function comprun(disc,c_run,...) -- vararg faster than the whole list setdisc(disc,pre,post,replace) end -- - return getnext(disc), renewed + -- return getnext(disc), renewed + return getnext(disc) end -- if we can hyphenate in a lig then unlikely a lig so we -- could have a option here to ignore lig +local test_flatten_start = 2 -- must start at 2 according to Kai + +directives.register("otf.testrun.forceflatten", function(v) + test_flatten_start = v and 1 or 2 +end) + local function testrun(disc,t_run,c_run,...) if trace_testruns then report_disc("test",disc) @@ -3271,7 +3335,7 @@ local function testrun(disc,t_run,c_run,...) local d = d_replace > d_post and d_replace or d_post local head = getnext(disc) -- is: next local tail = head - for i=2,d do -- must start at 2 according to Kai + for i=test_flatten_start,d do local nx = getnext(tail) local id = getid(nx) if id == disc_code then @@ -3286,7 +3350,7 @@ local function testrun(disc,t_run,c_run,...) next = getnext(tail) setnext(tail) setprev(head) - local new = copy_node_list(head) + local new = copynodelist(head) if posttail then setlink(posttail,head) else @@ -3359,7 +3423,8 @@ local function testrun(disc,t_run,c_run,...) end end -- next can have changed (copied list) - return getnext(disc), renewed + -- return getnext(disc), renewed + return getnext(disc) end -- 1{2{\oldstyle\discretionary{3}{4}{5}}6}7\par @@ -3882,7 +3947,7 @@ do -- the before and after lists in the loader. But first I need to see a font that uses multiple -- matches. -- - local start = find_node_tail(head) + local start = findnodetail(head) local rlmode = 0 -- how important is this .. do we need to check for dir? local merged = steps.merged while start do @@ -3968,17 +4033,13 @@ do start = getnext(start) elseif id == disc_code then if not discs or discs[start] == true then - local ok if gpossing then - start, ok = kernrun(start,k_run_single, font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler) + start = kernrun(start,k_run_single, font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler) elseif forcetestrun then - start, ok = testrun(start,t_run_single,c_run_single,font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler) + start = testrun(start,t_run_single,c_run_single,font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler) else - start, ok = comprun(start,c_run_single, font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler) + start = comprun(start,c_run_single, font,attr,lookupcache,step,dataset,sequence,rlmode,skiphash,handler) end - -- if ok then - -- done = true - -- end else start = getnext(start) end @@ -4052,17 +4113,13 @@ do start = getnext(start) elseif id == disc_code then if not discs or discs[start] == true then - local ok if gpossing then - start, ok = kernrun(start,k_run_multiple, font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler) + start = kernrun(start,k_run_multiple, font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler) elseif forcetestrun then - start, ok = testrun(start,t_run_multiple,c_run_multiple,font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler) + start = testrun(start,t_run_multiple,c_run_multiple,font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler) else - start, ok = comprun(start,c_run_multiple, font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler) + start = comprun(start,c_run_multiple, font,attr,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler) end - -- if ok then - -- done = true - -- end else start = getnext(start) end @@ -4184,7 +4241,7 @@ do start = getnext(start) -- elseif id == par_code and startofpar(start) then -- rlparmode, rlmode = pardirstate(start) - -- start = getnext(start) + -- start = nxt else start = getnext(start) end @@ -4274,8 +4331,8 @@ registerotffeature { } } --- Moved here (up) a bit. This doesn't really belong in generic so it will --- move to a context module some day. +-- Moved here (up) a bit. This doesn't really belong in generic so it will move to a +-- context module some day. local function markinitializer(tfmdata,value) local properties = tfmdata.properties diff --git a/tex/context/base/mkiv/font-shp.lua b/tex/context/base/mkiv/font-shp.lua index 2ca3011a5..cab4b7540 100644 --- a/tex/context/base/mkiv/font-shp.lua +++ b/tex/context/base/mkiv/font-shp.lua @@ -17,7 +17,7 @@ local pfb = fonts.handlers.pfb local hashes = fonts.hashes local identifiers = hashes.identifiers -local version = otf.version or 0.011 +local version = otf.version or 0.013 local shapescache = containers.define("fonts", "shapes", version, true) local streamscache = containers.define("fonts", "streams", version, true) diff --git a/tex/context/base/mkiv/math-dir.lua b/tex/context/base/mkiv/math-dir.lua index f26324ed9..f0298d243 100644 --- a/tex/context/base/mkiv/math-dir.lua +++ b/tex/context/base/mkiv/math-dir.lua @@ -142,6 +142,7 @@ function directions.processmath(head) -- style, penalties return processmath(head) end end + return head end function directions.setmath(n) diff --git a/tex/context/base/mkiv/mult-low.lua b/tex/context/base/mkiv/mult-low.lua index e8ce240f0..e4566b7e4 100644 --- a/tex/context/base/mkiv/mult-low.lua +++ b/tex/context/base/mkiv/mult-low.lua @@ -101,9 +101,9 @@ return { "adjustnodecode", "ligaturenodecode", "discretionarynodecode", "whatsitnodecode", "mathnodecode", "gluenodecode", "kernnodecode", "penaltynodecode", "unsetnodecode", "mathsnodecode", -- - "charifcode", "catifcode", "numifcode", "dimifcode", "oddifcode", "vmodeifcode", "hmodeifcode", - "mmodeifcode", "innerifcode", "voidifcode", "hboxifcode", "vboxifcode", "xifcode", "eofifcode", - "trueifcode", "falseifcode", "caseifcode", "definedifcode", "csnameifcode", "fontcharifcode", + -- "charifcode", "catifcode", "numifcode", "dimifcode", "oddifcode", "vmodeifcode", "hmodeifcode", + -- "mmodeifcode", "innerifcode", "voidifcode", "hboxifcode", "vboxifcode", "xifcode", "eofifcode", + -- "trueifcode", "falseifcode", "caseifcode", "definedifcode", "csnameifcode", "fontcharifcode", -- "overrulemathcontrolcode", "underrulemathcontrolcode", "radicalrulemathcontrolcode", "fractionrulemathcontrolcode", "accentskewhalfmathcontrolcode", "accentskewapplymathcontrolcode", "applyordinarykernpairmathcontrolcode", @@ -112,10 +112,11 @@ return { "applytextitalickernmathcontrolcode", "applyscriptitalickernmathcontrolcode", "checkspaceitalickernmathcontrolcode", "checktextitalickernmathcontrolcode", "analyzescriptnucleuscharmathcontrolcode", "analyzescriptnucleuslistmathcontrolcode", "analyzescriptnucleusboxmathcontrolcode", + "accenttopskewwithoffsetmathcontrolcode", "ignorekerndimensionsmathcontrolcode", -- "noligaturingglyphoptioncode", "nokerningglyphoptioncode", "noexpansionglyphoptioncode", "noprotrusionglyphoptioncode", "noleftkerningglyphoptioncode", "noleftligaturingglyphoptioncode", "norightkerningglyphoptioncode", "norightligaturingglyphoptioncode", - "noitaliccorrectionglyphoptioncode", + "noitaliccorrectionglyphoptioncode", "islargeoperatorglyphoptioncode", "hasitalicshapeglyphoptioncode", -- "normalparcontextcode", "vmodeparcontextcode", "vboxparcontextcode", "vtopparcontextcode", "vcenterparcontextcode", "vadjustparcontextcode", "insertparcontextcode", "outputparcontextcode", "alignparcontextcode", @@ -217,6 +218,7 @@ return { "flattenclassoptioncode", "omitpenaltyclassoptioncode", "unpackclassoptioncode", "raiseprimeclassoptioncode", "carryoverlefttopkernclassoptioncode", "carryoverleftbottomkernclassoptioncode", "carryoverrighttopkernclassoptioncode", "carryoverrightbottomkernclassoptioncode", "preferdelimiterdimensionsclassoptioncode", "autoinjectclassoptioncode", "removeitaliccorrectionclassoptioncode", + "operatoritaliccorrectionclassoptioncode", -- "noligaturingglyphoptioncode", "nokerningglyphoptioncode", "noleftligatureglyphoptioncode", "noleftkernglyphoptioncode", "norightligatureglyphoptioncode", "norightkernglyphoptioncode", diff --git a/tex/context/base/mkiv/mult-prm.lua b/tex/context/base/mkiv/mult-prm.lua index 546b93af3..60fb704d4 100644 --- a/tex/context/base/mkiv/mult-prm.lua +++ b/tex/context/base/mkiv/mult-prm.lua @@ -164,6 +164,8 @@ return { "Umathradicaldegreeafter", "Umathradicaldegreebefore", "Umathradicaldegreeraise", + "Umathradicalextensibleafter", + "Umathradicalextensiblebefore", "Umathradicalkern", "Umathradicalrule", "Umathradicalvariant", @@ -256,12 +258,14 @@ return { "aligntab", "allcrampedstyles", "alldisplaystyles", + "allmainstyles", "allmathstyles", "allscriptscriptstyles", "allscriptstyles", "allsplitstyles", "alltextstyles", "alluncrampedstyles", + "allunsplitstyles", "atendofgroup", "atendofgrouped", "attribute", @@ -411,6 +415,8 @@ return { "ifparameters", "ifrelax", "iftok", + "ifzerodim", + "ifzeronum", "ignorearguments", "ignorepars", "immediate", diff --git a/tex/context/base/mkiv/pack-cut.mkiv b/tex/context/base/mkiv/pack-cut.mkiv index 84c14d648..533440efd 100644 --- a/tex/context/base/mkiv/pack-cut.mkiv +++ b/tex/context/base/mkiv/pack-cut.mkiv @@ -102,9 +102,8 @@ \vss}% \hss}} -\unexpanded\def\makecutbox#1% - {\bgroup - \d_pack_cutmarks_height\ht#1% +\unexpanded\def\makecutbox#1% not grouped ! + {\d_pack_cutmarks_height\ht#1% \d_pack_cutmarks_depth \dp#1% \d_pack_cutmarks_width \wd#1% \setbox#1\hpack @@ -155,8 +154,7 @@ \box#1}% \wd#1\d_pack_cutmarks_width \ht#1\d_pack_cutmarks_height - \dp#1\d_pack_cutmarks_depth - \egroup} + \dp#1\d_pack_cutmarks_depth} \unexpanded\def\cuthbox{\hpack\bgroup\dowithnextbox{\makecutbox\nextbox\flushnextbox\egroup}\hbox} \unexpanded\def\cutvbox{\vpack\bgroup\dowithnextbox{\makecutbox\nextbox\flushnextbox\egroup}\vbox} diff --git a/tex/context/base/mkiv/status-files.pdf b/tex/context/base/mkiv/status-files.pdf Binary files differindex fb4443218..982b677cd 100644 --- a/tex/context/base/mkiv/status-files.pdf +++ b/tex/context/base/mkiv/status-files.pdf diff --git a/tex/context/base/mkiv/status-lua.pdf b/tex/context/base/mkiv/status-lua.pdf Binary files differindex d75e37cee..9469ffdf0 100644 --- a/tex/context/base/mkiv/status-lua.pdf +++ b/tex/context/base/mkiv/status-lua.pdf diff --git a/tex/context/base/mkiv/strc-doc.lua b/tex/context/base/mkiv/strc-doc.lua index d613d1aa7..7a79a7121 100644 --- a/tex/context/base/mkiv/strc-doc.lua +++ b/tex/context/base/mkiv/strc-doc.lua @@ -168,9 +168,9 @@ end local lastsaved = 0 function sections.save(sectiondata) -local sectiondata = helpers.simplify(sectiondata) -- maybe done earlier - local numberdata = sectiondata.numberdata - local ntobesaved = #tobesaved + local sectiondata = helpers.simplify(sectiondata) -- maybe done earlier + local numberdata = sectiondata.numberdata + local ntobesaved = #tobesaved if not numberdata or sectiondata.metadata.nolist then -- stay else diff --git a/tex/context/base/mkiv/strc-lst.lua b/tex/context/base/mkiv/strc-lst.lua index 865c44624..4a190132b 100644 --- a/tex/context/base/mkiv/strc-lst.lua +++ b/tex/context/base/mkiv/strc-lst.lua @@ -263,6 +263,14 @@ function lists.addto(t) -- maybe more more here (saves parsing at the tex end) if r and not r.section then r.section = structures.sections.currentid() end + local b = r and t.block + if r and not b then + local s = r.section + if s then + s = structures.sections.tobesaved[s] + r.block = s and s.block or nil + end + end local i = r and r.internal or 0 -- brrr if r and kind and name then local tag = tags.getid(kind,name) @@ -834,6 +842,7 @@ filters[v_default] = function(specification) -- is named for i=1,#collected do local v = collected[i] local r = v.references +-- inspect(v) if r and (not block or not r.block or pblock == r.block) then local sectionnumber = sections[r.section] if sectionnumber then diff --git a/tex/context/base/mkiv/type-set.mkiv b/tex/context/base/mkiv/type-set.mkiv index 3447c4e6e..269d41966 100644 --- a/tex/context/base/mkiv/type-set.mkiv +++ b/tex/context/base/mkiv/type-set.mkiv @@ -132,6 +132,7 @@ \definefilesynonym [type-imp-coloredsheep.mkiv] [type-imp-koeielettersot.mkiv] \definefilesynonym [type-imp-koeieletters.mkiv] [type-imp-koeielettersot.mkiv] +%definefilesynonym [type-imp-xits.mkiv] [type-imp-stix.mkiv] \definefilesynonym [type-imp-stixtwo.mkiv] [type-imp-stix.mkiv] \definefilesynonym [type-imp-ibmplex.mkiv] [type-imp-plex.mkiv] diff --git a/tex/context/base/mkxl/anch-pgr.lmt b/tex/context/base/mkxl/anch-pgr.lmt index 5ef6ecacb..575d4e906 100644 --- a/tex/context/base/mkxl/anch-pgr.lmt +++ b/tex/context/base/mkxl/anch-pgr.lmt @@ -34,6 +34,7 @@ local context = context local implement = interfaces.implement local texgetcount = tex.getcount +local texiscount = tex.iscount local getmacro = tokens.getters.macro local expandasvalue = tex.expandasvalue @@ -61,6 +62,8 @@ local f_pair = formatters["(%p,%p)"] local f_path = formatters["%--t--cycle"] local f_pair_i = formatters["(%r,%r)"] -- rounded +local c_realpageno = texiscount("realpageno") + graphics = graphics or { } local backgrounds = { } graphics.backgrounds = backgrounds @@ -254,7 +257,7 @@ end nodes.handlers.textbackgrounds = function(head,where,parent) -- we have hlistdir and local dir -- todo enable action in register index = index + 1 - realpage = texgetcount("realpageno") + realpage = texgetcount(c_realpageno) return processranges(a_textbackground,flush,head,parent) end @@ -1214,7 +1217,7 @@ backgrounds.fetchmultipar = fetchmultipar local function getwhatever(action) local tags = scanmpstring() local anchor = scanmpstring() - local page = texgetcount("realpageno") + local page = texgetcount(c_realpageno) if tags == "self" then tags = expandasvalue(string_value,"mpcategoryparameter",true,"self") elseif type(tags) == "string" then diff --git a/tex/context/base/mkxl/anch-pos.lmt b/tex/context/base/mkxl/anch-pos.lmt index fc668f699..6488a2fd7 100644 --- a/tex/context/base/mkxl/anch-pos.lmt +++ b/tex/context/base/mkxl/anch-pos.lmt @@ -65,6 +65,8 @@ local tex = tex local texgetdimen = tex.getdimen local texgetcount = tex.getcount local texgetinteger = tex.getintegervalue or tex.getcount +local texiscount = tex.iscount +local texisdimen = tex.isdimen local texsetcount = tex.setcount local texget = tex.get local texsp = tex.sp @@ -133,15 +135,19 @@ local default = { -- not r and paragraphs etc } } -local f_b_tag = formatters["b:%s"] -local f_e_tag = formatters["e:%s"] -local f_p_tag = formatters["p:%s"] ------ f_w_tag = formatters["w:%s"] +local f_b_tag = formatters["b:%s"] +local f_e_tag = formatters["e:%s"] +local f_p_tag = formatters["p:%s"] +----- f_w_tag = formatters["w:%s"] -local f_region = formatters["region:%s"] +local f_region = formatters["region:%s"] -local f_tag_three = formatters["%s:%s:%s"] -local f_tag_two = formatters["%s:%s"] +local f_tag_three = formatters["%s:%s:%s"] +local f_tag_two = formatters["%s:%s"] + +local c_realpageno = texiscount("realpageno") +local d_strutht = texisdimen("strutht") +local d_strutdp = texisdimen("strutdp") -- Because positions are set with a delay we cannot yet make the tree -- so that -- is a finalizer step. But, we already have a dual split. @@ -902,7 +908,7 @@ local function enhance(data) data.y = y ~= 0 and y or nil end if data.p == true then - data.p = texgetcount("realpageno") -- we should use a variable set in otr + data.p = texgetcount(c_realpageno) -- we should use a variable set in otr end if data.c == true then data.c = column @@ -1075,7 +1081,7 @@ local function b_region(specification) local x, y = getpos() last.x = x ~= 0 and x or nil last.y = y ~= 0 and y or nil - last.p = texgetcount("realpageno") + last.p = texgetcount(c_realpageno) insert(regions,tag) -- todo: fast stack region = tag end @@ -1117,7 +1123,7 @@ local function setregionbox(n,tag,index,k,lo,ro,to,bo,column) -- kind -- these auto regions (comning from framed). Too messy and the split in the -- setter is fast enough. tobesaved[tag] = { - -- p = texgetcount("realpageno"), -- we copy them + -- p = texgetcount(c_realpageno), -- we copy them x = 0, y = 0, w = w ~= 0 and w or nil, @@ -1191,6 +1197,8 @@ end do + local c_anch_positions_paragraph = texiscount("c_anch_positions_paragraph") + local nofparagraphs = 0 local function enhancepar_1(data) @@ -1205,7 +1213,7 @@ do if y ~= 0 then data.y = y end - data.p = texgetcount("realpageno") -- we should use a variable set in otr + data.p = texgetcount(c_realpageno) -- we should use a variable set in otr if column then data.c = column end @@ -1253,7 +1261,7 @@ do if y ~= 0 then data.y = y end - data.p = texgetcount("realpageno") -- we should use a variable set in otr + data.p = texgetcount(c_realpageno) if column then data.c = column end @@ -1268,10 +1276,10 @@ do name = "parpos", actions = function() nofparagraphs = nofparagraphs + 1 - texsetcount("global","c_anch_positions_paragraph",nofparagraphs) + texsetcount("global",c_anch_positions_paragraph,nofparagraphs) local name = f_p_tag(nofparagraphs) - local h = texgetdimen("strutht") - local d = texgetdimen("strutdp") + local h = texgetdimen(d_strutht) + local d = texgetdimen(d_strutdp) -- local top = texgetnest("top","head") local nxt = top.next @@ -1429,8 +1437,8 @@ do public = true, protected = true, actions = function(name) - local h = texgetdimen("strutht") - local d = texgetdimen("strutdp") + local h = texgetdimen(d_strutht) + local d = texgetdimen(d_strutdp) local spec = { p = true, c = column, @@ -1453,8 +1461,8 @@ do public = true, protected = true, actions = function(name,kind) - local h = texgetdimen("strutht") - local d = texgetdimen("strutdp") + local h = texgetdimen(d_strutht) + local d = texgetdimen(d_strutdp) local spec = { k = kind, p = true, @@ -1476,7 +1484,7 @@ end function jobpositions.getreserved(tag,n) if tag == v_column then - local fulltag = f_tag_three(tag,texgetcount("realpageno"),n or 1) + local fulltag = f_tag_three(tag,texgetcount(c_realpageno),n or 1) local data = collected[fulltag] if data then return data, fulltag @@ -1484,7 +1492,7 @@ function jobpositions.getreserved(tag,n) tag = v_text end if tag == v_text then - local fulltag = f_tag_two(tag,texgetcount("realpageno")) + local fulltag = f_tag_two(tag,texgetcount(c_realpageno)) return collected[fulltag] or false, fulltag end return collected[tag] or false, tag @@ -2257,7 +2265,7 @@ implement { public = true, protected = true, actions = function(list) - doifelse(onsamepage(list,tostring(texgetcount("realpageno")))) + doifelse(onsamepage(list,tostring(texgetcount(c_realpageno)))) end } diff --git a/tex/context/base/mkxl/anch-pos.mkxl b/tex/context/base/mkxl/anch-pos.mkxl index fef8e54f6..f8891eb33 100644 --- a/tex/context/base/mkxl/anch-pos.mkxl +++ b/tex/context/base/mkxl/anch-pos.mkxl @@ -17,10 +17,19 @@ %D early, but starting in 2012 more dramatic changes started to happen, especially %D in relation to background graphics. It will probably take some time to settle. -\registerctxluafile{anch-pos}{autosuffix} - \unprotect +\newcount\c_anch_column % will be delegated to lua +\newcount\c_anch_text % will be delegated to lua +\newcount\c_anch_free +\newtoks \t_anch_positions_tracers +\newcount\c_anch_positions_paragraph + +\newbox \b_anch_position +\newif \ifpositioning % sort of public + +\registerctxluafile{anch-pos}{autosuffix} + %D The first application of positional information was embedded graphics. Since we %D are interacting with text, it made sense to take the current line height and %D depth into account too. This is why we have position macros for simple positions @@ -43,8 +52,8 @@ % \dosetpositionstrut #1 % defined at lua end % \dosetpositionstrutkind #1#2 % defined at lua end -\newbox\b_anch_position -\newif \ifpositioning % sort of public +% see top: \newbox\b_anch_position +% see top: \newif \ifpositioning % sort of public \mutable\let\currentposition \empty \mutable\let\currentpositionaction\empty @@ -282,8 +291,8 @@ \permanent\def\textanchor {text:\the\realpageno} \permanent\def\regionanchor{region:0} -\newcount\c_anch_column % will be delegated to lua -\newcount\c_anch_text % will be delegated to lua +% see top: \newcount\c_anch_column % will be delegated to lua +% see top: \newcount\c_anch_text % will be delegated to lua % beware we need to pass \somethingexpanded or { } @@ -336,7 +345,7 @@ \expandafter\gobblesixarguments \fi} -\newcount\c_anch_free +% see top: \newcount\c_anch_free \protected\def\anch_mark_tagged_box_free_yes#1#2#3#4#5#6% only needed when positions {\global\advance\c_anch_free\plusone % could be done at the lua end @@ -408,8 +417,8 @@ %D can keep track of them. This mechanism is activated automatically based on %D information collected in the previous pass. -\newtoks \t_anch_positions_tracers -\newcount\c_anch_positions_paragraph +% see top: \newtoks \t_anch_positions_tracers +% see top: \newcount\c_anch_positions_paragraph \permanent\protected\def\tracepositions {\the\t_anch_positions_tracers} diff --git a/tex/context/base/mkxl/buff-ini.lmt b/tex/context/base/mkxl/buff-ini.lmt index 985c834ff..1d4722531 100644 --- a/tex/context/base/mkxl/buff-ini.lmt +++ b/tex/context/base/mkxl/buff-ini.lmt @@ -573,7 +573,7 @@ local function savebuffer(list,name,prefix,option,directory) -- name is optional if directory ~= "" and dir.makedirs(directory) then name = file.join(directory,name) end - io.savedata(name,replacenewlines(content),"\n",option == v_append) + savedata(name,replacenewlines(content),"\n",option == v_append) end implement { diff --git a/tex/context/base/mkxl/cont-new.mkxl b/tex/context/base/mkxl/cont-new.mkxl index 5fb6ae5b6..e8f8e5e2e 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.09.16 14:39} +\newcontextversion{2022.10.14 10:13} %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 cd7075d5e..bf5dd9a07 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.09.16 14:39} +\immutable\edef\contextversion{2022.10.14 10:13} %overloadmode 1 % check frozen / warning %overloadmode 2 % check frozen / error diff --git a/tex/context/base/mkxl/core-env.lmt b/tex/context/base/mkxl/core-env.lmt index 486beeec4..f5b382f12 100644 --- a/tex/context/base/mkxl/core-env.lmt +++ b/tex/context/base/mkxl/core-env.lmt @@ -135,30 +135,30 @@ end) tex.isdefined = isdefined -function tex.isdimen(name) - local hit = cache[name] - return hit.command == dimencode and hit.index or true -end - -function tex.iscount(name) - local hit = cache[name] - return hit.command == countcode and hit.index or true -end - -function tex.istoken(name) - local hit = cache[name] - return hit.command == tokencode and hit.index or true -end - -function tex.isskip(name) - local hit = cache[name] - return hit.command == skipcode and hit.index or true -end - -function tex.ismuskip(name) - local hit = cache[name] - return hit.command == muskipcode and hit.index or true -end +-- function tex.isdimen(name) +-- local hit = cache[name] +-- return hit.command == dimencode and hit.index or true +-- end +-- +-- function tex.iscount(name) +-- local hit = cache[name] +-- return hit.command == countcode and hit.index or true +-- end +-- +-- function tex.istoken(name) +-- local hit = cache[name] +-- return hit.command == tokencode and hit.index or true +-- end +-- +-- function tex.isskip(name) +-- local hit = cache[name] +-- return hit.command == skipcode and hit.index or true +-- end +-- +-- function tex.ismuskip(name) +-- local hit = cache[name] +-- return hit.command == muskipcode and hit.index or true +-- end function tex.type(name) return types[cache[name].command] or "macro" diff --git a/tex/context/base/mkxl/core-uti.lmt b/tex/context/base/mkxl/core-uti.lmt index 2266119de..d533de5f3 100644 --- a/tex/context/base/mkxl/core-uti.lmt +++ b/tex/context/base/mkxl/core-uti.lmt @@ -448,8 +448,8 @@ end) function statistics.formatruntime(runtime) if not environment.initex then -- else error when testing as not counters yet -- stoptiming(statistics) -- to be sure - local shipped = texgetcount('nofshipouts') - local pages = texgetcount('realpageno') + local shipped = texgetcount("nofshipouts") + local pages = texgetcount("realpageno") if pages > shipped then pages = shipped end diff --git a/tex/context/base/mkxl/font-con.lmt b/tex/context/base/mkxl/font-con.lmt index ddaf8afb1..319d5fe48 100644 --- a/tex/context/base/mkxl/font-con.lmt +++ b/tex/context/base/mkxl/font-con.lmt @@ -533,12 +533,6 @@ function constructors.scale(tfmdata,specification) targetparameters.scriptscale = scriptscale targetparameters.scriptscriptscale = scriptscriptscale - -- todo: maybe retrofit to font-con.lua - - local oldmath = properties.oldmath - targetproperties.oldmath = oldmath - target.oldmath = oldmath - local mathcontrol = properties.mathcontrol targetproperties.mathcontrol = mathcontrol target.mathcontrol = mathcontrol @@ -706,10 +700,26 @@ function constructors.scale(tfmdata,specification) if vi and vi ~= 0 then chr.vitalic = vi*hdelta end - local va = character.accent +-- local va = character.accent +-- if va and not chr.topanchor then +-- chr.topanchor = va +-- end + local va = character.topanchor + if va then + chr.topanchor = va*vdelta + end + va = character.bottomanchor if va then - chr.topaccent = va*vdelta + chr.bottomanchor = va*vdelta end + local vo = character.topovershoot + if vo then + chr.topovershoot = vo*hdelta + end + -- vo = character.bottomovershoot + -- if vo then + -- chr.bottomovershoot = vo*hdelta + -- end if stackmath then -- not ok yet local mk = character.mathkerns if mk then @@ -755,6 +765,10 @@ function constructors.scale(tfmdata,specification) if sm then chr.smaller = sm end + local mi = character.mirror + if mi then + chr.mirror = mi + end local fa = character.flataccent if fa then chr.flataccent = fa diff --git a/tex/context/base/mkxl/font-ctx.lmt b/tex/context/base/mkxl/font-ctx.lmt index 585547cbf..75572e089 100644 --- a/tex/context/base/mkxl/font-ctx.lmt +++ b/tex/context/base/mkxl/font-ctx.lmt @@ -1221,23 +1221,23 @@ do -- else too many locals "integer", }, actions = function ( - global, -- \ifx\fontclass\empty\s!false\else\s!true\fi - cs, -- {#csname}% - str, -- \somefontfile - size, -- \d_font_scaled_font_size - inheritancemode, -- \c_font_feature_inheritance_mode - classfeatures, -- \m_font_class_features - fontfeatures, -- \m_font_features - classfallbacks, -- \m_font_class_fallbacks - fontfallbacks, -- \m_font_fallbacks - mathsize, -- \fontface - textsize, -- \d_font_scaled_text_face - classgoodies, -- \m_font_class_goodies - goodies, -- \m_font_goodies - classdesignsize, -- \m_font_class_designsize - fontdesignsize, -- \m_font_designsize - scaledfontmode -- \scaledfontmode - ) + global, -- \ifx\fontclass\empty\s!false\else\s!true\fi + cs, -- {#csname}% + str, -- \somefontfile + size, -- \d_font_scaled_font_size + inheritancemode, -- \c_font_feature_inheritance_mode + classfeatures, -- \m_font_class_features + fontfeatures, -- \m_font_features + classfallbacks, -- \m_font_class_fallbacks + fontfallbacks, -- \m_font_fallbacks + mathsize, -- \fontface + textsize, -- \d_font_scaled_text_face + classgoodies, -- \m_font_class_goodies + goodies, -- \m_font_goodies + classdesignsize, -- \m_font_class_designsize + fontdesignsize, -- \m_font_designsize + scaledfontmode -- \scaledfontmode + ) if trace_defining then report_defining("start stage two: %s, size %s, features %a & %a, mode %a",str,size,classfeatures,fontfeatures,inheritancemode) end @@ -1397,7 +1397,7 @@ do -- else too many locals busy = false mathematics.finishfallbacks(tfmdata,specification,fallbacks) tfmdata.original = specification.specification -constructors.beforepassingfonttotex(tfmdata) + constructors.beforepassingfonttotex(tfmdata) local id = definefont(tfmdata,properties.id) csnames[id] = specification.cs properties.id = id -- already set diff --git a/tex/context/base/mkxl/font-imp-effects.lmt b/tex/context/base/mkxl/font-imp-effects.lmt index 38d86498a..8dce81087 100644 --- a/tex/context/base/mkxl/font-imp-effects.lmt +++ b/tex/context/base/mkxl/font-imp-effects.lmt @@ -238,11 +238,12 @@ local function manipulateeffect(tfmdata) parameters.hshift = hshift parameters.vshift = vshift for unicode, character in next, characters do - local oldwidth = character.width - local oldheight = character.height - local olddepth = character.depth - local olditalic = character.italic - local oldtopaccent = character.topaccent + local oldwidth = character.width + local oldheight = character.height + local olddepth = character.depth + local olditalic = character.italic + local oldtopanchor = character.topanchor + local oldbottomanchor = character.bottomanchor if oldwidth and oldwidth > 0 then character.width = oldwidth + wdelta end @@ -252,13 +253,16 @@ local function manipulateeffect(tfmdata) if olddepth and olddepth > 0 then character.depth = olddepth + ddelta end - if olditalic or oldtopaccent then + if olditalic or oldtopaccent or oldbottomaccent then local factor = character.width / oldwidth if olditalic and olditalic > 0 then character.italic = olditalic * factor end - if oldtopaccent and oldtopaccent > 0 then - character.topaccent = oldtopaccent * factor + if oldtopanchor and oldtopanchor > 0 then + character.topanchor = oldtopanchor * factor + end + if oldbottomanchor and oldbottomanchor > 0 then + character.bottomanchor = oldbottomanchor * factor end end end diff --git a/tex/context/base/mkxl/font-imp-math.lmt b/tex/context/base/mkxl/font-imp-math.lmt index 9811cb7c8..04fe5c04c 100644 --- a/tex/context/base/mkxl/font-imp-math.lmt +++ b/tex/context/base/mkxl/font-imp-math.lmt @@ -225,30 +225,6 @@ registerotffeature { -- end local function initialize(tfmdata,value) - if value then - local rawdata = tfmdata.shared.rawdata - local rawresources = rawdata and rawdata.resources - local mathconstants = rawresources.mathconstants - if mathconstants then - tfmdata.properties.oldmath = true - end - end -end - -registerotffeature { - name = "oldmath", - description = "deal with fake opentype fonts", - -- manipulators = { - -- base = manipulate, - -- node = manipulate, - -- }, - initializers = { - base = initialize, - node = initialize, - } -} - -local function initialize(tfmdata,value) if type(value) == "string" then local rawdata = tfmdata.shared.rawdata local rawresources = rawdata and rawdata.resources @@ -318,46 +294,45 @@ registerotffeature { -- is. So the quick and dirty solution is: -- -- add copies in private slots --- use a pseudo feature to acess those +-- use a pseudo feature to access those -- and optionally afterwards replace the original slots -local coverage = { } - -local function initialize(tfmdata,value) - if value then - if not next(coverage) then - for k, char in next, mathematics.alphabets.sr.tf.lcletters do - coverage[char] = 0xFE800 + k - end - for k, char in next, mathematics.alphabets.sr.tf.ucletters do - coverage[char] = 0xFE800 + k - end - fonts.handlers.otf.addfeature { - name = "savemathscripts", - type = "substitution", - data = coverage, - } - end - local characters = tfmdata.characters - local descriptions = tfmdata.descriptions - for char, private in next, coverage do - local data = characters[char] - if data and not characters[private] then - -- otherwise we need a virtual - characters [private] = copytable(data) - descriptions[private] = copytable(descriptions[char]) - end - end - end -end - -registerotffeature { - name = "copymathscripts", - description = "copy math script", - prepend = 1, - initializers = { - base = initialize, - node = initialize, - } -} - +-- local coverage = { } +-- +-- local function initialize(tfmdata,value) +-- if value then +-- if not next(coverage) then +-- for k, char in next, mathematics.alphabets.sr.tf.lcletters do +-- coverage[char] = 0xFE800 + k +-- end +-- for k, char in next, mathematics.alphabets.sr.tf.ucletters do +-- coverage[char] = 0xFE800 + k +-- end +-- fonts.handlers.otf.addfeature { +-- name = "savemathscripts", +-- type = "substitution", +-- data = coverage, +-- } +-- end +-- local characters = tfmdata.characters +-- local descriptions = tfmdata.descriptions +-- for char, private in next, coverage do +-- local data = characters[char] +-- if data and not characters[private] then +-- -- otherwise we need a virtual +-- characters [private] = copytable(data) +-- descriptions[private] = copytable(descriptions[char]) +-- end +-- end +-- end +-- end +-- +-- registerotffeature { +-- name = "copymathscripts", +-- description = "copy math script", +-- prepend = 1, +-- initializers = { +-- base = initialize, +-- node = initialize, +-- } +-- } diff --git a/tex/context/base/mkxl/font-ini.mklx b/tex/context/base/mkxl/font-ini.mklx index 473f37da2..67663b7db 100644 --- a/tex/context/base/mkxl/font-ini.mklx +++ b/tex/context/base/mkxl/font-ini.mklx @@ -657,8 +657,8 @@ % 4:x{\definedfont[Serif sa 4]x}\par % 5:x{\definedfont[Serif sa 5]x}\par -\permanent\def\safontscale{\number\dimexpr\v_font_size_absolute\relax} -\permanent\def\mofontscale{\number\dimexpr\font_basics_set_mapped_fontsize\v_font_size_absolute\relax} +% \permanent\def\safontscale{\number\dimexpr\v_font_size_absolute\relax} +% \permanent\def\mofontscale{\number\dimexpr\font_basics_set_mapped_fontsize\v_font_size_absolute\relax} \mutable\let\somefontname \s!unknown \mutable\let\somefontspec \s!unknown @@ -991,7 +991,7 @@ \newif\ifskipfontcharacteristics \skipfontcharacteristicstrue -\tracingfonts\plussix % <id: name @ size> +% \tracingfonts\plussix % <id: name @ size> %D When fontclasses are used, we define the font global, since namespaces are %D used. Otherwise we parse the specs each time. diff --git a/tex/context/base/mkxl/font-mat.mklx b/tex/context/base/mkxl/font-mat.mklx index 20925157b..0f3a2a222 100644 --- a/tex/context/base/mkxl/font-mat.mklx +++ b/tex/context/base/mkxl/font-mat.mklx @@ -15,6 +15,26 @@ \unprotect +%D The original (\MKIV) approach to bidi is that we have two extra families for +%D regular, bold and pseudobold: +%D +%D regular normal=0 l2r=1 r2l=2 +%D bold normal=3 l2r=4 r2l=5 +%D pseudobold normal=6 l2r=7 r2l=8 +%D +%D where l2r is just an alias. Because we're now using the mirror lookup (like +%D we do a smaller lookup) in the engine we not just have: +%D +%D regular normal=0 +%D bold normal=3 +%D pseudobold normal=6 +%D +%D And when one can wonder if pseudobold is needed (just bolden); we can then +%D actually go down to only two families. It is one of these cases when it hurts +%D to throw away a nice old mechanism that worked quite well so here we keep it +%D commented. For what it's worth: this variant switches a bit faster too and +%D produces less logging but I doubt if anyone will notice that. + %D Be nice: \ifdefined\??fontinstanceready \else \installcorenamespace{fontinstanceready} \fi @@ -55,16 +75,16 @@ % todo: \c_font_fam_mr \aliased\let\c_font_fam_mr \zerocount % math regular -\aliased\let\c_font_fam_mr_lr\plusone % math regular l2r -\aliased\let\c_font_fam_mr_rl\plustwo % math regular r2l +%aliased\let\c_font_fam_mr_lr\plusone % math regular l2r +%aliased\let\c_font_fam_mr_rl\plustwo % math regular r2l \aliased\let\c_font_fam_mb \plusthree % math bold -\aliased\let\c_font_fam_mb_lr\plusfour % math bold l2r -\aliased\let\c_font_fam_mb_rl\plusfive % math bold r2l +%aliased\let\c_font_fam_mb_lr\plusfour % math bold l2r +%aliased\let\c_font_fam_mb_rl\plusfive % math bold r2l \definesystemattribute[mathfamily][public] -\newconditional\c_font_bidirectional_mathstrategy % can be default, not that much overhead: \settrue\c_font_bidirectional_mathstrategy +%newconditional\c_font_bidirectional_mathstrategy % can be default, not that much overhead: \settrue\c_font_bidirectional_mathstrategy \newconditional\c_font_complete_bold_mathstrategy \settrue\c_font_complete_bold_mathstrategy % \frozen ... @@ -106,9 +126,12 @@ \mutable\let\fontfamily\relax % for now public but it is a helper +\newconditional\c_math_last_family_set + \def\font_helpers_set_math_family_indeed_normal#mrtag#family% \fontface etc are also used later on {\let\savedfontbody\fontbody \let\fontfamily#family% + \settrue\c_math_last_family_set % the order is important as we depend on known id's when completing fonts % enabling is needed when we have fallbacks which spoils the families \let\mathsizesuffix\mathscriptscriptsuffix\let\fontface\!!plusthree @@ -139,6 +162,7 @@ \def\font_helpers_set_math_family_indeed_compact#mrtag#family% \fontface etc are also used later on {\let\savedfontbody\fontbody \let\fontfamily#family% + \settrue\c_math_last_family_set \font_helpers_set_math_family_set_scales_compact % the order is important as we depend on known id's when completing fonts % enabling is needed when we have fallbacks which spoils the families @@ -163,6 +187,7 @@ \let\defaultfontclass\fontclass % else truefontname falls back on the wrong one \let\savedfontbody\fontbody \let\fontfamily#familytag% + \settrue\c_math_last_family_set \font_helpers_set_math_family_set_scales_normal \let\mathsizesuffix\mathscriptscriptsuffix\let\fontface\!!plusthree \font_helpers_set_math_family_bold_a\scriptscriptfont#mbfam#mrfam% defines @@ -183,6 +208,7 @@ \let\defaultfontclass\fontclass % else truefontname falls back on the wrong one \let\savedfontbody\fontbody \let\fontfamily#familytag% + \settrue\c_math_last_family_set \let\mathsizesuffix\mathtextsuffix \let\fontface\!!plusone \font_helpers_set_math_family_bold_a\textfont #mbfam#mrfam% defines \font_helpers_set_math_family_bold_a\textfont #mbfam#mrfam% enables @@ -309,77 +335,114 @@ \let\m_font_fallbacks\empty \let\m_font_goodies \empty -\appendtoks % can be analyzed once - % why here .. - %\edef\m_font_class_direction{\ifcsname\??fontclass\fontclass\s!mm\s!direction\endcsname\csname\??fontclass\fontclass\s!mm\s!direction\endcsname\fi}% - \edef\m_font_class_direction{\begincsname\??fontclass\fontclass\s!mm\s!direction\endcsname}% - % ... - \ifx\m_font_class_direction\v!both - \settrue\c_font_bidirectional_mathstrategy - \else - \setfalse\c_font_bidirectional_mathstrategy - \fi -\to \t_font_math_strategies - -\def\font_helpers_bidirectional_mathstrategy_yes - {\font_helpers_set_math_family\c_font_fam_mr_lr\s!mrlr - \font_helpers_set_math_family\c_font_fam_mr_rl\s!mrrl - \ifnum\fontid\textfont\c_font_fam_mr=\fontid\textfont\c_font_fam_mr_lr\else - \font_helpers_bidirectional_mathstrategy_yes_changed - \fi} - -\def\font_helpers_bidirectional_mathstrategy_yes_changed - {\textfont \c_font_fam_mr\textfont \c_font_fam_mr_lr - \scriptfont \c_font_fam_mr\scriptfont \c_font_fam_mr_lr - \scriptscriptfont\c_font_fam_mr\scriptscriptfont\c_font_fam_mr_lr} - -\def\font_helpers_bidirectional_mathstrategy_nop - {\font_helpers_set_math_family\c_font_fam_mr\s!mr - \ifnum\fontid\textfont\c_font_fam_mr_rl=\fontid\textfont\c_font_fam_mr\else - \font_helpers_bidirectional_mathstrategy_nop_changed - \fi} - -\def\font_helpers_bidirectional_mathstrategy_nop_changed - {\textfont \c_font_fam_mr_lr\textfont \c_font_fam_mr - \scriptfont \c_font_fam_mr_lr\scriptfont \c_font_fam_mr - \scriptscriptfont\c_font_fam_mr_lr\scriptscriptfont\c_font_fam_mr - \textfont \c_font_fam_mr_rl\textfont \c_font_fam_mr - \scriptfont \c_font_fam_mr_rl\scriptfont \c_font_fam_mr - \scriptscriptfont\c_font_fam_mr_rl\scriptscriptfont\c_font_fam_mr} +% \appendtoks % can be analyzed once +% % why here .. +% %\edef\m_font_class_direction{\ifcsname\??fontclass\fontclass\s!mm\s!direction\endcsname\csname\??fontclass\fontclass\s!mm\s!direction\endcsname\fi}% +% \edef\m_font_class_direction{\begincsname\??fontclass\fontclass\s!mm\s!direction\endcsname}% +% % ... +% \ifx\m_font_class_direction\v!both +% \settrue\c_font_bidirectional_mathstrategy +% \else +% \setfalse\c_font_bidirectional_mathstrategy +% \fi +% \to \t_font_math_strategies +% +% \def\font_helpers_bidirectional_mathstrategy_yes +% {\font_helpers_set_math_family\c_font_fam_mr_lr\s!mrlr +% \font_helpers_set_math_family\c_font_fam_mr_rl\s!mrrl +% \ifnum\fontid\textfont\c_font_fam_mr=\fontid\textfont\c_font_fam_mr_lr\else +% \font_helpers_bidirectional_mathstrategy_yes_changed +% \fi} +% +% \def\font_helpers_bidirectional_mathstrategy_yes_changed +% {\textfont \c_font_fam_mr\textfont \c_font_fam_mr_lr +% \scriptfont \c_font_fam_mr\scriptfont \c_font_fam_mr_lr +% \scriptscriptfont\c_font_fam_mr\scriptscriptfont\c_font_fam_mr_lr} +% +% \def\font_helpers_bidirectional_mathstrategy_nop +% {\font_helpers_set_math_family\c_font_fam_mr\s!mr +% \ifnum\fontid\textfont\c_font_fam_mr_rl=\fontid\textfont\c_font_fam_mr\else +% \font_helpers_bidirectional_mathstrategy_nop_changed +% \fi} +% +% \def\font_helpers_bidirectional_mathstrategy_nop +% {\font_helpers_set_math_family\c_font_fam_mr\s!mr} +% +% \def\font_helpers_bidirectional_mathstrategy_nop_changed +% {\textfont \c_font_fam_mr_lr\textfont \c_font_fam_mr +% \scriptfont \c_font_fam_mr_lr\scriptfont \c_font_fam_mr +% \scriptscriptfont\c_font_fam_mr_lr\scriptscriptfont\c_font_fam_mr +% \textfont \c_font_fam_mr_rl\textfont \c_font_fam_mr +% \scriptfont \c_font_fam_mr_rl\scriptfont \c_font_fam_mr +% \scriptscriptfont\c_font_fam_mr_rl\scriptscriptfont\c_font_fam_mr} +% +% \appendtoks +% \ifconditional\c_font_bidirectional_mathstrategy +% \font_helpers_bidirectional_mathstrategy_yes +% \else +% \font_helpers_bidirectional_mathstrategy_nop +% \fi +% \to \t_font_math_strategies \appendtoks - \ifconditional\c_font_bidirectional_mathstrategy - \font_helpers_bidirectional_mathstrategy_yes - \else - \font_helpers_bidirectional_mathstrategy_nop - \fi + \font_helpers_set_math_family\c_font_fam_mr\s!mr \to \t_font_math_strategies -\def\font_helpers_complete_bold_mathstrategy_yes_bidi - {\font_helpers_set_math_family_bold\c_font_fam_mb_lr\s!mblr\c_font_fam_mr_lr - \font_helpers_set_math_family_bold\c_font_fam_mb_rl\s!mbrl\c_font_fam_mr_rl - \ifnum\fontid\textfont\c_font_fam_mb=\fontid\textfont\c_font_fam_mb_lr\else - \font_helpers_complete_bold_mathstrategy_yes_bidi_changed - \fi} - -\def\font_helpers_complete_bold_mathstrategy_yes_bidi_changed - {\textfont \c_font_fam_mb\textfont \c_font_fam_mb_lr - \scriptfont \c_font_fam_mb\scriptfont \c_font_fam_mb_lr - \scriptscriptfont\c_font_fam_mb\scriptscriptfont\c_font_fam_mb_lr} +% \def\font_helpers_complete_bold_mathstrategy_yes_bidi +% {\font_helpers_set_math_family_bold\c_font_fam_mb_lr\s!mblr\c_font_fam_mr_lr +% \font_helpers_set_math_family_bold\c_font_fam_mb_rl\s!mbrl\c_font_fam_mr_rl +% \ifnum\fontid\textfont\c_font_fam_mb=\fontid\textfont\c_font_fam_mb_lr\else +% \font_helpers_complete_bold_mathstrategy_yes_bidi_changed +% \fi} +% +% \def\font_helpers_complete_bold_mathstrategy_yes_bidi_changed +% {\textfont \c_font_fam_mb\textfont \c_font_fam_mb_lr +% \scriptfont \c_font_fam_mb\scriptfont \c_font_fam_mb_lr +% \scriptscriptfont\c_font_fam_mb\scriptscriptfont\c_font_fam_mb_lr} +% +% \def\font_helpers_complete_bold_mathstrategy_yes +% {\font_helpers_set_math_family_bold\c_font_fam_mb\s!mb\c_font_fam_mr\relax +% \ifnum\fontid\textfont\c_font_fam_mb_rl=\fontid\textfont\c_font_fam_mb\else +% \font_helpers_complete_bold_mathstrategy_yes_changed +% \fi} +% +% \def\font_helpers_complete_bold_mathstrategy_yes_changed +% {\textfont \c_font_fam_mb_rl\textfont \c_font_fam_mb +% \scriptfont \c_font_fam_mb_rl\scriptfont \c_font_fam_mb +% \scriptscriptfont\c_font_fam_mb_rl\scriptscriptfont\c_font_fam_mb +% \textfont \c_font_fam_mb_lr\textfont \c_font_fam_mb +% \scriptfont \c_font_fam_mb_lr\scriptfont \c_font_fam_mb +% \scriptscriptfont\c_font_fam_mb_lr\scriptscriptfont\c_font_fam_mb} +% +% \def\font_helpers_complete_bold_mathstrategy_nop +% {\ifnum\fontid\textfont\c_font_fam_mb=\fontid\textfont\c_font_fam_mr\else +% \font_helpers_complete_bold_mathstrategy_nop_changed +% \fi} +% +% \def\font_helpers_complete_bold_mathstrategy_nop_changed +% {\textfont \c_font_fam_mb \textfont \c_font_fam_mr +% \scriptfont \c_font_fam_mb \scriptfont \c_font_fam_mr +% \scriptscriptfont\c_font_fam_mb \scriptscriptfont\c_font_fam_mr +% \textfont \c_font_fam_mb_lr\textfont \c_font_fam_mr_lr +% \scriptfont \c_font_fam_mb_lr\scriptfont \c_font_fam_mr_lr +% \scriptscriptfont\c_font_fam_mb_lr\scriptscriptfont\c_font_fam_mr_lr +% \textfont \c_font_fam_mb_rl\textfont \c_font_fam_mr_rl +% \scriptfont \c_font_fam_mb_rl\scriptfont \c_font_fam_mr_rl +% \scriptscriptfont\c_font_fam_mb_rl\scriptscriptfont\c_font_fam_mr_rl} +% +% \def\font_helpers_apply_complete_bold_mathstrategy +% {\ifconditional\c_font_complete_bold_mathstrategy +% \ifconditional\c_font_bidirectional_mathstrategy +% \font_helpers_complete_bold_mathstrategy_yes_bidi +% \else +% \font_helpers_complete_bold_mathstrategy_yes +% \fi +% \else +% \font_helpers_complete_bold_mathstrategy_nop +% \fi} \def\font_helpers_complete_bold_mathstrategy_yes - {\font_helpers_set_math_family_bold\c_font_fam_mb\s!mb\c_font_fam_mr\relax - \ifnum\fontid\textfont\c_font_fam_mb_rl=\fontid\textfont\c_font_fam_mb\else - \font_helpers_complete_bold_mathstrategy_yes_changed - \fi} - -\def\font_helpers_complete_bold_mathstrategy_yes_changed - {\textfont \c_font_fam_mb_rl\textfont \c_font_fam_mb - \scriptfont \c_font_fam_mb_rl\scriptfont \c_font_fam_mb - \scriptscriptfont\c_font_fam_mb_rl\scriptscriptfont\c_font_fam_mb - \textfont \c_font_fam_mb_lr\textfont \c_font_fam_mb - \scriptfont \c_font_fam_mb_lr\scriptfont \c_font_fam_mb - \scriptscriptfont\c_font_fam_mb_lr\scriptscriptfont\c_font_fam_mb} + {\font_helpers_set_math_family_bold\c_font_fam_mb\s!mb\c_font_fam_mr\relax} \def\font_helpers_complete_bold_mathstrategy_nop {\ifnum\fontid\textfont\c_font_fam_mb=\fontid\textfont\c_font_fam_mr\else @@ -389,21 +452,11 @@ \def\font_helpers_complete_bold_mathstrategy_nop_changed {\textfont \c_font_fam_mb \textfont \c_font_fam_mr \scriptfont \c_font_fam_mb \scriptfont \c_font_fam_mr - \scriptscriptfont\c_font_fam_mb \scriptscriptfont\c_font_fam_mr - \textfont \c_font_fam_mb_lr\textfont \c_font_fam_mr_lr - \scriptfont \c_font_fam_mb_lr\scriptfont \c_font_fam_mr_lr - \scriptscriptfont\c_font_fam_mb_lr\scriptscriptfont\c_font_fam_mr_lr - \textfont \c_font_fam_mb_rl\textfont \c_font_fam_mr_rl - \scriptfont \c_font_fam_mb_rl\scriptfont \c_font_fam_mr_rl - \scriptscriptfont\c_font_fam_mb_rl\scriptscriptfont\c_font_fam_mr_rl} + \scriptscriptfont\c_font_fam_mb \scriptscriptfont\c_font_fam_mr} \def\font_helpers_apply_complete_bold_mathstrategy {\ifconditional\c_font_complete_bold_mathstrategy - \ifconditional\c_font_bidirectional_mathstrategy - \font_helpers_complete_bold_mathstrategy_yes_bidi - \else - \font_helpers_complete_bold_mathstrategy_yes - \fi + \font_helpers_complete_bold_mathstrategy_yes \else \font_helpers_complete_bold_mathstrategy_nop \fi} @@ -420,27 +473,33 @@ \fam\zerocount % all characters and symbols are in this family \to \everymathematics +% \protected\def\font_helpers_synchronize_math_family_mr +% {\c_attr_mathfamily\ifconditional\c_font_bidirectional_mathstrategy +% \ifconditional\c_math_right_to_left +% \plustwo +% \else +% \plusone +% \fi +% \else +% \zerocount +% \fi} +% +% \protected\def\font_helpers_synchronize_math_family_mb +% {\c_attr_mathfamily\ifconditional\c_font_bidirectional_mathstrategy +% \ifconditional\c_math_right_to_left +% \ifconditional\c_font_pseudo_bold_math_state\pluseight\else\plusfive\fi +% \else +% \ifconditional\c_font_pseudo_bold_math_state\plusseven\else\plusfour\fi +% \fi +% \else +% \ifconditional\c_font_pseudo_bold_math_state\plussix\else\plusthree\fi +% \fi} + \protected\def\font_helpers_synchronize_math_family_mr - {\c_attr_mathfamily\ifconditional\c_font_bidirectional_mathstrategy - \ifconditional\c_math_right_to_left - \plustwo - \else - \plusone - \fi - \else - \zerocount - \fi} + {\c_attr_mathfamily\zerocount} \protected\def\font_helpers_synchronize_math_family_mb - {\c_attr_mathfamily\ifconditional\c_font_bidirectional_mathstrategy - \ifconditional\c_math_right_to_left - \ifconditional\c_font_pseudo_bold_math_state\pluseight\else\plusfive\fi - \else - \ifconditional\c_font_pseudo_bold_math_state\plusseven\else\plusfour\fi - \fi - \else - \ifconditional\c_font_pseudo_bold_math_state\plussix\else\plusthree\fi - \fi} + {\c_attr_mathfamily\ifconditional\c_font_pseudo_bold_math_state\plussix\else\plusthree\fi} \installcorenamespace{fontmathsynchronizer} \installcorenamespace{fontmathstoredstrategy} @@ -471,7 +530,6 @@ \fi \to \t_font_math_strategies -%def\font_helpers_synchronize_math_bold_strategy{\csname\??fontmathstoredstrategy\fontclass\endcsname} \def\font_helpers_synchronize_math_bold_strategy{\begincsname\??fontmathstoredstrategy\fontclass\endcsname} \newconditional\c_font_pseudo_bold_math_state @@ -569,4 +627,19 @@ \permanent\protected\def\setmscale#1{\ifmmode\scaledmathstyle\numericscale#1\relax\fi} +%D This is nasty, as the engine only stores the last set family parameters (per style) which +%D in our case can be bold. + +\def\font_helpers_synchronize_math_parameters + {\textfont \zerocount\textfont \zerocount + \scriptfont \zerocount\scriptfont \zerocount + \scriptscriptfont\zerocount\scriptscriptfont\zerocount + \setfalse\c_math_last_family_set} + +\appendtoks + \ifconditional\c_math_last_family_set + \font_helpers_synchronize_math_parameters + \fi +\to\everybodyfont + \protect \endinput diff --git a/tex/context/base/mkxl/font-mps.lmt b/tex/context/base/mkxl/font-mps.lmt index 9a123a25e..7afc48d0f 100644 --- a/tex/context/base/mkxl/font-mps.lmt +++ b/tex/context/base/mkxl/font-mps.lmt @@ -46,6 +46,14 @@ function metapost.boundingbox(d,factor) return f_boundingbox(llx,lly,urx,lly,urx,ury,llx,ury) end +function metapost.baseline(d,factor) + local bounds = d.boundingbox + local factor = factor or 1 + local llx = factor*bounds[1] + local urx = factor*bounds[3] + return f_vertical(llx,0,urx,0) +end + function metapost.widthline(d,factor) local bounds = d.boundingbox local factor = factor or 1 diff --git a/tex/context/base/mkxl/font-otl.lmt b/tex/context/base/mkxl/font-otl.lmt index 85b32470b..b7889fc05 100644 --- a/tex/context/base/mkxl/font-otl.lmt +++ b/tex/context/base/mkxl/font-otl.lmt @@ -52,7 +52,7 @@ local report_otf = logs.reporter("fonts","otf loading") local fonts = fonts local otf = fonts.handlers.otf -otf.version = 3.120 -- beware: also sync font-mis.lua and in mtx-fonts +otf.version = 3.121 -- beware: also sync font-mis.lua and in mtx-fonts otf.cache = containers.define("fonts", "otl", otf.version, true) otf.svgcache = containers.define("fonts", "svg", otf.version, true) otf.pngcache = containers.define("fonts", "png", otf.version, true) @@ -426,9 +426,9 @@ local function copytotfm(data,cache_id) character.vitalic = vitalic end -- - local accent = m.accent -- taccent? - if accent then - character.accent = accent + local topanchor = m.topanchor or m.accent -- for now + if topanchor then + character.topanchor = topanchor end -- local kerns = m.kerns @@ -766,14 +766,14 @@ end -- moved from font-oth.lua, todo: also afm -local function getgsub(tfmdata,k,kind,value) +local function getgsub(tfmdata,k,kind,value,script,language) local shared = tfmdata.shared local rawdata = shared and shared.rawdata if rawdata then local sequences = rawdata.resources.sequences if sequences then local properties = tfmdata.properties - local validlookups, lookuplist = otf.collectlookups(rawdata,kind,properties.script,properties.language) + local validlookups, lookuplist = otf.collectlookups(rawdata,kind,script or properties.script,language or properties.language) if validlookups then -- local choice = tonumber(value) or 1 -- no random here (yet) for i=1,#lookuplist do @@ -797,8 +797,8 @@ end otf.getgsub = getgsub -- returns value, gsub_kind -function otf.getsubstitution(tfmdata,k,kind,value) - local found, kind = getgsub(tfmdata,k,kind,value) +function otf.getsubstitution(tfmdata,k,kind,value,script,language) + local found, kind = getgsub(tfmdata,k,kind,value,script,language) if not found then -- elseif kind == "gsub_single" then @@ -812,16 +812,16 @@ end otf.getalternate = otf.getsubstitution -function otf.getmultiple(tfmdata,k,kind) - local found, kind = getgsub(tfmdata,k,kind) +function otf.getmultiple(tfmdata,k,kind,value,script,language) + local found, kind = getgsub(tfmdata,k,kind,value,script,language) if found and kind == "gsub_multiple" then return found end return { k } end -function otf.getkern(tfmdata,left,right,kind) - local kerns = getgsub(tfmdata,left,kind or "kern",true) -- for now we use getsub +function otf.getkern(tfmdata,left,right,kind,value,script,language) + local kerns = getgsub(tfmdata,left,kind or "kern",true,script,language) -- for now we use getsub if kerns then local found = kerns[right] local kind = type(found) diff --git a/tex/context/base/mkxl/font-ots.lmt b/tex/context/base/mkxl/font-ots.lmt index 2ab52a35a..73c9b7c56 100644 --- a/tex/context/base/mkxl/font-ots.lmt +++ b/tex/context/base/mkxl/font-ots.lmt @@ -169,13 +169,8 @@ local forcepairadvance = false -- for testing local repeatlastmultiple = context and true -directives.register("otf.forcediscretionaries",function(v) - forcediscretionaries = v -end) - -directives.register("otf.forcepairadvance",function(v) - forcepairadvance = v -end) +directives.register("otf.forcediscretionaries", function(v) forcediscretionaries = v end) +directives.register("otf.forcepairadvance", function(v) forcepairadvance = v end) local report_direct = logs.reporter("fonts","otf direct") local report_subchain = logs.reporter("fonts","otf subchain") @@ -200,7 +195,6 @@ local getboth = nuts.getboth local setboth = nuts.setboth local getid = nuts.getid local getstate = nuts.getstate -local setsubtype = nuts.setsubtype local getchar = nuts.getchar local setchar = nuts.setchar local getdisc = nuts.getdisc @@ -264,7 +258,6 @@ local lefttoright_code = nodes.dirvalues.lefttoright local righttoleft_code = nodes.dirvalues.righttoleft local discretionarydisc_code = nodes.disccodes.discretionary ------ ligatureglyph_code = glyphcodes.ligature local injections = nodes.injections local setmark = injections.setmark @@ -299,9 +292,9 @@ local marks = false local classes = false local currentfont = false local currentdynamic = false -local currentscale = 1000 -- false -local currentxscale = 1000 -- false -local currentyscale = 1000 -- false +local currentscale = 1000 +local currentxscale = 1000 +local currentyscale = 1000 local factor = 0 local threshold = 0 local checkmarks = false @@ -503,7 +496,6 @@ local function markstoligature(head,start,stop,char) end resetinjection(base) setchar(base,char) - -- setsubtype(base,ligatureglyph_code) setcomponents(base,start) setlink(prev,base,next) flushcomponents(start) @@ -525,7 +517,7 @@ local glyphoptioncodes = tex.glyphoptioncodes local no_left_ligature_code = glyphoptioncodes.noleftligature local no_right_ligature_code = glyphoptioncodes.norightligature -local no_left_kern_code = glyphoptioncodes.noleftkern +----- no_left_kern_code = glyphoptioncodes.noleftkern local no_right_kern_code = glyphoptioncodes.norightkern local hasglyphoption = nuts.hasglyphoption @@ -558,7 +550,7 @@ local function toligature(head,start,stop,char,dataset,sequence,skiphash,discfou if start == stop and getchar(start) == char and not hasmarks then resetinjection(start) setchar(start,char) --- fonts.collections.direct(start) + -- fonts.collections.direct(start) return head, start end if inhibited(start,stop) then @@ -575,9 +567,8 @@ local function toligature(head,start,stop,char,dataset,sequence,skiphash,discfou end resetinjection(base) setchar(base,char) --- fonts.collections.direct(base) + -- fonts.collections.direct(base) setoptions(base,getoptions(start) | getoptions(stop)) -- maybe only lig options - -- setsubtype(base,ligatureglyph_code) setcomponents(base,comp) setlink(prev,base,next) if not discfound then @@ -1379,7 +1370,7 @@ as less as needed but that would also make the code even more messy.</p> -- To be done (example needed): what if > 1 steps --- this is messy: do we need this disc checking also in alternaties? +-- this is messy: do we need this disc checking also in alternates? local function reportzerosteps(dataset,sequence) logwarning("%s: no steps",cref(dataset,sequence)) @@ -2058,9 +2049,7 @@ local function setdiscchecked(d,pre,post,replace) setdisc(d,pre,post,replace) end -local noflags = { false, false, false, false } - -local function chainrun(head,start,last,dataset,sequence,rlmode,skiphash,ck) +local function chainrun(head,start,last,dataset,sequence,rlmode,skiphash,ck,where) local size = ck[5] - ck[4] + 1 local chainlookups = ck[6] @@ -2076,26 +2065,30 @@ local function chainrun(head,start,last,dataset,sequence,rlmode,skiphash,ck) -- -- bad rules -- end local chainlookup = chainlookups[1] - for j=1,#chainlookup do - local chainstep = chainlookup[j] - if chainstep then - local chainkind = chainstep.type - local chainproc = chainprocs[chainkind] - if chainproc then - local ok - -- HH: chainindex 1 added here (for KAI to check too), there are weird ligatures e.g. - -- char + mark -> char where mark has to disappear - -- head, start, ok = chainproc(head,start,last,dataset,sequence,chainstep,rlmode,skiphash,1) - head, start, ok = chainproc(head,start,last,dataset,sequence,chainstep,rlmode,skiphash) - if ok then - done = true + if chainlookup then + for j=1,#chainlookup do + local chainstep = chainlookup[j] + if chainstep then + local chainkind = chainstep.type + local chainproc = chainprocs[chainkind] + if chainproc then + local ok + -- HH: chainindex 1 added here (for KAI to check too), there are weird ligatures e.g. + -- char + mark -> char where mark has to disappear + -- head, start, ok = chainproc(head,start,last,dataset,sequence,chainstep,rlmode,skiphash,1) + head, start, ok = chainproc(head,start,last,dataset,sequence,chainstep,rlmode,skiphash) + if ok then + done = true + end + else + logprocess("%s: %s is not yet supported (1)",cref(dataset,sequence),chainkind) end else - logprocess("%s: %s is not yet supported (1)",cref(dataset,sequence),chainkind) + logprocess("%s: has an issue (1)",cref(dataset,sequence)) end - else - logprocess("%s: has an issue (1)",cref(dataset,sequence)) end + else + -- whatever end else @@ -2185,7 +2178,7 @@ local function chainrun(head,start,last,dataset,sequence,rlmode,skiphash,ck) else done = true if trace_contexts then - logprocess("%s: skipping match",cref(dataset,sequence)) + logprocess("%s: skipping match @ %i",cref(dataset,sequence),where) end end end @@ -2215,6 +2208,8 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck) local last = start local prev = getprev(start) local hasglue = false + local useddisc = nil -- new 2022-09-25 + local usedstart = start -- new 2022-09-25 -- fishy: so we can overflow and then go on in the sweep? -- todo : id can also be glue_code as we checked spaces @@ -2376,15 +2371,14 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck) end end end + local done = false if lookaheaddisc then - local cf = start local cl = getprev(lookaheaddisc) local cprev = getprev(start) local insertedmarks = 0 - while cprev do local nxt, char = isnextchar(cf,currentfont,currentdynamic,currentscale,currentxscale,currentyscale) if char and marks[char] then @@ -2423,14 +2417,14 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck) end if not notmatchpre[lookaheaddisc] then local ok = false - cf, start, ok = chainrun(cf,start,cl,dataset,sequence,rlmode,skiphash,ck) + cf, start, ok = chainrun(cf,start,cl,dataset,sequence,rlmode,skiphash,ck,1) if ok then done = true end end if not notmatchreplace[lookaheaddisc] then local ok = false - new, cnew, ok = chainrun(new,cnew,clast,dataset,sequence,rlmode,skiphash,ck) + new, cnew, ok = chainrun(new,cnew,clast,dataset,sequence,rlmode,skiphash,ck,2) if ok then done = true end @@ -2441,16 +2435,14 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck) setdisc(lookaheaddisc,cf,post,new) end start = getprev(lookaheaddisc) + useddisc = lookaheaddisc -- new 2022-09-25 sweephead[cf] = getnext(clast) or false sweephead[new] = getnext(cl) or false - elseif backtrackdisc then - local cf = getnext(backtrackdisc) local cl = start local cnext = getnext(start) local insertedmarks = 0 - while cnext do local nxt, char = isnextchar(cnext,currentfont,currentdynamic,currentscale,currentxscale,currentyscale) if char and marks[char] then @@ -2476,14 +2468,14 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck) end if not notmatchpost[backtrackdisc] then local ok = false - cf, start, ok = chainrun(cf,start,last,dataset,sequence,rlmode,skiphash,ck) + cf, start, ok = chainrun(cf,start,last,dataset,sequence,rlmode,skiphash,ck,3) if ok then done = true end end if not notmatchreplace[backtrackdisc] then local ok = false - new, cnew, ok = chainrun(new,cnew,clast,dataset,sequence,rlmode,skiphash,ck) + new, cnew, ok = chainrun(new,cnew,clast,dataset,sequence,rlmode,skiphash,ck,4) if ok then done = true end @@ -2504,33 +2496,57 @@ local function chaindisk(head,start,dataset,sequence,rlmode,skiphash,ck) setdisc(backtrackdisc,pre,post,replace) end start = getprev(backtrackdisc) + useddisc = backtrackdisc -- new 2022-09-25 sweephead[post] = getnext(clast) or false sweephead[replace] = getnext(last) or false - else local ok = false - head, start, ok = chainrun(head,start,last,dataset,sequence,rlmode,skiphash,ck) + head, start, ok = chainrun(head,start,last,dataset,sequence,rlmode,skiphash,ck,5) if ok then done = true end end - - return head, start, done + if useddisc and start ~= usedstart then -- make this option per font -- new 2022-09-25 + start = getnext(start) -- new 2022-09-25 + end -- new 2022-09-25 + return head, start, done, useddisc -- new 2022-09-25 end -local function chaintrac(head,start,dataset,sequence,rlmode,skiphash,ck,match,discseen,sweepnode) - local rule = ck[1] - local lookuptype = ck[8] or ck[2] - local nofseq = #ck[3] - local first = ck[4] - local last = ck[5] - local char = getchar(start) - logwarning("%s: rule %s %s at char %s for (%s,%s,%s) chars, lookuptype %a, %sdisc seen, %ssweeping", - cref(dataset,sequence),rule,match and "matches" or "nomatch", - gref(char),first-1,last-first+1,nofseq-last,lookuptype, - discseen and "" or "no ", sweepnode and "" or "not ") +local chaintrac do + + local level = 0 + local last = { } + + chaintrac = function(head,start,dataset,sequence,rlmode,skiphash,ck,match,discseen,sweepnode) + if dataset then + level = level + 1 + last[level] = start + local rule = ck[1] + local lookuptype = ck[8] or ck[2] + local nofseq = #ck[3] -- ck[3].n + local first = ck[4] + local last = ck[5] + local char = getchar(start) + logwarning("+ %i : %s: rule %s %s at char %s for (%s,%s,%s) chars, lookuptype %a, %sdisc seen, %ssweeping", + level,cref(dataset,sequence),rule,match and "matches" or "nomatch", + gref(char),first-1,last-first+1,nofseq-last,lookuptype, + discseen and "" or "no ", sweepnode and "" or "not ") + else + -- (start,done) + local what = start and "done" or "continue" + local where = head == last[level] and "same" or "different" + local char = getchar(head) + if char then + logwarning("- %i : %s at char %s, %s node",level,what,gref(char),where) + else + logwarning("- %i : %s, %s node",level,what,where) + end + level = level - 1 + end + end + end -- The next one is quite optimized but still somewhat slow, fonts like ebgaramond @@ -2544,6 +2560,9 @@ end -- the previous disc .. such be it (<before><disc><current=fl><after> with only f done) local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,skiphash) + if not contexts then + return head, start, false + end -- optimizing for rlmode gains nothing local sweepnode = sweepnode local sweeptype = sweeptype @@ -2579,17 +2598,17 @@ local function handle_contextchain(head,start,dataset,sequence,contexts,rlmode,s -- fonts can have many steps (each doing one check) or many contexts -- todo: make a per-char cache so that we have small contexts (when we have a context - -- n == 1 and otherwise it can be more so we can even distingish n == 1 or more) + -- n == 1 and otherwise it can be more so we can even distinguish n == 1 or more) local nofcontexts = contexts.n -- #contexts local startchar = nofcontext == 1 or ischar(start,currentfont) -- already checked for k=1,nofcontexts do -- does this disc mess work well with n > 1 - local ck = contexts[k] - local seq = ck[3] - local f = ck[4] -- first current -local last = start + local ck = contexts[k] + local seq = ck[3] + local f = ck[4] -- first current + local last = start if not startchar or not seq[f][startchar] then -- report("no hit in %a at %i of %i contexts",sequence.type,k,nofcontexts) goto next @@ -2600,7 +2619,9 @@ local last = start else local l = ck[5] -- last current local current = start --- local last = start + -- local last = start + + -- current match if l > f then -- before/current/after | before/current | current/after @@ -2712,7 +2733,7 @@ local last = start -- before if f > 1 then - if startprev then + -- if startprev then -- new 2022-09-25 local prev = startprev if prereplace and prev == checkdisc then prev = getprev(sweepnode) @@ -2837,9 +2858,9 @@ local last = start else goto next end - else - goto next - end + -- else -- new 2022-09-25 + -- goto next -- new 2022-09-25 + -- end -- new 2022-09-25 end -- after @@ -2968,19 +2989,21 @@ local last = start chaintrac(head,start,dataset,sequence,rlmode,skipped and skiphash,ck,true,discseen,sweepnode) end if discseen or sweepnode then + -- When we process a disc we can collapse and therefore we backtrack one node (start) and + -- reprocess. This is needed because there might be more in the collapsed list. head, start, done = chaindisk(head,start,dataset,sequence,rlmode,skipped and skiphash,ck) else - head, start, done = chainrun(head,start,last,dataset,sequence,rlmode,skipped and skiphash,ck) + head, start, done = chainrun(head,start,last,dataset,sequence,rlmode,skipped and skiphash,ck,6) + end + if trace_contexts then + chaintrac(start,done) end if done then break -- else -- next context end - ::next:: - -- if trace_chains then - -- chaintrac(head,start,dataset,sequence,rlmode,skipped and skiphash,ck,false,discseen,sweepnode) - -- end + ::next:: end if discseen then notmatchpre = { } @@ -2999,21 +3022,46 @@ handlers.gsub_reversecontextchain = handle_contextchain handlers.gpos_contextchain = handle_contextchain handlers.gpos_context = handle_contextchain --- this needs testing +-- local function chained_contextchain(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash) +-- local steps = currentlookup.steps +-- local nofsteps = currentlookup.nofsteps +-- if nofsteps > 1 then +-- reportmoresteps(dataset,sequence) +-- end +-- -- probably wrong +-- local l = steps[1].coverage[getchar(start)] +-- if l then +-- return handle_contextchain(head,start,dataset,sequence,l,rlmode,skiphash) +-- else +-- return head, start, false +-- end +-- end +-- new 2022-09-25 + local function chained_contextchain(head,start,stop,dataset,sequence,currentlookup,rlmode,skiphash) local steps = currentlookup.steps local nofsteps = currentlookup.nofsteps - if nofsteps > 1 then - reportmoresteps(dataset,sequence) - end - -- probably wrong - local l = steps[1].coverage[getchar(start)] - if l then - return handle_contextchain(head,start,dataset,sequence,l,rlmode,skiphash) + local char = getchar(start) + if nofsteps == 1 then + local s = steps[1] + local l = s.coverage[char] + if l then + return handle_contextchain(head,start,dataset,sequence,l,rlmode,skiphash) + end else - return head, start, false + for i=1,nofsteps do + local s = steps[i] + local l = s.coverage[char] + if l then + local h, s, d = handle_contextchain(head,start,dataset,sequence,l,rlmode,skiphash) + if d then + return h, s, d + end + end + end end + return head, start, false end chainprocs.gsub_context = chained_contextchain @@ -3152,7 +3200,7 @@ do -- overcome local limit end -- Functions like kernrun, comprun etc evolved over time and in the end look rather --- complex. It's a bit of a compromis between extensive copying and creating subruns. +-- complex. It's a bit of a compromise between extensive copying and creating subruns. -- The logic has been improved a lot by Kai and Ivo who use complex fonts which -- really helped to identify border cases on the one hand and get insight in the diverse -- ways fonts implement features (not always that consistent and efficient). At the same @@ -3259,7 +3307,7 @@ local function kernrun(disc,k_run,...) if done and trace_testruns then report_disc("done",disc) end --- return nextstart, done + -- return nextstart, done return nextstart end @@ -3313,7 +3361,7 @@ local function comprun(disc,c_run,...) -- vararg faster than the whole list setdisc(disc,pre,post,replace) end -- --- return getnext(disc), renewed + -- return getnext(disc), renewed return getnext(disc) end @@ -3442,7 +3490,7 @@ local function testrun(disc,t_run,c_run,...) end end -- next can have changed (copied list) --- return getnext(disc), renewed + -- return getnext(disc), renewed return getnext(disc) end @@ -3978,20 +4026,13 @@ do start = nxt elseif id == disc_code then if not discs or discs[start] == true then --- local ok if gpossing then --- start, ok = kernrun(start,k_run_single, lookupcache,step,dataset,sequence,rlmode,skiphash,handler) start = kernrun(start,k_run_single, lookupcache,step,dataset,sequence,rlmode,skiphash,handler) elseif forcetestrun then --- start, ok = testrun(start,t_run_single,c_run_single,lookupcache,step,dataset,sequence,rlmode,skiphash,handler) start = testrun(start,t_run_single,c_run_single,lookupcache,step,dataset,sequence,rlmode,skiphash,handler) else --- start, ok = comprun(start,c_run_single, lookupcache,step,dataset,sequence,rlmode,skiphash,handler) start = comprun(start,c_run_single, lookupcache,step,dataset,sequence,rlmode,skiphash,handler) end - -- if ok then - -- done = true - -- end else start = nxt end @@ -4002,7 +4043,7 @@ do start = nxt -- elseif id == par_code and startofpar(start) then -- rlparmode, rlmode = pardirstate(start) - -- start = nxt + -- start = nxt else start = nxt end @@ -4051,15 +4092,11 @@ do start = nxt elseif id == disc_code then if not discs or discs[start] == true then --- local ok if gpossing then --- start, ok = kernrun(start,k_run_multiple, steps,nofsteps,dataset,sequence,rlmode,skiphash,handler) start = kernrun(start,k_run_multiple, steps,nofsteps,dataset,sequence,rlmode,skiphash,handler) elseif forcetestrun then --- start, ok = testrun(start,t_run_multiple,c_run_multiple,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler) start = testrun(start,t_run_multiple,c_run_multiple,steps,nofsteps,dataset,sequence,rlmode,skiphash,handler) else --- start, ok = comprun(start,c_run_multiple, steps,nofsteps,dataset,sequence,rlmode,skiphash,handler) start = comprun(start,c_run_multiple, steps,nofsteps,dataset,sequence,rlmode,skiphash,handler) end else @@ -4098,9 +4135,6 @@ do currentfont = font currentdynamic = false --- currentscale = false --- currentxscale = false --- currentyscale = false currentscale = 1000 currentxscale = 1000 currentyscale = 1000 @@ -4191,7 +4225,7 @@ do start = nxt -- elseif id == par_code and startofpar(start) then -- rlparmode, rlmode = pardirstate(start) - -- start = nxt + -- start = nxt else start = nxt end diff --git a/tex/context/base/mkxl/font-pre.mkxl b/tex/context/base/mkxl/font-pre.mkxl index 3c7a01857..8cb0b5b6c 100644 --- a/tex/context/base/mkxl/font-pre.mkxl +++ b/tex/context/base/mkxl/font-pre.mkxl @@ -427,10 +427,6 @@ language=dflt, script=math] -\definefontfeature - [oldmath] - [oldmath=yes] - \ifdefined\mathnolimitsmode \mathnolimitsmode\plusone % font driven (only opentype) \fi diff --git a/tex/context/base/mkxl/grph-trf.mkxl b/tex/context/base/mkxl/grph-trf.mkxl index a08cec904..0f1458873 100644 --- a/tex/context/base/mkxl/grph-trf.mkxl +++ b/tex/context/base/mkxl/grph-trf.mkxl @@ -117,7 +117,7 @@ \setupcurrentscale[#2]% \fi % - \dowithnextboxcs\grph_scale_finish\hbox} + \dowithnextboxcs\grph_scale_finish\naturalhbox} % intercept direction \def\grph_scale_finish {% todo: p_scale_ diff --git a/tex/context/base/mkxl/lpdf-ano.lmt b/tex/context/base/mkxl/lpdf-ano.lmt index 85fe050a2..b0d398457 100644 --- a/tex/context/base/mkxl/lpdf-ano.lmt +++ b/tex/context/base/mkxl/lpdf-ano.lmt @@ -386,6 +386,8 @@ local v_minheight = variables.minheight local v_fit = variables.fit local v_tight = variables.tight +local c_realpageno = tex.iscount("realpageno") + -- nicer is to create dictionaries and set properties but it's a bit overkill -- The problem with the following settings is that they are guesses: we never know @@ -466,7 +468,7 @@ end) local function flushdestination(specification) local names = specification.names local view = specification.view - local r = pdfpagereference(texgetcount("realpageno")) + local r = pdfpagereference(c_realpageno) if (references.innermethod ~= v_name) and (view == defaultview or not view or view == "") then r = pagedestinations[r] else @@ -1079,7 +1081,7 @@ end function specials.deltapage(var,actions) local p = tonumber(var.operation) if p then - p = references.checkedrealpage(p + texgetcount("realpageno")) + p = references.checkedrealpage(p + texgetcount(c_realpageno)) return pdflinkpage(p) end end diff --git a/tex/context/base/mkxl/lpdf-emb.lmt b/tex/context/base/mkxl/lpdf-emb.lmt index 6932879e7..3ce288b48 100644 --- a/tex/context/base/mkxl/lpdf-emb.lmt +++ b/tex/context/base/mkxl/lpdf-emb.lmt @@ -872,6 +872,7 @@ do FontName = basefont, Flags = 4, FontBBox = fontbbox, +-- FontMatrix = pdfarray { 0.001, 0, 0, 0.001, 0, 0 }, Ascent = scale(ascender), Descent = scale(descender), ItalicAngle = round(italicangle or 0), @@ -971,7 +972,6 @@ do return int4tag .. tointeger4(n) end - local e = false local z = byte("0") local dp = 10 local ep = 11 @@ -985,6 +985,7 @@ do local s = fg(v) local t = { [0] = realtag } local n = 0 + local e = false for s in gmatch(s,".") do if s == "e" or s == "E" then e = true @@ -1027,6 +1028,73 @@ do return t end + -- -- An alternative + -- + -- local fg = formatters["%0.14gE%i"] + -- + -- todictreal = function(v) + -- local E = 0 + -- if v >= 10.0 then + -- while v >= 10.0 do + -- v = v / 10.0 + -- E = E + 1 + -- end + -- elseif v < 1.0 then + -- while v < 1.0 do + -- v = v * 10.0 + -- E = E - 1 + -- end + -- end + -- local s = fg(v,E) + -- local t = { [0] = realtag } + -- local n = 0 + -- local e = false + -- for s in gmatch(s,".") do + -- if s == "e" or s == "E" then + -- e = true + -- elseif s == "+" then + -- -- skip + -- elseif s == "-" then + -- n = n + 1 + -- if e then + -- t[n] = em + -- e = false + -- else + -- t[n] = mn + -- end + -- else + -- if e then + -- n = n + 1 + -- t[n] = ep + -- e = false + -- end + -- n = n + 1 + -- if s == "." then + -- t[n] = dp + -- else + -- t[n] = byte(s) - z + -- end + -- end + -- end + -- n = n + 1 + -- t[n] = es + -- if (n % 2) ~= 0 then + -- n = n + 1 + -- t[n] = es + -- end + -- local j = 0 + -- for i=1,n,2 do + -- j = j + 1 + -- t[j] = char(t[i]*0x10+t[i+1]) + -- end + -- -- print(v,s) + -- -- for i=0,j do + -- -- print(string.format("%02X",utf.byte(t[i]))) + -- -- end + -- t = concat(t,"",0,j) + -- return t + -- end + todictnumber = function(n) if not n or n == 0 then return todictinteger(0) @@ -1063,7 +1131,8 @@ do local function todictdeltas(t) local r = { } for i=1,#t do - r[i] = todictnumber(t[i]-(t[i-1] or 0)) +-- r[i] = todictnumber(t[i]-(t[i-1] or 0)) + r[i] = todictnumber(t[i]+(t[i-1] or 0)) end return concat(r) end @@ -1140,7 +1209,7 @@ do -- local charstrings = fontfile.charstrings local nofglyphs = #charstrings + 1 - local fontmatrix = { 0.001, 0, 0, 0.001, 0, 0 } -- todo +-- local fontmatrix = { 0.001, 0, 0, 0.001, 0, 0 } -- todo local fontbbox = fontfile.fontbbox local defaultwidth = cffinfo.defaultwidth or 0 local nominalwidth = cffinfo.nominalwidth or 0 @@ -1153,6 +1222,8 @@ do local bluefuzz = cffinfo.bluefuzz local stdhw = cffinfo.stdhw local stdvw = cffinfo.stdvw + local stemsnaph = cffinfo.stemsnaph + local stemsnapv = cffinfo.stemsnapv -- if defaultwidth == 0 then defaultwidth = nil end if nomimalwidth == 0 then nominalwidth = nil end @@ -1163,8 +1234,10 @@ do if bluescale then bluescale = todictnumber(bluescale) end if blueshift then blueshift = todictnumber(blueshift) end if bluefuzz then bluefuzz = todictnumber(bluefuzz) end - if stdhw then stdhw = todictdeltas(stdhw) end - if stdvw then stdvw = todictdeltas(stdvw) end + if stemsnaph then stemsnaph = todictarray(stemsnaph) end + if stemsnapv then stemsnapv = todictarray(stemsnapv) end + if stdhw then stdhw = todictnumber(stdhw) end + if stdvw then stdvw = todictnumber(stdvw) end -- local fontversion = todictstring(fontfile,fontheader.fontversion or "uknown version") local familyname = todictstring(fontfile,cffinfo.familyname or names.family or basefontname) @@ -1177,7 +1250,7 @@ do local underlineposition = todictnumber(cffinfo.underlineposition) local underlinethickness = todictnumber(cffinfo.underlinethickness) local charstringtype = todictnumber(2) - local fontmatrix = todictarray(fontmatrix) +-- local fontmatrix = todictarray(fontmatrix) local ros = todictstring(fontfile,"Adobe") -- registry .. todictstring(fontfile,"Identity") -- identity .. todictnumber(0) -- supplement @@ -1191,18 +1264,21 @@ do -- local defaultwidthx = todictnumber(defaultwidth) local nominalwidthx = todictnumber(nominalwidth) + -- the order of the blues is important! local private = "" - .. (defaultwidthx and (defaultwidthx .. todictkey(20)) or "") - .. (nominalwidthx and (nominalwidthx .. todictkey(21)) or "") - .. (bluevalues and (bluevalues .. todictkey(6)) or "") - .. (otherblues and (otherblues .. todictkey(7)) or "") - .. (familyblues and (familyblues .. todictkey(8)) or "") - .. (familyotherblues and (familyotherblues .. todictkey(9)) or "") - .. (bluescale and (bluescale .. todictkey(12,9)) or "") - .. (blueshift and (blueshift .. todictkey(12,10)) or "") - .. (bluefuzz and (bluefuzz .. todictkey(12,11)) or "") - .. (stdhw and (stdhw .. todictkey(12,12)) or "") - .. (stdvw and (stdvw .. todictkey(12,13)) or "") + .. (bluevalues and (bluevalues .. todictkey( 6)) or "") + .. (otherblues and (otherblues .. todictkey( 7)) or "") + .. (familyblues and (familyblues .. todictkey( 8)) or "") + .. (familyotherblues and (familyotherblues .. todictkey( 9)) or "") + .. (bluescale and (bluescale .. todictkey(12, 9)) or "") + .. (blueshift and (blueshift .. todictkey(12,10)) or "") + .. (bluefuzz and (bluefuzz .. todictkey(12,11)) or "") + .. (stdhw and (stdhw .. todictkey(10)) or "") + .. (stdvw and (stdvw .. todictkey(11)) or "") + .. (stemsnaph and (stemsnaph .. todictkey(12,12)) or "") + .. (stemsnapv and (stemsnapv .. todictkey(12,13)) or "") + .. (defaultwidthx and (defaultwidthx .. todictkey(20)) or "") + .. (nominalwidthx and (nominalwidthx .. todictkey(21)) or "") local privatesize = todictnumber(#private) local privatespec = privatesize .. privateoffset -- @@ -1245,7 +1321,7 @@ do .. underlineposition .. todictkey(12, 3) .. underlinethickness .. todictkey(12, 4) .. charstringtype .. todictkey(12, 6) - .. fontmatrix .. todictkey(12, 7) +-- .. fontmatrix .. todictkey(12, 7) .. strokewidth .. todictkey(12, 8) .. topvars } @@ -1272,6 +1348,10 @@ do -- -- fdselect -- + -- see printer mail thread / experiments with Leah Neukirchen: some printers + -- (probaby with an old GS on board) need this matrix because oitherwise they + -- accumulate the top one (resulting in very tiny invisible results) + -- local fdselect = tocardinal1(3) -- format .. tocardinal2(1) -- n of ranges @@ -1301,8 +1381,8 @@ do offset = writestring(target,private,offset,"private") -- local fdarray = { - fontname .. todictkey(12,38) - .. privatespec .. todictkey(18) + fontname .. todictkey(12,38) + .. privatespec .. todictkey(18) -- case 1 } fdarrayoffset = todictoffset(offset) offset = writeindex(target,fdarray,offset,"fdarray") @@ -1314,19 +1394,18 @@ do .. charsetoffset .. todictkey(15) .. fdarrayoffset .. todictkey(12,36) .. fdselectoffset .. todictkey(12,37) - .. privatespec .. todictkey(18) + .. privatespec .. todictkey(18) -- case 2 target[dictof] = topdict .. topvars -- target = concat(target) -- if trace_details then - -- local name = "temp.cff" - -- report_fonts("saving %a",name) - -- io.savedata(name,target) - -- inspect(fonts.handlers.otf.readers.cffcheck(name)) + -- local name = "temp.cff" + -- report_fonts("saving %a",name) + -- io.savedata(name,target) + -- inspect(fonts.handlers.otf.readers.cffcheck(name)) -- end return target end - end -- todo: check widths (missing a decimal) @@ -1468,6 +1547,7 @@ do FontName = basefont, Flags = 4, FontBBox = fontbbox, +-- FontMatrix = pdfarray { 0.001, 0, 0, 0.001, 0, 0 }, Ascent = scale(ascender), Descent = scale(descender), ItalicAngle = round(italicangle or 0), diff --git a/tex/context/base/mkxl/lpdf-lmt.lmt b/tex/context/base/mkxl/lpdf-lmt.lmt index bf1142119..d937e3dea 100644 --- a/tex/context/base/mkxl/lpdf-lmt.lmt +++ b/tex/context/base/mkxl/lpdf-lmt.lmt @@ -202,6 +202,7 @@ local usedfontstreams = { } local usedindices = setmetatableindex(function(t,k) local n = 0 +-- n = 31 local v = setmetatableindex(function(tt,kk) if n >= 0xFFFF then report_fonts("registering character index: overflow in hash %a, todo: use overflow font") @@ -2488,11 +2489,12 @@ end do - local names = { } - local cache = { } - local nofpages = 0 + local names = { } + local cache = { } + local nofpages = 0 - local texgetcount = tex.getcount + local texgetcount = tex.getcount + local c_realpageno = tex.iscount("realpageno") pdfreserveobject = function(name) nofobjects = nofobjects + 1 @@ -2511,7 +2513,7 @@ do pdfpagereference = function(n,complete) -- true | false | nil | n [true,false] if n == true or not n then complete = n - n = texgetcount("realpageno") + n = texgetcount(c_realpageno) end if n > nofpages then nofpages = n diff --git a/tex/context/base/mkxl/lpdf-rul.lmt b/tex/context/base/mkxl/lpdf-rul.lmt index ca38dcaa8..2c8227be9 100644 --- a/tex/context/base/mkxl/lpdf-rul.lmt +++ b/tex/context/base/mkxl/lpdf-rul.lmt @@ -146,9 +146,7 @@ FakeRule(RuleWidth,RuleHeight,RuleDepth,RuleThickness,RuleColor); setdimen("d_rule_h", h) setdimen("d_rule_v", v) setdimen("d_rule_line", p.line or 65536) --- setdimen("d_rule_offset", p.offset or 0) setdimen("d_rule_offset", (p.offset or 0) * 65536) --- setmacro("m_rule_factor", (p.factor or 0) * bpfactor) -- needs checking setdimen("d_rule_factor", (p.factor or 0)) -- needs checking setmacro("m_rule_option", p.option or "") setmacro("m_rule_direction", p.direction or lefttoright_code) diff --git a/tex/context/base/mkxl/math-act.lmt b/tex/context/base/mkxl/math-act.lmt index f0b132d66..7fb4f9b9f 100644 --- a/tex/context/base/mkxl/math-act.lmt +++ b/tex/context/base/mkxl/math-act.lmt @@ -23,6 +23,11 @@ local trace_tweaking = false trackers.register("math.tweaks", function(v) local report_math = logs.reporter("mathematics","initializing") local report_mathtweak = logs.reporter("mathematics","tweak") +local getfontoffamily = tex.getfontoffamily +local fontcharacters = fonts.hashes.characters +local chardata = characters.data +local extensibles = mathematics.extensibles + local context = context local commands = commands local mathematics = mathematics @@ -166,28 +171,6 @@ function mathematics.checkaccentbaseheight(target,original) end end --- function mathematics.checkprivateparameters(target,original) --- local mathparameters = target.mathparameters --- if mathparameters then --- local parameters = target.parameters --- local properties = target.properties --- if parameters then --- local size = parameters.size --- if size then --- -- gone --- elseif properties then --- report_math("invalid parameters in font %a",properties.fullname or "?") --- else --- report_math("invalid parameters in font") --- end --- elseif properties then --- report_math("no parameters in font %a",properties.fullname or "?") --- else --- report_math("no parameters and properties in font") --- end --- end --- end - function mathematics.overloadparameters(target,original) if use_math_goodies then local mathparameters = target.mathparameters @@ -200,6 +183,8 @@ function mathematics.overloadparameters(target,original) if mathematics then local parameters = mathematics.parameters local bigslots = mathematics.bigslots or mathematics.bigs +-- inspect(parameters) +-- print("before",mathparameters.AxisHeight) if parameters then if trace_defining then report_math("overloading math parameters in %a @ %p",target.properties.fullname,target.parameters.size) @@ -222,6 +207,7 @@ function mathematics.overloadparameters(target,original) end mathparameters[name] = newvalue end +-- print("after ",mathparameters.AxisHeight) for name, value in next, parameters do local tvalue = type(value) if tvalue == "string" then @@ -265,7 +251,7 @@ local function report_tweak(fmt,target,original,...) (target and target .shared.rawdata.metadata) local parameters = target.parameters report_mathtweak( - "%a, size %p, math size %i, %s", + "%a, size %P, math size %i, %s", metadata and metadata.fontname or "unknown", parameters.size or 655360, parameters.mathsize or 1, @@ -276,6 +262,39 @@ local function report_tweak(fmt,target,original,...) end end +mathtweaks.subsets = { + acenorsuvxz = { 0x1D44E, 0x1D450, 0x1D452, 0x1D45B, 0x1D45C, 0x1D45F, 0x1D460, 0x1D462, 0x1D463, 0x1D465, 0x1D467 }, + bhklt = { 0x1D44F, 0x1D455, 0x1D458, 0x1D459, 0x1D461 }, + d = { 0x1D451 }, + f = { 0x1D453 }, + gjqy = { 0x1D454, 0x1D457, 0x1D45E, 0x1D466 }, + i = { 0x1D456 }, + mw = { 0x1D45A, 0x1D464 }, + p = { 0x1D45D }, + dotless = { 0x00049, 0x0004A, 0x00131, 0x00237, 0x1D6A4, 0x1D6A5 }, + integrals = { 0x0222B, 0x0222C, 0x0222D, 0x0222E, 0x0222F, 0x02230, 0x02231, 0x02232, 0x02233, 0x02A0B, 0x02A0C, 0x02A0D, 0x02A0E, 0x02A0F, 0x02A10, 0x02A11, 0x02A12, 0x02A13, 0x02A14, 0x02A15, 0x02A16, 0x02A17, 0x02A18, 0x02A19, 0x02A1A, 0x02A1B, 0x02A1C }, +} + +local function getalso(target,original) + local also = target.tweakalso -- maybe + if not also then + also = { } + for k, v in sortedhash(target.characters) do + local u = v.unicode + if u and k ~= u then + local a = also[u] + if a then + a[#a+1] = k + else + also[u] = { k } + end + end + end + target.tweakalso = also + end + return also +end + -- { -- tweak = "dimensions", -- list = { @@ -398,32 +417,33 @@ do extend = factor, }, v) end - local original = v.original - if not original then + local originalslot = v.original + if not originalslot then local delta = v.delta if delta then - original = k + delta + originalslot = k + delta end end - if original then - original = mathgaps[original] or original - local data = targetcharacters[original] + if originalslot then + originalslot = mathgaps[originalslot] or originalslot + local data = targetcharacters[originalslot] if data then data = copytable(data) - data.unicode = original + data.unicode = originalslot targetcharacters[k] = data character = data else - report_mathtweak("no slot %U",original) + report_mathtweak("no slot %U",originalslot) return end end -- - local width = character.width - local height = character.height - local depth = character.depth - local italic = character.italic - local topaccent = character.topaccent + local width = character.width + local height = character.height + local depth = character.depth + local italic = character.italic + local topanchor = character.topanchor + local bottomanchor = character.bottomanchor -- local widthfactor = v.width local heightfactor = v.height @@ -442,7 +462,7 @@ do if advancefactor then character.advance = advancefactor * width else - character.advance = width -- so advance is oldwidth + character.advance = character.advance or width -- so advance is oldwidth end if widthfactor then character.width = widthfactor * width @@ -470,8 +490,11 @@ do end end if anchorfactor then - character.topaccent = anchorfactor * (topaccent or width) + character.topanchor = anchorfactor * (topanchor or width) end +-- if anchorfactor then +-- character.bottomaccent = anchorfactor * (bottomanchor or width) +-- end -- begin experiment local line = v.wline if line then @@ -575,12 +598,26 @@ end do + function mathtweaks.showinfo(target,original,parameters) + local mathparameters = target.mathparameters + for k, v in sortedhash(mathparameters) do + report_mathtweak("%s : %s",k,v) + end + end + +end + + +do + function mathtweaks.wipevariants(target,original,parameters) local list = parameters.list if list then local targetcharacters = target.characters -- local originalcharacters = original.characters local count = 0 + -- local also = getalso(target,original) + -- local done = { } for k, v in sortedhash(list) do local ori = targetcharacters[k] local nxt = ori.next @@ -675,17 +712,6 @@ do -- maybe we'll have a different name - mathtweaks.subsets = { - acenorsuvxz = { 0x1D44E, 0x1D450, 0x1D452, 0x1D45B, 0x1D45C, 0x1D45F, 0x1D460, 0x1D462, 0x1D463, 0x1D465, 0x1D467 }, - bhklt = { 0x1D44F, 0x1D455, 0x1D458, 0x1D459, 0x1D461 }, - d = { 0x1D451 }, - f = { 0x1D453 }, - gjqy = { 0x1D454, 0x1D457, 0x1D45E, 0x1D466 }, - i = { 0x1D456 }, - mw = { 0x1D45A, 0x1D464}, - p = { 0x1D45D }, - } - function mathtweaks.kernpairs(target,original,parameters) local list = parameters.list if list then @@ -749,37 +775,11 @@ end do - -- What a mess ... should be a different alphabet. - - local function expand(target,original,list,selector,feature) - if feature then - local getsubstitution = fonts.handlers.otf.getsubstitution - for _, char in next, list do - local variant = getsubstitution(original,char,feature,true) - if variant then - mathematics.addvariant(target,char,variant,selector) - end - end - else - for i, char in next, list do - mathematics.addvariant(target,char,0xFE800+i,selector) - end - end - end - function mathtweaks.variants(target,original,parameters) - local feature = parameters.feature - local selector = parameters.selector - local kind = parameters.kind - if kind == "script" then - if selector then - expand(target,original,mathematics.alphabets.sr.tf.lcletters,selector,feature) - expand(target,original,mathematics.alphabets.sr.tf.ucletters,selector,feature) - end - end + report_mathtweak("todo: remove 'variants' tweak from goodie file") end - mathtweaks.variant = mathtweaks.variants + mathtweaks.variant = mathtweaks.variants end @@ -1052,80 +1052,219 @@ do local factor = tonumber(parameters.factor) or 0 if factor ~= 0 then for k, v in next, targetcharacters do - local a = v.topaccent + local a = v.topanchor if a and a > 0 then - v.topaccent = a * factor + v.topanchor = a * factor end end end end - -- local default = { - -- "digitsnormal", - -- "lowercasedoublestruck", - -- "uppercasedoublestruck", - -- } + mathtweaks.fixaccents = mathtweaks.fixanchors + +end + +do + + -- actually this should be a an engine feature driven by category because we don't + -- want this in display mode .. only a test for MS and HH + + local issymbol = characters.is_symbol + + function mathtweaks.oldstylemath(target,original,parameters) + local characters = target.characters + local axis = target.mathparameters.AxisHeight + local delta = (parameters.factor or .1) * axis + target.mathparameters.AxisHeight = (axis - delta) + for k, v in sortedhash(characters) do + if issymbol[k] then -- quick hack, engine knows + v.yoffset = -delta + v.height = (v.height or 0) - delta + v.depth = (v.depth or 0) - delta + end + end + end - local function wipe(target,original,parameters,field) - local targetcharacters = target.characters +end + +do + + function mathtweaks.simplifykerns(target,original,parameters) + local characters = target.characters + local simplified = 0 + for k, v in sortedhash(characters) do + local mathkerns = v.mathkerns + if mathkerns then + local k = mathkerns.topleft + if k then + k = k[#k].kern + if k then + v.topleft = k + end + end + local k = mathkerns.topright + if k then + k = k[#k].kern + if k then + v.topright = k + end + end + local k = mathkerns.bottomleft + if k then + k = k[1].kern -- todo get value at baseline + if k then + v.bottomleft = k + end + end + local k = mathkerns.bottomright + if k then + k = k[1].kern -- todo get value at baseline + if k then + v.bottomright = k + end + end + v.mathkerns = nil + simplified = simplified + 1 + end + end + if simplified == 0 then + report_tweak("no need to simplify mathkerns",target,original) + elseif trace_tweaking then + report_tweak("%i mathkerns simplified",target,original,simplified) + end + end + +end + +do + + local function wipe(target,original,parameters,field,move,integrals) + local targetcharacters = target.characters + local targetdescriptions = target.descriptions + local factor = target.parameters.factor + local correct = parameters.correct + local function getllx(u) + local d = targetdescriptions[u] + if d then + local b = d.boundingbox + if b then + local llx = b[1] + if llx < 0 then + return - llx + end + end + end + return false + end local function step(s,l) - local done = false while s do - local c = targetcharacters[mathgaps[s] or s] + local u = mathgaps[s] or s + local c = targetcharacters[u] if c then - local v = c[field] - if v then - if trace_tweaking then - if l then - report_tweak("removing %a in range %a from %C",target,original,field,l,s) + if field == "topanchor" then + if c.topanchor then + c.topanchor = nil + else + goto smaller + end + else + local done = false + local italic = c.italic + if move then + local width = c.width or 0 + c.advance = width + if correct then + local llx = getllx(u) + if llx then + local topanchor = c.topanchor + llx = llx * factor + width = width + llx + c.xoffset = llx + if topanchor then + c.topanchor = topanchor + llx + end +-- if c.bottomleft or c.topleft then +-- print("BEFORE",c.bottomleft,c.topleft,llx) +-- c.bottomleft = (c.bottomleft or 0) - llx +-- c.topleft = (c.topleft or 0) - llx +-- print("AFTER",c.bottomleft,c.topleft,llx) +-- else + c.bottomleft = (c.bottomleft or 0) - llx + c.topleft = (c.topleft or 0) - llx +-- end + done = true + end + end + if italic and italic ~= 0 then + c.width = width + italic +-- print(">>>",bottomright) + c.bottomright = - italic +-- c.bottomright = c.bottomright - italic + done = true else - report_tweak("removing %a from %C",target,original,field,s) + c.width = width end end - c[field] = nil - done = true + if italic then + c.italic = nil + done = true + end + if not done then + goto smaller + end end + if trace_tweaking then + if l then + report_tweak("%s %a in range %a from %C","removing",target,original,field,l,s) + else + report_tweak("%s %a from %C","removing",target,original,field,s) + end + end + goto smaller + ::smaller:: s = c.smaller else break end end - return done end local list = parameters.list -- todo: ranges - -- if list == "default" then - -- list = default - -- else if type(list) == "string" then list = { list } end for i=1,#list do local l = list[i] - local r = blocks[l] - if r then - local done = false - for i=r.first,r.last do - if step(i,l) then - done = true - end - end - if not done and trace_tweaking then - report_mathtweak("there is no need to remove %a range %a",field,l) + if type(l) == "table" then + for i=1,#l do + step(i,l[i]) end else - stepper(l,step) + local r = blocks[l] + if r then + for i=r.first,r.last do + step(i,l) + end + else + stepper(l,step) + end end end end function mathtweaks.wipeanchors(target,original,parameters) - wipe(target,original,parameters,"topaccent") + wipe(target,original,parameters,"topanchor") end + mathtweaks.wipeaccents = mathtweaks.wipeanchors + function mathtweaks.wipeitalics(target,original,parameters) wipe(target,original,parameters,"italic") end + function mathtweaks.moveitalics(target,original,parameters) + wipe(target,original,parameters,"italic",true) + end + -- function mathtweaks.fixdigits(target,original,parameters) -- mathtweaks.fixanchors(target,original,{ list = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } }) -- end @@ -1134,6 +1273,88 @@ end do + function mathtweaks.topanchors(target,original,parameters) + local characters = target.characters + local list = parameters.list + if list then + for k, v in sortedhash(list) do + local c = characters[k] + if c then + local w = c.width + if w and w ~= 0 then + c.topanchor = v * w + if trace_tweaking then + -- todo + end + end + end + end + -- todo: small + end + end + + mathtweaks.topaccents = mathtweaks.topanchors + + function mathtweaks.limits(target,original,parameters) + local characters = target.characters + local list = parameters.list + if list then + local factor = parameters.factor or 1 + local also = getalso(target,original) + local done = { } + local function relocate(u,factor) + if done[u] then + return + end + done[u] = true + local c = characters[u] + if c then + local italic = c.italic + if italic and italic ~= 0 then + local width = c.width or 0 + local half = (italic/2) * factor + c.topanchor = width + half + c.bottomanchor = width - half + c.bottomright = - italic + c.italic = nil + if trace_tweaking then + -- todo + end + end + local s = c.smaller + if s then + relocate(s,factor) + end + local n = c.next + if n then + relocate(n,factor) + end + if also then + local a = also[u] + if a then + for i=1,#a do + relocate(a[i],factor) + end + end + end + end + end + if #list > 0 then + for i=1,#list do + relocate(list[i],factor) + end + else + for k, v in sortedhash(list) do + relocate(k,tonumber(v) or factor) + end + end + end + end + +end + +do + -- musical timestamp: March 2022, Antonio Sanches (Bad Hombre), live performance in NL function mathtweaks.kerns(target,original,parameters) @@ -1178,12 +1399,14 @@ do local characters = target.characters local function setone(unicode,data) local chardata = characters[mathgaps[unicode] or unicode] - local width = chardata.width or 0 - local total = (chardata.height or 0) + (chardata.depth or 0) - local k = data.left ; if k and k ~= 0 then chardata.leftmargin = k * width end - local k = data.right ; if k and k ~= 0 then chardata.rightmargin = k * width end - local k = data.top ; if k and k ~= 0 then chardata.topmargin = k * total end - local k = data.bottom ; if k and k ~= 0 then chardata.bottommargin = k * total end + if chardata then + local width = chardata.width or 0 + local total = (chardata.height or 0) + (chardata.depth or 0) + local k = data.left ; if k and k ~= 0 then chardata.leftmargin = k * width end + local k = data.right ; if k and k ~= 0 then chardata.rightmargin = k * width end + local k = data.top ; if k and k ~= 0 then chardata.topmargin = k * total end + local k = data.bottom ; if k and k ~= 0 then chardata.bottommargin = k * total end + end end for unicode, data in next, margins do setone(unicode,data) -- withscriptcode(tfmdata,unicode,data,kernone) @@ -1398,39 +1621,39 @@ end do - local addprivate = fonts.helpers.addprivate - local privateslot = fonts.helpers.privateslot - - -- 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 + local addprivate = fonts.helpers.addprivate + local privateslot = fonts.helpers.privateslot + + -- 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 @@ -1787,6 +2010,9 @@ end do + -- mirror + -- smaller + local list = { 0x221A, } @@ -1802,11 +2028,19 @@ do end data.height = depth data.depth = height +if data.rorrim then + -- the original does the magic +else data.yoffset = depth - height +end + end + local smaller = data.smaller + if smaller then + fix(target,original,characters,smaller) end - local small = data.smaller - if small then - fix(target,original,characters,small) + local mirror = data.mirror + if mirror then + fix(target,original,characters,mirror) end end end @@ -1823,6 +2057,70 @@ end do + local done = nil + + local function fix(target,original,characters,unicode,axis) + if done[unicode] then + return + end + done[unicode] = true + local data = characters[unicode] + if data then + local height = data.height or 0 + local depth = data.depth or 0 + if trace_tweaking then + report_tweak("swapping height and depth of %U",target,original,unicode) + end + local half = (height + depth)/2 + if data.rorrim then + -- the original does the magic + else + data.yoffset = depth - (half - axis) + end + height = half + axis + depth = half - axis + data.height = height + data.depth = depth + local smaller = data.smaller + if smaller then + fix(target,original,characters,smaller,axis) + end + local mirror = data.mirror + if mirror then + fix(target,original,characters,mirror,axis) + end + local next = data.next + if next then + fix(target,original,characters,next,axis) + end + end + end + + function mathtweaks.fixoldschool(target,original,parameters) + local characters = target.characters + local list = mathtweaks.subsets.integrals + local also = getalso(target,original) + local axis = target.mathparameters.AxisHeight + done = { } + for i=1,#list do + local unicode = list[i] + fix(target,original,characters,unicode,axis) + end + if also then + local a = also[u] + if a then + for i=1,#a do + fix(target,original,characters,a[i],axis) + end + end + end + done = nil + end + +end + +do + local list = { 0x2061, 0x2062, 0x2063, 0x2064 } function mathtweaks.wipecues(target,original,parameters) @@ -1896,12 +2194,12 @@ characters[hat] = copytable(characters[0x0302]) -- TODO local alias = entry[1] local stretchingdata = characters[stretching] if stretchingdata and stretchingdata.width == 0 then - local topaccent = stretchingdata.topaccent or 0 - local width = -topaccent - topaccent = width/2 + local topanchor = stretchingdata.topanchor or 0 + local width = -topanchor + topanchor = width/2 stretchingdata.width = width - stretchingdata.topaccent = topaccent - stretchingdata.commands = { rightcommand[width + topaccent], charcommand[stretching] } + stretchingdata.topanchor = topanchor + stretchingdata.commands = { rightcommand[width + topanchor], charcommand[stretching] } if trace_tweaking then report_tweak("width of initial extensible accent %U set",target,original,stretching) end @@ -1925,7 +2223,7 @@ characters[hat] = copytable(characters[0x0302]) -- TODO local flataccent = last.flataccent if flataccent then characters[flataccent].extensible = true - end + end break end end @@ -1947,7 +2245,7 @@ characters[hat] = copytable(characters[0x0302]) -- TODO depth = stretchingdata.depth, next = stretchingdata.next, commands = { charcommand[stretching] }, - topaccent = stretchingdata.topaccent, + topanchor = stretchingdata.topanchor, -- unicode = stretching, -- when we aliasize to combiners unicode = alias, -- when we keep the original } @@ -2018,7 +2316,9 @@ do local linewidth = target.MathConstants.RadicalRuleThickness -- make option local basechar = characters[radical] local baseheight = basechar.height +/2 local basedepth = basechar.depth +/2 local basetotal = baseheight + basedepth local used = baseheight -- @@ -2188,7 +2488,7 @@ do } } if trace_tweaking then - report_tweak("fourier %U added using %U",target,original,basecode,fourier) + report_tweak("fourier %U added using %U",target,original,basecode,fouriercode) end end end @@ -2284,17 +2584,17 @@ do function mathtweaks.fixellipses(target,original,parameters) local characters = target.characters local function fix(normal,raised) - local normalone = characters[normal] - if normalone then - local raisedone = copytable(normalone) - characters[raised] = raisedone - raisedone.unicode = weird - local height = raisedone.height + local normaldata = characters[normal] + if normaldata then + local raiseddata = copytable(normaldata) + characters[raised] = raiseddata + raiseddata.unicode = raised + local height = raiseddata.height local yoffset = (parameters.yoffset or 2) * height - raisedone.yoffset = yoffset - raisedone.height = height + yoffset + raiseddata.yoffset = yoffset + raiseddata.height = height + yoffset if trace_tweaking then - report_tweak("taking %U from %U",target,original,weird,normal) + report_tweak("taking %U from %U",target,original,raised,normal) end end end @@ -2358,6 +2658,163 @@ end do + -- We started with the list that xits has in rtlm but most of them can be derived from + -- the database, and others need to be added. + + -- Checked while watching/listening to Dave Matthews Band: The Central Park Concert + -- (with superb solos by Warren Haynes), a DVD I bought around when we started with the + -- LUATEX advanture. + + local mirrors = { + + [0x0002F] = true, -- slashes + [0x0005C] = true, + [0x000F7] = true, + + [0x02032] = true, -- primes + [0x02033] = true, + [0x02034] = true, + [0x02057] = true, + [0x02035] = true, + [0x02036] = true, + [0x02037] = true, + + [0x0221A] = true, -- radicals + [0x0221B] = true, + [0x0221C] = true, + [0x0221D] = true, + + [0x0222B] = true, -- integrals + [0x0222C] = true, + [0x0222D] = true, + [0x0222E] = true, + [0x0222F] = true, + [0x02230] = true, + [0x02231] = true, + [0x02232] = true, + [0x02233] = true, + + [0x02A0A] = true, -- seen in xits (to be checked) + [0x02A0B] = true, + [0x02A0C] = true, + [0x02A0D] = true, + [0x02A0E] = true, + + [0x02140] = true, + [0x02201] = true, + [0x02202] = true, + [0x02203] = true, + [0x02204] = true, + [0x02211] = true, + + [0x02239] = true, + [0x0225F] = true, + [0x0228C] = true, + [0x022A7] = true, + [0x022AA] = true, + [0x022AC] = true, + [0x022AD] = true, + [0x022AE] = true, + [0x022AF] = true, + [0x022F5] = true, + [0x022F8] = true, + [0x022F9] = true, + [0x022FF] = true, + [0x02320] = true, + [0x02321] = true, + [0x027C0] = true, + [0x029DC] = true, + [0x029F4] = true, + + [0x02A0F] = true, + [0x02A10] = true, + [0x02A11] = true, + [0x02A12] = true, + [0x02A13] = true, + [0x02A14] = true, + [0x02A15] = true, + [0x02A16] = true, + [0x02A17] = true, + [0x02A18] = true, + [0x02A19] = true, + [0x02A1A] = true, + [0x02A1B] = true, + [0x02A1C] = true, + [0x02A20] = true, + + [0x02A74] = true, + [0x02AA3] = true, + [0x02AE2] = true, + [0x02AE6] = true, + [0x1D715] = true, + } + + local new = fonts.helpers.newprivateslot + + local function add(target,original,characters,unicode,what) + local data = characters[unicode] + if data then + if not data.mirror then + local slot = new("mirror."..unicode) + local mirror = copytable(data) + data.mirror = slot + mirror.rorrim = unicode -- so we can check later + mirror.commands = { + { "offset", data.width, 0, unicode, -1, 1 } + } + if trace_tweaking then + report_tweak("adding mirror %U (%s)",target,original,unicode,what) + end + characters[slot] = mirror + elseif trace_tweaking then + report_tweak("skipping mirror %U (%s)",target,original,unicode,what) + end + local hparts = data.hparts + if hparts then + for i=1,#hparts do + add(target,original,characters,hparts[i],"hpart") + end + end + local vparts = data.vparts + if vparts then + for i=1,#vparts do + add(target,original,characters,vparts[i],"vpart") + end + end + local smaller = data.smaller + if smaller then + add(target,original,characters,"smaller") + end + local next = data.next + if next then + add(target,original,characters,next,"next") + end + end + end + + -- todo: also check the rtlm table if present + + function mathtweaks.addmirrors(target,original,parameters) + local characters = target.characters + for unicode, detail in sortedhash(characters) do + local data = chardata[unicode] + if data and data.mirror then + add(target,original,characters,unicode,"mirror") + end + end + for unicode, detail in sortedhash(mirrors) do + if characters[unicode] then + add(target,original,characters,unicode,"character") + elseif trace_tweaking then + report_tweak("ignoring mirror %U (%s)",target,original,unicode,what) + end + end + end + +end + +do + local reported = { } function mathtweaks.version(target,original,parameters) @@ -2380,6 +2837,215 @@ do report_tweak() end reported[fontname] = true + target.tweakversion = version + end + end + end + +end + +do + + function mathtweaks.diagnose(target,original,parameters) + local characters = target.characters + for k, v in sortedhash(characters) do + local italic = v.italic + if italic then + report_tweak("italics: %U %p",target,original,k,italic) + end + end +-- inspect(characters[0xF0929]) + end + +end + +do + + function mathtweaks.setoptions(target,original,parameters) + local setlist = parameters.set or parameters.list + local resetlist = parameters.reset + if setlist or resetlist then + local properties = target.properties + local codes = tex.mathcontrolcodes + local oldcontrol = tex.get("mathfontcontrol") + local newcontrol = oldcontrol + -- todo: reset + if resetlist then + for i=1,#resetlist do + local v = tonumber(codes[resetlist[i]]) + if v then + newcontrol = newcontrol & (not v) + end + end + end + if setlist then + for i=1,#setlist do + local v = tonumber(codes[setlist[i]]) + if v then + newcontrol = newcontrol | v + end + end + end + newcontrol = newcontrol | codes.usefontcontrol + properties.mathcontrol = newcontrol + target.mathcontrol = newcontrol + if trace_tweaking then + report_tweak("forcing math font options 0x%08X instead of 0x08X",target,original,newcontrol,oldcontrol) + end + end + end + +end + +do + + function mathtweaks.setovershoots(target,original,parameters) + local list = parameters.list + if list then + local characters = target.characters + local emwidth = target.parameters.quad + for i=1,#list do + local entry = list[i] + local target = entry.target + local top = entry.topovershoot + local quad = entry.quad + if target and top then + local range = blocks[target] + if range then + if quad then + quad = emwidth + end + for r = range.first, range.last do + local unicode = mathgaps[r] or r + local data = characters[unicode] + if data then + data.topovershoot = top * (quad or data.width or 0) + end + end + if trace_tweaking then + report_mathtweak("setting overshoots for %a",target) + end + end + end + end + end + end + + -- there is no real need for thios but let's play nice with memory anyway + + local efindex = 0 + local effects = setmetatableindex (function (t,k) + efindex = efindex + 1 + local v = "tweakreplacealphabets" .. efindex + local e = fonts.specifiers.presetcontext(v,"",k) + -- print(k,v,e) + t[k] = v + return v + end) + + function mathtweaks.replacealphabets(target,original,parameters) + local feature = parameters.feature + local features = target.specification.features.normal + if not feature or features[feature] == true then + local list = parameters.list + if list then + local definedfont = fonts.definers.internal + local copiedglyph = fonts.handlers.vf.math.copy_glyph +-- does a deep copy, including parts and so + local getsubstitution = fonts.handlers.otf.getsubstitution + local fontdata = fonts.hashes.identifiers + -- + local fonts = target.fonts + local size = target.size + local characters = target.characters + -- compact: size = 655360 + if not fonts then + fonts = { } + target.fonts = fonts + end + if #fonts == 0 then + fonts[1] = { id = 0, size = size } -- self, will be resolved later + end + for i=1,#list do + local entry = list[i] + local filename = entry.filename + local feature = entry.feature + local thesource = entry.source + local thetarget = entry.target or thesource + if thesource and thetarget then + local sourcerange = type(thesource) == "table" and thesource or blocks[thesource] -- .gaps + local targetrange = type(thetarget) == "table" and thetarget or blocks[thetarget] -- .gaps + if sourcerange and targetrange then + local firsttarget = targetrange.first + local firstsource = sourcerange.first + local lastsource = sourcerange.last or firstsource + if firstsource and firsttarget then + local offset = firsttarget - firstsource + local topovershoot = entry.topovershoot + if filename then + local rscale = entry.rscale or 1 -- todo + size = size * rscale -- maybe use scale in vf command + -- load font, todo: set language and script, the effect hack is ugly + local fullname = filename + local effect = features.effect + if effect then + fullname = fullname .. "*" .. effects["effect={"..effect.."}"] + end + local id = definedfont { + name = fullname, + size = size, + } + local chars = fontchars[id] + local dropin = fontdata[id] + local index = #fonts + 1 + fonts[index] = { id = id, size = size } + -- copy characters + for s=firstsource,lastsource do + local t = s + offset + local sourceunicode = mathgaps[s] or s + local targetunicode = mathgaps[t] or t + if feature then + sourceunicode = getsubstitution(dropin,sourceunicode,feature,true,"math","dflt") or sourceunicode + end + if trace_tweaking then + report_mathtweak("copying %s %U from file %a to %s %U",thesource,sourceunicode,filename,thetarget,targetunicode) + end + characters[targetunicode] = copiedglyph(target,characters,chars,sourceunicode,index) + end + elseif feature then + for s=firstsource,lastsource do + local t = s + offset + local sourceunicode = mathgaps[s] or s + local targetunicode = mathgaps[t] or t + local variant = getsubstitution(original,sourceunicode,feature,true,"math","dflt") + local data = characters[variant] + if data then + if trace_tweaking then + report_mathtweak("copying %s %U from feature %a to %s %U",thesource,sourceunicode,feature,thetarget,targetunicode) + end + characters[targetunicode] = copytable(data) + end + end + else + for s=firstsource,lastsource do + local t = s + offset + local sourceunicode = mathgaps[s] or s + local targetunicode = mathgaps[t] or t + local data = characters[sourceunicode] + if data then + if trace_tweaking then + report_mathtweak("copying %s %U to %s %U",thesource,sourceunicode,thetarget,targetunicode) + end + characters[targetunicode] = copytable(data) + end + end + end + else + -- error + end + end + end + end end end end @@ -2418,7 +3084,10 @@ local function applytweaks(when,target,original) if type(tweak) == "table" then local action = mathtweaks[tweak.tweak or ""] if action then - if original then + local version = tweak.version + if version and version ~= target.tweakversion then + report_math("skipping tweak %a version %a",tweak.tweak,version) + elseif original then action(target,original,tweak) else action(target,tweak) @@ -2456,6 +3125,65 @@ function mathematics.tweakaftercopyingfont(target,original) end end +do + + local defaults = { + { + source = "uppercasescript", + target = "uppercasecalligraphic", + }, + { + source = "lowercasescript", + target = "lowercasecalligraphic", + }, + { + source = "uppercaseboldscript", + target = "uppercaseboldcalligraphic", + }, + { + source = "lowercaseboldscript", + target = "lowercaseboldcalligraphic", + }, + } + + function mathematics.checkaftercopyingfont(target,original) + local mathparameters = target.mathparameters -- why not hasmath + if mathparameters then + local characters = target.characters + -- + for i=1,#defaults do + -- we assume no ssty here yet .. todo + local default = defaults[i] + local block = blocks[default.target] + local first = block.first + local last = block.last + if not characters[mathgaps[first] or last] then + mathtweaks.replacealphabets(target,original,{ + tweak = "replacealphabets", + list = { default } + }) + end + end + -- + local addvariant = mathematics.addvariant + local function register(old,new) + for i, cold in next, old do + local cnew = new[i] + addvariant(target,cold,cold,0xFE00) + addvariant(target,cnew,cnew,0xFE01) + addvariant(target,cnew,cold,0xFE00) + addvariant(target,cold,cnew,0xFE01) + end + end + local sr = mathematics.alphabets.sr.tf + local ca = mathematics.alphabets.ca.tf + register(sr.ucletters,ca.ucletters) + register(sr.lcletters,ca.lcletters) + end + end + +end + function mathematics.beforepassingfonttotex(target) if use_math_goodies then local mathparameters = target.mathparameters -- why not hasmath @@ -2472,20 +3200,13 @@ sequencers.appendaction("mathparameters","system","mathematics.checkaccentbasehe sequencers.appendaction("beforecopyingcharacters","system","mathematics.tweakbeforecopyingfont") sequencers.appendaction("aftercopyingcharacters", "system","mathematics.tweakaftercopyingfont") +sequencers.appendaction("aftercopyingcharacters", "system","mathematics.checkaftercopyingfont") sequencers.appendaction("beforepassingfonttotex", "system","mathematics.beforepassingfonttotex") -- no, it's a feature now (see good-mth): -- -- sequencers.appendaction("aftercopyingcharacters", "system","mathematics.overloaddimensions") --- helpers - -local getfontoffamily = tex.getfontoffamily - -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) local e_left = extensibles.left @@ -2657,7 +3378,7 @@ function mathematics.finishfallbacks(target,specification,fallbacks) if trace_collecting then report_math("adding fallback characters to font %a",specification.hash) end - local definedfont = fonts.definers.internal + ----- definedfont = fonts.definers.internal local copiedglyph = fonts.handlers.vf.math.copy_glyph local fonts = target.fonts local size = specification.size -- target.size diff --git a/tex/context/base/mkxl/math-ali.mkxl b/tex/context/base/mkxl/math-ali.mkxl index b6b037117..af6b48cee 100644 --- a/tex/context/base/mkxl/math-ali.mkxl +++ b/tex/context/base/mkxl/math-ali.mkxl @@ -1011,12 +1011,12 @@ \ifmmode\stopimath\fi \hfil \aligntab - \hskip\mathcasesparameter\c!distance\relax + \kern\mathcasesparameter\c!distance\relax % hskip \math_cases_strut % looks better \aligncontent \hfil \aligntab - \hskip\mathcasesparameter\c!numberdistance\relax + \kern\mathcasesparameter\c!numberdistance\relax % hskip \span\math_text_in_eqalign{\aligncontent}% \crcr} % todo: number @@ -1286,7 +1286,7 @@ \math_matrix_anchor % \ifdim\d_math_eqalign_distance>\zeropoint % \ifbitwiseand\c_math_matrix_anchor_mode\plustwo - % \hskip.5\d_math_eqalign_distance + % \kern.5\d_math_eqalign_distance % \fi % \fi \fi} @@ -1296,7 +1296,7 @@ \ifcase\c_math_matrix_anchor_mode\else % \ifdim\d_math_eqalign_distance>\zeropoint % \ifbitwiseand\c_math_matrix_anchor_mode\plusfour - % \hskip.5\d_math_eqalign_distance + % \kern.5\d_math_eqalign_distance % \fi % \fi \math_matrix_anchor @@ -1312,7 +1312,7 @@ \aligntab \aligntab \math_matrix_anchor - \hskip.5\d_math_eqalign_distance % kern + \kern.5\d_math_eqalign_distance % hskip \aligncontent \aligntab \global\advance\c_math_eqalign_column\plusone @@ -1358,27 +1358,40 @@ \dousecolorparameter\p_rulecolor \fi} -% \noaligned\permanent\tolerant\protected\def\math_matrix_HL[#1]#*% -% {\noalign\bgroup -% \math_matrix_check_rule[#1]% -% \divide\scratchdimen\plustwo -% \autorule\s!height\scratchdimen\s!depth\scratchdimen\relax -% \egroup} -% -% \permanent\tolerant\protected\def\math_matrix_VL[#1]#*% -% {\NC -% \math_matrix_check_rule[#1]% -% \divide\d_math_eqalign_distance\plustwo -% \hskip-\d_math_eqalign_distance -% \autorule\s!width\scratchdimen\relax -% \hskip-\d_math_eqalign_distance -% \NC} - % These offset are an experiment so we abuse some existing keys or we have to % cook up new ones. Maybe we then should provide small medium big halfline etc. % but all depends on actual demand for this feature. +% Musical timestamp VL, NL, SL: Bad Hombre II by Antonio Sanches +% +% \startformula +% \startmatrix[left=\left(,right=\right)] +% \NC 0 \NL 0 \NC 0 \NC 2x \NC 1 \NC 0 \NC 0 \NL \NR +% \NC 0 \VL 0 \NC 0 \NC 0 \NC 2x \NC 0 \NC 0 \NL \NR +% \NC 0 \VL 0 \NC 0 \NC 0 \NC 0 \NC 3x \NC 0 \NL \NR +% \NC 0 \NL 0 \NC 0 \NC 0 \NC 0 \NC 0 \NC 4x \VL \NR +% \stopmatrix +% \stopformula +% +% \startformula +% \startmatrix[left=\left(,right=\right)] +% \SL[3] \NL \NL \NL \NL \NL \NR +% \VL 2x \NL 1 \NL 0 \VL 0 \NL 0 \NL 0 \NL 0 \NL \NR +% \VL 0 \NL 2x \NL 1 \VL 0 \NL 0 \NL 0 \NL 0 \NL \NR +% \VL 0 \NL 0 \NL 2x \VL 0 \NL 0 \NL 0 \NL 0 \NL \NR +% \SL[5] \NL \NL \NL \NR +% \NL 0 \NL 0 \NL 0 \VL 2x \NL 1 \VL 0 \NL 0 \NL \NR +% \NL 0 \NL 0 \NL 0 \VL 0 \NL 2x \VL 0 \NL 0 \NL \NR +% \NL \NL \NL \SL[3] \NL \NL \NR +% \NL 0 \NL 0 \NL 0 \NL 0 \NL 0 \VL 3x \VL 0 \NL \NR +% \NL \NL \NL \NL \NL \SL[2] \NL \NR +% \NL 0 \NL 0 \NL 0 \NL 0 \NL 0 \NL 0 \VL 3x \VL \NR +% \NL \NL \NL \NL \NL \NL \SL[1] \NL \NR +% \stopmatrix +% \stopformula + \definesystemattribute[mathalignmentvrule][public] +\definesystemattribute[mathalignmenthrule][public] \setupmathmatrix [%c!toffset=\zeropoint, @@ -1417,32 +1430,136 @@ \fi \egroup} -\protected\def\math_matrix_vertical_rule#1% - {\math_matrix_check_rule[#1]% +\protected\def\math_matrix_vertical_rule_indeed#1#2% + {\math_matrix_check_rule[#2]% \enablematrixrules - \vrule + #1 \s!attr \mathalignmentvruleattribute\plusone \s!width \scratchdimen \s!top -\dimexpr\mathmatrixparameter\c!toffset\relax \s!bottom-\dimexpr\mathmatrixparameter\c!boffset\relax \relax} +\protected\def\math_matrix_vertical_rule_yes{\math_matrix_vertical_rule_indeed\vrule } +\protected\def\math_matrix_vertical_rule_nop{\math_matrix_vertical_rule_indeed\novrule} + +\installcorenamespace{mathmatrixrulealternative} + +\newboundary\c_math_matrix_vl_boundary +%newboundary\c_math_matrix_sl_boundary + +\protected\def\math_matrix_horizontal_rule_indeed#1#2% + {\math_matrix_check_rule[#2]% + \global\setfalse\c_math_matrix_first + \global\settrue\c_math_matrix_sl_seen + \enablematrixrules + \leaders#1% + \s!attr \mathalignmenthruleattribute\plusone + \s!height .5\scratchdimen + \s!depth .5\scratchdimen + % \s!top -\dimexpr\mathmatrixparameter\c!toffset\relax + % \s!bottom-\dimexpr\mathmatrixparameter\c!boffset\relax + \hfilll + \kern\dimexpr.5\d_math_eqalign_distance\relax + \aligntab} + +\protected\def\math_matrix_horizontal_rule_yes{\math_matrix_horizontal_rule_indeed\hrule } +\protected\def\math_matrix_horizontal_rule_nop{\math_matrix_horizontal_rule_indeed\nohrule} + +\def\math_matrix_hrule_progress_rest#1% + {\expandedloop + \plusone + \numexpr(\ifchknum#1\or#1\else\c_math_matrix_columns\fi)*\plustwo+\minusone\relax + \plusone + {\span\omit}}% + +\def\math_matrix_hrule_progress_first#1% + {\expandedloop + \plusone + \numexpr(\ifchknum#1\or#1\else\c_math_matrix_columns\fi+\minusone)*\plustwo+\plusone\relax + \plusone + {\span\omit}}% + +\def\math_matrix_hrule_progress + {\NL + \ifconditional\c_math_matrix_first + \expandafter\math_matrix_hrule_progress_first + \else + \expandafter\math_matrix_hrule_progress_rest + \fi} + +\tolerant\permanent\protected\def\SL[#1]#*[#2]#*% [n] [name] | [name] | [n] + {\ifcsname\??mathmatrixrulealternative#2\endcsname + \lastnamedcs{#1}{#2}% + \orelse\ifcsname\??mathmatrixrulealternative#1\endcsname + \lastnamedcs{#2}{#1}% + \else + \csname\??mathmatrixrulealternative\v!auto\endcsname{#1}{#2}% + \fi} + +\defcsname\??mathmatrixrulealternative\v!auto\endcsname#1#2% + {\math_matrix_hrule_progress{#1}% + \ifnum\c_math_matrix_first=\zerocount + \kern-\dimexpr\linewidth\relax + \else + \kern-\dimexpr.5\d_math_eqalign_distance+\linewidth\relax + \fi + \math_matrix_horizontal_rule_yes{#2}% + %boundary\c_math_matrix_sl_boundary + \enforced\let\NR\math_matrix_NL_NR} \permanent\tolerant\protected\def\math_matrix_VL[#1]#*% {\span\omit - \hskip.5\d_math_eqalign_distance - \math_matrix_vertical_rule{#1}% - \hskip.5\d_math_eqalign_distance - \aligntab} + \ifconditional\c_math_matrix_first\else + \kern.5\d_math_eqalign_distance % hskip + \fi + \math_matrix_vertical_rule_yes{#1}% + \kern.5\d_math_eqalign_distance % hskip + \global\setfalse\c_math_matrix_first + \aligntab + \boundary\c_math_matrix_vl_boundary + \enforced\let\NR\math_matrix_NL_NR + } + +\permanent\tolerant\protected\def\math_matrix_NL[#1]#*% + {\span\omit + \ifconditional\c_math_matrix_first\else + \kern.5\d_math_eqalign_distance % hskip + \fi + \math_matrix_vertical_rule_nop{#1}% + \kern.5\d_math_eqalign_distance % hskip + \global\setfalse\c_math_matrix_first + \aligntab + \boundary\c_math_matrix_vl_boundary + \enforced\let\NR\math_matrix_NL_NR} + +\permanent\protected\def\math_matrix_NL_NR + {\ifnum\lastboundary=\c_math_matrix_vl_boundary + \ifconditional \c_math_matrix_sl_seen + \kern-1.5\d_math_eqalign_distance % hskip + \else + \kern-.5\d_math_eqalign_distance % hskip + \fi + \fi + \math_matrix_anchor_last + \math_matrix_stop_row + \math_matrix_pickup + \crcr + \math_matrix_start_row} + +\appendtoks + \enforced\let\NL\math_matrix_NL + \global\setfalse\c_math_matrix_sl_seen +\to \everymathmatrix \permanent\tolerant\protected\def\math_matrix_VC[#1]#*% {\NC - \math_matrix_vertical_rule{#1}% + \math_matrix_vertical_rule_yes{#1}% \NC} \permanent\tolerant\protected\def\math_matrix_VT[#1]#*% {\span\omit - \math_matrix_vertical_rule{#1}% + \math_matrix_vertical_rule_yes{#1}% \aligntab} \def\math_matrix_start_row @@ -1531,6 +1648,7 @@ callback \s!attr \mathmatrixornamentattribute "10 \s!attr \mathalignmentvruleattribute \plusone + \s!attr \mathalignmenthruleattribute \plusone \bgroup % preamble \span\math_matrix_preamble @@ -2300,7 +2418,7 @@ \hpack to \displaywidth\bgroup \hss \strc_math_flush_number_box - \hskip\d_framed_locator_ro + \kern\d_framed_locator_ro \egroup \egroup \strc_math_flush_box_framed_fit_inline} @@ -2308,7 +2426,7 @@ \def\strc_math_number_left_overflow_inside {\setbox\b_strc_math_display\vpack\bgroup \hpack to \displaywidth\bgroup - % \hskip\d_framed_locator_lo + % \kern\d_framed_locator_lo \strc_math_flush_number_box \hss \egroup @@ -2722,7 +2840,7 @@ \ifzeropt\scratchdimen\else\kern\scratchdimen\fi \setbox\scratchbox\hbox{\mathsimplealignparameter\c!text}% \ifvoid\scratchbox\else - \hskip\mathsimplealignparameter\c!textdistance + \kern\mathsimplealignparameter\c!textdistance % hskip \vcenter{\box\scratchbox}% \fi \egroup diff --git a/tex/context/base/mkxl/math-del.mklx b/tex/context/base/mkxl/math-del.mklx index edfd77de2..cfb8dc5d2 100644 --- a/tex/context/base/mkxl/math-del.mklx +++ b/tex/context/base/mkxl/math-del.mklx @@ -105,6 +105,13 @@ [fourier] [\c!right=\delimitedrighttildeuc] +% \definemathdelimited +% [bannuity] +% [%topoffset=.2\exheight, +% \c!strut=no, +% \c!rightmargin=.05\emwidth, +% \c!right=\delimitedrightanutityuc] + % $ \autofences \fourier{(z+\frac12)} + \courier{(z+\frac12)} + \xourier{(z+\frac12)} $ \protect \endinput diff --git a/tex/context/base/mkxl/math-fbk.lmt b/tex/context/base/mkxl/math-fbk.lmt index 185bb0d55..052f15f50 100644 --- a/tex/context/base/mkxl/math-fbk.lmt +++ b/tex/context/base/mkxl/math-fbk.lmt @@ -168,7 +168,7 @@ end -- a few examples: -local addextra = mathematics.extras.add +-- local addextra = mathematics.extras.add -- addextra(0xFE350) -- MATHEMATICAL DOUBLE ARROW LEFT END -- addextra(0xFE351) -- MATHEMATICAL DOUBLE ARROW MIDDLE PART @@ -395,7 +395,7 @@ local addextra = mathematics.extras.add -- 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 +-- c.topanchor = nil -- or maybe also all the others -- end -- return c -- end diff --git a/tex/context/base/mkxl/math-fen.mkxl b/tex/context/base/mkxl/math-fen.mkxl index 7cb775294..b3c85070f 100644 --- a/tex/context/base/mkxl/math-fen.mkxl +++ b/tex/context/base/mkxl/math-fen.mkxl @@ -53,6 +53,7 @@ \c!source=\zerocount, \c!height=\zeropoint, \c!depth=\zeropoint, + \c!distance=\zerocount, \c!factor=\v!auto] \appendtoks @@ -314,7 +315,66 @@ \installlocalcurrenthandler \??mathfences {mathfence} -\tolerant\protected\def\math_fenced_fenced#1#*[#2]% +%D The horizontal text variant was introduced for Alan Braslau. Because this is not +%D used that often we only support double text arguments. +%D +%D Musical timestamp: I am The Moon by Tedeschi Trucks Band + +% \definemathfence [tupdownarrows] [text] [\c!left="2191,\c!right="2193] + +\protected\def\math_fenced_horizontal_common#1#2#3#4% \Uwhatever class symbol source + {\c_math_fenced_class\mathfenceparameter#2\relax + \edef\p_fence{#3}% + #1% \Uleft \Umiddle \Uleft + \usedcolorparameterattributes{\mathfenceparameter\c!color}% + \s!leftclass \mathunspacedcode + \s!rightclass \mathunspacedcode + \s!class \mathunspacedcode + \s!source \numexpr\namedboxanchor{\mathfenceparameter#4}\relax + \Udelimiter\mathghostcode\fam\p_fence} + +\tolerant\protected\def\math_fenced_horizontal#1#*[#2]#:#*#3#4% + {% \csname math\mathfenceparameter\c!mathclass\endcsname + \mathord \bgroup % class here + \setlocalmathfencecurrent{#1}% \edef\currentmathfence{#1}% + \setupcurrentmathfence[#2]% + % \usemathstyleparameter\mathfenceparameter\c!mathstyle + \setmathsmalltextbox\scratchboxone\hbox{\usemathfencestyleandcolor\c!leftstyle \c!leftcolor #3}% + \setmathsmalltextbox\scratchboxtwo\hbox{\usemathfencestyleandcolor\c!rightstyle\c!rightcolor#4}% + \let\math_fenced_common\math_fenced_horizontal_common + \edef\p_fenced_middle{\mathfenceparameter\c!middle}% + \ifempty\p_fenced_middle\else + \letmathfenceparameter\c!left \p_fenced_middle + \letmathfenceparameter\c!right\zerocount + \fi + \scratchdistance\mathfenceparameter\c!distance + \box\scratchboxone + \kern\scratchdistance + \math_fenced_fenced_start\currentmathfence + \math_fenced_fenced_stop \currentmathfence + \kern\scratchdistance + \box\scratchboxtwo + \egroup} + +\tolerant\protected\def\math_fenced_fenced#1% + {\ifcstok{\namedmathfenceparameter{#1}\c!text}\v!yes % not the best keyword + \expandafter\math_fenced_horizontal + \else + \expandafter\math_fenced_vertical + \fi{#1}} + +% two step because we don't want to define text itself as command + +\definemathfence + [\v!text] + +\setupmathfence + [\v!text] + [\c!text=\v!yes, + \c!command=\v!yes, + \c!distance=.125\emwidth] + +\tolerant\protected\def\math_fenced_vertical#1#*[#2]% {\begingroup %{\beginmathgroup \setlocalmathfencecurrent{#1}% \edef\currentmathfence{#1}% @@ -1129,4 +1189,14 @@ \setmathoptions\mathmiddlecode bor \autoinjectclassoptioncode \relax} +%D New (to be completed): + +% $x + \tupdownarrows{left}{right} + x$ +% $x + \tdownuparrows{left}{right} + x$ +% $x + \tupanddownarrows[color=red,leftcolor=green,rightcolor=blue]{left}{right} + x$ + +\definemathfence [tupanddownarrows] [\v!text] [\c!left="2191,\c!right="2193] +\definemathfence [tupdownarrows] [\v!text] [\c!left="21C5,\c!right=0] +\definemathfence [tdownuparrows] [\v!text] [\c!middle="21F5] + \protect diff --git a/tex/context/base/mkxl/math-fnt.lmt b/tex/context/base/mkxl/math-fnt.lmt index 1901d79ae..cd4976900 100644 --- a/tex/context/base/mkxl/math-fnt.lmt +++ b/tex/context/base/mkxl/math-fnt.lmt @@ -50,13 +50,15 @@ local function register_extensible(font,char,style,box) local private = fonts.helpers.setboxdirectly(font,unicode,box) -- we saved a scaled glyph stream so we now use an unscaled one ... local g = new_glyph(font,private,al) + if fonts.hashes.properties[font].compactmath then + nuts.setscales(g,1000,1000,1000) + end local n = new_hlist(g) -- if newcommands then oldchar.commands = newcommands end -- - -- local newchar = { -- unicode = unicode, -- width = wd, @@ -77,7 +79,6 @@ local function register_extensible(font,char,style,box) -- end -- end -- addcharacters(font, { [private] = newchar }) - -- so the dimensions of the box don't match the glyph scale! setwhd(n,wd,ht,dp) setattrlst(n,al) diff --git a/tex/context/base/mkxl/math-frc.mkxl b/tex/context/base/mkxl/math-frc.mkxl index c0ef58c27..42e665f75 100644 --- a/tex/context/base/mkxl/math-frc.mkxl +++ b/tex/context/base/mkxl/math-frc.mkxl @@ -269,8 +269,8 @@ \Udelimiter\zerocount\fam\scratchcountertwo} \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} + \Udelimiter\zerocount\fam\scratchcounterone + \Udelimiter\zerocount\fam\scratchcountertwo} \defcsname\??fractionmethods\v!vertical \v!symbol \v!none\endcsname{\Ustretched \Udelimiter\zerocount\fam\scratchcounterthree} \defcsname\??fractionmethods\v!vertical \v!symbol \endcsname{\Ustretchedwithdelims @@ -452,34 +452,20 @@ \to \everysetupmathfraction \def\math_fraction_set_threshold_inline_auto - {\Umathfractiondelsize\textstyle \maxdimen - \Umathfractiondelsize\scriptstyle \maxdimen - \Umathfractiondelsize\scriptscriptstyle\maxdimen -\Umathfractiondelsize\crampedtextstyle \Umathfractiondelsize\textstyle -\Umathfractiondelsize\crampedscriptstyle \Umathfractiondelsize\scriptstyle -\Umathfractiondelsize\crampedscriptscriptstyle\Umathfractiondelsize\scriptscriptstyle - } + {\Umathfractiondelsize\allmathstyles\maxdimen} \def\math_fraction_set_threshold_display_auto - {\Umathfractiondelsize\displaystyle \maxdimen -\Umathfractiondelsize\crampeddisplaystyle \Umathfractiondelsize\displaystyle - } + {\Umathfractiondelsize\alldisplaystyles\maxdimen} \def\math_fraction_set_threshold_inline_ratio {\edef\p_threshold{\mathfractionparameter\c!inlinethreshold}% - \Umathfractiondelsize\textstyle \p_threshold\dimexpr\textface\relax - \Umathfractiondelsize\scriptstyle \p_threshold\dimexpr\scriptface\relax - \Umathfractiondelsize\scriptscriptstyle\p_threshold\dimexpr\scriptscriptface\relax -\Umathfractiondelsize\crampedtextstyle \Umathfractiondelsize\textstyle -\Umathfractiondelsize\crampedscriptstyle \Umathfractiondelsize\scriptstyle -\Umathfractiondelsize\crampedscriptscriptstyle\Umathfractiondelsize\scriptscriptstyle - } + \Umathfractiondelsize\alltextstyles \p_threshold\dimexpr\textface\relax + \Umathfractiondelsize\allscriptstyles \p_threshold\dimexpr\scriptface\relax + \Umathfractiondelsize\allscriptscriptstyles\p_threshold\dimexpr\scriptscriptface\relax} \def\math_fraction_set_threshold_display_ratio {\edef\p_threshold{\mathfractionparameter\c!displaythreshold}% - \Umathfractiondelsize\displaystyle \p_threshold\dimexpr\textface\relax -\Umathfractiondelsize\crampeddisplaystyle \Umathfractiondelsize\displaystyle - } + \Umathfractiondelsize\alldisplaystyles\p_threshold\dimexpr\textface\relax} \setupmathfractions [\c!inlinethreshold=.25, % no unit but fraction diff --git a/tex/context/base/mkxl/math-ini.mkxl b/tex/context/base/mkxl/math-ini.mkxl index bf674068a..d13c2447c 100644 --- a/tex/context/base/mkxl/math-ini.mkxl +++ b/tex/context/base/mkxl/math-ini.mkxl @@ -55,7 +55,7 @@ \registerctxluafile{math-ini}{autosuffix} \registerctxluafile{math-dim}{autosuffix} -% \registerctxluafile{math-act}{autosuffix} +%registerctxluafile{math-act}{autosuffix} \registerctxluafile{math-ext}{} \registerctxluafile{math-vfu}{autosuffix} \registerctxluafile{math-ttv}{} @@ -65,7 +65,7 @@ \registerctxluafile{math-noa}{autosuffix} \registerctxluafile{math-tag}{autosuffix} \registerctxluafile{math-fbk}{autosuffix} -\registerctxluafile{math-dir}{} +%registerctxluafile{math-dir}{} \registerctxluafile{math-spa}{autosuffix} \registerctxluafile{math-fnt}{autosuffix} \registerctxluafile{math-pre}{autosuffix} @@ -107,6 +107,8 @@ +\analyzescriptnucleuscharmathcontrolcode +\analyzescriptnucleuslistmathcontrolcode +\analyzescriptnucleusboxmathcontrolcode + +\accenttopskewwithoffsetmathcontrolcode + % +\ignorekerndimensionsmathcontrolcode % xits needs this (bad depth of fences) \relax % \mathpenaltiesmode\plusone @@ -513,8 +515,22 @@ \defaultmathclassoptions % +\checkligatureclassoptioncode +\checkkernpairclassoptioncode + % up to Mikael to decide, ok with italic chars, maybe less so with raw ints: + % +\operatoritaliccorrectionclassoptioncode \relax +% we tweak away weird italics so only special cases see this: +% +% \def\IntOr{\Umathchar\mathordinarycode"00"00222B } +% \def\IntOp{\Umathchar\mathoperatorcode"00"00222B } +% +% \showglyphs \showfontitalics +% $\IntOp\limits x \quad \IntOp\limits^1_2 x \quad \IntOp\nolimits^1_2 x $\blank +% $\IntOr\limits x \quad \IntOr\limits^1_2 x \quad \IntOr\nolimits^1_2 x $\blank +% +% $\mathop{f} (x) \quad \mathop{f}\limits (x) \quad \mathop{f}\nolimits (x)$\blank +% $\mathop{f}^a_b (x) \quad \mathop{f}\limits^a_b (x) \quad \mathop{f}\nolimits^a_b (x)$\blank + \setmathoptions\mathbinarycode\numexpr \defaultmathclassoptions +\lookaheadforendclassoptioncode @@ -1099,318 +1115,317 @@ \startsetups math:spacing:presets \resetmathspacing % - % \inherited\setmathspacing \mathordinarycode \mathordinarycode \allmathstyles \zeromuskip - \inherited\setmathspacing \mathordinarycode \mathoperatorcode \allmathstyles \thinmuskip - \inherited\setmathspacing \mathordinarycode \mathbinarycode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathordinarycode \mathbinarycode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathordinarycode \mathrelationcode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathordinarycode \mathrelationcode \allscriptstyles \pettymuskip - % \inherited\setmathspacing \mathordinarycode \mathopencode \allmathstyles \zeromuskip - \inherited\setmathspacing \mathordinarycode \mathmiddlecode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathordinarycode \mathmiddlecode \allscriptstyles \pettymuskip - % \inherited\setmathspacing \mathordinarycode \mathclosecode \allmathstyles \zeromuskip - % \inherited\setmathspacing \mathordinarycode \mathpunctuationcode \allmathstyles \zeromuskip - \inherited\setmathspacing \mathordinarycode \mathconstructcode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathordinarycode \mathconstructcode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathordinarycode \mathellipsiscode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathordinarycode \mathellipsiscode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathordinarycode \mathfractioncode \allsplitstyles \tinymuskip - \inherited\setmathspacing \mathordinarycode \mathfractioncode \allscriptstyles \pettymuskip - % \inherited\setmathspacing \mathordinarycode \mathradicalcode \allsplitstyles \tinymuskip % 220705 Results in an unwanted space - % \inherited\setmathspacing \mathordinarycode \mathradicalcode \allscriptstyles \pettymuskip % 220705 Results in an unwanted space - % - \inherited\setmathspacing \mathoperatorcode \mathordinarycode \allmathstyles \thinmuskip - \inherited\setmathspacing \mathoperatorcode \mathoperatorcode \allmathstyles \thinmuskip - % \inherited\setmathspacing \mathoperatorcode \mathbinarycode \allmathstyles \ zeromuskip - \inherited\setmathspacing \mathoperatorcode \mathrelationcode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathoperatorcode \mathrelationcode \allscriptstyles \pettymuskip - % \inherited\setmathspacing \mathoperatorcode \mathopencode \allmathstyles \zeromuskip - \inherited\setmathspacing \mathoperatorcode \mathmiddlecode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathoperatorcode \mathmiddlecode \allscriptstyles \pettymuskip - % \inherited\setmathspacing \mathoperatorcode \mathclosecode \allmathstyles \zeromuskip - % \inherited\setmathspacing \mathoperatorcode \mathpunctuationcode \allmathstyles \zeromuskip - \inherited\setmathspacing \mathoperatorcode \mathconstructcode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathoperatorcode \mathconstructcode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathoperatorcode \mathellipsiscode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathoperatorcode \mathellipsiscode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathoperatorcode \mathfractioncode \allmathstyles \thinmuskip - \inherited\setmathspacing \mathoperatorcode \mathradicalcode \allmathstyles \thinmuskip + % \inherited\setmathspacing \mathordinarycode \mathordinarycode \allmathstyles \zeromuskip + \inherited\setmathspacing \mathordinarycode \mathoperatorcode \allmathstyles \thinmuskip + \inherited\setmathspacing \mathordinarycode \mathbinarycode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathordinarycode \mathbinarycode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathordinarycode \mathrelationcode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathordinarycode \mathrelationcode \allunsplitstyles \pettymuskip + % \inherited\setmathspacing \mathordinarycode \mathopencode \allmathstyles \zeromuskip + \inherited\setmathspacing \mathordinarycode \mathmiddlecode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathordinarycode \mathmiddlecode \allunsplitstyles \pettymuskip + % \inherited\setmathspacing \mathordinarycode \mathclosecode \allmathstyles \zeromuskip + % \inherited\setmathspacing \mathordinarycode \mathpunctuationcode \allmathstyles \zeromuskip + \inherited\setmathspacing \mathordinarycode \mathconstructcode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathordinarycode \mathconstructcode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathordinarycode \mathellipsiscode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathordinarycode \mathellipsiscode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathordinarycode \mathfractioncode \allsplitstyles \tinymuskip + \inherited\setmathspacing \mathordinarycode \mathfractioncode \allunsplitstyles \pettymuskip + % \inherited\setmathspacing \mathordinarycode \mathradicalcode \allsplitstyles \tinymuskip % 220705 Results in an unwanted space + % \inherited\setmathspacing \mathordinarycode \mathradicalcode \allunsplitstyles \pettymuskip % 220705 Results in an unwanted space % - \inherited\setmathspacing \mathbinarycode \mathordinarycode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathbinarycode \mathordinarycode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathbinarycode \mathoperatorcode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathbinarycode \mathoperatorcode \allscriptstyles \pettymuskip - %% \inherited\setmathspacing \mathbinarycode \mathbinarycode \allmathstyles \zeromuskip - %% \inherited\setmathspacing \mathbinarycode \mathrelationcode \allmathstyles \zeromuskip - \inherited\setmathspacing \mathbinarycode \mathopencode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathbinarycode \mathopencode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathbinarycode \mathmiddlecode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathbinarycode \mathmiddlecode \allscriptstyles \pettymuskip - %% \inherited\setmathspacing \mathbinarycode \mathclosecode \allmathstyles \zeromuskip - \inherited\setmathspacing \mathbinarycode \mathpunctuationcode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathbinarycode \mathpunctuationcode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathbinarycode \mathconstructcode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathbinarycode \mathconstructcode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathbinarycode \mathellipsiscode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathbinarycode \mathellipsiscode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathbinarycode \mathfractioncode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathbinarycode \mathfractioncode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathbinarycode \mathradicalcode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathbinarycode \mathradicalcode \allscriptstyles \pettymuskip + \inherited\setmathspacing \mathoperatorcode \mathordinarycode \allmathstyles \thinmuskip + \inherited\setmathspacing \mathoperatorcode \mathoperatorcode \allmathstyles \thinmuskip + % \inherited\setmathspacing \mathoperatorcode \mathbinarycode \allmathstyles \zeromuskip + \inherited\setmathspacing \mathoperatorcode \mathrelationcode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathoperatorcode \mathrelationcode \allunsplitstyles \pettymuskip + % \inherited\setmathspacing \mathoperatorcode \mathopencode \allmathstyles \zeromuskip + \inherited\setmathspacing \mathoperatorcode \mathmiddlecode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathoperatorcode \mathmiddlecode \allunsplitstyles \pettymuskip + % \inherited\setmathspacing \mathoperatorcode \mathclosecode \allmathstyles \zeromuskip + % \inherited\setmathspacing \mathoperatorcode \mathpunctuationcode \allmathstyles \zeromuskip + \inherited\setmathspacing \mathoperatorcode \mathconstructcode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathoperatorcode \mathconstructcode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathoperatorcode \mathellipsiscode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathoperatorcode \mathellipsiscode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathoperatorcode \mathfractioncode \allmathstyles \thinmuskip + \inherited\setmathspacing \mathoperatorcode \mathradicalcode \allmathstyles \thinmuskip % - \inherited\setmathspacing \mathrelationcode \mathordinarycode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathrelationcode \mathordinarycode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathrelationcode \mathoperatorcode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathrelationcode \mathoperatorcode \allscriptstyles \pettymuskip - %% \inherited\setmathspacing \mathrelationcode \mathbinarycode \allmathstyles \zeromuskip - % \inherited\setmathspacing \mathrelationcode \mathrelationcode \allmathstyles \zeromuskip - \inherited\setmathspacing \mathrelationcode \mathopencode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathrelationcode \mathopencode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathrelationcode \mathmiddlecode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathrelationcode \mathmiddlecode \allscriptstyles \thinmuskip - % \inherited\setmathspacing \mathrelationcode \mathclosecode \allmathstyles \zeromuskip - \inherited\setmathspacing \mathrelationcode \mathpunctuationcode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathrelationcode \mathpunctuationcode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathrelationcode \mathconstructcode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathrelationcode \mathconstructcode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathrelationcode \mathellipsiscode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathrelationcode \mathellipsiscode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathrelationcode \mathfractioncode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathrelationcode \mathfractioncode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathrelationcode \mathradicalcode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathrelationcode \mathradicalcode \allscriptstyles \pettymuskip + \inherited\setmathspacing \mathbinarycode \mathordinarycode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathbinarycode \mathordinarycode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathbinarycode \mathoperatorcode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathbinarycode \mathoperatorcode \allunsplitstyles \pettymuskip + %% \inherited\setmathspacing \mathbinarycode \mathbinarycode \allmathstyles \zeromuskip + %% \inherited\setmathspacing \mathbinarycode \mathrelationcode \allmathstyles \zeromuskip + \inherited\setmathspacing \mathbinarycode \mathopencode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathbinarycode \mathopencode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathbinarycode \mathmiddlecode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathbinarycode \mathmiddlecode \allunsplitstyles \pettymuskip + %% \inherited\setmathspacing \mathbinarycode \mathclosecode \allmathstyles \zeromuskip + \inherited\setmathspacing \mathbinarycode \mathpunctuationcode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathbinarycode \mathpunctuationcode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathbinarycode \mathconstructcode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathbinarycode \mathconstructcode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathbinarycode \mathellipsiscode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathbinarycode \mathellipsiscode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathbinarycode \mathfractioncode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathbinarycode \mathfractioncode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathbinarycode \mathradicalcode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathbinarycode \mathradicalcode \allunsplitstyles \pettymuskip % - % \inherited\setmathspacing \mathopencode \mathordinarycode \allmathstyles \zeromuskip - % \inherited\setmathspacing \mathopencode \mathoperatorcode \allmathstyles \zeromuskip - % \inherited\setmathspacing \mathopencode \mathbinarycode \allmathstyles \zeromuskip - % \inherited\setmathspacing \mathopencode \mathrelationcode \allmathstyles \zeromuskip - % \inherited\setmathspacing \mathopencode \mathopencode \allmathstyles \zeromuskip - % \inherited\setmathspacing \mathopencode \mathmiddlecode \allmathstyles \zeromuskip - % \inherited\setmathspacing \mathopencode \mathclosecode \allmathstyles \zeromuskip - % \inherited\setmathspacing \mathopencode \mathpunctuationcode \allmathstyles \zeromuskip - % \inherited\setmathspacing \mathopencode \mathconstructcode \allmathstyles \zeromuskip - % \inherited\setmathspacing \mathopencode \mathellipsiscode \allmathstyles \zeromuskip - \inherited\setmathspacing \mathopencode \mathfractioncode \allmathstyles \pettymuskip - % \inherited\setmathspacing \mathopencode \mathradicalcode \allmathstyles \zeromuskip + \inherited\setmathspacing \mathrelationcode \mathordinarycode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathrelationcode \mathordinarycode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathrelationcode \mathoperatorcode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathrelationcode \mathoperatorcode \allunsplitstyles \pettymuskip + %% \inherited\setmathspacing \mathrelationcode \mathbinarycode \allmathstyles \zeromuskip + % \inherited\setmathspacing \mathrelationcode \mathrelationcode \allmathstyles \zeromuskip + \inherited\setmathspacing \mathrelationcode \mathopencode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathrelationcode \mathopencode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathrelationcode \mathmiddlecode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathrelationcode \mathmiddlecode \allunsplitstyles \thinmuskip + % \inherited\setmathspacing \mathrelationcode \mathclosecode \allmathstyles \zeromuskip + \inherited\setmathspacing \mathrelationcode \mathpunctuationcode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathrelationcode \mathpunctuationcode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathrelationcode \mathconstructcode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathrelationcode \mathconstructcode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathrelationcode \mathellipsiscode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathrelationcode \mathellipsiscode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathrelationcode \mathfractioncode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathrelationcode \mathfractioncode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathrelationcode \mathradicalcode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathrelationcode \mathradicalcode \allunsplitstyles \pettymuskip % - \inherited\setmathspacing \mathclosecode \mathordinarycode \allmathstyles \tinymuskip - \inherited\setmathspacing \mathclosecode \mathoperatorcode \allmathstyles \thinmuskip - \inherited\setmathspacing \mathclosecode \mathbinarycode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathclosecode \mathbinarycode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathclosecode \mathrelationcode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathclosecode \mathrelationcode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathclosecode \mathopencode \alltextstyles \tinymuskip - \inherited\setmathspacing \mathclosecode \mathopencode \alldisplaystyles\thinmuskip - \inherited\setmathspacing \mathclosecode \mathopencode \allscriptstyles \pettymuskip - % \inherited\setmathspacing \mathclosecode \mathmiddlecode \allmathstyles \zeromuskip - % \inherited\setmathspacing \mathclosecode \mathclosecode \allmathstyles \zeromuskip - % \inherited\setmathspacing \mathclosecode \mathpunctuationcode \allmathstyles \zeromuskip - \inherited\setmathspacing \mathclosecode \mathconstructcode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathclosecode \mathconstructcode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathclosecode \mathfactorialcode \allmathstyles \zeromuskip - \inherited\setmathspacing \mathclosecode \mathellipsiscode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathclosecode \mathellipsiscode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathclosecode \mathfractioncode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathclosecode \mathfractioncode \allscriptstyles \pettymuskip - % \inherited\setmathspacing \mathclosecode \mathradicalcode \allmathstyles \zeromuskip + % \inherited\setmathspacing \mathopencode \mathordinarycode \allmathstyles \zeromuskip + % \inherited\setmathspacing \mathopencode \mathoperatorcode \allmathstyles \zeromuskip + % \inherited\setmathspacing \mathopencode \mathbinarycode \allmathstyles \zeromuskip + % \inherited\setmathspacing \mathopencode \mathrelationcode \allmathstyles \zeromuskip + % \inherited\setmathspacing \mathopencode \mathopencode \allmathstyles \zeromuskip + % \inherited\setmathspacing \mathopencode \mathmiddlecode \allmathstyles \zeromuskip + % \inherited\setmathspacing \mathopencode \mathclosecode \allmathstyles \zeromuskip + % \inherited\setmathspacing \mathopencode \mathpunctuationcode \allmathstyles \zeromuskip + % \inherited\setmathspacing \mathopencode \mathconstructcode \allmathstyles \zeromuskip + % \inherited\setmathspacing \mathopencode \mathellipsiscode \allmathstyles \zeromuskip + \inherited\setmathspacing \mathopencode \mathfractioncode \allmathstyles \pettymuskip + % \inherited\setmathspacing \mathopencode \mathradicalcode \allmathstyles \zeromuskip % - \inherited\setmathspacing \mathpunctuationcode \mathordinarycode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathpunctuationcode \mathordinarycode \allscriptstyles \thinmuskip - \inherited\setmathspacing \mathpunctuationcode \mathoperatorcode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathpunctuationcode \mathoperatorcode \allscriptstyles \thinmuskip - % \inherited\setmathspacing \mathpunctuationcode \mathbinarycode \allmathstyles \zeromuskip - \inherited\setmathspacing \mathpunctuationcode \mathrelationcode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathpunctuationcode \mathrelationcode \allscriptstyles \thinmuskip - \inherited\setmathspacing \mathpunctuationcode \mathopencode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathpunctuationcode \mathopencode \allscriptstyles \thinmuskip - \inherited\setmathspacing \mathpunctuationcode \mathmiddlecode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathpunctuationcode \mathmiddlecode \allscriptstyles \thinmuskip - \inherited\setmathspacing \mathpunctuationcode \mathclosecode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathpunctuationcode \mathclosecode \allscriptstyles \thinmuskip - \inherited\setmathspacing \mathpunctuationcode \mathpunctuationcode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathpunctuationcode \mathpunctuationcode \allscriptstyles \thinmuskip - \inherited\setmathspacing \mathpunctuationcode \mathconstructcode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathpunctuationcode \mathconstructcode \allscriptstyles \thinmuskip - \inherited\setmathspacing \mathpunctuationcode \mathellipsiscode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathpunctuationcode \mathellipsiscode \allscriptstyles \thinmuskip - \inherited\setmathspacing \mathpunctuationcode \mathfractioncode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathpunctuationcode \mathfractioncode \allscriptstyles \thinmuskip - \inherited\setmathspacing \mathpunctuationcode \mathradicalcode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathpunctuationcode \mathradicalcode \allscriptstyles \thinmuskip + \inherited\setmathspacing \mathclosecode \mathordinarycode \allmathstyles \tinymuskip + \inherited\setmathspacing \mathclosecode \mathoperatorcode \allmathstyles \thinmuskip + \inherited\setmathspacing \mathclosecode \mathbinarycode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathclosecode \mathbinarycode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathclosecode \mathrelationcode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathclosecode \mathrelationcode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathclosecode \mathopencode \alltextstyles \tinymuskip + \inherited\setmathspacing \mathclosecode \mathopencode \alldisplaystyles \thinmuskip + \inherited\setmathspacing \mathclosecode \mathopencode \allunsplitstyles \pettymuskip + % \inherited\setmathspacing \mathclosecode \mathmiddlecode \allmathstyles \zeromuskip + % \inherited\setmathspacing \mathclosecode \mathclosecode \allmathstyles \zeromuskip + % \inherited\setmathspacing \mathclosecode \mathpunctuationcode \allmathstyles \zeromuskip + \inherited\setmathspacing \mathclosecode \mathconstructcode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathclosecode \mathconstructcode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathclosecode \mathfactorialcode \allmathstyles \zeromuskip + \inherited\setmathspacing \mathclosecode \mathellipsiscode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathclosecode \mathellipsiscode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathclosecode \mathfractioncode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathclosecode \mathfractioncode \allunsplitstyles \pettymuskip + % \inherited\setmathspacing \mathclosecode \mathradicalcode \allmathstyles \zeromuskip % - \inherited\setmathspacing \mathconstructcode \mathordinarycode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathconstructcode \mathordinarycode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathconstructcode \mathoperatorcode \allmathstyles \thinmuskip - \inherited\setmathspacing \mathconstructcode \mathbinarycode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathconstructcode \mathbinarycode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathconstructcode \mathrelationcode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathconstructcode \mathrelationcode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathconstructcode \mathopencode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathconstructcode \mathopencode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathconstructcode \mathmiddlecode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathconstructcode \mathmiddlecode \allscriptstyles \pettymuskip - % \inherited\setmathspacing \mathconstructcode \mathclosecode \allmathstyles \zeromuskip - \inherited\setmathspacing \mathconstructcode \mathpunctuationcode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathconstructcode \mathpunctuationcode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathconstructcode \mathconstructcode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathconstructcode \mathconstructcode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathconstructcode \mathfractioncode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathconstructcode \mathfractioncode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathconstructcode \mathradicalcode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathconstructcode \mathradicalcode \allscriptstyles \pettymuskip + \inherited\setmathspacing \mathpunctuationcode \mathordinarycode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathpunctuationcode \mathordinarycode \allunsplitstyles \thinmuskip + \inherited\setmathspacing \mathpunctuationcode \mathoperatorcode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathpunctuationcode \mathoperatorcode \allunsplitstyles \thinmuskip + % \inherited\setmathspacing \mathpunctuationcode \mathbinarycode \allmathstyles \zeromuskip + \inherited\setmathspacing \mathpunctuationcode \mathrelationcode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathpunctuationcode \mathrelationcode \allunsplitstyles \thinmuskip + \inherited\setmathspacing \mathpunctuationcode \mathopencode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathpunctuationcode \mathopencode \allunsplitstyles \thinmuskip + \inherited\setmathspacing \mathpunctuationcode \mathmiddlecode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathpunctuationcode \mathmiddlecode \allunsplitstyles \thinmuskip + \inherited\setmathspacing \mathpunctuationcode \mathclosecode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathpunctuationcode \mathclosecode \allunsplitstyles \thinmuskip + \inherited\setmathspacing \mathpunctuationcode \mathpunctuationcode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathpunctuationcode \mathpunctuationcode \allunsplitstyles \thinmuskip + \inherited\setmathspacing \mathpunctuationcode \mathconstructcode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathpunctuationcode \mathconstructcode \allunsplitstyles \thinmuskip + \inherited\setmathspacing \mathpunctuationcode \mathellipsiscode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathpunctuationcode \mathellipsiscode \allunsplitstyles \thinmuskip + \inherited\setmathspacing \mathpunctuationcode \mathfractioncode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathpunctuationcode \mathfractioncode \allunsplitstyles \thinmuskip + \inherited\setmathspacing \mathpunctuationcode \mathradicalcode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathpunctuationcode \mathradicalcode \allunsplitstyles \thinmuskip % - \inherited\setmathspacing \mathellipsiscode \mathordinarycode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathellipsiscode \mathordinarycode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathellipsiscode \mathoperatorcode \allmathstyles \thinmuskip - \inherited\setmathspacing \mathellipsiscode \mathbinarycode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathellipsiscode \mathbinarycode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathellipsiscode \mathrelationcode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathellipsiscode \mathrelationcode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathellipsiscode \mathopencode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathellipsiscode \mathopencode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathellipsiscode \mathmiddlecode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathellipsiscode \mathmiddlecode \allscriptstyles \pettymuskip - % \inherited\setmathspacing \mathellipsiscode \mathclosecode \allmathstyles \zeromuskip - \inherited\setmathspacing \mathellipsiscode \mathpunctuationcode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathellipsiscode \mathpunctuationcode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathellipsiscode \mathconstructcode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathellipsiscode \mathconstructcode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathellipsiscode \mathellipsiscode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathellipsiscode \mathellipsiscode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathellipsiscode \mathfractioncode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathellipsiscode \mathfractioncode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathellipsiscode \mathradicalcode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathellipsiscode \mathradicalcode \allscriptstyles \pettymuskip + \inherited\setmathspacing \mathconstructcode \mathordinarycode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathconstructcode \mathordinarycode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathconstructcode \mathoperatorcode \allmathstyles \thinmuskip + \inherited\setmathspacing \mathconstructcode \mathbinarycode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathconstructcode \mathbinarycode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathconstructcode \mathrelationcode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathconstructcode \mathrelationcode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathconstructcode \mathopencode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathconstructcode \mathopencode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathconstructcode \mathmiddlecode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathconstructcode \mathmiddlecode \allunsplitstyles \pettymuskip + % \inherited\setmathspacing \mathconstructcode \mathclosecode \allmathstyles \zeromuskip + \inherited\setmathspacing \mathconstructcode \mathpunctuationcode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathconstructcode \mathpunctuationcode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathconstructcode \mathconstructcode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathconstructcode \mathconstructcode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathconstructcode \mathfractioncode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathconstructcode \mathfractioncode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathconstructcode \mathradicalcode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathconstructcode \mathradicalcode \allunsplitstyles \pettymuskip % + \inherited\setmathspacing \mathellipsiscode \mathordinarycode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathellipsiscode \mathordinarycode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathellipsiscode \mathoperatorcode \allmathstyles \thinmuskip + \inherited\setmathspacing \mathellipsiscode \mathbinarycode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathellipsiscode \mathbinarycode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathellipsiscode \mathrelationcode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathellipsiscode \mathrelationcode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathellipsiscode \mathopencode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathellipsiscode \mathopencode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathellipsiscode \mathmiddlecode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathellipsiscode \mathmiddlecode \allunsplitstyles \pettymuskip + % \inherited\setmathspacing \mathellipsiscode \mathclosecode \allmathstyles \zeromuskip + \inherited\setmathspacing \mathellipsiscode \mathpunctuationcode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathellipsiscode \mathpunctuationcode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathellipsiscode \mathconstructcode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathellipsiscode \mathconstructcode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathellipsiscode \mathellipsiscode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathellipsiscode \mathellipsiscode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathellipsiscode \mathfractioncode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathellipsiscode \mathfractioncode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathellipsiscode \mathradicalcode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathellipsiscode \mathradicalcode \allunsplitstyles \pettymuskip % - \inherited\setmathspacing \mathfractioncode \mathordinarycode \allsplitstyles \tinymuskip - \inherited\setmathspacing \mathfractioncode \mathordinarycode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathfractioncode \mathoperatorcode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathfractioncode \mathoperatorcode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathfractioncode \mathbinarycode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathfractioncode \mathbinarycode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathfractioncode \mathrelationcode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathfractioncode \mathrelationcode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathfractioncode \mathopencode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathfractioncode \mathopencode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathfractioncode \mathmiddlecode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathfractioncode \mathmiddlecode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathfractioncode \mathclosecode \allmathstyles \pettymuskip - \inherited\setmathspacing \mathfractioncode \mathpunctuationcode \allsplitstyles \tinymuskip - \inherited\setmathspacing \mathfractioncode \mathpunctuationcode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathfractioncode \mathtextpunctuationcode \allmathstyles \tinymuskip - \inherited\setmathspacing \mathfractioncode \mathconstructcode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathfractioncode \mathconstructcode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathfractioncode \mathellipsiscode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathfractioncode \mathellipsiscode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathfractioncode \mathfractioncode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathfractioncode \mathfractioncode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathfractioncode \mathradicalcode \allsplitstyles \tinymuskip - \inherited\setmathspacing \mathfractioncode \mathradicalcode \allscriptstyles \pettymuskip + \inherited\setmathspacing \mathfractioncode \mathordinarycode \allsplitstyles \tinymuskip + \inherited\setmathspacing \mathfractioncode \mathordinarycode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathfractioncode \mathoperatorcode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathfractioncode \mathoperatorcode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathfractioncode \mathbinarycode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathfractioncode \mathbinarycode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathfractioncode \mathrelationcode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathfractioncode \mathrelationcode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathfractioncode \mathopencode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathfractioncode \mathopencode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathfractioncode \mathmiddlecode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathfractioncode \mathmiddlecode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathfractioncode \mathclosecode \allmathstyles \pettymuskip + \inherited\setmathspacing \mathfractioncode \mathpunctuationcode \allsplitstyles \tinymuskip + \inherited\setmathspacing \mathfractioncode \mathpunctuationcode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathfractioncode \mathtextpunctuationcode \allmathstyles \tinymuskip + \inherited\setmathspacing \mathfractioncode \mathconstructcode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathfractioncode \mathconstructcode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathfractioncode \mathellipsiscode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathfractioncode \mathellipsiscode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathfractioncode \mathfractioncode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathfractioncode \mathfractioncode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathfractioncode \mathradicalcode \allsplitstyles \tinymuskip + \inherited\setmathspacing \mathfractioncode \mathradicalcode \allunsplitstyles \pettymuskip % - \inherited\setmathspacing \mathradicalcode \mathordinarycode \allsplitstyles \tinymuskip - \inherited\setmathspacing \mathradicalcode \mathordinarycode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathradicalcode \mathoperatorcode \allmathstyles \thinmuskip - \inherited\setmathspacing \mathradicalcode \mathbinarycode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathradicalcode \mathbinarycode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathradicalcode \mathrelationcode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathradicalcode \mathrelationcode \allscriptstyles \pettymuskip - % \inherited\setmathspacing \mathradicalcode \mathopencode \allmathstyles \zeromuskip - \inherited\setmathspacing \mathradicalcode \mathmiddlecode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathradicalcode \mathmiddlecode \allscriptstyles \pettymuskip - % \inherited\setmathspacing \mathradicalcode \mathclosecode \allmathstyles \zeromuskip - \inherited\setmathspacing \mathradicalcode \mathpunctuationcode \allsplitstyles \pettymuskip - \inherited\setmathspacing \mathradicalcode \mathpunctuationcode \allscriptstyles \tinymuskip - \inherited\setmathspacing \mathradicalcode \mathconstructcode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathradicalcode \mathconstructcode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathradicalcode \mathellipsiscode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathradicalcode \mathellipsiscode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathradicalcode \mathfractioncode \allsplitstyles \tinymuskip - \inherited\setmathspacing \mathradicalcode \mathfractioncode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathradicalcode \mathradicalcode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathradicalcode \mathradicalcode \allscriptstyles \pettymuskip + \inherited\setmathspacing \mathradicalcode \mathordinarycode \allsplitstyles \tinymuskip + \inherited\setmathspacing \mathradicalcode \mathordinarycode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathradicalcode \mathoperatorcode \allmathstyles \thinmuskip + \inherited\setmathspacing \mathradicalcode \mathbinarycode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathradicalcode \mathbinarycode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathradicalcode \mathrelationcode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathradicalcode \mathrelationcode \allunsplitstyles \pettymuskip + % \inherited\setmathspacing \mathradicalcode \mathopencode \allmathstyles \zeromuskip + \inherited\setmathspacing \mathradicalcode \mathmiddlecode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathradicalcode \mathmiddlecode \allunsplitstyles \pettymuskip + % \inherited\setmathspacing \mathradicalcode \mathclosecode \allmathstyles \zeromuskip + \inherited\setmathspacing \mathradicalcode \mathpunctuationcode \allsplitstyles \pettymuskip + \inherited\setmathspacing \mathradicalcode \mathpunctuationcode \allunsplitstyles \tinymuskip + \inherited\setmathspacing \mathradicalcode \mathconstructcode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathradicalcode \mathconstructcode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathradicalcode \mathellipsiscode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathradicalcode \mathellipsiscode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathradicalcode \mathfractioncode \allsplitstyles \tinymuskip + \inherited\setmathspacing \mathradicalcode \mathfractioncode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathradicalcode \mathradicalcode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathradicalcode \mathradicalcode \allunsplitstyles \pettymuskip % - \inherited\setmathspacing \mathmiddlecode \mathordinarycode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathmiddlecode \mathordinarycode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathmiddlecode \mathoperatorcode \allmathstyles \thickmuskip - \inherited\setmathspacing \mathmiddlecode \mathbinarycode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathmiddlecode \mathbinarycode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathmiddlecode \mathrelationcode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathmiddlecode \mathrelationcode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathmiddlecode \mathopencode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathmiddlecode \mathopencode \allsplitstyles \pettymuskip - \inherited\setmathspacing \mathmiddlecode \mathmiddlecode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathmiddlecode \mathmiddlecode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathmiddlecode \mathclosecode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathmiddlecode \mathclosecode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathmiddlecode \mathpunctuationcode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathmiddlecode \mathpunctuationcode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathmiddlecode \mathconstructcode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathmiddlecode \mathconstructcode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathmiddlecode \mathellipsiscode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathmiddlecode \mathellipsiscode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathmiddlecode \mathfractioncode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathmiddlecode \mathfractioncode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathmiddlecode \mathradicalcode \allsplitstyles \thickmuskip - \inherited\setmathspacing \mathmiddlecode \mathradicalcode \allmathstyles \pettymuskip + \inherited\setmathspacing \mathmiddlecode \mathordinarycode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathmiddlecode \mathordinarycode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathmiddlecode \mathoperatorcode \allmathstyles \thickmuskip + \inherited\setmathspacing \mathmiddlecode \mathbinarycode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathmiddlecode \mathbinarycode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathmiddlecode \mathrelationcode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathmiddlecode \mathrelationcode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathmiddlecode \mathopencode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathmiddlecode \mathopencode \allsplitstyles \pettymuskip + \inherited\setmathspacing \mathmiddlecode \mathmiddlecode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathmiddlecode \mathmiddlecode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathmiddlecode \mathclosecode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathmiddlecode \mathclosecode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathmiddlecode \mathpunctuationcode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathmiddlecode \mathpunctuationcode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathmiddlecode \mathconstructcode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathmiddlecode \mathconstructcode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathmiddlecode \mathellipsiscode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathmiddlecode \mathellipsiscode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathmiddlecode \mathfractioncode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathmiddlecode \mathfractioncode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathmiddlecode \mathradicalcode \allsplitstyles \thickmuskip + \inherited\setmathspacing \mathmiddlecode \mathradicalcode \allmathstyles \pettymuskip % - \inherited\setmathspacing \mathclosecode \mathdifferentialcode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathclosecode \mathdifferentialcode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathordinarycode \mathdifferentialcode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathordinarycode \mathdifferentialcode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathfactorialcode \mathordinarycode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathfactorialcode \mathordinarycode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathfactorialcode \mathfactorialcode \allmathstyles \zeromuskip + \inherited\setmathspacing \mathclosecode \mathdifferentialcode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathclosecode \mathdifferentialcode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathordinarycode \mathdifferentialcode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathordinarycode \mathdifferentialcode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathfactorialcode \mathordinarycode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathfactorialcode \mathordinarycode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathfactorialcode \mathfactorialcode \allmathstyles \zeromuskip % - \inherited\setmathspacing \mathopencode \mathconstructcode \allmathstyles \thinmuskip - \inherited\setmathspacing \mathconstructcode \mathclosecode \allmathstyles \thinmuskip + \inherited\setmathspacing \mathopencode \mathconstructcode \allmathstyles \thinmuskip + \inherited\setmathspacing \mathconstructcode \mathclosecode \allmathstyles \thinmuskip % - \inherited\setmathspacing \mathdimensioncode \mathdimensioncode \allmathstyles \zeromuskip - \inherited\setmathspacing \mathordinarycode \mathdimensioncode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathordinarycode \mathdimensioncode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathdigitcode \mathdimensioncode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathdigitcode \mathdimensioncode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathclosecode \mathdimensioncode \allsplitstyles \thinmuskip - \inherited\setmathspacing \mathclosecode \mathdimensioncode \allscriptstyles \pettymuskip - \inherited\setmathspacing \mathfunctioncode \mathbinarycode \allsplitstyles \medmuskip - \inherited\setmathspacing \mathfunctioncode \mathbinarycode \allscriptstyles \pettymuskip + \inherited\setmathspacing \mathdimensioncode \mathdimensioncode \allmathstyles \zeromuskip + \inherited\setmathspacing \mathordinarycode \mathdimensioncode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathordinarycode \mathdimensioncode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathdigitcode \mathdimensioncode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathdigitcode \mathdimensioncode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathclosecode \mathdimensioncode \allsplitstyles \thinmuskip + \inherited\setmathspacing \mathclosecode \mathdimensioncode \allunsplitstyles \pettymuskip + \inherited\setmathspacing \mathfunctioncode \mathbinarycode \allsplitstyles \medmuskip + \inherited\setmathspacing \mathfunctioncode \mathbinarycode \allunsplitstyles \pettymuskip % % \im{1\unit{hour} 20 \unit{minute} 56 \unit{second}} % - \inherited\setmathspacing \mathdimensioncode \mathdigitcode \allmathstyles \thickmuskip + \inherited\setmathspacing \mathdimensioncode \mathdigitcode \allmathstyles \thickmuskip + % + \inherited\setmathspacing \mathfakecode \mathallcode \allmathstyles \tinymuskip + \inherited\setmathspacing \mathallcode \mathfakecode \allmathstyles \tinymuskip % - \inherited\setmathspacing \mathfakecode \mathallcode \allmathstyles \tinymuskip - \inherited\setmathspacing \mathallcode \mathfakecode \allmathstyles \tinymuskip + \inherited\setmathspacing \mathtextpunctuationcode \mathordinarycode \allmathstyles \mathinterwordmuskip + \inherited\setmathspacing \mathtextpunctuationcode \mathoperatorcode \allmathstyles \mathinterwordmuskip + \inherited\setmathspacing \mathtextpunctuationcode \mathbinarycode \allmathstyles \mathinterwordmuskip + \inherited\setmathspacing \mathtextpunctuationcode \mathrelationcode \allmathstyles \mathinterwordmuskip + \inherited\setmathspacing \mathtextpunctuationcode \mathopencode \allmathstyles \mathinterwordmuskip + \inherited\setmathspacing \mathtextpunctuationcode \mathmiddlecode \allmathstyles \mathinterwordmuskip + \inherited\setmathspacing \mathtextpunctuationcode \mathclosecode \allmathstyles \mathinterwordmuskip + \inherited\setmathspacing \mathtextpunctuationcode \mathpunctuationcode \allmathstyles \mathinterwordmuskip + \inherited\setmathspacing \mathtextpunctuationcode \mathconstructcode \allmathstyles \mathinterwordmuskip + \inherited\setmathspacing \mathtextpunctuationcode \mathellipsiscode \allmathstyles \mathinterwordmuskip + \inherited\setmathspacing \mathtextpunctuationcode \mathfractioncode \allmathstyles \mathinterwordmuskip + \inherited\setmathspacing \mathtextpunctuationcode \mathradicalcode \allmathstyles \mathinterwordmuskip + \inherited\setmathspacing \mathtextpunctuationcode \mathdifferentialcode \allmathstyles \mathinterwordmuskip + \inherited\setmathspacing \mathtextpunctuationcode \mathpunctuationcode \allmathstyles \mathinterwordmuskip % - \inherited\setmathspacing \mathtextpunctuationcode \mathordinarycode \allmathstyles \mathinterwordmuskip - \inherited\setmathspacing \mathtextpunctuationcode \mathoperatorcode \allmathstyles \mathinterwordmuskip - \inherited\setmathspacing \mathtextpunctuationcode \mathbinarycode \allmathstyles \mathinterwordmuskip - \inherited\setmathspacing \mathtextpunctuationcode \mathrelationcode \allmathstyles \mathinterwordmuskip - \inherited\setmathspacing \mathtextpunctuationcode \mathopencode \allmathstyles \mathinterwordmuskip - \inherited\setmathspacing \mathtextpunctuationcode \mathmiddlecode \allmathstyles \mathinterwordmuskip - \inherited\setmathspacing \mathtextpunctuationcode \mathclosecode \allmathstyles \mathinterwordmuskip - \inherited\setmathspacing \mathtextpunctuationcode \mathpunctuationcode \allmathstyles \mathinterwordmuskip - \inherited\setmathspacing \mathtextpunctuationcode \mathconstructcode \allmathstyles \mathinterwordmuskip - \inherited\setmathspacing \mathtextpunctuationcode \mathellipsiscode \allmathstyles \mathinterwordmuskip - \inherited\setmathspacing \mathtextpunctuationcode \mathfractioncode \allmathstyles \mathinterwordmuskip - \inherited\setmathspacing \mathtextpunctuationcode \mathradicalcode \allmathstyles \mathinterwordmuskip - \inherited\setmathspacing \mathtextpunctuationcode \mathdifferentialcode \allmathstyles \mathinterwordmuskip - \inherited\setmathspacing \mathtextpunctuationcode \mathpunctuationcode \allmathstyles \mathinterwordmuskip - - \inherited\setmathspacing \mathordinarycode \mathtextpunctuationcode \allmathstyles \tinymuskip - \inherited\setmathspacing \mathoperatorcode \mathtextpunctuationcode \allmathstyles \tinymuskip - \inherited\setmathspacing \mathbinarycode \mathtextpunctuationcode \allmathstyles \tinymuskip - \inherited\setmathspacing \mathrelationcode \mathtextpunctuationcode \allmathstyles \tinymuskip - \inherited\setmathspacing \mathopencode \mathtextpunctuationcode \allmathstyles \tinymuskip - \inherited\setmathspacing \mathmiddlecode \mathtextpunctuationcode \allmathstyles \tinymuskip - \inherited\setmathspacing \mathclosecode \mathtextpunctuationcode \allmathstyles \tinymuskip - \inherited\setmathspacing \mathpunctuationcode \mathtextpunctuationcode \allmathstyles \tinymuskip - \inherited\setmathspacing \mathconstructcode \mathtextpunctuationcode \allmathstyles \tinymuskip - \inherited\setmathspacing \mathellipsiscode \mathtextpunctuationcode \allmathstyles \tinymuskip - \inherited\setmathspacing \mathfractioncode \mathtextpunctuationcode \allmathstyles \tinymuskip - \inherited\setmathspacing \mathradicalcode \mathtextpunctuationcode \allmathstyles \tinymuskip - \inherited\setmathspacing \mathdifferentialcode \mathtextpunctuationcode \allmathstyles \tinymuskip - \inherited\setmathspacing \mathpunctuationcode \mathtextpunctuationcode \allmathstyles \tinymuskip + \inherited\setmathspacing \mathordinarycode \mathtextpunctuationcode \allmathstyles \tinymuskip + \inherited\setmathspacing \mathoperatorcode \mathtextpunctuationcode \allmathstyles \tinymuskip + \inherited\setmathspacing \mathbinarycode \mathtextpunctuationcode \allmathstyles \tinymuskip + \inherited\setmathspacing \mathrelationcode \mathtextpunctuationcode \allmathstyles \tinymuskip + \inherited\setmathspacing \mathopencode \mathtextpunctuationcode \allmathstyles \tinymuskip + \inherited\setmathspacing \mathmiddlecode \mathtextpunctuationcode \allmathstyles \tinymuskip + \inherited\setmathspacing \mathclosecode \mathtextpunctuationcode \allmathstyles \tinymuskip + \inherited\setmathspacing \mathpunctuationcode \mathtextpunctuationcode \allmathstyles \tinymuskip + \inherited\setmathspacing \mathconstructcode \mathtextpunctuationcode \allmathstyles \tinymuskip + \inherited\setmathspacing \mathellipsiscode \mathtextpunctuationcode \allmathstyles \tinymuskip + \inherited\setmathspacing \mathfractioncode \mathtextpunctuationcode \allmathstyles \tinymuskip + \inherited\setmathspacing \mathradicalcode \mathtextpunctuationcode \allmathstyles \tinymuskip + \inherited\setmathspacing \mathdifferentialcode \mathtextpunctuationcode \allmathstyles \tinymuskip + \inherited\setmathspacing \mathpunctuationcode \mathtextpunctuationcode \allmathstyles \tinymuskip \stopsetups \directsetup{math:spacing:default} @@ -1506,10 +1521,12 @@ \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\setmathvariant\s!handwriting} -\permanent\protected\def\math_calligraphic{\setmathalphabet \s!script \setmathfontstylealternate\s!script\setmathvariant\s!calligraphy} -\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\math_script {\setmathalphabet \s!script \setmathfontstylealternate\s!script\setmathvariant\s!handwriting} +%permanent\protected\def\math_calligraphic{\setmathalphabet \s!script \setmathfontstylealternate\s!script\setmathvariant\s!calligraphy} +\permanent\protected\def\math_script {\setmathalphabet \s!script \setmathfontstylealternate\s!script} +\permanent\protected\def\math_calligraphic{\setmathalphabet \s!calligraphic\setmathfontstylealternate\s!calligraphic} +\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 } @@ -1804,14 +1821,12 @@ % using \s!font \mathstylefontid\mathstyle\fam would needs expansion and guesswork \appendtoks - \Umathruleheight\alltextstyles \strutheightfactor\fontspecifiedsize\textfont \zerocount - \Umathruledepth \alltextstyles \strutdepthfactor \fontspecifiedsize\textfont \zerocount + \Umathruleheight\allmainstyles \strutheightfactor\fontspecifiedsize\textfont \zerocount + \Umathruledepth \allmainstyles \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 @@ -2364,26 +2379,26 @@ \math_basics_synchronize_direction \to \everyswitchmathematics -% experimental (needed for an article) - -\installcorenamespace {mathbidi} - -\newcount\c_math_bidi - -\def\math_bidi_enable {\clf_setmathdirection\plusone \relax\c_math_bidi\plusone} -\def\math_bidi_disable{\clf_setmathdirection\zerocount\relax\c_math_bidi\attributeunsetvalue} - -\letcsname\??mathbidi\v!yes\endcsname\math_bidi_enable -\letcsname\??mathbidi\v!no \endcsname\math_bidi_disable - -\appendtoks - \edef\p_bidi{\mathematicsparameter\c!bidi}% still needed ? - \ifcsname\??mathbidi\p_bidi\endcsname\lastnamedcs\else\math_bidi_disable\fi -\to \everysetupmathematics +% experimental (needed for an article) .. this is is no longer neded -\appendtoks - \c_attr_mathbidi\ifconditional\c_math_right_to_left\c_math_bidi\else\attributeunsetvalue\fi -\to \everyswitchmathematics +% \installcorenamespace {mathbidi} +% +% \newcount\c_math_bidi +% +% \def\math_bidi_enable {\clf_setmathdirection\plusone \relax\c_math_bidi\plusone} +% \def\math_bidi_disable{\clf_setmathdirection\zerocount\relax\c_math_bidi\attributeunsetvalue} +% +% \letcsname\??mathbidi\v!yes\endcsname\math_bidi_enable +% \letcsname\??mathbidi\v!no \endcsname\math_bidi_disable +% +% \appendtoks +% \edef\p_bidi{\mathematicsparameter\c!bidi}% still needed ? +% \ifcsname\??mathbidi\p_bidi\endcsname\lastnamedcs\else\math_bidi_disable\fi +% \to \everysetupmathematics +% +% \appendtoks +% \c_attr_mathbidi\ifconditional\c_math_right_to_left\c_math_bidi\else\attributeunsetvalue\fi +% \to \everyswitchmathematics %D Delayed: greek. %D diff --git a/tex/context/base/mkxl/math-map.lmt b/tex/context/base/mkxl/math-map.lmt index f411505f2..d0a1410a1 100644 --- a/tex/context/base/mkxl/math-map.lmt +++ b/tex/context/base/mkxl/math-map.lmt @@ -66,7 +66,7 @@ local context = context -- todo: allocate -mathematics.styles = allocate { "regular", "sansserif", "monospaced", "fraktur", "script", "blackboard" } +mathematics.styles = allocate { "regular", "sansserif", "monospaced", "fraktur", "script", "calligraphic", "blackboard" } mathematics.alternatives = allocate { "normal", "bold", "italic", "bolditalic" } mathematics.sets = allocate { "ucletters", "lcletters", "digits", "ucgreek", "lcgreek", "symbols" } @@ -520,58 +520,95 @@ local script = { bi = script_bf, } +local calligraphic_tf = { + digits = tovector(regular_tf.digits), + ucletters = toupper(0x100020), + lcletters = tolower(0x100000), + lcgreek = tovector(regular_tf.lcgreek), + ucgreek = tovector(regular_tf.ucgreek), + symbols = tovector(regular_tf.symbols), +} + +local calligraphic_bf = { + digits = tovector(regular_bf.digits), + ucletters = toupper(0x100060), + lcletters = tolower(0x100040), + lcgreek = tovector(regular_bf.lcgreek), + ucgreek = tovector(regular_bf.ucgreek), + symbols = tovector(regular_bf.symbols), +} + +local calligraphic = { + tf = calligraphic_tf, + bf = calligraphic_bf, + it = calligraphic_tf, + bi = calligraphic_bf, +} + local alphabets = allocate { - regular = regular, - sansserif = sansserif, - monospaced = monospaced, - blackboard = blackboard, - fraktur = fraktur, - script = script, -} - -alphabets.tt = tovector(monospaced) -alphabets.ss = tovector(sansserif) -alphabets.rm = tovector(regular) -alphabets.bb = tovector(blackboard) -alphabets.fr = tovector(fraktur) -alphabets.sr = tovector(script) - -monospaced.normal = tovector(monospaced_tf) -monospaced.italic = tovector(monospaced_it) -monospaced.bold = tovector(monospaced_bf) -monospaced.bolditalic = tovector(monospaced_bi) - -sansserif.normal = tovector(sansserif_tf) -sansserif.italic = tovector(sansserif_it) -sansserif.bold = tovector(sansserif_bf) -sansserif.bolditalic = tovector(sansserif_bi) - -regular.normal = tovector(regular_tf) -regular.italic = tovector(regular_it) -regular.bold = tovector(regular_bf) -regular.bolditalic = tovector(regular_bi) - -blackboard.normal = tovector(blackboard_tf) -blackboard.italic = tovector(blackboard_tf) -blackboard.bold = tovector(blackboard_tf) -blackboard.bolditalic = tovector(blackboard_tf) - -fraktur.normal = tovector(fraktur_tf) -fraktur.italic = tovector(fraktur_bf) -fraktur.bold = tovector(fraktur_tf) -fraktur.bolditalic = tovector(fraktur_bf) - -alphabets.serif = tovector(regular) -alphabets.type = tovector(monospaced) -alphabets.teletype = tovector(monospaced) - -mathematics.alphabets = alphabets - -local mathremap = allocate { } -mathematics.mapremap = mathremap - -local boldmap = allocate { } -mathematics.boldmap = boldmap + regular = regular, + sansserif = sansserif, + monospaced = monospaced, + blackboard = blackboard, + fraktur = fraktur, + script = script, + calligraphic = calligraphic, +} + +alphabets.tt = tovector(monospaced) +alphabets.ss = tovector(sansserif) +alphabets.rm = tovector(regular) +alphabets.bb = tovector(blackboard) +alphabets.fr = tovector(fraktur) +alphabets.sr = tovector(script) +alphabets.ca = tovector(calligraphic) + +monospaced.normal = tovector(monospaced_tf) +monospaced.italic = tovector(monospaced_it) +monospaced.bold = tovector(monospaced_bf) +monospaced.bolditalic = tovector(monospaced_bi) + +sansserif.normal = tovector(sansserif_tf) +sansserif.italic = tovector(sansserif_it) +sansserif.bold = tovector(sansserif_bf) +sansserif.bolditalic = tovector(sansserif_bi) + +regular.normal = tovector(regular_tf) +regular.italic = tovector(regular_it) +regular.bold = tovector(regular_bf) +regular.bolditalic = tovector(regular_bi) + +blackboard.normal = tovector(blackboard_tf) +blackboard.italic = tovector(blackboard_tf) +blackboard.bold = tovector(blackboard_tf) +blackboard.bolditalic = tovector(blackboard_tf) + +fraktur.normal = tovector(fraktur_tf) +fraktur.italic = tovector(fraktur_bf) +fraktur.bold = tovector(fraktur_tf) +fraktur.bolditalic = tovector(fraktur_bf) + +script.normal = tovector(script_tf) +script.italic = tovector(script_bf) +script.bold = tovector(script_tf) +script.bolditalic = tovector(script_bf) + +calligraphic.normal = tovector(calligraphic_tf) +calligraphic.italic = tovector(calligraphic_bf) +calligraphic.bold = tovector(calligraphic_tf) +calligraphic.bolditalic = tovector(calligraphic_bf) + +alphabets.serif = tovector(regular) +alphabets.type = tovector(monospaced) +alphabets.teletype = tovector(monospaced) + +mathematics.alphabets = alphabets + +local mathremap = allocate { } +mathematics.mapremap = mathremap + +local boldmap = allocate { } +mathematics.boldmap = boldmap -- all math (a bit of redundancy here) (sorted for tracing) @@ -704,10 +741,11 @@ implement { actions = function(alphabet) if texgetmode() == mathmode_code then -- local r = mathremap[mathalphabet] - local r = mathremap[texgetattribute(mathalphabet)] + local a = texgetattribute(mathalphabet) + local r = mathremap[a] local style = r and r.style or "tf" local data = alphabets[alphabet][style] - texsetattribute(mathalphabet,data and data.attribute or texattribute[mathalphabet]) + texsetattribute(mathalphabet,data and data.attribute or a) end end } @@ -805,7 +843,7 @@ end -- begin of experiment -local fallback = { +local stylefallbacks = { tf = "bf", it = "bi", bf = "tf", @@ -813,12 +851,12 @@ local fallback = { } function mathematics.fallbackstyleattr(attribute) - local r = mathremap[attribute] - local alphabet = r.alphabet or "regular" - local style = r.style or "tf" - local fback = fallback[style] - if fback then - local data = alphabets[alphabet][fback] + local redirect = mathremap[attribute] + local alphabet = redirect.alphabet or "regular" + local style = redirect.style or "tf" + local fallback = stylefallbacks[style] + if fallback then + local data = alphabets[alphabet][fallback] if data then local attr = data.attribute return attribute ~= attr and attr diff --git a/tex/context/base/mkxl/math-noa.lmt b/tex/context/base/mkxl/math-noa.lmt index a754f6f39..30b7b0448 100644 --- a/tex/context/base/mkxl/math-noa.lmt +++ b/tex/context/base/mkxl/math-noa.lmt @@ -683,13 +683,14 @@ end do - local a_mathalphabet = privateattribute("mathalphabet") - local a_mathgreek = privateattribute("mathgreek") + local a_mathalphabet = privateattribute("mathalphabet") + local a_mathgreek = privateattribute("mathgreek") - local relocate = { } + local relocate = { } - local remapalphabets = mathematics.remapalphabets - local fallbackstyleattr = mathematics.fallbackstyleattr + local remapalphabets = mathematics.remapalphabets + local fallbackstyleattr = mathematics.fallbackstyleattr + local fallbackalphabetattr = mathematics.fallbackalphabetattr local function report_remap(tag,id,old,new,extra) if new then diff --git a/tex/context/base/mkxl/math-rad.mklx b/tex/context/base/mkxl/math-rad.mklx index 04d6bfbba..9dfc80d13 100644 --- a/tex/context/base/mkxl/math-rad.mklx +++ b/tex/context/base/mkxl/math-rad.mklx @@ -242,13 +242,13 @@ \scratchdimen \wd\scratchbox \scratchtopoffset \dimexpr\scratchoffset+\dp\nextbox\relax \scratchbottomoffset\dimexpr\scratchoffset+\ht\nextbox/2\relax - \hpack to \scratchdimen{\hss\box\nextbox\hskip\scratchoffset}% - \hskip-\scratchdimen + \hpack to \scratchdimen{\hss\box\nextbox\kern\scratchoffset}% + \kern-\scratchdimen \lower\dimexpr\scratchtopoffset\box\scratchbox% \ifx\currentmathradicaldegree\empty \else \setbox\scratchbox\mathstylehbox{\scriptscriptstyle\currentmathradicaldegree\hss}% \wd\scratchbox\scratchdimen - \hskip-\scratchdimen + \kern-\scratchdimen \raise\dimexpr\scratchbottomoffset\box\scratchbox \fi \endgroup} @@ -296,7 +296,7 @@ % the width of the graphic determines the width of the final result \setbox\scratchbox\hpack{\uniqueMPgraphic{\p_mp}}% todo: add code key + tag \hpack to \wd\scratchbox{\hss\box\nextbox\hss}% - \hskip-\wd\scratchbox + \kern-\wd\scratchbox \box\scratchbox \endgroup} diff --git a/tex/context/base/mkxl/math-stc.mklx b/tex/context/base/mkxl/math-stc.mklx index 2ddfa24fd..828115f83 100644 --- a/tex/context/base/mkxl/math-stc.mklx +++ b/tex/context/base/mkxl/math-stc.mklx @@ -75,6 +75,9 @@ % at the lua end and some checking: use \mathhorizontalcode or \mathextensiblecode % but in practice arrows etc are not used that often +% At some point we can consider to use the more natural \LUAMETATEX\ features but the +% problem is that we lack proper support in fonts and we also have less control. + \installcorenamespace {mathextensiblefallbacks} % currently no italic correction ... problem is that we don't know yet if we have an italic @@ -1059,6 +1062,7 @@ \definemathextensible [\v!reverse] [xrightharpoondown] ["21C1] \definemathextensible [\v!reverse] [xrightharpoonup] ["21C0] \definemathextensible [\v!reverse] [xrightoverleftarrow] ["21C4] +\definemathextensible [\v!reverse] [xleftoverrightarrow] ["21C6] \definemathextensible [\v!reverse] [xleftrightharpoons] ["21CB] \definemathextensible [\v!reverse] [xrightleftharpoons] ["21CC] \definemathextensible [\v!reverse] [xtriplerel] ["2261] @@ -1081,6 +1085,7 @@ \definemathextensible [\v!mathematics] [mrightharpoondown] ["21C1] \definemathextensible [\v!mathematics] [mrightharpoonup] ["21C0] \definemathextensible [\v!mathematics] [mrightoverleftarrow] ["21C4] +\definemathextensible [\v!mathematics] [mleftoverrightarrow] ["21C6] \definemathextensible [\v!mathematics] [mleftrightharpoons] ["21CB] \definemathextensible [\v!mathematics] [mrightleftharpoons] ["21CC] \definemathextensible [\v!mathematics] [mtriplerel] ["2261] @@ -1103,6 +1108,7 @@ \definemathextensible [\v!text] [trightharpoondown] ["21C1] \definemathextensible [\v!text] [trightharpoonup] ["21C0] \definemathextensible [\v!text] [trightoverleftarrow] ["21C4] +\definemathextensible [\v!text] [tleftoverrightarrow] ["21C6] \definemathextensible [\v!text] [tleftrightharpoons] ["21CB] \definemathextensible [\v!text] [trightleftharpoons] ["21CC] \definemathextensible [\v!text] [ttriplerel] ["2261] @@ -1184,6 +1190,7 @@ \definemathextensible [\v!chemistry] [cleftarrow] ["2190] \definemathextensible [\v!chemistry] [crightarrow] ["2192] \definemathextensible [\v!chemistry] [crightoverleftarrow] ["21C4] +\definemathextensible [\v!chemistry] [cleftoverrightarrow] ["21C6] % for the moment: @@ -1208,6 +1215,7 @@ \immutable\protected\def\rightarrowfill {\math_stackers_hacked_fill \relbar \relbar \rightarrow} \immutable\protected\def\leftarrowfill {\math_stackers_hacked_fill \leftarrow \relbar \relbar } \immutable\protected\def\rightoverleftarrowfill{\math_stackers_hacked_fill \ctxdoublearrowfillleftend\ctxdoublearrowfillmiddlepart\ctxdoublearrowfillrightend} +\immutable\protected\def\leftoverrightarrowfill{\math_stackers_hacked_fill \ctxdoublearrowfillrightend\ctxdoublearrowfillmiddlepart\ctxdoublearrowfillleftend} \immutable\protected\def\equalfill {\math_stackers_hacked_fill \Relbar \Relbar \Relbar} \immutable\protected\def\Rightarrowfill {\math_stackers_hacked_fill \Relbar \Relbar \Rightarrow} \immutable\protected\def\Leftarrowfill {\math_stackers_hacked_fill \Leftarrow \Relbar \Relbar} @@ -1247,6 +1255,7 @@ \defineextensiblefiller [rightharpoondownfill] ["21C1] \defineextensiblefiller [rightharpoonupfill] ["21C0] \defineextensiblefiller [rightoverleftarrowfill] ["21C4] +\defineextensiblefiller [leftoverrightarrowfill] ["21C6] %defineextensiblefiller [leftrightharpoonsfill] ["21CB] % yet undefined %defineextensiblefiller [rightleftharpoonsfill] ["21CC] % yet undefined \defineextensiblefiller [triplerelfill] ["2261] @@ -1303,7 +1312,7 @@ [\v!symbol] [\c!voffset=-.3\mathexheight, \c!hoffset=\zeropoint, - \c!mathclass=ord, + \c!mathclass=\s!ordinary, \c!topoffset=.4\mathemwidth, % poor man's italic correction \c!middlecommand=\mathematics] diff --git a/tex/context/base/mkxl/math-vfu.lmt b/tex/context/base/mkxl/math-vfu.lmt index c58906a10..906c9ccf6 100644 --- a/tex/context/base/mkxl/math-vfu.lmt +++ b/tex/context/base/mkxl/math-vfu.lmt @@ -631,8 +631,9 @@ local function copy_glyph(main,target,original,unicode,slot) height = olddata.height, depth = olddata.depth, italic = olddata.italic, - topaccent = olddata.topaccent, + topanchor = olddata.topanchor, kerns = olddata.kerns, + mathkerns = olddata.mathkerns, tounicode = olddata.tounicode, commands = { { "slot", slot, unicode } }, } @@ -646,7 +647,9 @@ local function copy_glyph(main,target,original,unicode,slot) height = oldnextdata.height, depth = oldnextdata.depth, italic = oldnextdata.italic, - topaccent = oldnextdata.topaccent, + topanchor = oldnextdata.topanchor, + kerns = olddata.kerns, + mathkerns = olddata.mathkerns, tounicode = olddata.tounicode, commands = { { "slot", slot, nextglyph } }, } @@ -982,7 +985,7 @@ function vfmath.define(specification,set,goodies) if skewchar then local k = kerns[skewchar] if k then - t.topaccent = width/2 + k + t.topanchor = width/2 + k end end characters[unicode] = t @@ -1131,8 +1134,6 @@ function vfmath.define(specification,set,goodies) report_virtual("loading and virtualizing font %a at size %p took %0.3f seconds",name,size,os.clock()-start) end -- - -- main.oldmath = true - -- -- We bypass the scaler so ... -- main.MathConstants = main.mathconstants diff --git a/tex/context/base/mkxl/mult-sys.mkxl b/tex/context/base/mkxl/mult-sys.mkxl index 38d2c0633..636c15363 100644 --- a/tex/context/base/mkxl/mult-sys.mkxl +++ b/tex/context/base/mkxl/mult-sys.mkxl @@ -160,6 +160,7 @@ \definesystemconstant {class} \definesystemconstant {leftclass} \definesystemconstant {rightclass} +\definesystemconstant {calligraphic} \definesystemconstant {clone} \definesystemconstant {close} \definesystemconstant {cmyk} diff --git a/tex/context/base/mkxl/node-ali.lmt b/tex/context/base/mkxl/node-ali.lmt index 9209a520b..4b52f2d4b 100644 --- a/tex/context/base/mkxl/node-ali.lmt +++ b/tex/context/base/mkxl/node-ali.lmt @@ -30,6 +30,7 @@ local getlist = nuts.getlist local setlist = nuts.setlist local setattrlist = nuts.setattrlist local setprop = nuts.setprop +local getprop = nuts.getprop local getfont = nuts.getfont local getchar = nuts.getchar local addmargins = nuts.addmargins @@ -626,16 +627,24 @@ deltas = { } do local a_mathalignmentvrule = attributes.private("mathalignmentvrule") + local a_mathalignmenthrule = attributes.private("mathalignmenthrule") - local function first_pass(head,attr,preamble) + -- these loops will be combined + + local dp = { } + local ht = { } + + local function vrule_pass(head,attr,preamble) + local i = 0 for row, id, subtype, list in nextlist, head do if id == hlist_code and subtype == row_code then + i = i + 1 + local prv, nxt = getboth(row) for cell, id, subtype, list in nextlist, list do if list then for n, id, subtype in nextrule, list do local signal = getattr(n,a_mathalignmentvrule) if signal then - local prv, nxt = getboth(row) if prv then if getid(prv) ~= rule_code or not getattr(prv,a_mathalignmentvrule) then prv = nil @@ -646,20 +655,65 @@ do nxt = nil end end - setoffsets(n,nil,nil,not prv and 0 or nil,not nxt and 0 or nil) + local top = not prv and 0 or nil + local bot = not nxt and 0 or nil + setoffsets(n,nil,nil,d and -d or top,h and -h or bot) + end + end + end + end + end + end + end + + local function hrule_pass(head,attr,preamble) + local i = 0 + for row, id, subtype, list in nextlist, head do + if id == hlist_code and subtype == row_code then + i = i + 1 + local height = 0 + local depth = 0 + local done = false + for cell, id, subtype, list in nextlist, list do + if list then + for n, id, subtype in nextglue, list do + local signal = getattr(n,a_mathalignmenthrule) + if signal then + local w, h, d = getwhd(n) + if h and d then + if h > height then + height = h + end + if d > depth then + depth = d + end + done = true + end end end end end + if done then + setheight(row,height) + setdepth(row,depth) + dp[i] = height + ht[i] = depth + end end end end function nodes.handlers.mathmatrixrules(head,where,attr,preamble) if where == "wrapup" then + dp = { } + ht = { } + local signal = getattr(attr,a_mathalignmenthrule) + if signal == 0x01 then -- matrix + hrule_pass(head,attr,preamble) + end local signal = getattr(attr,a_mathalignmentvrule) - if signal == 1 then -- matrix - first_pass(head,attr,preamble) + if signal == 0x01 then -- matrix + vrule_pass(head,attr,preamble) end end end diff --git a/tex/context/base/mkxl/node-ini.lmt b/tex/context/base/mkxl/node-ini.lmt index 53bd082af..34028fa2e 100644 --- a/tex/context/base/mkxl/node-ini.lmt +++ b/tex/context/base/mkxl/node-ini.lmt @@ -226,6 +226,8 @@ local texsetintegervalue = tex.setintegervalue for i=0,nodecodes.glyph do texsetintegervalue(nodecodes[i] .. "nodecode",i,"immutable") end +texsetintegervalue("tempnodecode",nodecodes.temp,"immutable") -- can happen in tables + for i=0,#gluecodes do texsetintegervalue(gluecodes[i] .. "subtypecode",i,"immutable") end diff --git a/tex/context/base/mkxl/pack-box.mkxl b/tex/context/base/mkxl/pack-box.mkxl index 28c1a42f0..ecd793056 100644 --- a/tex/context/base/mkxl/pack-box.mkxl +++ b/tex/context/base/mkxl/pack-box.mkxl @@ -1199,7 +1199,7 @@ \fi \global\setbox\scratchcounterone\hpack\bgroup \unhbox\scratchcounterone - \hskip-\wd\nextbox + \kern-\wd\nextbox \box\nextbox \egroup \endgroup}} diff --git a/tex/context/base/mkxl/pack-cut.mkxl b/tex/context/base/mkxl/pack-cut.mkxl index 0cd06ed43..1e23a97e3 100644 --- a/tex/context/base/mkxl/pack-cut.mkxl +++ b/tex/context/base/mkxl/pack-cut.mkxl @@ -13,6 +13,8 @@ \unprotect +% to be redone in a more modern way + %D \macros %D {makecutbox, cuthbox, cutvbox, cutvtop} %D @@ -101,9 +103,8 @@ \vss}% \hss}} -\permanent\protected\def\makecutbox#1% - {\bgroup - \d_pack_cutmarks_height\ht#1% +\permanent\protected\def\makecutbox#1% not grouped ! + {\d_pack_cutmarks_height\ht#1% \d_pack_cutmarks_depth \dp#1% \d_pack_cutmarks_width \wd#1% \setbox#1\hpack @@ -155,7 +156,7 @@ \wd#1\d_pack_cutmarks_width \ht#1\d_pack_cutmarks_height \dp#1\d_pack_cutmarks_depth - \egroup} + \box#1} \permanent\protected\def\cuthbox{\hpack\bgroup\dowithnextbox{\makecutbox\nextbox\flushnextbox\egroup}\hbox} \permanent\protected\def\cutvbox{\vpack\bgroup\dowithnextbox{\makecutbox\nextbox\flushnextbox\egroup}\vbox} diff --git a/tex/context/base/mkxl/pack-mrl.mkxl b/tex/context/base/mkxl/pack-mrl.mkxl index 7a04f3904..b4339b0b2 100644 --- a/tex/context/base/mkxl/pack-mrl.mkxl +++ b/tex/context/base/mkxl/pack-mrl.mkxl @@ -181,7 +181,7 @@ \s!depth \scratchdepth \relax \ifzeropt\scratchdistance\else - \hskip\scratchdistance + \kern\scratchdistance % hskip \fi} \installcorenamespace{blackruletype} @@ -648,7 +648,7 @@ {\llap {\usetextrulesstyleandcolor\c!style\c!color #1% - \hskip\leftmargindistance}} + \kern\leftmargindistance}} % hskip {\color[\directtextrulesparameter\c!rulecolor] {\vrule \s!height\scratchheight @@ -794,7 +794,7 @@ \strut #2% \hfill\directfillinrulesparameter\c!separator - \hskip\scratchdistance + \kern\scratchdistance % hskip \egroup \fi \setupwhitespace[\v!big]% diff --git a/tex/context/base/mkxl/pack-pos.mkxl b/tex/context/base/mkxl/pack-pos.mkxl index aee22081f..e2fd1c8f8 100644 --- a/tex/context/base/mkxl/pack-pos.mkxl +++ b/tex/context/base/mkxl/pack-pos.mkxl @@ -90,7 +90,7 @@ \vbox to \d_pack_positioning_y_dimension {\vskip\d_pack_positioning_y_offset \hbox to \d_pack_positioning_x_dimension - {\hskip\d_pack_positioning_x_offset + {\kern\d_pack_positioning_x_offset \box\b_pack_positioning \hfill} \vfill}% @@ -145,7 +145,7 @@ {\offinterlineskip % else we get an empty line \vskip\d_pack_positioning_y_position \hbox to \zeropoint - {\hskip\d_pack_positioning_x_position + {\kern\d_pack_positioning_x_position \box\nextbox \hss} \vss}% diff --git a/tex/context/base/mkxl/pack-rul.lmt b/tex/context/base/mkxl/pack-rul.lmt index f81a672d2..c2183c1ad 100644 --- a/tex/context/base/mkxl/pack-rul.lmt +++ b/tex/context/base/mkxl/pack-rul.lmt @@ -35,6 +35,8 @@ local equationlist_code = listcodes.equation local texsetdimen = tex.setdimen local texsetcount = tex.setcount +local texisdimen = tex.isdimen +local texiscount = tex.iscount local implement = interfaces.implement @@ -52,8 +54,6 @@ local getdirection = nuts.getdirection local setshift = nuts.setshift local setwidth = nuts.setwidth local getwidth = nuts.getwidth --- local setboxglue = nuts.setboxglue --- local getboxglue = nuts.getboxglue local setboxglue = nuts.setglue local getboxglue = nuts.getglue @@ -73,6 +73,13 @@ directives.register("framed.checkmath",function(v) checkformath = v end) -- expe -- beware: dir nodes and pseudostruts can end up on lines of their own +local c_framednoflines = texiscount("framednoflines") +local d_framedfirstheight = texisdimen("framedfirstheight") +local d_framedlastdepth = texisdimen("framedlastdepth") +local d_framedminwidth = texisdimen("framedminwidth") +local d_framedmaxwidth = texisdimen("framedmaxwidth") +local d_framedaveragewidth = texisdimen("framedaveragewidth") + local function doreshapeframedbox(n,resync) if resync then resync = drivers.converters.resyncbox @@ -148,7 +155,7 @@ local function doreshapeframedbox(n,resync) setlist(p) flushnode(p) elseif checkformath and subtype == equationlist_code then - -- display formulas use a shift + -- display formulas use a shift .. actually we never have display mode if nofnonzero == 1 then setshift(h,0) end @@ -172,12 +179,12 @@ local function doreshapeframedbox(n,resync) end end end - texsetcount("global","framednoflines",noflines) - texsetdimen("global","framedfirstheight",firstheight or 0) -- also signal - texsetdimen("global","framedlastdepth",lastdepth or 0) - texsetdimen("global","framedminwidth",minwidth) - texsetdimen("global","framedmaxwidth",maxwidth) - texsetdimen("global","framedaveragewidth",averagewidth) + texsetcount("global",c_framednoflines,noflines) + texsetdimen("global",d_framedfirstheight,firstheight or 0) -- also signal + texsetdimen("global",d_framedlastdepth,lastdepth or 0) + texsetdimen("global",d_framedminwidth,minwidth) + texsetdimen("global",d_framedmaxwidth,maxwidth) + texsetdimen("global",d_framedaveragewidth,averagewidth) end local function doanalyzeframedbox(n) @@ -206,9 +213,9 @@ local function doanalyzeframedbox(n) end end end - texsetcount("global","framednoflines",noflines) - texsetdimen("global","framedfirstheight",firstheight or 0) - texsetdimen("global","framedlastdepth",lastdepth or 0) + texsetcount("global",c_framednoflines,noflines) + texsetdimen("global",d_framedfirstheight,firstheight or 0) + texsetdimen("global",d_framedlastdepth,lastdepth or 0) end implement { name = "doreshapeframedbox", actions = doreshapeframedbox, arguments = "integer" } diff --git a/tex/context/base/mkxl/pack-rul.mkxl b/tex/context/base/mkxl/pack-rul.mkxl index 803d83bf3..b06e8f57c 100644 --- a/tex/context/base/mkxl/pack-rul.mkxl +++ b/tex/context/base/mkxl/pack-rul.mkxl @@ -18,6 +18,13 @@ %D packaging and expansion we also keep tracing reasonable. For instance, multiple %D stacked backgrounds can slow down a run if not optimized this way. +\newcount\framednoflines +\newdimen\framedfirstheight +\newdimen\framedlastdepth +\newdimen\framedminwidth +\newdimen\framedmaxwidth +\newdimen\framedaveragewidth + \registerctxluafile{pack-rul}{autosuffix,optimize} \unprotect @@ -703,7 +710,7 @@ \def\pack_framed_stroked_box_normal_closed {\hpack\bgroup \scratchdimen.5\d_framed_linewidth - \hskip\scratchdimen + \kern\scratchdimen \clf_framedoutline \dimexpr\d_framed_target_wd-\d_framed_linewidth\relax \dimexpr\d_framed_target_ht-\scratchdimen\relax @@ -2323,12 +2330,12 @@ %D It is possible to let the frame macro calculate the width of a centered box %D automatically (\type {fit}). When doing so, we need to reshape the box: -\newcount\framednoflines -\newdimen\framedfirstheight -\newdimen\framedlastdepth -\newdimen\framedminwidth -\newdimen\framedmaxwidth -\newdimen\framedaveragewidth +% \newcount\framednoflines +% \newdimen\framedfirstheight +% \newdimen\framedlastdepth +% \newdimen\framedminwidth +% \newdimen\framedmaxwidth +% \newdimen\framedaveragewidth \def\pack_framed_reshape_reset {\framednoflines \zerocount diff --git a/tex/context/base/mkxl/page-box.mklx b/tex/context/base/mkxl/page-box.mklx index 56cb73f7a..a65989222 100644 --- a/tex/context/base/mkxl/page-box.mklx +++ b/tex/context/base/mkxl/page-box.mklx @@ -79,10 +79,19 @@ % {\boxxoffset#box\dimexpr\boxxoffset#box\doifbothsides++-\backoffset\relax % \boxyoffset#box\dimexpr\boxyoffset#box-\topoffset\relax} +% \def\page_boxes_apply_offset % #box +% {\unless\ifzeropt\topoffset % we can't do an unless here +% \expandafter\page_boxes_apply_offset_indeed +% \orunless\ifzeropt\backoffset +% \expandafter\page_boxes_apply_offset_indeed +% \else +% \expandafter\gobbleoneargument +% \fi} + \def\page_boxes_apply_offset % #box - {\unless\ifzeropt\topoffset + {\unless\ifdim\topoffset=\zeropoint \expandafter\page_boxes_apply_offset_indeed - \orunless\ifzeropt\backoffset + \orunless\ifdim\backoffset=\zeropoint \expandafter\page_boxes_apply_offset_indeed \else \expandafter\gobbleoneargument @@ -100,9 +109,9 @@ \def\page_boxes_apply_replicate_indeed#box% {\setbox#box\vpack {\offinterlineskip - \dorecurse{\layoutparameter\c!ny} + \dorecurse{\layoutparameter\c!ny}% {\hpack{\dorecurse{\layoutparameter\c!nx}{\copy#box\kern\layoutparameter\c!dx}\unskip}% - \vskip\layoutparameter\c!dy} + \vskip\layoutparameter\c!dy}% \unskip}} \def\page_boxes_apply_orientate_paper#box% diff --git a/tex/context/base/mkxl/spac-ver.lmt b/tex/context/base/mkxl/spac-ver.lmt index 7884a111c..283109f03 100644 --- a/tex/context/base/mkxl/spac-ver.lmt +++ b/tex/context/base/mkxl/spac-ver.lmt @@ -56,6 +56,8 @@ local texsetcount = tex.setcount local texnest = tex.nest local texgetbox = tex.getbox +local tg = texgetdimen + local buildpage = tex.triggerbuildpage local variables = interfaces.variables @@ -69,13 +71,6 @@ local v_split = variables.split local v_min = variables.min local v_max = variables.max local v_none = variables.none -local v_line = variables.line -local v_noheight = variables.noheight -local v_nodepth = variables.nodepth -local v_line = variables.line -local v_halfline = variables.halfline -local v_line_m = "-" .. v_line -local v_halfline_m = "-" .. v_halfline local v_first = variables.first local v_last = variables.last local v_top = variables.top @@ -115,6 +110,11 @@ local a_skiporder = attributes.private('skiporder') local a_snapmethod = attributes.private('snapmethod') local a_snapvbox = attributes.private('snapvbox') +local d_bodyfontstrutheight = tex.isdimen("bodyfontstrutheight") +local d_bodyfontstrutdepth = tex.isdimen("bodyfontstrutdepth") +local d_globalbodyfontstrutheight = tex.isdimen("globalbodyfontstrutheight") +local d_globalbodyfontstrutdepth = tex.isdimen("globalbodyfontstrutdepth") + local nuts = nodes.nuts local tonut = nuts.tonut @@ -357,6 +357,13 @@ end local snap_hlist do + local v_noheight = variables.noheight + local v_nodepth = variables.nodepth + local v_line = variables.line + local v_halfline = variables.halfline + local v_line_m = "-" .. v_line + local v_halfline_m = "-" .. v_halfline + local floor = math.floor local ceil = math.ceil @@ -397,24 +404,24 @@ local snap_hlist do local snapht, snapdp if method[v_local] then -- snapping is done immediately here - snapht = texgetdimen("bodyfontstrutheight") - snapdp = texgetdimen("bodyfontstrutdepth") + snapht = texgetdimen(d_bodyfontstrutheight) + snapdp = texgetdimen(d_bodyfontstrutdepth) if t then t[#t+1] = formatters["local: snapht %p snapdp %p"](snapht,snapdp) end elseif method[v_global] then - snapht = texgetdimen("globalbodyfontstrutheight") - snapdp = texgetdimen("globalbodyfontstrutdepth") + snapht = texgetdimen(d_globalbodyfontstrutheight) + snapdp = texgetdimen(d_globalbodyfontstrutdepth) if t then t[#t+1] = formatters["global: snapht %p snapdp %p"](snapht,snapdp) end else -- maybe autolocal -- snapping might happen later in the otr - snapht = texgetdimen("globalbodyfontstrutheight") - snapdp = texgetdimen("globalbodyfontstrutdepth") - local lsnapht = texgetdimen("bodyfontstrutheight") - local lsnapdp = texgetdimen("bodyfontstrutdepth") + snapht = texgetdimen(d_globalbodyfontstrutheight) + snapdp = texgetdimen(d_globalbodyfontstrutdepth) + local lsnapht = texgetdimen(d_bodyfontstrutheight) + local lsnapdp = texgetdimen(d_bodyfontstrutdepth) if snapht ~= lsnapht and snapdp ~= lsnapdp then snapht, snapdp = lsnapht, lsnapdp end @@ -672,7 +679,7 @@ local snap_hlist do local lines = (ch+cd)/snaphtdp if t then local original = (h+d)/snaphtdp - local whatever = (ch+cd)/(texgetdimen("globalbodyfontstrutheight") + texgetdimen("globalbodyfontstrutdepth")) + local whatever = (ch+cd)/(texgetdimen(d_globalbodyfontstrutheight) + texgetdimen(d_globalbodyfontstrutdepth)) t[#t+1] = formatters["final lines : %p -> %p (%p)"](original,lines,whatever) t[#t+1] = formatters["final height: %p -> %p"](h,ch) t[#t+1] = formatters["final depth : %p -> %p"](d,cd) @@ -1699,10 +1706,10 @@ do -- if trace_vsnapping then report_snapper("global ht/dp = %p/%p, local ht/dp = %p/%p", - texgetdimen("globalbodyfontstrutheight"), - texgetdimen("globalbodyfontstrutdepth"), - texgetdimen("bodyfontstrutheight"), - texgetdimen("bodyfontstrutdepth") + texgetdimen(d_globalbodyfontstrutheight), + texgetdimen(d_globalbodyfontstrutdepth), + texgetdimen(d_bodyfontstrutheight), + texgetdimen(d_bodyfontstrutdepth) ) end if trace then diff --git a/tex/context/base/mkxl/spac-ver.mkxl b/tex/context/base/mkxl/spac-ver.mkxl index 28a1151fb..7ab80d6a9 100644 --- a/tex/context/base/mkxl/spac-ver.mkxl +++ b/tex/context/base/mkxl/spac-ver.mkxl @@ -15,6 +15,14 @@ \unprotect +\newskip \bodyfontlineheight % why a skip +\newdimen \bodyfontstrutheight +\newdimen \bodyfontstrutdepth + +\newskip \globalbodyfontlineheight % why a skip +\newdimen \globalbodyfontstrutheight +\newdimen \globalbodyfontstrutdepth + \registerctxluafile{spac-ver}{autosuffix,optimize} % todo: use usernodes ? @@ -1396,13 +1404,13 @@ \installcorenamespace{gridsnapperattributes} \installcorenamespace{gridsnappersets} -\newskip \bodyfontlineheight -\newdimen \bodyfontstrutheight -\newdimen \bodyfontstrutdepth +% \newskip \bodyfontlineheight % see top +% \newdimen \bodyfontstrutheight % see top +% \newdimen \bodyfontstrutdepth % see top -\newskip \globalbodyfontlineheight % why a skip -\newdimen \globalbodyfontstrutheight -\newdimen \globalbodyfontstrutdepth +% \newskip \globalbodyfontlineheight % see top +% \newdimen \globalbodyfontstrutheight % see top +% \newdimen \globalbodyfontstrutdepth % see top \permanent\def\snappedvboxattribute{\ifgridsnapping attr\snapvboxattribute\c_attr_snapmethod\fi} \permanent\def\setlocalgridsnapping{\ifgridsnapping \c_attr_snapvbox \c_attr_snapmethod\fi} diff --git a/tex/context/base/mkxl/strc-lst.mklx b/tex/context/base/mkxl/strc-lst.mklx index 785d566cf..c04d68fa7 100644 --- a/tex/context/base/mkxl/strc-lst.mklx +++ b/tex/context/base/mkxl/strc-lst.mklx @@ -146,7 +146,7 @@ \scratchcounter\clf_addtolist references { internal \locationcount - % block {\currentsectionblock} + % block {\currentsectionblock} % needed for publications (can be get from section) % section structures.sections.currentid() % location {\p_location} } diff --git a/tex/context/base/mkxl/strc-ref.lmt b/tex/context/base/mkxl/strc-ref.lmt index 7ad20fa34..32c2a5429 100644 --- a/tex/context/base/mkxl/strc-ref.lmt +++ b/tex/context/base/mkxl/strc-ref.lmt @@ -54,6 +54,7 @@ local implement = interfaces.implement local ctx_latelua = context.latelua +local texiscount = tex.iscount local texgetcount = tex.getcount local texsetcount = tex.setcount local texconditionals = tex.conditionals @@ -124,6 +125,11 @@ local currentreference = nil local txtcatcodes = catcodes.numbers.txtcatcodes -- or just use "txtcatcodes" +local c_realpageno = texiscount("realpageno") +local c_locationcount = texiscount("locationcount") +local c_locationorder = texiscount("locationorder") +local c_lastdestinationattribute = texiscount("lastdestinationattribute") + local context = context local ctx_pushcatcodes = context.pushcatcodes @@ -294,7 +300,7 @@ local function referredpage(n) end end -- fallback - return texgetcount("realpageno") + return texgetcount(c_realpageno) end references.referredpage = referredpage @@ -304,7 +310,7 @@ function references.registerpage(n) -- called in the backend code if n > maxreferred then maxreferred = n end - tobereferred[n] = texgetcount("realpageno") + tobereferred[n] = texgetcount(c_realpageno) end end @@ -323,14 +329,14 @@ local function setnextorder(kind,name) lastorder = (ok[name] or 0) + 1 ok[name] = lastorder end - texsetcount("global","locationorder",lastorder) + texsetcount("global",c_locationorder,lastorder) end local function setnextinternal(kind,name) setnextorder(kind,name) -- always incremented with internal - local n = texgetcount("locationcount") + 1 - texsetcount("global","locationcount",n) + local n = texgetcount(c_locationcount) + 1 + texsetcount("global",c_locationcount,n) return n end @@ -433,12 +439,12 @@ end -- function references.enhance(prefix,tag) -- local l = tobesaved[prefix][tag] -- if l then --- l.references.realpage = texgetcount("realpageno") +-- l.references.realpage = texgetcount(c_realpageno) -- end -- end local function synchronizepage(reference) -- non public helper - reference.realpage = texgetcount("realpageno") + reference.realpage = texgetcount(c_realpageno) if jobpositions.used() then reference.x, reference.y = getpos() end @@ -2040,7 +2046,7 @@ local function setinternalreference(specification) if internal then -- new destinationattributes[internal] = destination end - texsetcount("lastdestinationattribute",destination) + texsetcount(c_lastdestinationattribute,destination) return destination end @@ -2107,7 +2113,7 @@ function references.setandgetattribute(data) -- maybe do internal automatically } or unsetvalue end end - texsetcount("lastdestinationattribute",attr) + texsetcount(c_lastdestinationattribute,attr) return attr end @@ -2685,7 +2691,7 @@ function references.checkedrealpage(r) realpageofpage(r) -- just initialize end if not r then - return texgetcount("realpageno") + return texgetcount(c_realpageno) elseif r < 1 then return 1 elseif r > nofrealpages then @@ -2780,7 +2786,7 @@ end function specials.deltapage(var,actions) local p = tonumber(var.operation) if p then - p = references.checkedrealpage(p + texgetcount("realpageno")) + p = references.checkedrealpage(p + texgetcount(c_realpageno)) var.r = p actions.realpage = actions.realpage or p -- first wins end diff --git a/tex/context/base/mkxl/strc-ref.mklx b/tex/context/base/mkxl/strc-ref.mklx index 07c8c2c1b..012d9d92d 100644 --- a/tex/context/base/mkxl/strc-ref.mklx +++ b/tex/context/base/mkxl/strc-ref.mklx @@ -27,6 +27,14 @@ \writestatus{loading}{ConTeXt Structure Macros / Cross Referencing} +\newif \iflocation +\newcount\locationcount +\newcount\locationorder +\newbox \locationbox + +\newcount\lastreferenceattribute +\newcount\lastdestinationattribute + \registerctxluafile{strc-rsc}{autosuffix} \registerctxluafile{strc-ref}{autosuffix} \registerctxluafile{node-ref}{autosuffix,optimize} @@ -137,8 +145,8 @@ %D Actually there is not much difference between a text and a full reference, but %D it's the concept that counts. The low level implementation is: -\newcount\lastreferenceattribute -\newcount\lastdestinationattribute +% sett top : \newcount\lastreferenceattribute +% sett top : \newcount\lastdestinationattribute \def\strc_references_finish#prefix#reference#internal% gets expanded anyway {\normalexpanded{\clf_deferredenhancereference{#prefix}{#reference}}} @@ -803,10 +811,10 @@ %D %D We could do this in \LUA\ \unknown -\newif \iflocation -\newcount\locationcount -\newcount\locationorder -\newbox \locationbox +% seet top: \newif \iflocation +% seet top: \newcount\locationcount +% seet top: \newcount\locationorder +% seet top: \newbox \locationbox \appendtoks \locationfalse diff --git a/tex/context/base/mkxl/strc-reg.lmt b/tex/context/base/mkxl/strc-reg.lmt index a45f23bf0..85198a151 100644 --- a/tex/context/base/mkxl/strc-reg.lmt +++ b/tex/context/base/mkxl/strc-reg.lmt @@ -34,6 +34,7 @@ local processors = typesetters.processors local splitprocessor = processors.split local texgetcount = tex.getcount +local texiscount = tex.iscount local variables = interfaces.variables local v_forward = variables.forward @@ -67,6 +68,9 @@ local setmetatableindex = table.setmetatableindex local absmaxlevel = 5 -- \c_strc_registers_maxlevel +local c_realpageno = texiscount("realpageno") +local c_locationcount = texiscount("locationcount") + local h_prefixpage = helpers.prefixpage local h_prefixlastpage = helpers.prefixlastpage local h_title = helpers.title @@ -564,7 +568,7 @@ local function storeregister(rawdata) -- metadata, references, entries -- local internal = references.internal if not internal then - internal = texgetcount("locationcount") -- we assume that it has been set + internal = texgetcount(c_locationcount) -- we assume that it has been set references.internal = internal end -- @@ -606,7 +610,7 @@ local function enhanceregister(specification) local data = saved.metadata.notsaved and collected[name] or saved local entry = data.entries[n] if entry then - entry.references.realpage = texgetcount("realpageno") + entry.references.realpage = texgetcount(c_realpageno) end end @@ -621,7 +625,7 @@ local function extendregister(name,tag,rawdata) -- maybe do lastsection internal local entry = data.entries[tag] if entry then local references = entry.references - references.lastrealpage = texgetcount("realpageno") + references.lastrealpage = texgetcount(c_realpageno) references.lastsection = currentid() if rawdata then local userdata = rawdata.userdata diff --git a/tex/context/base/mkxl/strc-reg.mkxl b/tex/context/base/mkxl/strc-reg.mkxl index 22b1202db..b0f50ecfd 100644 --- a/tex/context/base/mkxl/strc-reg.mkxl +++ b/tex/context/base/mkxl/strc-reg.mkxl @@ -1068,11 +1068,14 @@ % \applyprocessor{#1}{\registerparameter\c!pagecommand{#4}}% % \fi} +\let\currentregisterrealpage\!!zerocount % todo: more general accessor + \permanent\protected\def\withregisterpagecommand#1#2#3#4% {\ifcase#3\relax {\tt [entry\space not\space flushed]}% \else \def\currentregisterpageindex{#2}% + \def\currentregisterrealpage{#3}% \iflocation \strc_references_goto_internal{\applyprocessor{#1}{\registerparameter\c!pagecommand{#4}}}[internal(#2)]% \else diff --git a/tex/context/base/mkxl/syst-ini.mkxl b/tex/context/base/mkxl/syst-ini.mkxl index 0c5251373..96bdde764 100644 --- a/tex/context/base/mkxl/syst-ini.mkxl +++ b/tex/context/base/mkxl/syst-ini.mkxl @@ -990,7 +990,8 @@ %D \ifzeropt \somedimen ... \else ... \fi %D \stoptyping -\aliased\let\ifzeropt\ifcase +\aliased\let\ifzeropt\ifzerodim % was \let\ifzeropt\ifcase +\aliased\let\ifzero \ifzeronum % was \let\ifzeropt\ifcase % these token list helpers might move to syst-aux.mkiv % @@ -1254,8 +1255,8 @@ %D For a while we will keep these useless numbers as for instance tikz checks for them: -\immutable\integerdef\eTeXversion 2 -\immutable\def \eTeXrevision {2} +\immutable\integerdef\eTeXversion 2 +\immutable\def \eTeXrevision {.2} % there is a funny period here % %D Just in case users use this (or some styles still have it): diff --git a/tex/context/base/mkxl/tabl-tbl.mkxl b/tex/context/base/mkxl/tabl-tbl.mkxl index 4d4037ff6..851984bea 100644 --- a/tex/context/base/mkxl/tabl-tbl.mkxl +++ b/tex/context/base/mkxl/tabl-tbl.mkxl @@ -407,11 +407,11 @@ % \protected % we can expand this one \def\tabl_tabulate_inject_pre_skip#1% {\ifdim#1>\zeropoint - \kern#1\relax % was \hskip + \kern#1\relax % hskip \orelse\ifnum\c_tabl_tabulate_column=\zerocount \ifconditional\c_tabl_tabulate_autorulespacing \ifcase\c_tabl_tabulate_has_rule_spec_first\else - \kern\s_tabl_tabulate_first\relax % was \hskip + \kern\s_tabl_tabulate_first\relax % hskip \fi \fi \fi} @@ -423,7 +423,7 @@ \orelse\ifnum\c_tabl_tabulate_columns=\c_tabl_tabulate_nofcolumns \ifconditional\c_tabl_tabulate_autorulespacing \ifcase\c_tabl_tabulate_has_rule_spec_last\else - \kern\s_tabl_tabulate_last\relax % was \hskip + \kern\s_tabl_tabulate_last\relax % hskip \fi \fi \fi} diff --git a/tex/context/base/mkxl/task-ini.lmt b/tex/context/base/mkxl/task-ini.lmt index 9c90aba02..17555d7e2 100644 --- a/tex/context/base/mkxl/task-ini.lmt +++ b/tex/context/base/mkxl/task-ini.lmt @@ -122,7 +122,7 @@ appendaction("math", "normalizers", "noads.handlers.dictionaries", appendaction("math", "normalizers", "noads.handlers.suspicious", nil, "nonut", "enabled" ) appendaction("math", "builders", "builders.kernel.mlisttohlist", nil, "nut", "enabled" ) -- mandate -appendaction("math", "builders", "typesetters.directions.processmath", nil, "nut", "disabled" ) +------------("math", "builders", "typesetters.directions.processmath", nil, "nut", "disabled" ) appendaction("math", "builders", "noads.handlers.makeup", nil, "nonut", "disabled" ) ------------("math", "builders", "noads.handlers.align", nil, "nonut", "enabled" ) diff --git a/tex/context/base/mkxl/type-set.mkxl b/tex/context/base/mkxl/type-set.mkxl index a14a99630..ae07bd914 100644 --- a/tex/context/base/mkxl/type-set.mkxl +++ b/tex/context/base/mkxl/type-set.mkxl @@ -134,6 +134,7 @@ \definefilesynonym [type-imp-coloredsheep.mkiv] [type-imp-koeielettersot.mkiv] \definefilesynonym [type-imp-koeieletters.mkiv] [type-imp-koeielettersot.mkiv] +\definefilesynonym [type-imp-xits.mkiv] [type-imp-stix.mkiv] \definefilesynonym [type-imp-stixtwo.mkiv] [type-imp-stix.mkiv] \definefilesynonym [type-imp-ibmplex.mkiv] [type-imp-plex.mkiv] |