From d237f3e4386c910e8960a9ec6cba2e7f59d1268a Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Mon, 21 Sep 2009 17:39:00 +0200 Subject: beta 2009.09.21 17:39 --- tex/context/base/anch-pgr.mkiv | 18 +- tex/context/base/bibl-tra.mkiv | 19 +- tex/context/base/buff-ver.mkiv | 1 + tex/context/base/cont-new.tex | 2 +- tex/context/base/context.tex | 2 +- tex/context/base/core-var.mkiv | 3 + tex/context/base/font-agl.lua | 3695 +++++++++++++++++++++++++++ tex/context/base/font-ini.mkiv | 31 +- tex/context/base/font-map.lua | 11 +- tex/context/base/font-otf.lua | 7 +- tex/context/base/font-run.mkiv | 2 - tex/context/base/l-xml.lua | 1 + tex/context/base/luat-env.lua | 2 +- tex/context/base/lxml-ini.lua | 8 +- tex/context/base/lxml-ini.mkiv | 2 + tex/context/base/lxml-pth.lua | 30 + tex/context/base/lxml-tab.lua | 2 + tex/context/base/math-arr.mkiv | 68 +- tex/context/base/math-ext.lua | 34 +- tex/context/base/math-ini.mkiv | 2 +- tex/context/base/math-inl.mkiv | 339 +-- tex/context/base/math-scr.mkiv | 83 +- tex/context/base/math-vfu.lua | 4 +- tex/context/base/meta-ini.mkiv | 6 +- tex/context/base/mult-de.tex | 5 + tex/context/base/mult-def.lua | 21 + tex/context/base/mult-en.tex | 5 + tex/context/base/mult-fr.tex | 5 + tex/context/base/mult-it.tex | 5 + tex/context/base/mult-nl.tex | 5 + tex/context/base/mult-ro.tex | 5 + tex/context/base/mult-sys.tex | 2 + tex/context/base/node-ini.mkiv | 1 + tex/context/base/node-res.lua | 27 + tex/context/base/node-typ.lua | 51 + tex/context/base/pack-lyr.mkiv | 10 +- tex/context/base/page-ini.mkiv | 3 +- tex/context/base/page-lay.mkiv | 10 +- tex/context/base/page-one.mkiv | 66 - tex/context/base/page-sid.mkiv | 2 +- tex/context/base/scrn-but.mkiv | 3 +- tex/context/base/scrn-men.mkiv | 3 +- tex/context/base/spac-ali.mkiv | 18 +- tex/context/base/spac-fnt.mkiv | 2 +- tex/context/base/spac-gen.mkii | 3 + tex/context/base/spac-grd.lua | 41 - tex/context/base/spac-grd.mkiv | 866 +------ tex/context/base/spac-hor.mkiv | 118 +- tex/context/base/spac-pag.mkiv | 2 - tex/context/base/spac-par.mkiv | 16 +- tex/context/base/spac-ver.lua | 621 +++-- tex/context/base/spac-ver.mkiv | 473 +++- tex/context/base/strc-des.mkiv | 3 +- tex/context/base/strc-doc.lua | 2 +- tex/context/base/strc-flt.mkiv | 7 +- tex/context/base/strc-lst.lua | 2 +- tex/context/base/strc-mat.mkiv | 124 +- tex/context/base/strc-pag.mkiv | 2 +- tex/context/base/strc-ref.lua | 20 +- tex/context/base/strc-ren.mkiv | 1 - tex/context/base/syst-aux.mkiv | 16 +- tex/context/interface/cont-cs.xml | 4 + tex/context/interface/cont-de.xml | 4 + tex/context/interface/cont-en.xml | 4 + tex/context/interface/cont-fr.xml | 4 + tex/context/interface/cont-it.xml | 4 + tex/context/interface/cont-nl.xml | 4 + tex/context/interface/cont-pe.xml | 4 + tex/context/interface/cont-ro.xml | 4 + tex/context/interface/keys-cs.xml | 5 + tex/context/interface/keys-de.xml | 5 + tex/context/interface/keys-en.xml | 5 + tex/context/interface/keys-fr.xml | 5 + tex/context/interface/keys-it.xml | 5 + tex/context/interface/keys-nl.xml | 5 + tex/context/interface/keys-pe.xml | 5 + tex/context/interface/keys-ro.xml | 5 + tex/generic/context/luatex-fonts-merged.lua | 47 +- 78 files changed, 5119 insertions(+), 1938 deletions(-) create mode 100644 tex/context/base/font-agl.lua create mode 100644 tex/context/base/node-typ.lua delete mode 100644 tex/context/base/spac-grd.lua (limited to 'tex') diff --git a/tex/context/base/anch-pgr.mkiv b/tex/context/base/anch-pgr.mkiv index 9e6bc027d..a32757b5c 100644 --- a/tex/context/base/anch-pgr.mkiv +++ b/tex/context/base/anch-pgr.mkiv @@ -26,18 +26,6 @@ \ifx\textheight\undefined \def\textheight{\vsize} \fi -%D Helper: - -\def\doassignsomeskip#1\to#2% ook nog \v!halfline+fuzzysnap - {\doifelse{#1}\v!line - {#2\openlineheight} - {\ifgridsnapping - \assigndimension{#1}{#2}{.25\openlineheight}{.5\openlineheight}\openlineheight - \else - \assigndimension{#1}{#2}\smallskipamount\medskipamount\bigskipamount - \fi}% - \relax} - %D The next macros so some housekeeping. \def\pageanchor{page:0} % for the moment only one pagesize @@ -809,7 +797,7 @@ % \dostartattributes{\??td\currenttextbackground}\c!style\c!color\empty \nowhitespace -\nobreak % new per 23/04/2006 (else potential break when whitespace) + \nobreak % new per 23/04/2006 (else potential break when whitespace) \seteffectivehsize \doinhibitblank % \blank[\v!disable]% new \par} @@ -828,7 +816,7 @@ \nobreak \vskip-\lineheight \nobreak \nowhitespace \egroup -\bgroup \forgeteverypar % NOT REALLY NEEDED, SAVES HASH/MEM + \bgroup \forgeteverypar % NOT REALLY NEEDED, SAVES HASH/MEM \nobreak \noindent \strut \hfill \kern\zeropoint \doassignsomeskip\textbackgroundparameter\c!bottomoffset\to\textbackgroundskip \ifgridsnapping % experimental, pascal (todo: topoffset in same way) @@ -840,7 +828,7 @@ \else \tpos\currentparbackground \fi -\egroup + \egroup \endgraf % new \textbackgroundparameter\c!after} diff --git a/tex/context/base/bibl-tra.mkiv b/tex/context/base/bibl-tra.mkiv index 13ef316b8..5ad1422f3 100644 --- a/tex/context/base/bibl-tra.mkiv +++ b/tex/context/base/bibl-tra.mkiv @@ -874,13 +874,12 @@ \unexpanded\def\typesetapublication#1% {\doifsomething{#1} - {\ifgridsnapping\expandafter\snaptogrid\expandafter\vbox\fi\bgroup - \doifelse{\namedlistparameter{pubs}\c!criterium}\v!all + {\doifelse{\namedlistparameter{pubs}\c!criterium}\v!all {\doplacepublicationindeed{#1}}% {\ctxlua{bibtex.hacks.doifalreadyplaced("#1")} {} {\doplacepublicationindeed{#1}}}% - \egroup}} + }} % for the moment we don't access the data directly but we will do that % later when we get away from storing the data and only deal with @@ -1482,11 +1481,15 @@ \processcommalist[#1]\dobibauthornumref } \def\dobibauthornumref#1% - {\bibinsertrefsep - \doifbibreferencefoundelse{#1} - {\bibgetvara{#1}% - \bibalternative\c!inbetween\cite[#1]} - {\unknownreference{#1}}} + {\bibinsertrefsep + \doifbibreferencefoundelse{#1} + {\begingroup + \bibgetvara{#1}% + \bibalternative\c!inbetween + \setuppublications[\c!refcommand=num]% + \cite[#1]% + \endgroup} + {\unknownreference{#1}}} %D And some defaults are loaded from bibl-apa: diff --git a/tex/context/base/buff-ver.mkiv b/tex/context/base/buff-ver.mkiv index 54764a82c..e4f5872fe 100644 --- a/tex/context/base/buff-ver.mkiv +++ b/tex/context/base/buff-ver.mkiv @@ -523,6 +523,7 @@ \edef\!!stringa{\executeifdefined{\??bo\typingparameter\c!blank}{\typingparameter\c!blank}}% \scratchskip\executeifdefined{\??tp:\c!blank:\!!stringa}\!!stringa\relax \ifgridsnapping + % this will be adapted \ifdim\scratchskip=.5\baselineskip\relax \edef\verbatimbaselineskip{\the\scratchskip}% new \else diff --git a/tex/context/base/cont-new.tex b/tex/context/base/cont-new.tex index d09e31d67..eb837a618 100644 --- a/tex/context/base/cont-new.tex +++ b/tex/context/base/cont-new.tex @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2009.09.16 20:07} +\newcontextversion{2009.09.21 17:39} %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/context.tex b/tex/context/base/context.tex index bd0c49d95..1eac2fe20 100644 --- a/tex/context/base/context.tex +++ b/tex/context/base/context.tex @@ -20,7 +20,7 @@ %D your styles an modules. \edef\contextformat {\jobname} -\edef\contextversion{2009.09.16 20:07} +\edef\contextversion{2009.09.21 17:39} %D For those who want to use this: diff --git a/tex/context/base/core-var.mkiv b/tex/context/base/core-var.mkiv index d6e02e392..8e2b5cff7 100644 --- a/tex/context/base/core-var.mkiv +++ b/tex/context/base/core-var.mkiv @@ -107,6 +107,9 @@ \newevery \everybodyfont \EveryBodyFont \newevery \everyfontswitch \EveryFontSwitch +\newtoks \everysetupbodyfont +\newtoks \everyswitchtobodyfont + %D Math: \newtoks \everybeforedisplayformula diff --git a/tex/context/base/font-agl.lua b/tex/context/base/font-agl.lua new file mode 100644 index 000000000..8a087b123 --- /dev/null +++ b/tex/context/base/font-agl.lua @@ -0,0 +1,3695 @@ +if not modules then modules = { } end modules ['font-map'] = { + version = 1.001, + comment = "companion to font-ini.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "derived from http://www.adobe.com/devnet/opentype/archives/glyphlist.txt", + comment = "Adobe Glyph List, version 2.0, September 20, 2002", +} + +fonts = fonts or { } +fonts.map = fonts.map or { } + +fonts.map.unicode_to_agl = { + "controlSTX", + "controlSOT", + "controlETX", + "controlEOT", + "controlENQ", + "controlACK", + "controlBEL", + "controlBS", + "controlHT", + "controlLF", + "controlVT", + "controlFF", + "controlCR", + "controlSO", + "controlSI", + "controlDLE", + "controlDC1", + "controlDC2", + "controlDC3", + "controlDC4", + "controlNAK", + "controlSYN", + "controlETB", + "controlCAN", + "controlEM", + "controlSUB", + "controlESC", + "controlFS", + "controlGS", + "controlRS", + "controlUS", + "spacehackarabic", + "exclam", + "quotedbl", + "numbersign", + "dollar", + "percent", + "ampersand", + "quotesingle", + "parenleft", + "parenright", + "asterisk", + "plus", + "comma", + "hyphen", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "at", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "bracketleft", + "backslash", + "bracketright", + "asciicircum", + "underscore", + "grave", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "braceleft", + "verticalbar", + "braceright", + "asciitilde", + "controlDEL", + [0x00A0] = "nonbreakingspace", + [0x00A1] = "exclamdown", + [0x00A2] = "cent", + [0x00A3] = "sterling", + [0x00A4] = "currency", + [0x00A5] = "yen", + [0x00A6] = "brokenbar", + [0x00A7] = "section", + [0x00A8] = "dieresis", + [0x00A9] = "copyright", + [0x00AA] = "ordfeminine", + [0x00AB] = "guillemotleft", + [0x00AC] = "logicalnot", + [0x00AD] = "softhyphen", + [0x00AE] = "registered", + [0x00AF] = "overscore", + [0x00B0] = "degree", + [0x00B1] = "plusminus", + [0x00B2] = "twosuperior", + [0x00B3] = "threesuperior", + [0x00B4] = "acute", + [0x00B5] = "mu1", + [0x00B6] = "paragraph", + [0x00B7] = "periodcentered", + [0x00B8] = "cedilla", + [0x00B9] = "onesuperior", + [0x00BA] = "ordmasculine", + [0x00BB] = "guillemotright", + [0x00BC] = "onequarter", + [0x00BD] = "onehalf", + [0x00BE] = "threequarters", + [0x00BF] = "questiondown", + [0x00C0] = "Agrave", + [0x00C1] = "Aacute", + [0x00C2] = "Acircumflex", + [0x00C3] = "Atilde", + [0x00C4] = "Adieresis", + [0x00C5] = "Aring", + [0x00C6] = "AE", + [0x00C7] = "Ccedilla", + [0x00C8] = "Egrave", + [0x00C9] = "Eacute", + [0x00CA] = "Ecircumflex", + [0x00CB] = "Edieresis", + [0x00CC] = "Igrave", + [0x00CD] = "Iacute", + [0x00CE] = "Icircumflex", + [0x00CF] = "Idieresis", + [0x00D0] = "Eth", + [0x00D1] = "Ntilde", + [0x00D2] = "Ograve", + [0x00D3] = "Oacute", + [0x00D4] = "Ocircumflex", + [0x00D5] = "Otilde", + [0x00D6] = "Odieresis", + [0x00D7] = "multiply", + [0x00D8] = "Oslash", + [0x00D9] = "Ugrave", + [0x00DA] = "Uacute", + [0x00DB] = "Ucircumflex", + [0x00DC] = "Udieresis", + [0x00DD] = "Yacute", + [0x00DE] = "Thorn", + [0x00DF] = "germandbls", + [0x00E0] = "agrave", + [0x00E1] = "aacute", + [0x00E2] = "acircumflex", + [0x00E3] = "atilde", + [0x00E4] = "adieresis", + [0x00E5] = "aring", + [0x00E6] = "ae", + [0x00E7] = "ccedilla", + [0x00E8] = "egrave", + [0x00E9] = "eacute", + [0x00EA] = "ecircumflex", + [0x00EB] = "edieresis", + [0x00EC] = "igrave", + [0x00ED] = "iacute", + [0x00EE] = "icircumflex", + [0x00EF] = "idieresis", + [0x00F0] = "eth", + [0x00F1] = "ntilde", + [0x00F2] = "ograve", + [0x00F3] = "oacute", + [0x00F4] = "ocircumflex", + [0x00F5] = "otilde", + [0x00F6] = "odieresis", + [0x00F7] = "divide", + [0x00F8] = "oslash", + [0x00F9] = "ugrave", + [0x00FA] = "uacute", + [0x00FB] = "ucircumflex", + [0x00FC] = "udieresis", + [0x00FD] = "yacute", + [0x00FE] = "thorn", + [0x00FF] = "ydieresis", + [0x0100] = "Amacron", + [0x0101] = "amacron", + [0x0102] = "Abreve", + [0x0103] = "abreve", + [0x0104] = "Aogonek", + [0x0105] = "aogonek", + [0x0106] = "Cacute", + [0x0107] = "cacute", + [0x0108] = "Ccircumflex", + [0x0109] = "ccircumflex", + [0x010A] = "Cdotaccent", + [0x010B] = "cdotaccent", + [0x010C] = "Ccaron", + [0x010D] = "ccaron", + [0x010E] = "Dcaron", + [0x010F] = "dcaron", + [0x0110] = "Dslash", + [0x0111] = "dmacron", + [0x0112] = "Emacron", + [0x0113] = "emacron", + [0x0114] = "Ebreve", + [0x0115] = "ebreve", + [0x0116] = "Edotaccent", + [0x0117] = "edotaccent", + [0x0118] = "Eogonek", + [0x0119] = "eogonek", + [0x011A] = "Ecaron", + [0x011B] = "ecaron", + [0x011C] = "Gcircumflex", + [0x011D] = "gcircumflex", + [0x011E] = "Gbreve", + [0x011F] = "gbreve", + [0x0120] = "Gdotaccent", + [0x0121] = "gdotaccent", + [0x0122] = "Gcommaaccent", + [0x0123] = "gcommaaccent", + [0x0124] = "Hcircumflex", + [0x0125] = "hcircumflex", + [0x0126] = "Hbar", + [0x0127] = "hbar", + [0x0128] = "Itilde", + [0x0129] = "itilde", + [0x012A] = "Imacron", + [0x012B] = "imacron", + [0x012C] = "Ibreve", + [0x012D] = "ibreve", + [0x012E] = "Iogonek", + [0x012F] = "iogonek", + [0x0130] = "Idotaccent", + [0x0131] = "dotlessi", + [0x0132] = "IJ", + [0x0133] = "ij", + [0x0134] = "Jcircumflex", + [0x0135] = "jcircumflex", + [0x0136] = "Kcommaaccent", + [0x0137] = "kcommaaccent", + [0x0138] = "kgreenlandic", + [0x0139] = "Lacute", + [0x013A] = "lacute", + [0x013B] = "Lcommaaccent", + [0x013C] = "lcommaaccent", + [0x013D] = "Lcaron", + [0x013E] = "lcaron", + [0x013F] = "Ldotaccent", + [0x0140] = "ldotaccent", + [0x0141] = "Lslash", + [0x0142] = "lslash", + [0x0143] = "Nacute", + [0x0144] = "nacute", + [0x0145] = "Ncommaaccent", + [0x0146] = "ncommaaccent", + [0x0147] = "Ncaron", + [0x0148] = "ncaron", + [0x0149] = "quoterightn", + [0x014A] = "Eng", + [0x014B] = "eng", + [0x014C] = "Omacron", + [0x014D] = "omacron", + [0x014E] = "Obreve", + [0x014F] = "obreve", + [0x0150] = "Ohungarumlaut", + [0x0151] = "ohungarumlaut", + [0x0152] = "OE", + [0x0153] = "oe", + [0x0154] = "Racute", + [0x0155] = "racute", + [0x0156] = "Rcommaaccent", + [0x0157] = "rcommaaccent", + [0x0158] = "Rcaron", + [0x0159] = "rcaron", + [0x015A] = "Sacute", + [0x015B] = "sacute", + [0x015C] = "Scircumflex", + [0x015D] = "scircumflex", + [0x015E] = "Scedilla", + [0x015F] = "scedilla", + [0x0160] = "Scaron", + [0x0161] = "scaron", + [0x0162] = "Tcommaaccent", + [0x0163] = "tcommaaccent", + [0x0164] = "Tcaron", + [0x0165] = "tcaron", + [0x0166] = "Tbar", + [0x0167] = "tbar", + [0x0168] = "Utilde", + [0x0169] = "utilde", + [0x016A] = "Umacron", + [0x016B] = "umacron", + [0x016C] = "Ubreve", + [0x016D] = "ubreve", + [0x016E] = "Uring", + [0x016F] = "uring", + [0x0170] = "Uhungarumlaut", + [0x0171] = "uhungarumlaut", + [0x0172] = "Uogonek", + [0x0173] = "uogonek", + [0x0174] = "Wcircumflex", + [0x0175] = "wcircumflex", + [0x0176] = "Ycircumflex", + [0x0177] = "ycircumflex", + [0x0178] = "Ydieresis", + [0x0179] = "Zacute", + [0x017A] = "zacute", + [0x017B] = "Zdotaccent", + [0x017C] = "zdotaccent", + [0x017D] = "Zcaron", + [0x017E] = "zcaron", + [0x017F] = "slong", + [0x0180] = "bstroke", + [0x0181] = "Bhook", + [0x0182] = "Btopbar", + [0x0183] = "btopbar", + [0x0184] = "Tonesix", + [0x0185] = "tonesix", + [0x0186] = "Oopen", + [0x0187] = "Chook", + [0x0188] = "chook", + [0x0189] = "Dafrican", + [0x018A] = "Dhook", + [0x018B] = "Dtopbar", + [0x018C] = "dtopbar", + [0x018D] = "deltaturned", + [0x018E] = "Ereversed", + [0x018F] = "Schwa", + [0x0190] = "Eopen", + [0x0191] = "Fhook", + [0x0192] = "florin", + [0x0193] = "Ghook", + [0x0194] = "Gammaafrican", + [0x0195] = "hv", + [0x0196] = "Iotaafrican", + [0x0197] = "Istroke", + [0x0198] = "Khook", + [0x0199] = "khook", + [0x019A] = "lbar", + [0x019B] = "lambdastroke", + [0x019C] = "Mturned", + [0x019D] = "Nhookleft", + [0x019E] = "nlegrightlong", + [0x019F] = "Ocenteredtilde", + [0x01A0] = "Ohorn", + [0x01A1] = "ohorn", + [0x01A2] = "Oi", + [0x01A3] = "oi", + [0x01A4] = "Phook", + [0x01A5] = "phook", + [0x01A6] = "yr", + [0x01A7] = "Tonetwo", + [0x01A8] = "tonetwo", + [0x01A9] = "Esh", + [0x01AA] = "eshreversedloop", + [0x01AB] = "tpalatalhook", + [0x01AC] = "Thook", + [0x01AD] = "thook", + [0x01AE] = "Tretroflexhook", + [0x01AF] = "Uhorn", + [0x01B0] = "uhorn", + [0x01B1] = "Upsilonafrican", + [0x01B2] = "Vhook", + [0x01B3] = "Yhook", + [0x01B4] = "yhook", + [0x01B5] = "Zstroke", + [0x01B6] = "zstroke", + [0x01B7] = "Ezh", + [0x01B8] = "Ezhreversed", + [0x01B9] = "ezhreversed", + [0x01BA] = "ezhtail", + [0x01BB] = "twostroke", + [0x01BC] = "Tonefive", + [0x01BD] = "tonefive", + [0x01BE] = "glottalinvertedstroke", + [0x01BF] = "wynn", + [0x01C0] = "clickdental", + [0x01C1] = "clicklateral", + [0x01C2] = "clickalveolar", + [0x01C3] = "clickretroflex", + [0x01C4] = "DZcaron", + [0x01C5] = "Dzcaron", + [0x01C6] = "dzcaron", + [0x01C7] = "LJ", + [0x01C8] = "Lj", + [0x01C9] = "lj", + [0x01CA] = "NJ", + [0x01CB] = "Nj", + [0x01CC] = "nj", + [0x01CD] = "Acaron", + [0x01CE] = "acaron", + [0x01CF] = "Icaron", + [0x01D0] = "icaron", + [0x01D1] = "Ocaron", + [0x01D2] = "ocaron", + [0x01D3] = "Ucaron", + [0x01D4] = "ucaron", + [0x01D5] = "Udieresismacron", + [0x01D6] = "udieresismacron", + [0x01D7] = "Udieresisacute", + [0x01D8] = "udieresisacute", + [0x01D9] = "Udieresiscaron", + [0x01DA] = "udieresiscaron", + [0x01DB] = "Udieresisgrave", + [0x01DC] = "udieresisgrave", + [0x01DD] = "eturned", + [0x01DE] = "Adieresismacron", + [0x01DF] = "adieresismacron", + [0x01E0] = "Adotmacron", + [0x01E1] = "adotmacron", + [0x01E2] = "AEmacron", + [0x01E3] = "aemacron", + [0x01E4] = "Gstroke", + [0x01E5] = "gstroke", + [0x01E6] = "Gcaron", + [0x01E7] = "gcaron", + [0x01E8] = "Kcaron", + [0x01E9] = "kcaron", + [0x01EA] = "Oogonek", + [0x01EB] = "oogonek", + [0x01EC] = "Oogonekmacron", + [0x01ED] = "oogonekmacron", + [0x01EE] = "Ezhcaron", + [0x01EF] = "ezhcaron", + [0x01F0] = "jcaron", + [0x01F1] = "DZ", + [0x01F2] = "Dz", + [0x01F3] = "dz", + [0x01F4] = "Gacute", + [0x01F5] = "gacute", + [0x01FA] = "Aringacute", + [0x01FB] = "aringacute", + [0x01FC] = "AEacute", + [0x01FD] = "aeacute", + [0x01FE] = "Ostrokeacute", + [0x01FF] = "ostrokeacute", + [0x0200] = "Adblgrave", + [0x0201] = "adblgrave", + [0x0202] = "Ainvertedbreve", + [0x0203] = "ainvertedbreve", + [0x0204] = "Edblgrave", + [0x0205] = "edblgrave", + [0x0206] = "Einvertedbreve", + [0x0207] = "einvertedbreve", + [0x0208] = "Idblgrave", + [0x0209] = "idblgrave", + [0x020A] = "Iinvertedbreve", + [0x020B] = "iinvertedbreve", + [0x020C] = "Odblgrave", + [0x020D] = "odblgrave", + [0x020E] = "Oinvertedbreve", + [0x020F] = "oinvertedbreve", + [0x0210] = "Rdblgrave", + [0x0211] = "rdblgrave", + [0x0212] = "Rinvertedbreve", + [0x0213] = "rinvertedbreve", + [0x0214] = "Udblgrave", + [0x0215] = "udblgrave", + [0x0216] = "Uinvertedbreve", + [0x0217] = "uinvertedbreve", + [0x0218] = "Scommaaccent", + [0x0219] = "scommaaccent", + [0x0250] = "aturned", + [0x0251] = "ascript", + [0x0252] = "ascriptturned", + [0x0253] = "bhook", + [0x0254] = "oopen", + [0x0255] = "ccurl", + [0x0256] = "dtail", + [0x0257] = "dhook", + [0x0258] = "ereversed", + [0x0259] = "schwa", + [0x025A] = "schwahook", + [0x025B] = "eopen", + [0x025C] = "eopenreversed", + [0x025D] = "eopenreversedhook", + [0x025E] = "eopenreversedclosed", + [0x025F] = "jdotlessstroke", + [0x0260] = "ghook", + [0x0261] = "gscript", + [0x0263] = "gammalatinsmall", + [0x0264] = "ramshorn", + [0x0265] = "hturned", + [0x0266] = "hhook", + [0x0267] = "henghook", + [0x0268] = "istroke", + [0x0269] = "iotalatin", + [0x026B] = "lmiddletilde", + [0x026C] = "lbelt", + [0x026D] = "lhookretroflex", + [0x026E] = "lezh", + [0x026F] = "mturned", + [0x0270] = "mlonglegturned", + [0x0271] = "mhook", + [0x0272] = "nhookleft", + [0x0273] = "nhookretroflex", + [0x0275] = "obarred", + [0x0277] = "omegalatinclosed", + [0x0278] = "philatin", + [0x0279] = "rturned", + [0x027A] = "rlonglegturned", + [0x027B] = "rhookturned", + [0x027C] = "rlongleg", + [0x027D] = "rhook", + [0x027E] = "rfishhook", + [0x027F] = "rfishhookreversed", + [0x0281] = "Rsmallinverted", + [0x0282] = "shook", + [0x0283] = "esh", + [0x0284] = "dotlessjstrokehook", + [0x0285] = "eshsquatreversed", + [0x0286] = "eshcurl", + [0x0287] = "tturned", + [0x0288] = "tretroflexhook", + [0x0289] = "ubar", + [0x028A] = "upsilonlatin", + [0x028B] = "vhook", + [0x028C] = "vturned", + [0x028D] = "wturned", + [0x028E] = "yturned", + [0x0290] = "zretroflexhook", + [0x0291] = "zcurl", + [0x0292] = "ezh", + [0x0293] = "ezhcurl", + [0x0294] = "glottalstop", + [0x0295] = "glottalstopreversed", + [0x0296] = "glottalstopinverted", + [0x0297] = "cstretched", + [0x0298] = "bilabialclick", + [0x029A] = "eopenclosed", + [0x029B] = "Gsmallhook", + [0x029D] = "jcrossedtail", + [0x029E] = "kturned", + [0x02A0] = "qhook", + [0x02A1] = "glottalstopstroke", + [0x02A2] = "glottalstopstrokereversed", + [0x02A3] = "dzaltone", + [0x02A4] = "dezh", + [0x02A5] = "dzcurl", + [0x02A6] = "ts", + [0x02A7] = "tesh", + [0x02A8] = "tccurl", + [0x02B0] = "hsuperior", + [0x02B1] = "hhooksuperior", + [0x02B2] = "jsuperior", + [0x02B4] = "rturnedsuperior", + [0x02B5] = "rhookturnedsuperior", + [0x02B6] = "Rsmallinvertedsuperior", + [0x02B7] = "wsuperior", + [0x02B8] = "ysuperior", + [0x02B9] = "primemod", + [0x02BA] = "dblprimemod", + [0x02BB] = "commaturnedmod", + [0x02BC] = "apostrophemod", + [0x02BD] = "commareversedmod", + [0x02BE] = "ringhalfright", + [0x02BF] = "ringhalfleft", + [0x02C0] = "glottalstopmod", + [0x02C1] = "glottalstopreversedmod", + [0x02C2] = "arrowheadleftmod", + [0x02C3] = "arrowheadrightmod", + [0x02C4] = "arrowheadupmod", + [0x02C5] = "arrowheaddownmod", + [0x02C6] = "circumflex", + [0x02C7] = "caron", + [0x02C8] = "verticallinemod", + [0x02C9] = "firsttonechinese", + [0x02CA] = "secondtonechinese", + [0x02CB] = "fourthtonechinese", + [0x02CC] = "verticallinelowmod", + [0x02CD] = "macronlowmod", + [0x02CE] = "gravelowmod", + [0x02CF] = "acutelowmod", + [0x02D0] = "colontriangularmod", + [0x02D1] = "colontriangularhalfmod", + [0x02D2] = "ringhalfrightcentered", + [0x02D3] = "ringhalfleftcentered", + [0x02D4] = "uptackmod", + [0x02D5] = "downtackmod", + [0x02D6] = "plusmod", + [0x02D7] = "minusmod", + [0x02D8] = "breve", + [0x02D9] = "dotaccent", + [0x02DA] = "ring", + [0x02DB] = "ogonek", + [0x02DC] = "tilde", + [0x02DD] = "hungarumlaut", + [0x02DE] = "rhotichookmod", + [0x02E0] = "gammasuperior", + [0x02E3] = "xsuperior", + [0x02E4] = "glottalstopreversedsuperior", + [0x02E5] = "tonebarextrahighmod", + [0x02E6] = "tonebarhighmod", + [0x02E7] = "tonebarmidmod", + [0x02E8] = "tonebarlowmod", + [0x02E9] = "tonebarextralowmod", + [0x0300] = "gravecomb", + [0x0301] = "acutecomb", + [0x0302] = "circumflexcmb", + [0x0303] = "tildecomb", + [0x0304] = "macroncmb", + [0x0305] = "overlinecmb", + [0x0306] = "brevecmb", + [0x0307] = "dotaccentcmb", + [0x0308] = "dieresiscmb", + [0x0309] = "hookcmb", + [0x030A] = "ringcmb", + [0x030B] = "hungarumlautcmb", + [0x030C] = "caroncmb", + [0x030D] = "verticallineabovecmb", + [0x030E] = "dblverticallineabovecmb", + [0x030F] = "dblgravecmb", + [0x0310] = "candrabinducmb", + [0x0311] = "breveinvertedcmb", + [0x0312] = "commaturnedabovecmb", + [0x0313] = "commaabovecmb", + [0x0314] = "commareversedabovecmb", + [0x0315] = "commaaboverightcmb", + [0x0316] = "gravebelowcmb", + [0x0317] = "acutebelowcmb", + [0x0318] = "lefttackbelowcmb", + [0x0319] = "righttackbelowcmb", + [0x031A] = "leftangleabovecmb", + [0x031B] = "horncmb", + [0x031C] = "ringhalfleftbelowcmb", + [0x031D] = "uptackbelowcmb", + [0x031E] = "downtackbelowcmb", + [0x031F] = "plusbelowcmb", + [0x0320] = "minusbelowcmb", + [0x0321] = "hookpalatalizedbelowcmb", + [0x0322] = "hookretroflexbelowcmb", + [0x0323] = "dotbelowcomb", + [0x0324] = "dieresisbelowcmb", + [0x0325] = "ringbelowcmb", + [0x0327] = "cedillacmb", + [0x0328] = "ogonekcmb", + [0x0329] = "verticallinebelowcmb", + [0x032A] = "bridgebelowcmb", + [0x032B] = "dblarchinvertedbelowcmb", + [0x032C] = "caronbelowcmb", + [0x032D] = "circumflexbelowcmb", + [0x032E] = "brevebelowcmb", + [0x032F] = "breveinvertedbelowcmb", + [0x0330] = "tildebelowcmb", + [0x0331] = "macronbelowcmb", + [0x0332] = "lowlinecmb", + [0x0333] = "dbllowlinecmb", + [0x0334] = "tildeoverlaycmb", + [0x0335] = "strokeshortoverlaycmb", + [0x0336] = "strokelongoverlaycmb", + [0x0337] = "solidusshortoverlaycmb", + [0x0338] = "soliduslongoverlaycmb", + [0x0339] = "ringhalfrightbelowcmb", + [0x033A] = "bridgeinvertedbelowcmb", + [0x033B] = "squarebelowcmb", + [0x033C] = "seagullbelowcmb", + [0x033D] = "xabovecmb", + [0x033E] = "tildeverticalcmb", + [0x033F] = "dbloverlinecmb", + [0x0340] = "gravetonecmb", + [0x0341] = "acutetonecmb", + [0x0342] = "perispomenigreekcmb", + [0x0343] = "koroniscmb", + [0x0344] = "dialytikatonoscmb", + [0x0345] = "ypogegrammenigreekcmb", + [0x0360] = "tildedoublecmb", + [0x0361] = "breveinverteddoublecmb", + [0x0374] = "numeralsigngreek", + [0x0375] = "numeralsignlowergreek", + [0x037A] = "ypogegrammeni", + [0x037E] = "questiongreek", + [0x0384] = "tonos", + [0x0385] = "dieresistonos", + [0x0386] = "Alphatonos", + [0x0387] = "anoteleia", + [0x0388] = "Epsilontonos", + [0x0389] = "Etatonos", + [0x038A] = "Iotatonos", + [0x038C] = "Omicrontonos", + [0x038E] = "Upsilontonos", + [0x038F] = "Omegatonos", + [0x0390] = "iotadieresistonos", + [0x0391] = "Alpha", + [0x0392] = "Beta", + [0x0393] = "Gamma", + [0x0394] = "Deltagreek", + [0x0395] = "Epsilon", + [0x0396] = "Zeta", + [0x0397] = "Eta", + [0x0398] = "Theta", + [0x0399] = "Iota", + [0x039A] = "Kappa", + [0x039B] = "Lambda", + [0x039C] = "Mu", + [0x039D] = "Nu", + [0x039E] = "Xi", + [0x039F] = "Omicron", + [0x03A0] = "Pi", + [0x03A1] = "Rho", + [0x03A3] = "Sigma", + [0x03A4] = "Tau", + [0x03A5] = "Upsilon", + [0x03A6] = "Phi", + [0x03A7] = "Chi", + [0x03A8] = "Psi", + [0x03A9] = "Omegagreek", + [0x03AA] = "Iotadieresis", + [0x03AB] = "Upsilondieresis", + [0x03AC] = "alphatonos", + [0x03AD] = "epsilontonos", + [0x03AE] = "etatonos", + [0x03AF] = "iotatonos", + [0x03B0] = "upsilondieresistonos", + [0x03B1] = "alpha", + [0x03B2] = "beta", + [0x03B3] = "gamma", + [0x03B4] = "delta", + [0x03B5] = "epsilon", + [0x03B6] = "zeta", + [0x03B7] = "eta", + [0x03B8] = "theta", + [0x03B9] = "iota", + [0x03BA] = "kappa", + [0x03BB] = "lambda", + [0x03BC] = "mugreek", + [0x03BD] = "nu", + [0x03BE] = "xi", + [0x03BF] = "omicron", + [0x03C0] = "pi", + [0x03C1] = "rho", + [0x03C2] = "sigmafinal", + [0x03C3] = "sigma", + [0x03C4] = "tau", + [0x03C5] = "upsilon", + [0x03C6] = "phi", + [0x03C7] = "chi", + [0x03C8] = "psi", + [0x03C9] = "omega", + [0x03CA] = "iotadieresis", + [0x03CB] = "upsilondieresis", + [0x03CC] = "omicrontonos", + [0x03CD] = "upsilontonos", + [0x03CE] = "omegatonos", + [0x03D0] = "betasymbolgreek", + [0x03D1] = "thetasymbolgreek", + [0x03D2] = "Upsilonhooksymbol", + [0x03D3] = "Upsilonacutehooksymbolgreek", + [0x03D4] = "Upsilondieresishooksymbolgreek", + [0x03D5] = "phisymbolgreek", + [0x03D6] = "pisymbolgreek", + [0x03DA] = "Stigmagreek", + [0x03DC] = "Digammagreek", + [0x03DE] = "Koppagreek", + [0x03E0] = "Sampigreek", + [0x03E2] = "Sheicoptic", + [0x03E3] = "sheicoptic", + [0x03E4] = "Feicoptic", + [0x03E5] = "feicoptic", + [0x03E6] = "Kheicoptic", + [0x03E7] = "kheicoptic", + [0x03E8] = "Horicoptic", + [0x03E9] = "horicoptic", + [0x03EA] = "Gangiacoptic", + [0x03EB] = "gangiacoptic", + [0x03EC] = "Shimacoptic", + [0x03ED] = "shimacoptic", + [0x03EE] = "Deicoptic", + [0x03EF] = "deicoptic", + [0x03F0] = "kappasymbolgreek", + [0x03F1] = "rhosymbolgreek", + [0x03F2] = "sigmalunatesymbolgreek", + [0x03F3] = "yotgreek", + [0x0401] = "afii10023", + [0x0402] = "afii10051", + [0x0403] = "afii10052", + [0x0404] = "afii10053", + [0x0405] = "afii10054", + [0x0406] = "afii10055", + [0x0407] = "afii10056", + [0x0408] = "afii10057", + [0x0409] = "afii10058", + [0x040A] = "afii10059", + [0x040B] = "afii10060", + [0x040C] = "afii10061", + [0x040E] = "afii10062", + [0x040F] = "afii10145", + [0x0410] = "afii10017", + [0x0411] = "afii10018", + [0x0412] = "afii10019", + [0x0413] = "afii10020", + [0x0414] = "afii10021", + [0x0415] = "afii10022", + [0x0416] = "afii10024", + [0x0417] = "afii10025", + [0x0418] = "afii10026", + [0x0419] = "afii10027", + [0x041A] = "afii10028", + [0x041B] = "afii10029", + [0x041C] = "afii10030", + [0x041D] = "afii10031", + [0x041E] = "afii10032", + [0x041F] = "afii10033", + [0x0420] = "afii10034", + [0x0421] = "afii10035", + [0x0422] = "afii10036", + [0x0423] = "afii10037", + [0x0424] = "afii10038", + [0x0425] = "afii10039", + [0x0426] = "afii10040", + [0x0427] = "afii10041", + [0x0428] = "afii10042", + [0x0429] = "afii10043", + [0x042A] = "afii10044", + [0x042B] = "afii10045", + [0x042C] = "afii10046", + [0x042D] = "afii10047", + [0x042E] = "afii10048", + [0x042F] = "afii10049", + [0x0430] = "afii10065", + [0x0431] = "becyrillic", + [0x0432] = "vecyrillic", + [0x0433] = "gecyrillic", + [0x0434] = "decyrillic", + [0x0435] = "iecyrillic", + [0x0436] = "zhecyrillic", + [0x0437] = "zecyrillic", + [0x0438] = "iicyrillic", + [0x0439] = "iishortcyrillic", + [0x043A] = "kacyrillic", + [0x043B] = "elcyrillic", + [0x043C] = "emcyrillic", + [0x043D] = "encyrillic", + [0x043E] = "ocyrillic", + [0x043F] = "pecyrillic", + [0x0440] = "ercyrillic", + [0x0441] = "escyrillic", + [0x0442] = "tecyrillic", + [0x0443] = "ucyrillic", + [0x0444] = "efcyrillic", + [0x0445] = "khacyrillic", + [0x0446] = "tsecyrillic", + [0x0447] = "checyrillic", + [0x0448] = "shacyrillic", + [0x0449] = "shchacyrillic", + [0x044A] = "hardsigncyrillic", + [0x044B] = "yericyrillic", + [0x044C] = "softsigncyrillic", + [0x044D] = "ereversedcyrillic", + [0x044E] = "iucyrillic", + [0x044F] = "iacyrillic", + [0x0451] = "iocyrillic", + [0x0452] = "djecyrillic", + [0x0453] = "gjecyrillic", + [0x0454] = "ecyrillic", + [0x0455] = "dzecyrillic", + [0x0456] = "icyrillic", + [0x0457] = "yicyrillic", + [0x0458] = "jecyrillic", + [0x0459] = "ljecyrillic", + [0x045A] = "njecyrillic", + [0x045B] = "tshecyrillic", + [0x045C] = "kjecyrillic", + [0x045E] = "ushortcyrillic", + [0x045F] = "dzhecyrillic", + [0x0460] = "Omegacyrillic", + [0x0461] = "omegacyrillic", + [0x0462] = "afii10146", + [0x0463] = "yatcyrillic", + [0x0464] = "Eiotifiedcyrillic", + [0x0465] = "eiotifiedcyrillic", + [0x0466] = "Yuslittlecyrillic", + [0x0467] = "yuslittlecyrillic", + [0x0468] = "Yuslittleiotifiedcyrillic", + [0x0469] = "yuslittleiotifiedcyrillic", + [0x046A] = "Yusbigcyrillic", + [0x046B] = "yusbigcyrillic", + [0x046C] = "Yusbigiotifiedcyrillic", + [0x046D] = "yusbigiotifiedcyrillic", + [0x046E] = "Ksicyrillic", + [0x046F] = "ksicyrillic", + [0x0470] = "Psicyrillic", + [0x0471] = "psicyrillic", + [0x0472] = "afii10147", + [0x0473] = "fitacyrillic", + [0x0474] = "afii10148", + [0x0475] = "izhitsacyrillic", + [0x0476] = "Izhitsadblgravecyrillic", + [0x0477] = "izhitsadblgravecyrillic", + [0x0478] = "Ukcyrillic", + [0x0479] = "ukcyrillic", + [0x047A] = "Omegaroundcyrillic", + [0x047B] = "omegaroundcyrillic", + [0x047C] = "Omegatitlocyrillic", + [0x047D] = "omegatitlocyrillic", + [0x047E] = "Otcyrillic", + [0x047F] = "otcyrillic", + [0x0480] = "Koppacyrillic", + [0x0481] = "koppacyrillic", + [0x0482] = "thousandcyrillic", + [0x0483] = "titlocyrilliccmb", + [0x0484] = "palatalizationcyrilliccmb", + [0x0485] = "dasiapneumatacyrilliccmb", + [0x0486] = "psilipneumatacyrilliccmb", + [0x0490] = "afii10050", + [0x0491] = "gheupturncyrillic", + [0x0492] = "Ghestrokecyrillic", + [0x0493] = "ghestrokecyrillic", + [0x0494] = "Ghemiddlehookcyrillic", + [0x0495] = "ghemiddlehookcyrillic", + [0x0496] = "Zhedescendercyrillic", + [0x0497] = "zhedescendercyrillic", + [0x0498] = "Zedescendercyrillic", + [0x0499] = "zedescendercyrillic", + [0x049A] = "Kadescendercyrillic", + [0x049B] = "kadescendercyrillic", + [0x049C] = "Kaverticalstrokecyrillic", + [0x049D] = "kaverticalstrokecyrillic", + [0x049E] = "Kastrokecyrillic", + [0x049F] = "kastrokecyrillic", + [0x04A0] = "Kabashkircyrillic", + [0x04A1] = "kabashkircyrillic", + [0x04A2] = "Endescendercyrillic", + [0x04A3] = "endescendercyrillic", + [0x04A4] = "Enghecyrillic", + [0x04A5] = "enghecyrillic", + [0x04A6] = "Pemiddlehookcyrillic", + [0x04A7] = "pemiddlehookcyrillic", + [0x04A8] = "Haabkhasiancyrillic", + [0x04A9] = "haabkhasiancyrillic", + [0x04AA] = "Esdescendercyrillic", + [0x04AB] = "esdescendercyrillic", + [0x04AC] = "Tedescendercyrillic", + [0x04AD] = "tedescendercyrillic", + [0x04AE] = "Ustraightcyrillic", + [0x04AF] = "ustraightcyrillic", + [0x04B0] = "Ustraightstrokecyrillic", + [0x04B1] = "ustraightstrokecyrillic", + [0x04B2] = "Hadescendercyrillic", + [0x04B3] = "hadescendercyrillic", + [0x04B4] = "Tetsecyrillic", + [0x04B5] = "tetsecyrillic", + [0x04B6] = "Chedescendercyrillic", + [0x04B7] = "chedescendercyrillic", + [0x04B8] = "Cheverticalstrokecyrillic", + [0x04B9] = "cheverticalstrokecyrillic", + [0x04BA] = "Shhacyrillic", + [0x04BB] = "shhacyrillic", + [0x04BC] = "Cheabkhasiancyrillic", + [0x04BD] = "cheabkhasiancyrillic", + [0x04BE] = "Chedescenderabkhasiancyrillic", + [0x04BF] = "chedescenderabkhasiancyrillic", + [0x04C0] = "palochkacyrillic", + [0x04C1] = "Zhebrevecyrillic", + [0x04C2] = "zhebrevecyrillic", + [0x04C3] = "Kahookcyrillic", + [0x04C4] = "kahookcyrillic", + [0x04C7] = "Enhookcyrillic", + [0x04C8] = "enhookcyrillic", + [0x04CB] = "Chekhakassiancyrillic", + [0x04CC] = "chekhakassiancyrillic", + [0x04D0] = "Abrevecyrillic", + [0x04D1] = "abrevecyrillic", + [0x04D2] = "Adieresiscyrillic", + [0x04D3] = "adieresiscyrillic", + [0x04D4] = "Aiecyrillic", + [0x04D5] = "aiecyrillic", + [0x04D6] = "Iebrevecyrillic", + [0x04D7] = "iebrevecyrillic", + [0x04D8] = "Schwacyrillic", + [0x04D9] = "schwacyrillic", + [0x04DA] = "Schwadieresiscyrillic", + [0x04DB] = "schwadieresiscyrillic", + [0x04DC] = "Zhedieresiscyrillic", + [0x04DD] = "zhedieresiscyrillic", + [0x04DE] = "Zedieresiscyrillic", + [0x04DF] = "zedieresiscyrillic", + [0x04E0] = "Dzeabkhasiancyrillic", + [0x04E1] = "dzeabkhasiancyrillic", + [0x04E2] = "Imacroncyrillic", + [0x04E3] = "imacroncyrillic", + [0x04E4] = "Idieresiscyrillic", + [0x04E5] = "idieresiscyrillic", + [0x04E6] = "Odieresiscyrillic", + [0x04E7] = "odieresiscyrillic", + [0x04E8] = "Obarredcyrillic", + [0x04E9] = "obarredcyrillic", + [0x04EA] = "Obarreddieresiscyrillic", + [0x04EB] = "obarreddieresiscyrillic", + [0x04EE] = "Umacroncyrillic", + [0x04EF] = "umacroncyrillic", + [0x04F0] = "Udieresiscyrillic", + [0x04F1] = "udieresiscyrillic", + [0x04F2] = "Uhungarumlautcyrillic", + [0x04F3] = "uhungarumlautcyrillic", + [0x04F4] = "Chedieresiscyrillic", + [0x04F5] = "chedieresiscyrillic", + [0x04F8] = "Yerudieresiscyrillic", + [0x04F9] = "yerudieresiscyrillic", + [0x0531] = "Aybarmenian", + [0x0532] = "Benarmenian", + [0x0533] = "Gimarmenian", + [0x0534] = "Daarmenian", + [0x0535] = "Echarmenian", + [0x0536] = "Zaarmenian", + [0x0537] = "Eharmenian", + [0x0538] = "Etarmenian", + [0x0539] = "Toarmenian", + [0x053A] = "Zhearmenian", + [0x053B] = "Iniarmenian", + [0x053C] = "Liwnarmenian", + [0x053D] = "Xeharmenian", + [0x053E] = "Caarmenian", + [0x053F] = "Kenarmenian", + [0x0540] = "Hoarmenian", + [0x0541] = "Jaarmenian", + [0x0542] = "Ghadarmenian", + [0x0543] = "Cheharmenian", + [0x0544] = "Menarmenian", + [0x0545] = "Yiarmenian", + [0x0546] = "Nowarmenian", + [0x0547] = "Shaarmenian", + [0x0548] = "Voarmenian", + [0x0549] = "Chaarmenian", + [0x054A] = "Peharmenian", + [0x054B] = "Jheharmenian", + [0x054C] = "Raarmenian", + [0x054D] = "Seharmenian", + [0x054E] = "Vewarmenian", + [0x054F] = "Tiwnarmenian", + [0x0550] = "Reharmenian", + [0x0551] = "Coarmenian", + [0x0552] = "Yiwnarmenian", + [0x0553] = "Piwrarmenian", + [0x0554] = "Keharmenian", + [0x0555] = "Oharmenian", + [0x0556] = "Feharmenian", + [0x0559] = "ringhalfleftarmenian", + [0x055A] = "apostrophearmenian", + [0x055B] = "emphasismarkarmenian", + [0x055C] = "exclamarmenian", + [0x055D] = "commaarmenian", + [0x055E] = "questionarmenian", + [0x055F] = "abbreviationmarkarmenian", + [0x0561] = "aybarmenian", + [0x0562] = "benarmenian", + [0x0563] = "gimarmenian", + [0x0564] = "daarmenian", + [0x0565] = "echarmenian", + [0x0566] = "zaarmenian", + [0x0567] = "eharmenian", + [0x0568] = "etarmenian", + [0x0569] = "toarmenian", + [0x056A] = "zhearmenian", + [0x056B] = "iniarmenian", + [0x056C] = "liwnarmenian", + [0x056D] = "xeharmenian", + [0x056E] = "caarmenian", + [0x056F] = "kenarmenian", + [0x0570] = "hoarmenian", + [0x0571] = "jaarmenian", + [0x0572] = "ghadarmenian", + [0x0573] = "cheharmenian", + [0x0574] = "menarmenian", + [0x0575] = "yiarmenian", + [0x0576] = "nowarmenian", + [0x0577] = "shaarmenian", + [0x0578] = "voarmenian", + [0x0579] = "chaarmenian", + [0x057A] = "peharmenian", + [0x057B] = "jheharmenian", + [0x057C] = "raarmenian", + [0x057D] = "seharmenian", + [0x057E] = "vewarmenian", + [0x057F] = "tiwnarmenian", + [0x0580] = "reharmenian", + [0x0581] = "coarmenian", + [0x0582] = "yiwnarmenian", + [0x0583] = "piwrarmenian", + [0x0584] = "keharmenian", + [0x0585] = "oharmenian", + [0x0586] = "feharmenian", + [0x0587] = "echyiwnarmenian", + [0x0589] = "periodarmenian", + [0x0591] = "etnahtalefthebrew", + [0x0592] = "segoltahebrew", + [0x0593] = "shalshelethebrew", + [0x0594] = "zaqefqatanhebrew", + [0x0595] = "zaqefgadolhebrew", + [0x0596] = "tipehalefthebrew", + [0x0597] = "reviamugrashhebrew", + [0x0598] = "zarqahebrew", + [0x0599] = "pashtahebrew", + [0x059A] = "yetivhebrew", + [0x059B] = "tevirlefthebrew", + [0x059C] = "gereshaccenthebrew", + [0x059D] = "gereshmuqdamhebrew", + [0x059E] = "gershayimaccenthebrew", + [0x059F] = "qarneyparahebrew", + [0x05A0] = "telishagedolahebrew", + [0x05A1] = "pazerhebrew", + [0x05A3] = "munahlefthebrew", + [0x05A4] = "mahapakhlefthebrew", + [0x05A5] = "merkhalefthebrew", + [0x05A6] = "merkhakefulalefthebrew", + [0x05A7] = "dargalefthebrew", + [0x05A8] = "qadmahebrew", + [0x05A9] = "telishaqetanahebrew", + [0x05AA] = "yerahbenyomolefthebrew", + [0x05AB] = "olehebrew", + [0x05AC] = "iluyhebrew", + [0x05AD] = "dehihebrew", + [0x05AE] = "zinorhebrew", + [0x05AF] = "masoracirclehebrew", + [0x05B0] = "shevawidehebrew", + [0x05B1] = "hatafsegolwidehebrew", + [0x05B2] = "hatafpatahwidehebrew", + [0x05B3] = "hatafqamatswidehebrew", + [0x05B4] = "hiriqwidehebrew", + [0x05B5] = "tserewidehebrew", + [0x05B6] = "segolwidehebrew", + [0x05B7] = "patahwidehebrew", + [0x05B8] = "qamatswidehebrew", + [0x05B9] = "holamwidehebrew", + [0x05BB] = "qubutswidehebrew", + [0x05BC] = "dageshhebrew", + [0x05BD] = "siluqlefthebrew", + [0x05BE] = "maqafhebrew", + [0x05BF] = "rafehebrew", + [0x05C0] = "paseqhebrew", + [0x05C1] = "shindothebrew", + [0x05C2] = "sindothebrew", + [0x05C3] = "sofpasuqhebrew", + [0x05C4] = "upperdothebrew", + [0x05D0] = "alefhebrew", + [0x05D1] = "bethebrew", + [0x05D2] = "gimelhebrew", + [0x05D3] = "dalettserehebrew", + [0x05D4] = "hehebrew", + [0x05D5] = "vavhebrew", + [0x05D6] = "zayinhebrew", + [0x05D7] = "hethebrew", + [0x05D8] = "tethebrew", + [0x05D9] = "yodhebrew", + [0x05DA] = "finalkafshevahebrew", + [0x05DB] = "kafhebrew", + [0x05DC] = "lamedholamhebrew", + [0x05DD] = "finalmemhebrew", + [0x05DE] = "memhebrew", + [0x05DF] = "finalnunhebrew", + [0x05E0] = "nunhebrew", + [0x05E1] = "samekhhebrew", + [0x05E2] = "ayinhebrew", + [0x05E3] = "finalpehebrew", + [0x05E4] = "pehebrew", + [0x05E5] = "finaltsadihebrew", + [0x05E6] = "tsadihebrew", + [0x05E7] = "qoftserehebrew", + [0x05E8] = "reshtserehebrew", + [0x05E9] = "shinhebrew", + [0x05EA] = "tavhebrew", + [0x05F0] = "vavvavhebrew", + [0x05F1] = "vavyodhebrew", + [0x05F2] = "yodyodhebrew", + [0x05F3] = "gereshhebrew", + [0x05F4] = "gershayimhebrew", + [0x060C] = "commaarabic", + [0x061B] = "semicolonarabic", + [0x061F] = "questionarabic", + [0x0621] = "hamzasukunarabic", + [0x0622] = "alefmaddaabovearabic", + [0x0623] = "alefhamzaabovearabic", + [0x0624] = "wawhamzaabovearabic", + [0x0625] = "alefhamzabelowarabic", + [0x0626] = "yehhamzaabovearabic", + [0x0627] = "alefarabic", + [0x0628] = "beharabic", + [0x0629] = "tehmarbutaarabic", + [0x062A] = "teharabic", + [0x062B] = "theharabic", + [0x062C] = "jeemarabic", + [0x062D] = "haharabic", + [0x062E] = "khaharabic", + [0x062F] = "dalarabic", + [0x0630] = "thalarabic", + [0x0631] = "rehyehaleflamarabic", + [0x0632] = "zainarabic", + [0x0633] = "seenarabic", + [0x0634] = "sheenarabic", + [0x0635] = "sadarabic", + [0x0636] = "dadarabic", + [0x0637] = "taharabic", + [0x0638] = "zaharabic", + [0x0639] = "ainarabic", + [0x063A] = "ghainarabic", + [0x0640] = "tatweelarabic", + [0x0641] = "feharabic", + [0x0642] = "qafarabic", + [0x0643] = "kafarabic", + [0x0644] = "lamarabic", + [0x0645] = "meemarabic", + [0x0646] = "noonarabic", + [0x0647] = "heharabic", + [0x0648] = "wawarabic", + [0x0649] = "alefmaksuraarabic", + [0x064A] = "yeharabic", + [0x064B] = "fathatanarabic", + [0x064C] = "dammatanarabic", + [0x064D] = "kasratanarabic", + [0x064E] = "fathalowarabic", + [0x064F] = "dammalowarabic", + [0x0650] = "kasraarabic", + [0x0651] = "shaddafathatanarabic", + [0x0652] = "sukunarabic", + [0x0660] = "zerohackarabic", + [0x0661] = "onehackarabic", + [0x0662] = "twohackarabic", + [0x0663] = "threehackarabic", + [0x0664] = "fourhackarabic", + [0x0665] = "fivehackarabic", + [0x0666] = "sixhackarabic", + [0x0667] = "sevenhackarabic", + [0x0668] = "eighthackarabic", + [0x0669] = "ninehackarabic", + [0x066A] = "percentarabic", + [0x066B] = "decimalseparatorpersian", + [0x066C] = "thousandsseparatorpersian", + [0x066D] = "asteriskarabic", + [0x0679] = "tteharabic", + [0x067E] = "peharabic", + [0x0686] = "tcheharabic", + [0x0688] = "ddalarabic", + [0x0691] = "rreharabic", + [0x0698] = "jeharabic", + [0x06A4] = "veharabic", + [0x06AF] = "gafarabic", + [0x06BA] = "noonghunnaarabic", + [0x06C1] = "hehaltonearabic", + [0x06D1] = "yehthreedotsbelowarabic", + [0x06D2] = "yehbarreearabic", + [0x06D5] = "afii57534", + [0x06F0] = "zeropersian", + [0x06F1] = "onepersian", + [0x06F2] = "twopersian", + [0x06F3] = "threepersian", + [0x06F4] = "fourpersian", + [0x06F5] = "fivepersian", + [0x06F6] = "sixpersian", + [0x06F7] = "sevenpersian", + [0x06F8] = "eightpersian", + [0x06F9] = "ninepersian", + [0x0901] = "candrabindudeva", + [0x0902] = "anusvaradeva", + [0x0903] = "visargadeva", + [0x0905] = "adeva", + [0x0906] = "aadeva", + [0x0907] = "ideva", + [0x0908] = "iideva", + [0x0909] = "udeva", + [0x090A] = "uudeva", + [0x090B] = "rvocalicdeva", + [0x090C] = "lvocalicdeva", + [0x090D] = "ecandradeva", + [0x090E] = "eshortdeva", + [0x090F] = "edeva", + [0x0910] = "aideva", + [0x0911] = "ocandradeva", + [0x0912] = "oshortdeva", + [0x0913] = "odeva", + [0x0914] = "audeva", + [0x0915] = "kadeva", + [0x0916] = "khadeva", + [0x0917] = "gadeva", + [0x0918] = "ghadeva", + [0x0919] = "ngadeva", + [0x091A] = "cadeva", + [0x091B] = "chadeva", + [0x091C] = "jadeva", + [0x091D] = "jhadeva", + [0x091E] = "nyadeva", + [0x091F] = "ttadeva", + [0x0920] = "tthadeva", + [0x0921] = "ddadeva", + [0x0922] = "ddhadeva", + [0x0923] = "nnadeva", + [0x0924] = "tadeva", + [0x0925] = "thadeva", + [0x0926] = "dadeva", + [0x0927] = "dhadeva", + [0x0928] = "nadeva", + [0x0929] = "nnnadeva", + [0x092A] = "padeva", + [0x092B] = "phadeva", + [0x092C] = "badeva", + [0x092D] = "bhadeva", + [0x092E] = "madeva", + [0x092F] = "yadeva", + [0x0930] = "radeva", + [0x0931] = "rradeva", + [0x0932] = "ladeva", + [0x0933] = "lladeva", + [0x0934] = "llladeva", + [0x0935] = "vadeva", + [0x0936] = "shadeva", + [0x0937] = "ssadeva", + [0x0938] = "sadeva", + [0x0939] = "hadeva", + [0x093C] = "nuktadeva", + [0x093D] = "avagrahadeva", + [0x093E] = "aavowelsigndeva", + [0x093F] = "ivowelsigndeva", + [0x0940] = "iivowelsigndeva", + [0x0941] = "uvowelsigndeva", + [0x0942] = "uuvowelsigndeva", + [0x0943] = "rvocalicvowelsigndeva", + [0x0944] = "rrvocalicvowelsigndeva", + [0x0945] = "ecandravowelsigndeva", + [0x0946] = "eshortvowelsigndeva", + [0x0947] = "evowelsigndeva", + [0x0948] = "aivowelsigndeva", + [0x0949] = "ocandravowelsigndeva", + [0x094A] = "oshortvowelsigndeva", + [0x094B] = "ovowelsigndeva", + [0x094C] = "auvowelsigndeva", + [0x094D] = "viramadeva", + [0x0950] = "omdeva", + [0x0951] = "udattadeva", + [0x0952] = "anudattadeva", + [0x0953] = "gravedeva", + [0x0954] = "acutedeva", + [0x0958] = "qadeva", + [0x0959] = "khhadeva", + [0x095A] = "ghhadeva", + [0x095B] = "zadeva", + [0x095C] = "dddhadeva", + [0x095D] = "rhadeva", + [0x095E] = "fadeva", + [0x095F] = "yyadeva", + [0x0960] = "rrvocalicdeva", + [0x0961] = "llvocalicdeva", + [0x0962] = "lvocalicvowelsigndeva", + [0x0963] = "llvocalicvowelsigndeva", + [0x0964] = "danda", + [0x0965] = "dbldanda", + [0x0966] = "zerodeva", + [0x0967] = "onedeva", + [0x0968] = "twodeva", + [0x0969] = "threedeva", + [0x096A] = "fourdeva", + [0x096B] = "fivedeva", + [0x096C] = "sixdeva", + [0x096D] = "sevendeva", + [0x096E] = "eightdeva", + [0x096F] = "ninedeva", + [0x0970] = "abbreviationsigndeva", + [0x0981] = "candrabindubengali", + [0x0982] = "anusvarabengali", + [0x0983] = "visargabengali", + [0x0985] = "abengali", + [0x0986] = "aabengali", + [0x0987] = "ibengali", + [0x0988] = "iibengali", + [0x0989] = "ubengali", + [0x098A] = "uubengali", + [0x098B] = "rvocalicbengali", + [0x098C] = "lvocalicbengali", + [0x098F] = "ebengali", + [0x0990] = "aibengali", + [0x0993] = "obengali", + [0x0994] = "aubengali", + [0x0995] = "kabengali", + [0x0996] = "khabengali", + [0x0997] = "gabengali", + [0x0998] = "ghabengali", + [0x0999] = "ngabengali", + [0x099A] = "cabengali", + [0x099B] = "chabengali", + [0x099C] = "jabengali", + [0x099D] = "jhabengali", + [0x099E] = "nyabengali", + [0x099F] = "ttabengali", + [0x09A0] = "tthabengali", + [0x09A1] = "ddabengali", + [0x09A2] = "ddhabengali", + [0x09A3] = "nnabengali", + [0x09A4] = "tabengali", + [0x09A5] = "thabengali", + [0x09A6] = "dabengali", + [0x09A7] = "dhabengali", + [0x09A8] = "nabengali", + [0x09AA] = "pabengali", + [0x09AB] = "phabengali", + [0x09AC] = "babengali", + [0x09AD] = "bhabengali", + [0x09AE] = "mabengali", + [0x09AF] = "yabengali", + [0x09B0] = "rabengali", + [0x09B2] = "labengali", + [0x09B6] = "shabengali", + [0x09B7] = "ssabengali", + [0x09B8] = "sabengali", + [0x09B9] = "habengali", + [0x09BC] = "nuktabengali", + [0x09BE] = "aavowelsignbengali", + [0x09BF] = "ivowelsignbengali", + [0x09C0] = "iivowelsignbengali", + [0x09C1] = "uvowelsignbengali", + [0x09C2] = "uuvowelsignbengali", + [0x09C3] = "rvocalicvowelsignbengali", + [0x09C4] = "rrvocalicvowelsignbengali", + [0x09C7] = "evowelsignbengali", + [0x09C8] = "aivowelsignbengali", + [0x09CB] = "ovowelsignbengali", + [0x09CC] = "auvowelsignbengali", + [0x09CD] = "viramabengali", + [0x09D7] = "aulengthmarkbengali", + [0x09DC] = "rrabengali", + [0x09DD] = "rhabengali", + [0x09DF] = "yyabengali", + [0x09E0] = "rrvocalicbengali", + [0x09E1] = "llvocalicbengali", + [0x09E2] = "lvocalicvowelsignbengali", + [0x09E3] = "llvocalicvowelsignbengali", + [0x09E6] = "zerobengali", + [0x09E7] = "onebengali", + [0x09E8] = "twobengali", + [0x09E9] = "threebengali", + [0x09EA] = "fourbengali", + [0x09EB] = "fivebengali", + [0x09EC] = "sixbengali", + [0x09ED] = "sevenbengali", + [0x09EE] = "eightbengali", + [0x09EF] = "ninebengali", + [0x09F0] = "ramiddlediagonalbengali", + [0x09F1] = "ralowerdiagonalbengali", + [0x09F2] = "rupeemarkbengali", + [0x09F3] = "rupeesignbengali", + [0x09F4] = "onenumeratorbengali", + [0x09F5] = "twonumeratorbengali", + [0x09F6] = "threenumeratorbengali", + [0x09F7] = "fournumeratorbengali", + [0x09F8] = "denominatorminusonenumeratorbengali", + [0x09F9] = "sixteencurrencydenominatorbengali", + [0x09FA] = "issharbengali", + [0x0A02] = "bindigurmukhi", + [0x0A05] = "agurmukhi", + [0x0A06] = "aagurmukhi", + [0x0A07] = "igurmukhi", + [0x0A08] = "iigurmukhi", + [0x0A09] = "ugurmukhi", + [0x0A0A] = "uugurmukhi", + [0x0A0F] = "eegurmukhi", + [0x0A10] = "aigurmukhi", + [0x0A13] = "oogurmukhi", + [0x0A14] = "augurmukhi", + [0x0A15] = "kagurmukhi", + [0x0A16] = "khagurmukhi", + [0x0A17] = "gagurmukhi", + [0x0A18] = "ghagurmukhi", + [0x0A19] = "ngagurmukhi", + [0x0A1A] = "cagurmukhi", + [0x0A1B] = "chagurmukhi", + [0x0A1C] = "jagurmukhi", + [0x0A1D] = "jhagurmukhi", + [0x0A1E] = "nyagurmukhi", + [0x0A1F] = "ttagurmukhi", + [0x0A20] = "tthagurmukhi", + [0x0A21] = "ddagurmukhi", + [0x0A22] = "ddhagurmukhi", + [0x0A23] = "nnagurmukhi", + [0x0A24] = "tagurmukhi", + [0x0A25] = "thagurmukhi", + [0x0A26] = "dagurmukhi", + [0x0A27] = "dhagurmukhi", + [0x0A28] = "nagurmukhi", + [0x0A2A] = "pagurmukhi", + [0x0A2B] = "phagurmukhi", + [0x0A2C] = "bagurmukhi", + [0x0A2D] = "bhagurmukhi", + [0x0A2E] = "magurmukhi", + [0x0A2F] = "yagurmukhi", + [0x0A30] = "ragurmukhi", + [0x0A32] = "lagurmukhi", + [0x0A35] = "vagurmukhi", + [0x0A36] = "shagurmukhi", + [0x0A38] = "sagurmukhi", + [0x0A39] = "hagurmukhi", + [0x0A3C] = "nuktagurmukhi", + [0x0A3E] = "aamatragurmukhi", + [0x0A3F] = "imatragurmukhi", + [0x0A40] = "iimatragurmukhi", + [0x0A41] = "umatragurmukhi", + [0x0A42] = "uumatragurmukhi", + [0x0A47] = "eematragurmukhi", + [0x0A48] = "aimatragurmukhi", + [0x0A4B] = "oomatragurmukhi", + [0x0A4C] = "aumatragurmukhi", + [0x0A4D] = "halantgurmukhi", + [0x0A59] = "khhagurmukhi", + [0x0A5A] = "ghhagurmukhi", + [0x0A5B] = "zagurmukhi", + [0x0A5C] = "rragurmukhi", + [0x0A5E] = "fagurmukhi", + [0x0A66] = "zerogurmukhi", + [0x0A67] = "onegurmukhi", + [0x0A68] = "twogurmukhi", + [0x0A69] = "threegurmukhi", + [0x0A6A] = "fourgurmukhi", + [0x0A6B] = "fivegurmukhi", + [0x0A6C] = "sixgurmukhi", + [0x0A6D] = "sevengurmukhi", + [0x0A6E] = "eightgurmukhi", + [0x0A6F] = "ninegurmukhi", + [0x0A70] = "tippigurmukhi", + [0x0A71] = "addakgurmukhi", + [0x0A72] = "irigurmukhi", + [0x0A73] = "uragurmukhi", + [0x0A74] = "ekonkargurmukhi", + [0x0A81] = "candrabindugujarati", + [0x0A82] = "anusvaragujarati", + [0x0A83] = "visargagujarati", + [0x0A85] = "agujarati", + [0x0A86] = "aagujarati", + [0x0A87] = "igujarati", + [0x0A88] = "iigujarati", + [0x0A89] = "ugujarati", + [0x0A8A] = "uugujarati", + [0x0A8B] = "rvocalicgujarati", + [0x0A8D] = "ecandragujarati", + [0x0A8F] = "egujarati", + [0x0A90] = "aigujarati", + [0x0A91] = "ocandragujarati", + [0x0A93] = "ogujarati", + [0x0A94] = "augujarati", + [0x0A95] = "kagujarati", + [0x0A96] = "khagujarati", + [0x0A97] = "gagujarati", + [0x0A98] = "ghagujarati", + [0x0A99] = "ngagujarati", + [0x0A9A] = "cagujarati", + [0x0A9B] = "chagujarati", + [0x0A9C] = "jagujarati", + [0x0A9D] = "jhagujarati", + [0x0A9E] = "nyagujarati", + [0x0A9F] = "ttagujarati", + [0x0AA0] = "tthagujarati", + [0x0AA1] = "ddagujarati", + [0x0AA2] = "ddhagujarati", + [0x0AA3] = "nnagujarati", + [0x0AA4] = "tagujarati", + [0x0AA5] = "thagujarati", + [0x0AA6] = "dagujarati", + [0x0AA7] = "dhagujarati", + [0x0AA8] = "nagujarati", + [0x0AAA] = "pagujarati", + [0x0AAB] = "phagujarati", + [0x0AAC] = "bagujarati", + [0x0AAD] = "bhagujarati", + [0x0AAE] = "magujarati", + [0x0AAF] = "yagujarati", + [0x0AB0] = "ragujarati", + [0x0AB2] = "lagujarati", + [0x0AB3] = "llagujarati", + [0x0AB5] = "vagujarati", + [0x0AB6] = "shagujarati", + [0x0AB7] = "ssagujarati", + [0x0AB8] = "sagujarati", + [0x0AB9] = "hagujarati", + [0x0ABC] = "nuktagujarati", + [0x0ABE] = "aavowelsigngujarati", + [0x0ABF] = "ivowelsigngujarati", + [0x0AC0] = "iivowelsigngujarati", + [0x0AC1] = "uvowelsigngujarati", + [0x0AC2] = "uuvowelsigngujarati", + [0x0AC3] = "rvocalicvowelsigngujarati", + [0x0AC4] = "rrvocalicvowelsigngujarati", + [0x0AC5] = "ecandravowelsigngujarati", + [0x0AC7] = "evowelsigngujarati", + [0x0AC8] = "aivowelsigngujarati", + [0x0AC9] = "ocandravowelsigngujarati", + [0x0ACB] = "ovowelsigngujarati", + [0x0ACC] = "auvowelsigngujarati", + [0x0ACD] = "viramagujarati", + [0x0AD0] = "omgujarati", + [0x0AE0] = "rrvocalicgujarati", + [0x0AE6] = "zerogujarati", + [0x0AE7] = "onegujarati", + [0x0AE8] = "twogujarati", + [0x0AE9] = "threegujarati", + [0x0AEA] = "fourgujarati", + [0x0AEB] = "fivegujarati", + [0x0AEC] = "sixgujarati", + [0x0AED] = "sevengujarati", + [0x0AEE] = "eightgujarati", + [0x0AEF] = "ninegujarati", + [0x0E01] = "kokaithai", + [0x0E02] = "khokhaithai", + [0x0E03] = "khokhuatthai", + [0x0E04] = "khokhwaithai", + [0x0E05] = "khokhonthai", + [0x0E06] = "khorakhangthai", + [0x0E07] = "ngonguthai", + [0x0E08] = "chochanthai", + [0x0E09] = "chochingthai", + [0x0E0A] = "chochangthai", + [0x0E0B] = "sosothai", + [0x0E0C] = "chochoethai", + [0x0E0D] = "yoyingthai", + [0x0E0E] = "dochadathai", + [0x0E0F] = "topatakthai", + [0x0E10] = "thothanthai", + [0x0E11] = "thonangmonthothai", + [0x0E12] = "thophuthaothai", + [0x0E13] = "nonenthai", + [0x0E14] = "dodekthai", + [0x0E15] = "totaothai", + [0x0E16] = "thothungthai", + [0x0E17] = "thothahanthai", + [0x0E18] = "thothongthai", + [0x0E19] = "nonuthai", + [0x0E1A] = "bobaimaithai", + [0x0E1B] = "poplathai", + [0x0E1C] = "phophungthai", + [0x0E1D] = "fofathai", + [0x0E1E] = "phophanthai", + [0x0E1F] = "fofanthai", + [0x0E20] = "phosamphaothai", + [0x0E21] = "momathai", + [0x0E22] = "yoyakthai", + [0x0E23] = "roruathai", + [0x0E24] = "ruthai", + [0x0E25] = "lolingthai", + [0x0E26] = "luthai", + [0x0E27] = "wowaenthai", + [0x0E28] = "sosalathai", + [0x0E29] = "sorusithai", + [0x0E2A] = "sosuathai", + [0x0E2B] = "hohipthai", + [0x0E2C] = "lochulathai", + [0x0E2D] = "oangthai", + [0x0E2E] = "honokhukthai", + [0x0E2F] = "paiyannoithai", + [0x0E30] = "saraathai", + [0x0E31] = "maihanakatthai", + [0x0E32] = "saraaathai", + [0x0E33] = "saraamthai", + [0x0E34] = "saraithai", + [0x0E35] = "saraiithai", + [0x0E36] = "sarauethai", + [0x0E37] = "saraueethai", + [0x0E38] = "sarauthai", + [0x0E39] = "sarauuthai", + [0x0E3A] = "phinthuthai", + [0x0E3F] = "bahtthai", + [0x0E40] = "saraethai", + [0x0E41] = "saraaethai", + [0x0E42] = "saraothai", + [0x0E43] = "saraaimaimuanthai", + [0x0E44] = "saraaimaimalaithai", + [0x0E45] = "lakkhangyaothai", + [0x0E46] = "maiyamokthai", + [0x0E47] = "maitaikhuthai", + [0x0E48] = "maiekthai", + [0x0E49] = "maithothai", + [0x0E4A] = "maitrithai", + [0x0E4B] = "maichattawathai", + [0x0E4C] = "thanthakhatthai", + [0x0E4D] = "nikhahitthai", + [0x0E4E] = "yamakkanthai", + [0x0E4F] = "fongmanthai", + [0x0E50] = "zerothai", + [0x0E51] = "onethai", + [0x0E52] = "twothai", + [0x0E53] = "threethai", + [0x0E54] = "fourthai", + [0x0E55] = "fivethai", + [0x0E56] = "sixthai", + [0x0E57] = "seventhai", + [0x0E58] = "eightthai", + [0x0E59] = "ninethai", + [0x0E5A] = "angkhankhuthai", + [0x0E5B] = "khomutthai", + [0x1E00] = "Aringbelow", + [0x1E01] = "aringbelow", + [0x1E02] = "Bdotaccent", + [0x1E03] = "bdotaccent", + [0x1E04] = "Bdotbelow", + [0x1E05] = "bdotbelow", + [0x1E06] = "Blinebelow", + [0x1E07] = "blinebelow", + [0x1E08] = "Ccedillaacute", + [0x1E09] = "ccedillaacute", + [0x1E0A] = "Ddotaccent", + [0x1E0B] = "ddotaccent", + [0x1E0C] = "Ddotbelow", + [0x1E0D] = "ddotbelow", + [0x1E0E] = "Dlinebelow", + [0x1E0F] = "dlinebelow", + [0x1E10] = "Dcedilla", + [0x1E11] = "dcedilla", + [0x1E12] = "Dcircumflexbelow", + [0x1E13] = "dcircumflexbelow", + [0x1E14] = "Emacrongrave", + [0x1E15] = "emacrongrave", + [0x1E16] = "Emacronacute", + [0x1E17] = "emacronacute", + [0x1E18] = "Ecircumflexbelow", + [0x1E19] = "ecircumflexbelow", + [0x1E1A] = "Etildebelow", + [0x1E1B] = "etildebelow", + [0x1E1C] = "Ecedillabreve", + [0x1E1D] = "ecedillabreve", + [0x1E1E] = "Fdotaccent", + [0x1E1F] = "fdotaccent", + [0x1E20] = "Gmacron", + [0x1E21] = "gmacron", + [0x1E22] = "Hdotaccent", + [0x1E23] = "hdotaccent", + [0x1E24] = "Hdotbelow", + [0x1E25] = "hdotbelow", + [0x1E26] = "Hdieresis", + [0x1E27] = "hdieresis", + [0x1E28] = "Hcedilla", + [0x1E29] = "hcedilla", + [0x1E2A] = "Hbrevebelow", + [0x1E2B] = "hbrevebelow", + [0x1E2C] = "Itildebelow", + [0x1E2D] = "itildebelow", + [0x1E2E] = "Idieresisacute", + [0x1E2F] = "idieresisacute", + [0x1E30] = "Kacute", + [0x1E31] = "kacute", + [0x1E32] = "Kdotbelow", + [0x1E33] = "kdotbelow", + [0x1E34] = "Klinebelow", + [0x1E35] = "klinebelow", + [0x1E36] = "Ldotbelow", + [0x1E37] = "ldotbelow", + [0x1E38] = "Ldotbelowmacron", + [0x1E39] = "ldotbelowmacron", + [0x1E3A] = "Llinebelow", + [0x1E3B] = "llinebelow", + [0x1E3C] = "Lcircumflexbelow", + [0x1E3D] = "lcircumflexbelow", + [0x1E3E] = "Macute", + [0x1E3F] = "macute", + [0x1E40] = "Mdotaccent", + [0x1E41] = "mdotaccent", + [0x1E42] = "Mdotbelow", + [0x1E43] = "mdotbelow", + [0x1E44] = "Ndotaccent", + [0x1E45] = "ndotaccent", + [0x1E46] = "Ndotbelow", + [0x1E47] = "ndotbelow", + [0x1E48] = "Nlinebelow", + [0x1E49] = "nlinebelow", + [0x1E4A] = "Ncircumflexbelow", + [0x1E4B] = "ncircumflexbelow", + [0x1E4C] = "Otildeacute", + [0x1E4D] = "otildeacute", + [0x1E4E] = "Otildedieresis", + [0x1E4F] = "otildedieresis", + [0x1E50] = "Omacrongrave", + [0x1E51] = "omacrongrave", + [0x1E52] = "Omacronacute", + [0x1E53] = "omacronacute", + [0x1E54] = "Pacute", + [0x1E55] = "pacute", + [0x1E56] = "Pdotaccent", + [0x1E57] = "pdotaccent", + [0x1E58] = "Rdotaccent", + [0x1E59] = "rdotaccent", + [0x1E5A] = "Rdotbelow", + [0x1E5B] = "rdotbelow", + [0x1E5C] = "Rdotbelowmacron", + [0x1E5D] = "rdotbelowmacron", + [0x1E5E] = "Rlinebelow", + [0x1E5F] = "rlinebelow", + [0x1E60] = "Sdotaccent", + [0x1E61] = "sdotaccent", + [0x1E62] = "Sdotbelow", + [0x1E63] = "sdotbelow", + [0x1E64] = "Sacutedotaccent", + [0x1E65] = "sacutedotaccent", + [0x1E66] = "Scarondotaccent", + [0x1E67] = "scarondotaccent", + [0x1E68] = "Sdotbelowdotaccent", + [0x1E69] = "sdotbelowdotaccent", + [0x1E6A] = "Tdotaccent", + [0x1E6B] = "tdotaccent", + [0x1E6C] = "Tdotbelow", + [0x1E6D] = "tdotbelow", + [0x1E6E] = "Tlinebelow", + [0x1E6F] = "tlinebelow", + [0x1E70] = "Tcircumflexbelow", + [0x1E71] = "tcircumflexbelow", + [0x1E72] = "Udieresisbelow", + [0x1E73] = "udieresisbelow", + [0x1E74] = "Utildebelow", + [0x1E75] = "utildebelow", + [0x1E76] = "Ucircumflexbelow", + [0x1E77] = "ucircumflexbelow", + [0x1E78] = "Utildeacute", + [0x1E79] = "utildeacute", + [0x1E7A] = "Umacrondieresis", + [0x1E7B] = "umacrondieresis", + [0x1E7C] = "Vtilde", + [0x1E7D] = "vtilde", + [0x1E7E] = "Vdotbelow", + [0x1E7F] = "vdotbelow", + [0x1E80] = "Wgrave", + [0x1E81] = "wgrave", + [0x1E82] = "Wacute", + [0x1E83] = "wacute", + [0x1E84] = "Wdieresis", + [0x1E85] = "wdieresis", + [0x1E86] = "Wdotaccent", + [0x1E87] = "wdotaccent", + [0x1E88] = "Wdotbelow", + [0x1E89] = "wdotbelow", + [0x1E8A] = "Xdotaccent", + [0x1E8B] = "xdotaccent", + [0x1E8C] = "Xdieresis", + [0x1E8D] = "xdieresis", + [0x1E8E] = "Ydotaccent", + [0x1E8F] = "ydotaccent", + [0x1E90] = "Zcircumflex", + [0x1E91] = "zcircumflex", + [0x1E92] = "Zdotbelow", + [0x1E93] = "zdotbelow", + [0x1E94] = "Zlinebelow", + [0x1E95] = "zlinebelow", + [0x1E96] = "hlinebelow", + [0x1E97] = "tdieresis", + [0x1E98] = "wring", + [0x1E99] = "yring", + [0x1E9A] = "arighthalfring", + [0x1E9B] = "slongdotaccent", + [0x1EA0] = "Adotbelow", + [0x1EA1] = "adotbelow", + [0x1EA2] = "Ahookabove", + [0x1EA3] = "ahookabove", + [0x1EA4] = "Acircumflexacute", + [0x1EA5] = "acircumflexacute", + [0x1EA6] = "Acircumflexgrave", + [0x1EA7] = "acircumflexgrave", + [0x1EA8] = "Acircumflexhookabove", + [0x1EA9] = "acircumflexhookabove", + [0x1EAA] = "Acircumflextilde", + [0x1EAB] = "acircumflextilde", + [0x1EAC] = "Acircumflexdotbelow", + [0x1EAD] = "acircumflexdotbelow", + [0x1EAE] = "Abreveacute", + [0x1EAF] = "abreveacute", + [0x1EB0] = "Abrevegrave", + [0x1EB1] = "abrevegrave", + [0x1EB2] = "Abrevehookabove", + [0x1EB3] = "abrevehookabove", + [0x1EB4] = "Abrevetilde", + [0x1EB5] = "abrevetilde", + [0x1EB6] = "Abrevedotbelow", + [0x1EB7] = "abrevedotbelow", + [0x1EB8] = "Edotbelow", + [0x1EB9] = "edotbelow", + [0x1EBA] = "Ehookabove", + [0x1EBB] = "ehookabove", + [0x1EBC] = "Etilde", + [0x1EBD] = "etilde", + [0x1EBE] = "Ecircumflexacute", + [0x1EBF] = "ecircumflexacute", + [0x1EC0] = "Ecircumflexgrave", + [0x1EC1] = "ecircumflexgrave", + [0x1EC2] = "Ecircumflexhookabove", + [0x1EC3] = "ecircumflexhookabove", + [0x1EC4] = "Ecircumflextilde", + [0x1EC5] = "ecircumflextilde", + [0x1EC6] = "Ecircumflexdotbelow", + [0x1EC7] = "ecircumflexdotbelow", + [0x1EC8] = "Ihookabove", + [0x1EC9] = "ihookabove", + [0x1ECA] = "Idotbelow", + [0x1ECB] = "idotbelow", + [0x1ECC] = "Odotbelow", + [0x1ECD] = "odotbelow", + [0x1ECE] = "Ohookabove", + [0x1ECF] = "ohookabove", + [0x1ED0] = "Ocircumflexacute", + [0x1ED1] = "ocircumflexacute", + [0x1ED2] = "Ocircumflexgrave", + [0x1ED3] = "ocircumflexgrave", + [0x1ED4] = "Ocircumflexhookabove", + [0x1ED5] = "ocircumflexhookabove", + [0x1ED6] = "Ocircumflextilde", + [0x1ED7] = "ocircumflextilde", + [0x1ED8] = "Ocircumflexdotbelow", + [0x1ED9] = "ocircumflexdotbelow", + [0x1EDA] = "Ohornacute", + [0x1EDB] = "ohornacute", + [0x1EDC] = "Ohorngrave", + [0x1EDD] = "ohorngrave", + [0x1EDE] = "Ohornhookabove", + [0x1EDF] = "ohornhookabove", + [0x1EE0] = "Ohorntilde", + [0x1EE1] = "ohorntilde", + [0x1EE2] = "Ohorndotbelow", + [0x1EE3] = "ohorndotbelow", + [0x1EE4] = "Udotbelow", + [0x1EE5] = "udotbelow", + [0x1EE6] = "Uhookabove", + [0x1EE7] = "uhookabove", + [0x1EE8] = "Uhornacute", + [0x1EE9] = "uhornacute", + [0x1EEA] = "Uhorngrave", + [0x1EEB] = "uhorngrave", + [0x1EEC] = "Uhornhookabove", + [0x1EED] = "uhornhookabove", + [0x1EEE] = "Uhorntilde", + [0x1EEF] = "uhorntilde", + [0x1EF0] = "Uhorndotbelow", + [0x1EF1] = "uhorndotbelow", + [0x1EF2] = "Ygrave", + [0x1EF3] = "ygrave", + [0x1EF4] = "Ydotbelow", + [0x1EF5] = "ydotbelow", + [0x1EF6] = "Yhookabove", + [0x1EF7] = "yhookabove", + [0x1EF8] = "Ytilde", + [0x1EF9] = "ytilde", + [0x2002] = "enspace", + [0x200B] = "zerowidthspace", + [0x200C] = "zerowidthnonjoiner", + [0x200D] = "afii301", + [0x200E] = "afii299", + [0x200F] = "afii300", + [0x2010] = "hyphentwo", + [0x2012] = "figuredash", + [0x2013] = "endash", + [0x2014] = "emdash", + [0x2015] = "horizontalbar", + [0x2016] = "dblverticalbar", + [0x2017] = "underscoredbl", + [0x2018] = "quoteleft", + [0x2019] = "quoteright", + [0x201A] = "quotesinglbase", + [0x201B] = "quotereversed", + [0x201C] = "quotedblleft", + [0x201D] = "quotedblright", + [0x201E] = "quotedblbase", + [0x2020] = "dagger", + [0x2021] = "daggerdbl", + [0x2022] = "bullet", + [0x2024] = "onedotenleader", + [0x2025] = "twodotleader", + [0x2026] = "ellipsis", + [0x202C] = "afii61573", + [0x202D] = "afii61574", + [0x202E] = "afii61575", + [0x2030] = "perthousand", + [0x2032] = "minute", + [0x2033] = "second", + [0x2035] = "primereversed", + [0x2039] = "guilsinglleft", + [0x203A] = "guilsinglright", + [0x203B] = "referencemark", + [0x203C] = "exclamdbl", + [0x203E] = "overline", + [0x2042] = "asterism", + [0x2044] = "fraction", + [0x2070] = "zerosuperior", + [0x2074] = "foursuperior", + [0x2075] = "fivesuperior", + [0x2076] = "sixsuperior", + [0x2077] = "sevensuperior", + [0x2078] = "eightsuperior", + [0x2079] = "ninesuperior", + [0x207A] = "plussuperior", + [0x207C] = "equalsuperior", + [0x207D] = "parenleftsuperior", + [0x207E] = "parenrightsuperior", + [0x207F] = "nsuperior", + [0x2080] = "zeroinferior", + [0x2081] = "oneinferior", + [0x2082] = "twoinferior", + [0x2083] = "threeinferior", + [0x2084] = "fourinferior", + [0x2085] = "fiveinferior", + [0x2086] = "sixinferior", + [0x2087] = "seveninferior", + [0x2088] = "eightinferior", + [0x2089] = "nineinferior", + [0x208D] = "parenleftinferior", + [0x208E] = "parenrightinferior", + [0x20A1] = "colonsign", + [0x20A2] = "cruzeiro", + [0x20A3] = "franc", + [0x20A4] = "lira", + [0x20A7] = "peseta", + [0x20A9] = "won", + [0x20AA] = "sheqelhebrew", + [0x20AB] = "dong", + [0x20AC] = "euro", + [0x2103] = "centigrade", + [0x2105] = "careof", + [0x2109] = "fahrenheit", + [0x2111] = "Ifraktur", + [0x2113] = "lsquare", + [0x2116] = "numero", + [0x2118] = "weierstrass", + [0x211C] = "Rfraktur", + [0x211E] = "prescription", + [0x2121] = "telephone", + [0x2122] = "trademark", + [0x2126] = "Omega", + [0x212B] = "angstrom", + [0x212E] = "estimated", + [0x2135] = "aleph", + [0x2153] = "onethird", + [0x2154] = "twothirds", + [0x215B] = "oneeighth", + [0x215C] = "threeeighths", + [0x215D] = "fiveeighths", + [0x215E] = "seveneighths", + [0x2160] = "Oneroman", + [0x2161] = "Tworoman", + [0x2162] = "Threeroman", + [0x2163] = "Fourroman", + [0x2164] = "Fiveroman", + [0x2165] = "Sixroman", + [0x2166] = "Sevenroman", + [0x2167] = "Eightroman", + [0x2168] = "Nineroman", + [0x2169] = "Tenroman", + [0x216A] = "Elevenroman", + [0x216B] = "Twelveroman", + [0x2170] = "oneroman", + [0x2171] = "tworoman", + [0x2172] = "threeroman", + [0x2173] = "fourroman", + [0x2174] = "fiveroman", + [0x2175] = "sixroman", + [0x2176] = "sevenroman", + [0x2177] = "eightroman", + [0x2178] = "nineroman", + [0x2179] = "tenroman", + [0x217A] = "elevenroman", + [0x217B] = "twelveroman", + [0x2190] = "arrowleft", + [0x2191] = "arrowup", + [0x2192] = "arrowright", + [0x2193] = "arrowdown", + [0x2194] = "arrowboth", + [0x2195] = "arrowupdn", + [0x2196] = "arrowupleft", + [0x2197] = "arrowupright", + [0x2198] = "arrowdownright", + [0x2199] = "arrowdownleft", + [0x21A8] = "arrowupdownbase", + [0x21B5] = "carriagereturn", + [0x21BC] = "harpoonleftbarbup", + [0x21C0] = "harpoonrightbarbup", + [0x21C4] = "arrowrightoverleft", + [0x21C5] = "arrowupleftofdown", + [0x21C6] = "arrowleftoverright", + [0x21CD] = "arrowleftdblstroke", + [0x21CF] = "arrowrightdblstroke", + [0x21D0] = "arrowleftdbl", + [0x21D1] = "arrowdblup", + [0x21D2] = "dblarrowright", + [0x21D3] = "arrowdbldown", + [0x21D4] = "dblarrowleft", + [0x21DE] = "pageup", + [0x21DF] = "pagedown", + [0x21E0] = "arrowdashleft", + [0x21E1] = "arrowdashup", + [0x21E2] = "arrowdashright", + [0x21E3] = "arrowdashdown", + [0x21E4] = "arrowtableft", + [0x21E5] = "arrowtabright", + [0x21E6] = "arrowleftwhite", + [0x21E7] = "arrowupwhite", + [0x21E8] = "arrowrightwhite", + [0x21E9] = "arrowdownwhite", + [0x21EA] = "capslock", + [0x2200] = "universal", + [0x2202] = "partialdiff", + [0x2203] = "thereexists", + [0x2205] = "emptyset", + [0x2206] = "increment", + [0x2207] = "nabla", + [0x2208] = "element", + [0x2209] = "notelementof", + [0x220B] = "suchthat", + [0x220C] = "notcontains", + [0x220F] = "product", + [0x2211] = "summation", + [0x2212] = "minus", + [0x2213] = "minusplus", + [0x2215] = "divisionslash", + [0x2217] = "asteriskmath", + [0x2219] = "bulletoperator", + [0x221A] = "radical", + [0x221D] = "proportional", + [0x221E] = "infinity", + [0x221F] = "rightangle", + [0x2220] = "angle", + [0x2223] = "divides", + [0x2225] = "parallel", + [0x2226] = "notparallel", + [0x2227] = "logicaland", + [0x2228] = "logicalor", + [0x2229] = "intersection", + [0x222A] = "union", + [0x222B] = "integral", + [0x222C] = "dblintegral", + [0x222E] = "contourintegral", + [0x2234] = "therefore", + [0x2235] = "because", + [0x2236] = "ratio", + [0x2237] = "proportion", + [0x223C] = "tildeoperator", + [0x223D] = "reversedtilde", + [0x2243] = "asymptoticallyequal", + [0x2245] = "congruent", + [0x2248] = "approxequal", + [0x224C] = "allequal", + [0x2250] = "approaches", + [0x2251] = "geometricallyequal", + [0x2252] = "approxequalorimage", + [0x2253] = "imageorapproximatelyequal", + [0x2260] = "notequal", + [0x2261] = "equivalence", + [0x2262] = "notidentical", + [0x2264] = "lessequal", + [0x2265] = "greaterequal", + [0x2266] = "lessoverequal", + [0x2267] = "greateroverequal", + [0x226A] = "muchless", + [0x226B] = "muchgreater", + [0x226E] = "notless", + [0x226F] = "notgreater", + [0x2270] = "notlessnorequal", + [0x2271] = "notgreaternorequal", + [0x2272] = "lessorequivalent", + [0x2273] = "greaterorequivalent", + [0x2276] = "lessorgreater", + [0x2277] = "greaterorless", + [0x2279] = "notgreaternorless", + [0x227A] = "precedes", + [0x227B] = "succeeds", + [0x2280] = "notprecedes", + [0x2281] = "notsucceeds", + [0x2282] = "subset", + [0x2283] = "superset", + [0x2284] = "notsubset", + [0x2285] = "notsuperset", + [0x2286] = "subsetorequal", + [0x2287] = "supersetorequal", + [0x228A] = "subsetnotequal", + [0x228B] = "supersetnotequal", + [0x2295] = "pluscircle", + [0x2296] = "minuscircle", + [0x2297] = "timescircle", + [0x2299] = "circleot", + [0x22A3] = "tackleft", + [0x22A4] = "tackdown", + [0x22A5] = "perpendicular", + [0x22BF] = "righttriangle", + [0x22C5] = "dotmath", + [0x22CE] = "curlyor", + [0x22CF] = "curlyand", + [0x22DA] = "lessequalorgreater", + [0x22DB] = "greaterequalorless", + [0x22EE] = "ellipsisvertical", + [0x2302] = "house", + [0x2303] = "control", + [0x2305] = "projective", + [0x2310] = "revlogicalnot", + [0x2312] = "arc", + [0x2318] = "propellor", + [0x2320] = "integraltp", + [0x2321] = "integralbt", + [0x2325] = "option", + [0x2326] = "deleteright", + [0x2327] = "clear", + [0x2329] = "angleleft", + [0x232A] = "angleright", + [0x232B] = "deleteleft", + [0x2423] = "blank", + [0x2460] = "onecircle", + [0x2461] = "twocircle", + [0x2462] = "threecircle", + [0x2463] = "fourcircle", + [0x2464] = "fivecircle", + [0x2465] = "sixcircle", + [0x2466] = "sevencircle", + [0x2467] = "eightcircle", + [0x2468] = "ninecircle", + [0x2469] = "tencircle", + [0x246A] = "elevencircle", + [0x246B] = "twelvecircle", + [0x246C] = "thirteencircle", + [0x246D] = "fourteencircle", + [0x246E] = "fifteencircle", + [0x246F] = "sixteencircle", + [0x2470] = "seventeencircle", + [0x2471] = "eighteencircle", + [0x2472] = "nineteencircle", + [0x2473] = "twentycircle", + [0x2474] = "oneparen", + [0x2475] = "twoparen", + [0x2476] = "threeparen", + [0x2477] = "fourparen", + [0x2478] = "fiveparen", + [0x2479] = "sixparen", + [0x247A] = "sevenparen", + [0x247B] = "eightparen", + [0x247C] = "nineparen", + [0x247D] = "tenparen", + [0x247E] = "elevenparen", + [0x247F] = "twelveparen", + [0x2480] = "thirteenparen", + [0x2481] = "fourteenparen", + [0x2482] = "fifteenparen", + [0x2483] = "sixteenparen", + [0x2484] = "seventeenparen", + [0x2485] = "eighteenparen", + [0x2486] = "nineteenparen", + [0x2487] = "twentyparen", + [0x2488] = "oneperiod", + [0x2489] = "twoperiod", + [0x248A] = "threeperiod", + [0x248B] = "fourperiod", + [0x248C] = "fiveperiod", + [0x248D] = "sixperiod", + [0x248E] = "sevenperiod", + [0x248F] = "eightperiod", + [0x2490] = "nineperiod", + [0x2491] = "tenperiod", + [0x2492] = "elevenperiod", + [0x2493] = "twelveperiod", + [0x2494] = "thirteenperiod", + [0x2495] = "fourteenperiod", + [0x2496] = "fifteenperiod", + [0x2497] = "sixteenperiod", + [0x2498] = "seventeenperiod", + [0x2499] = "eighteenperiod", + [0x249A] = "nineteenperiod", + [0x249B] = "twentyperiod", + [0x249C] = "aparen", + [0x249D] = "bparen", + [0x249E] = "cparen", + [0x249F] = "dparen", + [0x24A0] = "eparen", + [0x24A1] = "fparen", + [0x24A2] = "gparen", + [0x24A3] = "hparen", + [0x24A4] = "iparen", + [0x24A5] = "jparen", + [0x24A6] = "kparen", + [0x24A7] = "lparen", + [0x24A8] = "mparen", + [0x24A9] = "nparen", + [0x24AA] = "oparen", + [0x24AB] = "pparen", + [0x24AC] = "qparen", + [0x24AD] = "rparen", + [0x24AE] = "sparen", + [0x24AF] = "tparen", + [0x24B0] = "uparen", + [0x24B1] = "vparen", + [0x24B2] = "wparen", + [0x24B3] = "xparen", + [0x24B4] = "yparen", + [0x24B5] = "zparen", + [0x24B6] = "Acircle", + [0x24B7] = "Bcircle", + [0x24B8] = "Ccircle", + [0x24B9] = "Dcircle", + [0x24BA] = "Ecircle", + [0x24BB] = "Fcircle", + [0x24BC] = "Gcircle", + [0x24BD] = "Hcircle", + [0x24BE] = "Icircle", + [0x24BF] = "Jcircle", + [0x24C0] = "Kcircle", + [0x24C1] = "Lcircle", + [0x24C2] = "Mcircle", + [0x24C3] = "Ncircle", + [0x24C4] = "Ocircle", + [0x24C5] = "Pcircle", + [0x24C6] = "Qcircle", + [0x24C7] = "Rcircle", + [0x24C8] = "Scircle", + [0x24C9] = "Tcircle", + [0x24CA] = "Ucircle", + [0x24CB] = "Vcircle", + [0x24CC] = "Wcircle", + [0x24CD] = "Xcircle", + [0x24CE] = "Ycircle", + [0x24CF] = "Zcircle", + [0x24D0] = "acircle", + [0x24D1] = "bcircle", + [0x24D2] = "ccircle", + [0x24D3] = "dcircle", + [0x24D4] = "ecircle", + [0x24D5] = "fcircle", + [0x24D6] = "gcircle", + [0x24D7] = "hcircle", + [0x24D8] = "icircle", + [0x24D9] = "jcircle", + [0x24DA] = "kcircle", + [0x24DB] = "lcircle", + [0x24DC] = "mcircle", + [0x24DD] = "ncircle", + [0x24DE] = "ocircle", + [0x24DF] = "pcircle", + [0x24E0] = "qcircle", + [0x24E1] = "rcircle", + [0x24E2] = "scircle", + [0x24E3] = "tcircle", + [0x24E4] = "ucircle", + [0x24E5] = "vcircle", + [0x24E6] = "wcircle", + [0x24E7] = "xcircle", + [0x24E8] = "ycircle", + [0x24E9] = "zcircle", + [0x2500] = "SF100000", + [0x2502] = "SF110000", + [0x250C] = "SF010000", + [0x2510] = "SF030000", + [0x2514] = "SF020000", + [0x2518] = "SF040000", + [0x251C] = "SF080000", + [0x2524] = "SF090000", + [0x252C] = "SF060000", + [0x2534] = "SF070000", + [0x253C] = "SF050000", + [0x2550] = "SF430000", + [0x2551] = "SF240000", + [0x2552] = "SF510000", + [0x2553] = "SF520000", + [0x2554] = "SF390000", + [0x2555] = "SF220000", + [0x2556] = "SF210000", + [0x2557] = "SF250000", + [0x2558] = "SF500000", + [0x2559] = "SF490000", + [0x255A] = "SF380000", + [0x255B] = "SF280000", + [0x255C] = "SF270000", + [0x255D] = "SF260000", + [0x255E] = "SF360000", + [0x255F] = "SF370000", + [0x2560] = "SF420000", + [0x2561] = "SF190000", + [0x2562] = "SF200000", + [0x2563] = "SF230000", + [0x2564] = "SF470000", + [0x2565] = "SF480000", + [0x2566] = "SF410000", + [0x2567] = "SF450000", + [0x2568] = "SF460000", + [0x2569] = "SF400000", + [0x256A] = "SF540000", + [0x256B] = "SF530000", + [0x256C] = "SF440000", + [0x2580] = "upblock", + [0x2584] = "dnblock", + [0x2588] = "block", + [0x258C] = "lfblock", + [0x2590] = "rtblock", + [0x2591] = "shadelight", + [0x2592] = "shademedium", + [0x2593] = "shadedark", + [0x25A0] = "filledbox", + [0x25A1] = "whitesquare", + [0x25A3] = "squarewhitewithsmallblack", + [0x25A4] = "squarehorizontalfill", + [0x25A5] = "squareverticalfill", + [0x25A6] = "squareorthogonalcrosshatchfill", + [0x25A7] = "squareupperlefttolowerrightfill", + [0x25A8] = "squareupperrighttolowerleftfill", + [0x25A9] = "squarediagonalcrosshatchfill", + [0x25AA] = "blacksmallsquare", + [0x25AB] = "whitesmallsquare", + [0x25AC] = "filledrect", + [0x25B2] = "triagup", + [0x25B3] = "whiteuppointingtriangle", + [0x25B4] = "blackuppointingsmalltriangle", + [0x25B5] = "whiteuppointingsmalltriangle", + [0x25B6] = "blackrightpointingtriangle", + [0x25B7] = "whiterightpointingtriangle", + [0x25B9] = "whiterightpointingsmalltriangle", + [0x25BA] = "triagrt", + [0x25BC] = "triagdn", + [0x25BD] = "whitedownpointingtriangle", + [0x25BF] = "whitedownpointingsmalltriangle", + [0x25C0] = "blackleftpointingtriangle", + [0x25C1] = "whiteleftpointingtriangle", + [0x25C3] = "whiteleftpointingsmalltriangle", + [0x25C4] = "triaglf", + [0x25C6] = "blackdiamond", + [0x25C7] = "whitediamond", + [0x25C8] = "whitediamondcontainingblacksmalldiamond", + [0x25C9] = "fisheye", + [0x25CA] = "lozenge", + [0x25CB] = "whitecircle", + [0x25CC] = "dottedcircle", + [0x25CE] = "bullseye", + [0x25CF] = "blackcircle", + [0x25D0] = "circlewithlefthalfblack", + [0x25D1] = "circlewithrighthalfblack", + [0x25D8] = "invbullet", + [0x25D9] = "whitecircleinverse", + [0x25E2] = "blacklowerrighttriangle", + [0x25E3] = "blacklowerlefttriangle", + [0x25E4] = "blackupperlefttriangle", + [0x25E5] = "blackupperrighttriangle", + [0x25E6] = "whitebullet", + [0x25EF] = "largecircle", + [0x2605] = "blackstar", + [0x2606] = "whitestar", + [0x260E] = "telephoneblack", + [0x260F] = "whitetelephone", + [0x261C] = "pointingindexleftwhite", + [0x261D] = "pointingindexupwhite", + [0x261E] = "pointingindexrightwhite", + [0x261F] = "pointingindexdownwhite", + [0x262F] = "yinyang", + [0x263A] = "whitesmilingface", + [0x263B] = "invsmileface", + [0x263C] = "sun", + [0x2640] = "venus", + [0x2641] = "earth", + [0x2642] = "mars", + [0x2660] = "spadesuitblack", + [0x2661] = "heartsuitwhite", + [0x2662] = "diamondsuitwhite", + [0x2663] = "clubsuitblack", + [0x2664] = "spadesuitwhite", + [0x2665] = "heartsuitblack", + [0x2666] = "diamond", + [0x2667] = "clubsuitwhite", + [0x2668] = "hotsprings", + [0x2669] = "quarternote", + [0x266A] = "musicalnote", + [0x266B] = "musicalnotedbl", + [0x266C] = "beamedsixteenthnotes", + [0x266D] = "musicflatsign", + [0x266F] = "musicsharpsign", + [0x2713] = "checkmark", + [0x278A] = "onecircleinversesansserif", + [0x278B] = "twocircleinversesansserif", + [0x278C] = "threecircleinversesansserif", + [0x278D] = "fourcircleinversesansserif", + [0x278E] = "fivecircleinversesansserif", + [0x278F] = "sixcircleinversesansserif", + [0x2790] = "sevencircleinversesansserif", + [0x2791] = "eightcircleinversesansserif", + [0x2792] = "ninecircleinversesansserif", + [0x279E] = "arrowrightheavy", + [0x3000] = "ideographicspace", + [0x3001] = "ideographiccomma", + [0x3002] = "ideographicperiod", + [0x3003] = "dittomark", + [0x3004] = "jis", + [0x3005] = "ideographiciterationmark", + [0x3006] = "ideographicclose", + [0x3007] = "ideographiczero", + [0x3008] = "anglebracketleft", + [0x3009] = "anglebracketright", + [0x300A] = "dblanglebracketleft", + [0x300B] = "dblanglebracketright", + [0x300C] = "cornerbracketleft", + [0x300D] = "cornerbracketright", + [0x300E] = "whitecornerbracketleft", + [0x300F] = "whitecornerbracketright", + [0x3010] = "blacklenticularbracketleft", + [0x3011] = "blacklenticularbracketright", + [0x3012] = "postalmark", + [0x3013] = "getamark", + [0x3014] = "tortoiseshellbracketleft", + [0x3015] = "tortoiseshellbracketright", + [0x3016] = "whitelenticularbracketleft", + [0x3017] = "whitelenticularbracketright", + [0x3018] = "whitetortoiseshellbracketleft", + [0x3019] = "whitetortoiseshellbracketright", + [0x301C] = "wavedash", + [0x301D] = "quotedblprimereversed", + [0x301E] = "quotedblprime", + [0x3020] = "postalmarkface", + [0x3021] = "onehangzhou", + [0x3022] = "twohangzhou", + [0x3023] = "threehangzhou", + [0x3024] = "fourhangzhou", + [0x3025] = "fivehangzhou", + [0x3026] = "sixhangzhou", + [0x3027] = "sevenhangzhou", + [0x3028] = "eighthangzhou", + [0x3029] = "ninehangzhou", + [0x3036] = "circlepostalmark", + [0x3041] = "asmallhiragana", + [0x3042] = "ahiragana", + [0x3043] = "ismallhiragana", + [0x3044] = "ihiragana", + [0x3045] = "usmallhiragana", + [0x3046] = "uhiragana", + [0x3047] = "esmallhiragana", + [0x3048] = "ehiragana", + [0x3049] = "osmallhiragana", + [0x304A] = "ohiragana", + [0x304B] = "kahiragana", + [0x304C] = "gahiragana", + [0x304D] = "kihiragana", + [0x304E] = "gihiragana", + [0x304F] = "kuhiragana", + [0x3050] = "guhiragana", + [0x3051] = "kehiragana", + [0x3052] = "gehiragana", + [0x3053] = "kohiragana", + [0x3054] = "gohiragana", + [0x3055] = "sahiragana", + [0x3056] = "zahiragana", + [0x3057] = "sihiragana", + [0x3058] = "zihiragana", + [0x3059] = "suhiragana", + [0x305A] = "zuhiragana", + [0x305B] = "sehiragana", + [0x305C] = "zehiragana", + [0x305D] = "sohiragana", + [0x305E] = "zohiragana", + [0x305F] = "tahiragana", + [0x3060] = "dahiragana", + [0x3061] = "tihiragana", + [0x3062] = "dihiragana", + [0x3063] = "tusmallhiragana", + [0x3064] = "tuhiragana", + [0x3065] = "duhiragana", + [0x3066] = "tehiragana", + [0x3067] = "dehiragana", + [0x3068] = "tohiragana", + [0x3069] = "dohiragana", + [0x306A] = "nahiragana", + [0x306B] = "nihiragana", + [0x306C] = "nuhiragana", + [0x306D] = "nehiragana", + [0x306E] = "nohiragana", + [0x306F] = "hahiragana", + [0x3070] = "bahiragana", + [0x3071] = "pahiragana", + [0x3072] = "hihiragana", + [0x3073] = "bihiragana", + [0x3074] = "pihiragana", + [0x3075] = "huhiragana", + [0x3076] = "buhiragana", + [0x3077] = "puhiragana", + [0x3078] = "hehiragana", + [0x3079] = "behiragana", + [0x307A] = "pehiragana", + [0x307B] = "hohiragana", + [0x307C] = "bohiragana", + [0x307D] = "pohiragana", + [0x307E] = "mahiragana", + [0x307F] = "mihiragana", + [0x3080] = "muhiragana", + [0x3081] = "mehiragana", + [0x3082] = "mohiragana", + [0x3083] = "yasmallhiragana", + [0x3084] = "yahiragana", + [0x3085] = "yusmallhiragana", + [0x3086] = "yuhiragana", + [0x3087] = "yosmallhiragana", + [0x3088] = "yohiragana", + [0x3089] = "rahiragana", + [0x308A] = "rihiragana", + [0x308B] = "ruhiragana", + [0x308C] = "rehiragana", + [0x308D] = "rohiragana", + [0x308E] = "wasmallhiragana", + [0x308F] = "wahiragana", + [0x3090] = "wihiragana", + [0x3091] = "wehiragana", + [0x3092] = "wohiragana", + [0x3093] = "nhiragana", + [0x3094] = "vuhiragana", + [0x309B] = "voicedmarkkana", + [0x309C] = "semivoicedmarkkana", + [0x309D] = "iterationhiragana", + [0x309E] = "voicediterationhiragana", + [0x30A1] = "asmallkatakana", + [0x30A2] = "akatakana", + [0x30A3] = "ismallkatakana", + [0x30A4] = "ikatakana", + [0x30A5] = "usmallkatakana", + [0x30A6] = "ukatakana", + [0x30A7] = "esmallkatakana", + [0x30A8] = "ekatakana", + [0x30A9] = "osmallkatakana", + [0x30AA] = "okatakana", + [0x30AB] = "kakatakana", + [0x30AC] = "gakatakana", + [0x30AD] = "kikatakana", + [0x30AE] = "gikatakana", + [0x30AF] = "kukatakana", + [0x30B0] = "gukatakana", + [0x30B1] = "kekatakana", + [0x30B2] = "gekatakana", + [0x30B3] = "kokatakana", + [0x30B4] = "gokatakana", + [0x30B5] = "sakatakana", + [0x30B6] = "zakatakana", + [0x30B7] = "sikatakana", + [0x30B8] = "zikatakana", + [0x30B9] = "sukatakana", + [0x30BA] = "zukatakana", + [0x30BB] = "sekatakana", + [0x30BC] = "zekatakana", + [0x30BD] = "sokatakana", + [0x30BE] = "zokatakana", + [0x30BF] = "takatakana", + [0x30C0] = "dakatakana", + [0x30C1] = "tikatakana", + [0x30C2] = "dikatakana", + [0x30C3] = "tusmallkatakana", + [0x30C4] = "tukatakana", + [0x30C5] = "dukatakana", + [0x30C6] = "tekatakana", + [0x30C7] = "dekatakana", + [0x30C8] = "tokatakana", + [0x30C9] = "dokatakana", + [0x30CA] = "nakatakana", + [0x30CB] = "nikatakana", + [0x30CC] = "nukatakana", + [0x30CD] = "nekatakana", + [0x30CE] = "nokatakana", + [0x30CF] = "hakatakana", + [0x30D0] = "bakatakana", + [0x30D1] = "pakatakana", + [0x30D2] = "hikatakana", + [0x30D3] = "bikatakana", + [0x30D4] = "pikatakana", + [0x30D5] = "hukatakana", + [0x30D6] = "bukatakana", + [0x30D7] = "pukatakana", + [0x30D8] = "hekatakana", + [0x30D9] = "bekatakana", + [0x30DA] = "pekatakana", + [0x30DB] = "hokatakana", + [0x30DC] = "bokatakana", + [0x30DD] = "pokatakana", + [0x30DE] = "makatakana", + [0x30DF] = "mikatakana", + [0x30E0] = "mukatakana", + [0x30E1] = "mekatakana", + [0x30E2] = "mokatakana", + [0x30E3] = "yasmallkatakana", + [0x30E4] = "yakatakana", + [0x30E5] = "yusmallkatakana", + [0x30E6] = "yukatakana", + [0x30E7] = "yosmallkatakana", + [0x30E8] = "yokatakana", + [0x30E9] = "rakatakana", + [0x30EA] = "rikatakana", + [0x30EB] = "rukatakana", + [0x30EC] = "rekatakana", + [0x30ED] = "rokatakana", + [0x30EE] = "wasmallkatakana", + [0x30EF] = "wakatakana", + [0x30F0] = "wikatakana", + [0x30F1] = "wekatakana", + [0x30F2] = "wokatakana", + [0x30F3] = "nkatakana", + [0x30F4] = "vukatakana", + [0x30F5] = "kasmallkatakana", + [0x30F6] = "kesmallkatakana", + [0x30F7] = "vakatakana", + [0x30F8] = "vikatakana", + [0x30F9] = "vekatakana", + [0x30FA] = "vokatakana", + [0x30FB] = "dotkatakana", + [0x30FC] = "prolongedkana", + [0x30FD] = "iterationkatakana", + [0x30FE] = "voicediterationkatakana", + [0x3105] = "bbopomofo", + [0x3106] = "pbopomofo", + [0x3107] = "mbopomofo", + [0x3108] = "fbopomofo", + [0x3109] = "dbopomofo", + [0x310A] = "tbopomofo", + [0x310B] = "nbopomofo", + [0x310C] = "lbopomofo", + [0x310D] = "gbopomofo", + [0x310E] = "kbopomofo", + [0x310F] = "hbopomofo", + [0x3110] = "jbopomofo", + [0x3111] = "qbopomofo", + [0x3112] = "xbopomofo", + [0x3113] = "zhbopomofo", + [0x3114] = "chbopomofo", + [0x3115] = "shbopomofo", + [0x3116] = "rbopomofo", + [0x3117] = "zbopomofo", + [0x3118] = "cbopomofo", + [0x3119] = "sbopomofo", + [0x311A] = "abopomofo", + [0x311B] = "obopomofo", + [0x311C] = "ebopomofo", + [0x311D] = "ehbopomofo", + [0x311E] = "aibopomofo", + [0x311F] = "eibopomofo", + [0x3120] = "aubopomofo", + [0x3121] = "oubopomofo", + [0x3122] = "anbopomofo", + [0x3123] = "enbopomofo", + [0x3124] = "angbopomofo", + [0x3125] = "engbopomofo", + [0x3126] = "erbopomofo", + [0x3127] = "ibopomofo", + [0x3128] = "ubopomofo", + [0x3129] = "iubopomofo", + [0x3131] = "kiyeokkorean", + [0x3132] = "ssangkiyeokkorean", + [0x3133] = "kiyeoksioskorean", + [0x3134] = "nieunkorean", + [0x3135] = "nieuncieuckorean", + [0x3136] = "nieunhieuhkorean", + [0x3137] = "tikeutkorean", + [0x3138] = "ssangtikeutkorean", + [0x3139] = "rieulkorean", + [0x313A] = "rieulkiyeokkorean", + [0x313B] = "rieulmieumkorean", + [0x313C] = "rieulpieupkorean", + [0x313D] = "rieulsioskorean", + [0x313E] = "rieulthieuthkorean", + [0x313F] = "rieulphieuphkorean", + [0x3140] = "rieulhieuhkorean", + [0x3141] = "mieumkorean", + [0x3142] = "pieupkorean", + [0x3143] = "ssangpieupkorean", + [0x3144] = "pieupsioskorean", + [0x3145] = "sioskorean", + [0x3146] = "ssangsioskorean", + [0x3147] = "ieungkorean", + [0x3148] = "cieuckorean", + [0x3149] = "ssangcieuckorean", + [0x314A] = "chieuchkorean", + [0x314B] = "khieukhkorean", + [0x314C] = "thieuthkorean", + [0x314D] = "phieuphkorean", + [0x314E] = "hieuhkorean", + [0x314F] = "akorean", + [0x3150] = "aekorean", + [0x3151] = "yakorean", + [0x3152] = "yaekorean", + [0x3153] = "eokorean", + [0x3154] = "ekorean", + [0x3155] = "yeokorean", + [0x3156] = "yekorean", + [0x3157] = "okorean", + [0x3158] = "wakorean", + [0x3159] = "waekorean", + [0x315A] = "oekorean", + [0x315B] = "yokorean", + [0x315C] = "ukorean", + [0x315D] = "weokorean", + [0x315E] = "wekorean", + [0x315F] = "wikorean", + [0x3160] = "yukorean", + [0x3161] = "eukorean", + [0x3162] = "yikorean", + [0x3163] = "ikorean", + [0x3164] = "hangulfiller", + [0x3165] = "ssangnieunkorean", + [0x3166] = "nieuntikeutkorean", + [0x3167] = "nieunsioskorean", + [0x3168] = "nieunpansioskorean", + [0x3169] = "rieulkiyeoksioskorean", + [0x316A] = "rieultikeutkorean", + [0x316B] = "rieulpieupsioskorean", + [0x316C] = "rieulpansioskorean", + [0x316D] = "rieulyeorinhieuhkorean", + [0x316E] = "mieumpieupkorean", + [0x316F] = "mieumsioskorean", + [0x3170] = "mieumpansioskorean", + [0x3171] = "kapyeounmieumkorean", + [0x3172] = "pieupkiyeokkorean", + [0x3173] = "pieuptikeutkorean", + [0x3174] = "pieupsioskiyeokkorean", + [0x3175] = "pieupsiostikeutkorean", + [0x3176] = "pieupcieuckorean", + [0x3177] = "pieupthieuthkorean", + [0x3178] = "kapyeounpieupkorean", + [0x3179] = "kapyeounssangpieupkorean", + [0x317A] = "sioskiyeokkorean", + [0x317B] = "siosnieunkorean", + [0x317C] = "siostikeutkorean", + [0x317D] = "siospieupkorean", + [0x317E] = "sioscieuckorean", + [0x317F] = "pansioskorean", + [0x3180] = "ssangieungkorean", + [0x3181] = "yesieungkorean", + [0x3182] = "yesieungsioskorean", + [0x3183] = "yesieungpansioskorean", + [0x3184] = "kapyeounphieuphkorean", + [0x3185] = "ssanghieuhkorean", + [0x3186] = "yeorinhieuhkorean", + [0x3187] = "yoyakorean", + [0x3188] = "yoyaekorean", + [0x3189] = "yoikorean", + [0x318A] = "yuyeokorean", + [0x318B] = "yuyekorean", + [0x318C] = "yuikorean", + [0x318D] = "araeakorean", + [0x318E] = "araeaekorean", + [0x3200] = "kiyeokparenkorean", + [0x3201] = "nieunparenkorean", + [0x3202] = "tikeutparenkorean", + [0x3203] = "rieulparenkorean", + [0x3204] = "mieumparenkorean", + [0x3205] = "pieupparenkorean", + [0x3206] = "siosparenkorean", + [0x3207] = "ieungparenkorean", + [0x3208] = "cieucparenkorean", + [0x3209] = "chieuchparenkorean", + [0x320A] = "khieukhparenkorean", + [0x320B] = "thieuthparenkorean", + [0x320C] = "phieuphparenkorean", + [0x320D] = "hieuhparenkorean", + [0x320E] = "kiyeokaparenkorean", + [0x320F] = "nieunaparenkorean", + [0x3210] = "tikeutaparenkorean", + [0x3211] = "rieulaparenkorean", + [0x3212] = "mieumaparenkorean", + [0x3213] = "pieupaparenkorean", + [0x3214] = "siosaparenkorean", + [0x3215] = "ieungaparenkorean", + [0x3216] = "cieucaparenkorean", + [0x3217] = "chieuchaparenkorean", + [0x3218] = "khieukhaparenkorean", + [0x3219] = "thieuthaparenkorean", + [0x321A] = "phieuphaparenkorean", + [0x321B] = "hieuhaparenkorean", + [0x321C] = "cieucuparenkorean", + [0x3220] = "oneideographicparen", + [0x3221] = "twoideographicparen", + [0x3222] = "threeideographicparen", + [0x3223] = "fourideographicparen", + [0x3224] = "fiveideographicparen", + [0x3225] = "sixideographicparen", + [0x3226] = "sevenideographicparen", + [0x3227] = "eightideographicparen", + [0x3228] = "nineideographicparen", + [0x3229] = "tenideographicparen", + [0x322A] = "ideographicmoonparen", + [0x322B] = "ideographicfireparen", + [0x322C] = "ideographicwaterparen", + [0x322D] = "ideographicwoodparen", + [0x322E] = "ideographicmetalparen", + [0x322F] = "ideographicearthparen", + [0x3230] = "ideographicsunparen", + [0x3231] = "ideographicstockparen", + [0x3232] = "ideographichaveparen", + [0x3233] = "ideographicsocietyparen", + [0x3234] = "ideographicnameparen", + [0x3235] = "ideographicspecialparen", + [0x3236] = "ideographicfinancialparen", + [0x3237] = "ideographiccongratulationparen", + [0x3238] = "ideographiclaborparen", + [0x3239] = "ideographicrepresentparen", + [0x323A] = "ideographiccallparen", + [0x323B] = "ideographicstudyparen", + [0x323C] = "ideographicsuperviseparen", + [0x323D] = "ideographicenterpriseparen", + [0x323E] = "ideographicresourceparen", + [0x323F] = "ideographicallianceparen", + [0x3240] = "ideographicfestivalparen", + [0x3242] = "ideographicselfparen", + [0x3243] = "ideographicreachparen", + [0x3260] = "kiyeokcirclekorean", + [0x3261] = "nieuncirclekorean", + [0x3262] = "tikeutcirclekorean", + [0x3263] = "rieulcirclekorean", + [0x3264] = "mieumcirclekorean", + [0x3265] = "pieupcirclekorean", + [0x3266] = "sioscirclekorean", + [0x3267] = "ieungcirclekorean", + [0x3268] = "cieuccirclekorean", + [0x3269] = "chieuchcirclekorean", + [0x326A] = "khieukhcirclekorean", + [0x326B] = "thieuthcirclekorean", + [0x326C] = "phieuphcirclekorean", + [0x326D] = "hieuhcirclekorean", + [0x326E] = "kiyeokacirclekorean", + [0x326F] = "nieunacirclekorean", + [0x3270] = "tikeutacirclekorean", + [0x3271] = "rieulacirclekorean", + [0x3272] = "mieumacirclekorean", + [0x3273] = "pieupacirclekorean", + [0x3274] = "siosacirclekorean", + [0x3275] = "ieungacirclekorean", + [0x3276] = "cieucacirclekorean", + [0x3277] = "chieuchacirclekorean", + [0x3278] = "khieukhacirclekorean", + [0x3279] = "thieuthacirclekorean", + [0x327A] = "phieuphacirclekorean", + [0x327B] = "hieuhacirclekorean", + [0x327F] = "koreanstandardsymbol", + [0x328A] = "ideographmooncircle", + [0x328B] = "ideographfirecircle", + [0x328C] = "ideographwatercircle", + [0x328D] = "ideographwoodcircle", + [0x328E] = "ideographmetalcircle", + [0x328F] = "ideographearthcircle", + [0x3290] = "ideographsuncircle", + [0x3294] = "ideographnamecircle", + [0x3296] = "ideographicfinancialcircle", + [0x3298] = "ideographiclaborcircle", + [0x3299] = "ideographicsecretcircle", + [0x329D] = "ideographicexcellentcircle", + [0x329E] = "ideographicprintcircle", + [0x32A3] = "ideographiccorrectcircle", + [0x32A4] = "ideographichighcircle", + [0x32A5] = "ideographiccentrecircle", + [0x32A6] = "ideographiclowcircle", + [0x32A7] = "ideographicleftcircle", + [0x32A8] = "ideographicrightcircle", + [0x32A9] = "ideographicmedicinecircle", + [0x3300] = "apaatosquare", + [0x3303] = "aarusquare", + [0x3305] = "intisquare", + [0x330D] = "karoriisquare", + [0x3314] = "kirosquare", + [0x3315] = "kiroguramusquare", + [0x3316] = "kiromeetorusquare", + [0x3318] = "guramusquare", + [0x331E] = "kooposquare", + [0x3322] = "sentisquare", + [0x3323] = "sentosquare", + [0x3326] = "dorusquare", + [0x3327] = "tonsquare", + [0x332A] = "haitusquare", + [0x332B] = "paasentosquare", + [0x3331] = "birusquare", + [0x3333] = "huiitosquare", + [0x3336] = "hekutaarusquare", + [0x3339] = "herutusquare", + [0x333B] = "peezisquare", + [0x3342] = "hoonsquare", + [0x3347] = "mansyonsquare", + [0x3349] = "mirisquare", + [0x334A] = "miribaarusquare", + [0x334D] = "meetorusquare", + [0x334E] = "yaadosquare", + [0x3351] = "rittorusquare", + [0x3357] = "wattosquare", + [0x337B] = "heiseierasquare", + [0x337C] = "syouwaerasquare", + [0x337D] = "taisyouerasquare", + [0x337E] = "meizierasquare", + [0x337F] = "corporationsquare", + [0x3380] = "paampssquare", + [0x3381] = "nasquare", + [0x3382] = "muasquare", + [0x3383] = "masquare", + [0x3384] = "kasquare", + [0x3385] = "KBsquare", + [0x3386] = "MBsquare", + [0x3387] = "GBsquare", + [0x3388] = "calsquare", + [0x3389] = "kcalsquare", + [0x338A] = "pfsquare", + [0x338B] = "nfsquare", + [0x338C] = "mufsquare", + [0x338D] = "mugsquare", + [0x338E] = "squaremg", + [0x338F] = "squarekg", + [0x3390] = "Hzsquare", + [0x3391] = "khzsquare", + [0x3392] = "mhzsquare", + [0x3393] = "ghzsquare", + [0x3394] = "thzsquare", + [0x3395] = "mulsquare", + [0x3396] = "mlsquare", + [0x3397] = "dlsquare", + [0x3398] = "klsquare", + [0x3399] = "fmsquare", + [0x339A] = "nmsquare", + [0x339B] = "mumsquare", + [0x339C] = "squaremm", + [0x339D] = "squarecm", + [0x339E] = "squarekm", + [0x339F] = "mmsquaredsquare", + [0x33A0] = "cmsquaredsquare", + [0x33A1] = "squaremsquared", + [0x33A2] = "kmsquaredsquare", + [0x33A3] = "mmcubedsquare", + [0x33A4] = "cmcubedsquare", + [0x33A5] = "mcubedsquare", + [0x33A6] = "kmcubedsquare", + [0x33A7] = "moverssquare", + [0x33A8] = "moverssquaredsquare", + [0x33A9] = "pasquare", + [0x33AA] = "kpasquare", + [0x33AB] = "mpasquare", + [0x33AC] = "gpasquare", + [0x33AD] = "radsquare", + [0x33AE] = "radoverssquare", + [0x33AF] = "radoverssquaredsquare", + [0x33B0] = "pssquare", + [0x33B1] = "nssquare", + [0x33B2] = "mussquare", + [0x33B3] = "mssquare", + [0x33B4] = "pvsquare", + [0x33B5] = "nvsquare", + [0x33B6] = "muvsquare", + [0x33B7] = "mvsquare", + [0x33B8] = "kvsquare", + [0x33B9] = "mvmegasquare", + [0x33BA] = "pwsquare", + [0x33BB] = "nwsquare", + [0x33BC] = "muwsquare", + [0x33BD] = "mwsquare", + [0x33BE] = "kwsquare", + [0x33BF] = "mwmegasquare", + [0x33C0] = "kohmsquare", + [0x33C1] = "mohmsquare", + [0x33C2] = "amsquare", + [0x33C3] = "bqsquare", + [0x33C4] = "squarecc", + [0x33C5] = "cdsquare", + [0x33C6] = "coverkgsquare", + [0x33C7] = "cosquare", + [0x33C8] = "dbsquare", + [0x33C9] = "gysquare", + [0x33CA] = "hasquare", + [0x33CB] = "HPsquare", + [0x33CD] = "KKsquare", + [0x33CE] = "squarekmcapital", + [0x33CF] = "ktsquare", + [0x33D0] = "lmsquare", + [0x33D1] = "squareln", + [0x33D2] = "squarelog", + [0x33D3] = "lxsquare", + [0x33D4] = "mbsquare", + [0x33D5] = "squaremil", + [0x33D6] = "molsquare", + [0x33D8] = "pmsquare", + [0x33DB] = "srsquare", + [0x33DC] = "svsquare", + [0x33DD] = "wbsquare", + [0x5344] = "twentyhangzhou", + [0xF6BE] = "dotlessj", + [0xF6BF] = "LL", + [0xF6C0] = "ll", + [0xF6C3] = "commaaccent", + [0xF6C4] = "afii10063", + [0xF6C5] = "afii10064", + [0xF6C6] = "afii10192", + [0xF6C7] = "afii10831", + [0xF6C8] = "afii10832", + [0xF6C9] = "Acute", + [0xF6CA] = "Caron", + [0xF6CB] = "Dieresis", + [0xF6CC] = "DieresisAcute", + [0xF6CD] = "DieresisGrave", + [0xF6CE] = "Grave", + [0xF6CF] = "Hungarumlaut", + [0xF6D0] = "Macron", + [0xF6D1] = "cyrBreve", + [0xF6D2] = "cyrFlex", + [0xF6D3] = "dblGrave", + [0xF6D4] = "cyrbreve", + [0xF6D5] = "cyrflex", + [0xF6D6] = "dblgrave", + [0xF6D7] = "dieresisacute", + [0xF6D8] = "dieresisgrave", + [0xF6D9] = "copyrightserif", + [0xF6DA] = "registerserif", + [0xF6DB] = "trademarkserif", + [0xF6DC] = "onefitted", + [0xF6DD] = "rupiah", + [0xF6DE] = "threequartersemdash", + [0xF6DF] = "centinferior", + [0xF6E0] = "centsuperior", + [0xF6E1] = "commainferior", + [0xF6E2] = "commasuperior", + [0xF6E3] = "dollarinferior", + [0xF6E4] = "dollarsuperior", + [0xF6E5] = "hypheninferior", + [0xF6E6] = "hyphensuperior", + [0xF6E7] = "periodinferior", + [0xF6E8] = "periodsuperior", + [0xF6E9] = "asuperior", + [0xF6EA] = "bsuperior", + [0xF6EB] = "dsuperior", + [0xF6EC] = "esuperior", + [0xF6ED] = "isuperior", + [0xF6EE] = "lsuperior", + [0xF6EF] = "msuperior", + [0xF6F0] = "osuperior", + [0xF6F1] = "rsuperior", + [0xF6F2] = "ssuperior", + [0xF6F3] = "tsuperior", + [0xF6F4] = "Brevesmall", + [0xF6F5] = "Caronsmall", + [0xF6F6] = "Circumflexsmall", + [0xF6F7] = "Dotaccentsmall", + [0xF6F8] = "Hungarumlautsmall", + [0xF6F9] = "Lslashsmall", + [0xF6FA] = "OEsmall", + [0xF6FB] = "Ogoneksmall", + [0xF6FC] = "Ringsmall", + [0xF6FD] = "Scaronsmall", + [0xF6FE] = "Tildesmall", + [0xF6FF] = "Zcaronsmall", + [0xF721] = "exclamsmall", + [0xF724] = "dollaroldstyle", + [0xF726] = "ampersandsmall", + [0xF730] = "zerooldstyle", + [0xF731] = "oneoldstyle", + [0xF732] = "twooldstyle", + [0xF733] = "threeoldstyle", + [0xF734] = "fouroldstyle", + [0xF735] = "fiveoldstyle", + [0xF736] = "sixoldstyle", + [0xF737] = "sevenoldstyle", + [0xF738] = "eightoldstyle", + [0xF739] = "nineoldstyle", + [0xF73F] = "questionsmall", + [0xF760] = "Gravesmall", + [0xF761] = "Asmall", + [0xF762] = "Bsmall", + [0xF763] = "Csmall", + [0xF764] = "Dsmall", + [0xF765] = "Esmall", + [0xF766] = "Fsmall", + [0xF767] = "Gsmall", + [0xF768] = "Hsmall", + [0xF769] = "Ismall", + [0xF76A] = "Jsmall", + [0xF76B] = "Ksmall", + [0xF76C] = "Lsmall", + [0xF76D] = "Msmall", + [0xF76E] = "Nsmall", + [0xF76F] = "Osmall", + [0xF770] = "Psmall", + [0xF771] = "Qsmall", + [0xF772] = "Rsmall", + [0xF773] = "Ssmall", + [0xF774] = "Tsmall", + [0xF775] = "Usmall", + [0xF776] = "Vsmall", + [0xF777] = "Wsmall", + [0xF778] = "Xsmall", + [0xF779] = "Ysmall", + [0xF77A] = "Zsmall", + [0xF7A1] = "exclamdownsmall", + [0xF7A2] = "centoldstyle", + [0xF7A8] = "Dieresissmall", + [0xF7AF] = "Macronsmall", + [0xF7B4] = "Acutesmall", + [0xF7B8] = "Cedillasmall", + [0xF7BF] = "questiondownsmall", + [0xF7E0] = "Agravesmall", + [0xF7E1] = "Aacutesmall", + [0xF7E2] = "Acircumflexsmall", + [0xF7E3] = "Atildesmall", + [0xF7E4] = "Adieresissmall", + [0xF7E5] = "Aringsmall", + [0xF7E6] = "AEsmall", + [0xF7E7] = "Ccedillasmall", + [0xF7E8] = "Egravesmall", + [0xF7E9] = "Eacutesmall", + [0xF7EA] = "Ecircumflexsmall", + [0xF7EB] = "Edieresissmall", + [0xF7EC] = "Igravesmall", + [0xF7ED] = "Iacutesmall", + [0xF7EE] = "Icircumflexsmall", + [0xF7EF] = "Idieresissmall", + [0xF7F0] = "Ethsmall", + [0xF7F1] = "Ntildesmall", + [0xF7F2] = "Ogravesmall", + [0xF7F3] = "Oacutesmall", + [0xF7F4] = "Ocircumflexsmall", + [0xF7F5] = "Otildesmall", + [0xF7F6] = "Odieresissmall", + [0xF7F8] = "Oslashsmall", + [0xF7F9] = "Ugravesmall", + [0xF7FA] = "Uacutesmall", + [0xF7FB] = "Ucircumflexsmall", + [0xF7FC] = "Udieresissmall", + [0xF7FD] = "Yacutesmall", + [0xF7FE] = "Thornsmall", + [0xF7FF] = "Ydieresissmall", + [0xF884] = "maihanakatleftthai", + [0xF885] = "saraileftthai", + [0xF886] = "saraiileftthai", + [0xF887] = "saraueleftthai", + [0xF888] = "saraueeleftthai", + [0xF889] = "maitaikhuleftthai", + [0xF88A] = "maiekupperleftthai", + [0xF88B] = "maieklowrightthai", + [0xF88C] = "maieklowleftthai", + [0xF88D] = "maithoupperleftthai", + [0xF88E] = "maitholowrightthai", + [0xF88F] = "maitholowleftthai", + [0xF890] = "maitriupperleftthai", + [0xF891] = "maitrilowrightthai", + [0xF892] = "maitrilowleftthai", + [0xF893] = "maichattawaupperleftthai", + [0xF894] = "maichattawalowrightthai", + [0xF895] = "maichattawalowleftthai", + [0xF896] = "thanthakhatupperleftthai", + [0xF897] = "thanthakhatlowrightthai", + [0xF898] = "thanthakhatlowleftthai", + [0xF899] = "nikhahitleftthai", + [0xF8E5] = "radicalex", + [0xF8E6] = "arrowvertex", + [0xF8E7] = "arrowhorizex", + [0xF8E8] = "registersans", + [0xF8E9] = "copyrightsans", + [0xF8EA] = "trademarksans", + [0xF8EB] = "parenlefttp", + [0xF8EC] = "parenleftex", + [0xF8ED] = "parenleftbt", + [0xF8EE] = "bracketlefttp", + [0xF8EF] = "bracketleftex", + [0xF8F0] = "bracketleftbt", + [0xF8F1] = "bracelefttp", + [0xF8F2] = "braceleftmid", + [0xF8F3] = "braceleftbt", + [0xF8F4] = "braceex", + [0xF8F5] = "integralex", + [0xF8F6] = "parenrighttp", + [0xF8F7] = "parenrightex", + [0xF8F8] = "parenrightbt", + [0xF8F9] = "bracketrighttp", + [0xF8FA] = "bracketrightex", + [0xF8FB] = "bracketrightbt", + [0xF8FC] = "bracerighttp", + [0xF8FD] = "bracerightmid", + [0xF8FE] = "bracerightbt", + [0xF8FF] = "apple", + [0xFB00] = "ff", + [0xFB01] = "fi", + [0xFB02] = "fl", + [0xFB03] = "ffi", + [0xFB04] = "ffl", + [0xFB1F] = "yodyodpatahhebrew", + [0xFB20] = "ayinaltonehebrew", + [0xFB2A] = "shinshindothebrew", + [0xFB2B] = "shinsindothebrew", + [0xFB2C] = "shindageshshindothebrew", + [0xFB2D] = "shindageshsindothebrew", + [0xFB2E] = "alefpatahhebrew", + [0xFB2F] = "alefqamatshebrew", + [0xFB30] = "alefdageshhebrew", + [0xFB31] = "betdageshhebrew", + [0xFB32] = "gimeldageshhebrew", + [0xFB33] = "daletdageshhebrew", + [0xFB34] = "hedageshhebrew", + [0xFB35] = "vavdageshhebrew", + [0xFB36] = "zayindageshhebrew", + [0xFB38] = "tetdageshhebrew", + [0xFB39] = "yoddageshhebrew", + [0xFB3A] = "finalkafdageshhebrew", + [0xFB3B] = "kafdageshhebrew", + [0xFB3C] = "lameddageshhebrew", + [0xFB3E] = "memdageshhebrew", + [0xFB40] = "nundageshhebrew", + [0xFB41] = "samekhdageshhebrew", + [0xFB43] = "pefinaldageshhebrew", + [0xFB44] = "pedageshhebrew", + [0xFB46] = "tsadidageshhebrew", + [0xFB47] = "qofdageshhebrew", + [0xFB48] = "reshdageshhebrew", + [0xFB49] = "shindageshhebrew", + [0xFB4A] = "tavdageshhebrew", + [0xFB4B] = "vavholamhebrew", + [0xFB4C] = "betrafehebrew", + [0xFB4D] = "kafrafehebrew", + [0xFB4E] = "perafehebrew", + [0xFB4F] = "aleflamedhebrew", + [0xFB57] = "pehfinalarabic", + [0xFB58] = "pehinitialarabic", + [0xFB59] = "pehmedialarabic", + [0xFB67] = "ttehfinalarabic", + [0xFB68] = "ttehinitialarabic", + [0xFB69] = "ttehmedialarabic", + [0xFB6B] = "vehfinalarabic", + [0xFB6C] = "vehinitialarabic", + [0xFB6D] = "vehmedialarabic", + [0xFB7B] = "tchehfinalarabic", + [0xFB7C] = "tchehmeeminitialarabic", + [0xFB7D] = "tchehmedialarabic", + [0xFB89] = "ddalfinalarabic", + [0xFB8B] = "jehfinalarabic", + [0xFB8D] = "rrehfinalarabic", + [0xFB93] = "gaffinalarabic", + [0xFB94] = "gafinitialarabic", + [0xFB95] = "gafmedialarabic", + [0xFB9F] = "noonghunnafinalarabic", + [0xFBA4] = "hehhamzaaboveisolatedarabic", + [0xFBA5] = "hehhamzaabovefinalarabic", + [0xFBA7] = "hehfinalaltonearabic", + [0xFBA8] = "hehinitialaltonearabic", + [0xFBA9] = "hehmedialaltonearabic", + [0xFBAF] = "yehbarreefinalarabic", + [0xFC08] = "behmeemisolatedarabic", + [0xFC0B] = "tehjeemisolatedarabic", + [0xFC0C] = "tehhahisolatedarabic", + [0xFC0E] = "tehmeemisolatedarabic", + [0xFC48] = "meemmeemisolatedarabic", + [0xFC4B] = "noonjeemisolatedarabic", + [0xFC4E] = "noonmeemisolatedarabic", + [0xFC58] = "yehmeemisolatedarabic", + [0xFC5E] = "shaddadammatanarabic", + [0xFC5F] = "shaddakasratanarabic", + [0xFC60] = "shaddafathaarabic", + [0xFC61] = "shaddadammaarabic", + [0xFC62] = "shaddakasraarabic", + [0xFC6D] = "behnoonfinalarabic", + [0xFC73] = "tehnoonfinalarabic", + [0xFC8D] = "noonnoonfinalarabic", + [0xFC94] = "yehnoonfinalarabic", + [0xFC9F] = "behmeeminitialarabic", + [0xFCA1] = "tehjeeminitialarabic", + [0xFCA2] = "tehhahinitialarabic", + [0xFCA4] = "tehmeeminitialarabic", + [0xFCC9] = "lamjeeminitialarabic", + [0xFCCA] = "lamhahinitialarabic", + [0xFCCB] = "lamkhahinitialarabic", + [0xFCCC] = "lammeeminitialarabic", + [0xFCD1] = "meemmeeminitialarabic", + [0xFCD2] = "noonjeeminitialarabic", + [0xFCD5] = "noonmeeminitialarabic", + [0xFCDD] = "yehmeeminitialarabic", + [0xFD3E] = "parenleftaltonearabic", + [0xFD3F] = "parenrightaltonearabic", + [0xFD88] = "lammeemhahinitialarabic", + [0xFDF2] = "lamlamhehisolatedarabic", + [0xFDFA] = "sallallahoualayhewasallamarabic", + [0xFE30] = "twodotleadervertical", + [0xFE31] = "emdashvertical", + [0xFE32] = "endashvertical", + [0xFE33] = "underscorevertical", + [0xFE34] = "wavyunderscorevertical", + [0xFE35] = "parenleftvertical", + [0xFE36] = "parenrightvertical", + [0xFE37] = "braceleftvertical", + [0xFE38] = "bracerightvertical", + [0xFE39] = "tortoiseshellbracketleftvertical", + [0xFE3A] = "tortoiseshellbracketrightvertical", + [0xFE3B] = "blacklenticularbracketleftvertical", + [0xFE3C] = "blacklenticularbracketrightvertical", + [0xFE3D] = "dblanglebracketleftvertical", + [0xFE3E] = "dblanglebracketrightvertical", + [0xFE3F] = "anglebracketleftvertical", + [0xFE40] = "anglebracketrightvertical", + [0xFE41] = "cornerbracketleftvertical", + [0xFE42] = "cornerbracketrightvertical", + [0xFE43] = "whitecornerbracketleftvertical", + [0xFE44] = "whitecornerbracketrightvertical", + [0xFE49] = "overlinedashed", + [0xFE4A] = "overlinecenterline", + [0xFE4B] = "overlinewavy", + [0xFE4C] = "overlinedblwavy", + [0xFE4D] = "lowlinedashed", + [0xFE4E] = "lowlinecenterline", + [0xFE4F] = "underscorewavy", + [0xFE50] = "commasmall", + [0xFE52] = "periodsmall", + [0xFE54] = "semicolonsmall", + [0xFE55] = "colonsmall", + [0xFE59] = "parenleftsmall", + [0xFE5A] = "parenrightsmall", + [0xFE5B] = "braceleftsmall", + [0xFE5C] = "bracerightsmall", + [0xFE5D] = "tortoiseshellbracketleftsmall", + [0xFE5E] = "tortoiseshellbracketrightsmall", + [0xFE5F] = "numbersignsmall", + [0xFE61] = "asterisksmall", + [0xFE62] = "plussmall", + [0xFE63] = "hyphensmall", + [0xFE64] = "lesssmall", + [0xFE65] = "greatersmall", + [0xFE66] = "equalsmall", + [0xFE69] = "dollarsmall", + [0xFE6A] = "percentsmall", + [0xFE6B] = "atsmall", + [0xFE82] = "alefmaddaabovefinalarabic", + [0xFE84] = "alefhamzaabovefinalarabic", + [0xFE86] = "wawhamzaabovefinalarabic", + [0xFE88] = "alefhamzabelowfinalarabic", + [0xFE8A] = "yehhamzaabovefinalarabic", + [0xFE8B] = "yehhamzaaboveinitialarabic", + [0xFE8C] = "yehhamzaabovemedialarabic", + [0xFE8E] = "aleffinalarabic", + [0xFE90] = "behfinalarabic", + [0xFE91] = "behinitialarabic", + [0xFE92] = "behmedialarabic", + [0xFE94] = "tehmarbutafinalarabic", + [0xFE96] = "tehfinalarabic", + [0xFE97] = "tehinitialarabic", + [0xFE98] = "tehmedialarabic", + [0xFE9A] = "thehfinalarabic", + [0xFE9B] = "thehinitialarabic", + [0xFE9C] = "thehmedialarabic", + [0xFE9E] = "jeemfinalarabic", + [0xFE9F] = "jeeminitialarabic", + [0xFEA0] = "jeemmedialarabic", + [0xFEA2] = "hahfinalarabic", + [0xFEA3] = "hahinitialarabic", + [0xFEA4] = "hahmedialarabic", + [0xFEA6] = "khahfinalarabic", + [0xFEA7] = "khahinitialarabic", + [0xFEA8] = "khahmedialarabic", + [0xFEAA] = "dalfinalarabic", + [0xFEAC] = "thalfinalarabic", + [0xFEAE] = "rehfinalarabic", + [0xFEB0] = "zainfinalarabic", + [0xFEB2] = "seenfinalarabic", + [0xFEB3] = "seeninitialarabic", + [0xFEB4] = "seenmedialarabic", + [0xFEB6] = "sheenfinalarabic", + [0xFEB7] = "sheeninitialarabic", + [0xFEB8] = "sheenmedialarabic", + [0xFEBA] = "sadfinalarabic", + [0xFEBB] = "sadinitialarabic", + [0xFEBC] = "sadmedialarabic", + [0xFEBE] = "dadfinalarabic", + [0xFEBF] = "dadinitialarabic", + [0xFEC0] = "dadmedialarabic", + [0xFEC2] = "tahfinalarabic", + [0xFEC3] = "tahinitialarabic", + [0xFEC4] = "tahmedialarabic", + [0xFEC6] = "zahfinalarabic", + [0xFEC7] = "zahinitialarabic", + [0xFEC8] = "zahmedialarabic", + [0xFECA] = "ainfinalarabic", + [0xFECB] = "aininitialarabic", + [0xFECC] = "ainmedialarabic", + [0xFECE] = "ghainfinalarabic", + [0xFECF] = "ghaininitialarabic", + [0xFED0] = "ghainmedialarabic", + [0xFED2] = "fehfinalarabic", + [0xFED3] = "fehinitialarabic", + [0xFED4] = "fehmedialarabic", + [0xFED6] = "qaffinalarabic", + [0xFED7] = "qafinitialarabic", + [0xFED8] = "qafmedialarabic", + [0xFEDA] = "kaffinalarabic", + [0xFEDB] = "kafinitialarabic", + [0xFEDC] = "kafmedialarabic", + [0xFEDE] = "lamfinalarabic", + [0xFEDF] = "lammeemkhahinitialarabic", + [0xFEE0] = "lammedialarabic", + [0xFEE2] = "meemfinalarabic", + [0xFEE3] = "meeminitialarabic", + [0xFEE4] = "meemmedialarabic", + [0xFEE6] = "noonfinalarabic", + [0xFEE7] = "nooninitialarabic", + [0xFEE8] = "noonmedialarabic", + [0xFEEA] = "hehfinalarabic", + [0xFEEB] = "hehinitialarabic", + [0xFEEC] = "hehmedialarabic", + [0xFEEE] = "wawfinalarabic", + [0xFEF0] = "alefmaksurafinalarabic", + [0xFEF2] = "yehfinalarabic", + [0xFEF3] = "yehinitialarabic", + [0xFEF4] = "yehmedialarabic", + [0xFEF5] = "lamalefmaddaaboveisolatedarabic", + [0xFEF6] = "lamalefmaddaabovefinalarabic", + [0xFEF7] = "lamalefhamzaaboveisolatedarabic", + [0xFEF8] = "lamalefhamzaabovefinalarabic", + [0xFEF9] = "lamalefhamzabelowisolatedarabic", + [0xFEFA] = "lamalefhamzabelowfinalarabic", + [0xFEFB] = "lamalefisolatedarabic", + [0xFEFC] = "lamaleffinalarabic", + [0xFEFF] = "zerowidthjoiner", + [0xFF01] = "exclammonospace", + [0xFF02] = "quotedblmonospace", + [0xFF03] = "numbersignmonospace", + [0xFF04] = "dollarmonospace", + [0xFF05] = "percentmonospace", + [0xFF06] = "ampersandmonospace", + [0xFF07] = "quotesinglemonospace", + [0xFF08] = "parenleftmonospace", + [0xFF09] = "parenrightmonospace", + [0xFF0A] = "asteriskmonospace", + [0xFF0B] = "plusmonospace", + [0xFF0C] = "commamonospace", + [0xFF0D] = "hyphenmonospace", + [0xFF0E] = "periodmonospace", + [0xFF0F] = "slashmonospace", + [0xFF10] = "zeromonospace", + [0xFF11] = "onemonospace", + [0xFF12] = "twomonospace", + [0xFF13] = "threemonospace", + [0xFF14] = "fourmonospace", + [0xFF15] = "fivemonospace", + [0xFF16] = "sixmonospace", + [0xFF17] = "sevenmonospace", + [0xFF18] = "eightmonospace", + [0xFF19] = "ninemonospace", + [0xFF1A] = "colonmonospace", + [0xFF1B] = "semicolonmonospace", + [0xFF1C] = "lessmonospace", + [0xFF1D] = "equalmonospace", + [0xFF1E] = "greatermonospace", + [0xFF1F] = "questionmonospace", + [0xFF20] = "atmonospace", + [0xFF21] = "Amonospace", + [0xFF22] = "Bmonospace", + [0xFF23] = "Cmonospace", + [0xFF24] = "Dmonospace", + [0xFF25] = "Emonospace", + [0xFF26] = "Fmonospace", + [0xFF27] = "Gmonospace", + [0xFF28] = "Hmonospace", + [0xFF29] = "Imonospace", + [0xFF2A] = "Jmonospace", + [0xFF2B] = "Kmonospace", + [0xFF2C] = "Lmonospace", + [0xFF2D] = "Mmonospace", + [0xFF2E] = "Nmonospace", + [0xFF2F] = "Omonospace", + [0xFF30] = "Pmonospace", + [0xFF31] = "Qmonospace", + [0xFF32] = "Rmonospace", + [0xFF33] = "Smonospace", + [0xFF34] = "Tmonospace", + [0xFF35] = "Umonospace", + [0xFF36] = "Vmonospace", + [0xFF37] = "Wmonospace", + [0xFF38] = "Xmonospace", + [0xFF39] = "Ymonospace", + [0xFF3A] = "Zmonospace", + [0xFF3B] = "bracketleftmonospace", + [0xFF3C] = "backslashmonospace", + [0xFF3D] = "bracketrightmonospace", + [0xFF3E] = "asciicircummonospace", + [0xFF3F] = "underscoremonospace", + [0xFF40] = "gravemonospace", + [0xFF41] = "amonospace", + [0xFF42] = "bmonospace", + [0xFF43] = "cmonospace", + [0xFF44] = "dmonospace", + [0xFF45] = "emonospace", + [0xFF46] = "fmonospace", + [0xFF47] = "gmonospace", + [0xFF48] = "hmonospace", + [0xFF49] = "imonospace", + [0xFF4A] = "jmonospace", + [0xFF4B] = "kmonospace", + [0xFF4C] = "lmonospace", + [0xFF4D] = "mmonospace", + [0xFF4E] = "nmonospace", + [0xFF4F] = "omonospace", + [0xFF50] = "pmonospace", + [0xFF51] = "qmonospace", + [0xFF52] = "rmonospace", + [0xFF53] = "smonospace", + [0xFF54] = "tmonospace", + [0xFF55] = "umonospace", + [0xFF56] = "vmonospace", + [0xFF57] = "wmonospace", + [0xFF58] = "xmonospace", + [0xFF59] = "ymonospace", + [0xFF5A] = "zmonospace", + [0xFF5B] = "braceleftmonospace", + [0xFF5C] = "barmonospace", + [0xFF5D] = "bracerightmonospace", + [0xFF5E] = "asciitildemonospace", + [0xFF61] = "periodhalfwidth", + [0xFF62] = "cornerbracketlefthalfwidth", + [0xFF63] = "cornerbracketrighthalfwidth", + [0xFF64] = "ideographiccommaleft", + [0xFF65] = "middledotkatakanahalfwidth", + [0xFF66] = "wokatakanahalfwidth", + [0xFF67] = "asmallkatakanahalfwidth", + [0xFF68] = "ismallkatakanahalfwidth", + [0xFF69] = "usmallkatakanahalfwidth", + [0xFF6A] = "esmallkatakanahalfwidth", + [0xFF6B] = "osmallkatakanahalfwidth", + [0xFF6C] = "yasmallkatakanahalfwidth", + [0xFF6D] = "yusmallkatakanahalfwidth", + [0xFF6E] = "yosmallkatakanahalfwidth", + [0xFF6F] = "tusmallkatakanahalfwidth", + [0xFF70] = "katahiraprolongmarkhalfwidth", + [0xFF71] = "akatakanahalfwidth", + [0xFF72] = "ikatakanahalfwidth", + [0xFF73] = "ukatakanahalfwidth", + [0xFF74] = "ekatakanahalfwidth", + [0xFF75] = "okatakanahalfwidth", + [0xFF76] = "kakatakanahalfwidth", + [0xFF77] = "kikatakanahalfwidth", + [0xFF78] = "kukatakanahalfwidth", + [0xFF79] = "kekatakanahalfwidth", + [0xFF7A] = "kokatakanahalfwidth", + [0xFF7B] = "sakatakanahalfwidth", + [0xFF7C] = "sikatakanahalfwidth", + [0xFF7D] = "sukatakanahalfwidth", + [0xFF7E] = "sekatakanahalfwidth", + [0xFF7F] = "sokatakanahalfwidth", + [0xFF80] = "takatakanahalfwidth", + [0xFF81] = "tikatakanahalfwidth", + [0xFF82] = "tukatakanahalfwidth", + [0xFF83] = "tekatakanahalfwidth", + [0xFF84] = "tokatakanahalfwidth", + [0xFF85] = "nakatakanahalfwidth", + [0xFF86] = "nikatakanahalfwidth", + [0xFF87] = "nukatakanahalfwidth", + [0xFF88] = "nekatakanahalfwidth", + [0xFF89] = "nokatakanahalfwidth", + [0xFF8A] = "hakatakanahalfwidth", + [0xFF8B] = "hikatakanahalfwidth", + [0xFF8C] = "hukatakanahalfwidth", + [0xFF8D] = "hekatakanahalfwidth", + [0xFF8E] = "hokatakanahalfwidth", + [0xFF8F] = "makatakanahalfwidth", + [0xFF90] = "mikatakanahalfwidth", + [0xFF91] = "mukatakanahalfwidth", + [0xFF92] = "mekatakanahalfwidth", + [0xFF93] = "mokatakanahalfwidth", + [0xFF94] = "yakatakanahalfwidth", + [0xFF95] = "yukatakanahalfwidth", + [0xFF96] = "yokatakanahalfwidth", + [0xFF97] = "rakatakanahalfwidth", + [0xFF98] = "rikatakanahalfwidth", + [0xFF99] = "rukatakanahalfwidth", + [0xFF9A] = "rekatakanahalfwidth", + [0xFF9B] = "rokatakanahalfwidth", + [0xFF9C] = "wakatakanahalfwidth", + [0xFF9D] = "nkatakanahalfwidth", + [0xFF9E] = "voicedmarkkanahalfwidth", + [0xFF9F] = "semivoicedmarkkanahalfwidth", + [0xFFE0] = "centmonospace", + [0xFFE1] = "sterlingmonospace", + [0xFFE3] = "macronmonospace", + [0xFFE5] = "yenmonospace", + [0xFFE6] = "wonmonospace", +} + +fonts.map.agl_to_unicode = table.swapped(fonts.map.unicode_to_agl) diff --git a/tex/context/base/font-ini.mkiv b/tex/context/base/font-ini.mkiv index 91b789204..8c797652b 100644 --- a/tex/context/base/font-ini.mkiv +++ b/tex/context/base/font-ini.mkiv @@ -78,6 +78,7 @@ \registerctxluafile{font-ext}{1.001} \registerctxluafile{font-pat}{1.001} \registerctxluafile{font-chk}{1.001} +\registerctxluafile{font-agl}{1.001} \unprotect @@ -2644,6 +2645,9 @@ \ifx\saveinterlinespace \undefined \let\saveinterlinespace \relax \fi \ifx\restoreinterlinespace\undefined \let\restoreinterlinespace\relax \fi +% \newtoks \everysetupbodyfont +% \newtoks \everyswitchtobodyfont + \chardef\bodyfontsetstate=0 \definecomplexorsimple\setupbodyfont @@ -2662,7 +2666,8 @@ \the\everybodyfont \the\everyglobalbodyfont \saveinterlinespace - \fi}} + \fi + \the\everysetupbodyfont}} \unexpanded\def\switchtobodyfont[#1]% {\doifsomething{#1} @@ -2671,7 +2676,8 @@ \else \dosetfont0{#1}% \fi - \the\everybodyfont}} % indeed needed in case nothing is executed + \the\everybodyfont + \the\everyswitchtobodyfont}} %D The following alternative is meant for math||to||text %D switching and will be optimized. @@ -2718,23 +2724,22 @@ \definefontfeature [default] - [%mode=node,% + [%mode=node, liga=yes,kern=yes,tlig=yes,trep=yes] % texligatures=yes,texquotes=yes \definefontfeature [smallcaps] - [%mode=node,% - liga=yes,kern=yes,tlig=yes,trep=yes,smcp=yes] % texligatures=yes,texquotes=yes + [%mode=node,liga=yes, + smcp=yes,kern=yes,tlig=yes,trep=yes] % texligatures=yes,texquotes=yes \definefontfeature [oldstyle] - [%mode=node,% - liga=yes,kern=yes,tlig=yes,trep=yes,onum=yes] % texligatures=yes,texquotes=yes - + [%mode=node, + onum=yes,liga=yes,kern=yes,tlig=yes,trep=yes] % texligatures=yes,texquotes=yes \definefontfeature % == default unless redefined [ligatures] - [%mode=node,% + [%mode=node, liga=yes,kern=yes,tlig=yes,trep=yes] \definefontfeature % can be used for type1 fonts @@ -3254,7 +3259,7 @@ %D takes care of \type {\em \bf ...} sitiations. \def\setemphasisboldface - {\let\normalbf\bf + {\let\savedemphasisboldface\bf \let\setemphasisboldface\relax \unexpanded\def\bf {%\relax @@ -3264,9 +3269,9 @@ \else\ifx\fontalternative\c!sl \bs \else - \normalbf + \savedemphasisboldface \fi\fi - \let\bf\normalbf}} + \let\bf\savedemphasisboldface}} %D Donald's (adapted) macros take the next character into %D account when placing italic correction. As a bonus we also @@ -3410,7 +3415,7 @@ %D The implementation is rather straightforward in using %D \type{\halign}. -\fetchruntimecommand \showbodyfont {\f!fontprefix\s!run.mkii} +\fetchruntimecommand \showbodyfont {\f!fontprefix\s!run.mkiv} %D \macros %D {showfontstrip, testminimalbaseline, showminimalbaseline} diff --git a/tex/context/base/font-map.lua b/tex/context/base/font-map.lua index 5a034727f..0dc4eca5b 100644 --- a/tex/context/base/font-map.lua +++ b/tex/context/base/font-map.lua @@ -10,7 +10,7 @@ local match, format, find, concat = string.match, string.format, string.find, ta local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end) -local ctxcatcodes = tex.ctxcatcodes +local ctxcatcodes = tex and tex.ctxcatcodes --[[ldx--

Eventually this code will disappear because map files are kind @@ -141,13 +141,15 @@ end local hex = lpeg.R("AF","09") local hexfour = (hex*hex*hex*hex) / function(s) return tonumber(s,16) end -local dec = (lpeg.R("09")^1) / tonumber +local hexsix = (hex^1) / function(s) return tonumber(s,16) end +local dec = (lpeg.R("09")^1) / tonumber local period = lpeg.P(".") local unicode = lpeg.P("uni") * (hexfour * (period + lpeg.P(-1)) * lpeg.Cc(false) + lpeg.Ct(hexfour^1) * lpeg.Cc(true)) +local ucode = lpeg.P("u") * (hexsix * (period + lpeg.P(-1)) * lpeg.Cc(false) + lpeg.Ct(hexsix ^1) * lpeg.Cc(true)) local index = lpeg.P("index") * dec * lpeg.Cc(false) -local parser = unicode + index +local parser = unicode + ucode + index local parsers = { } @@ -165,10 +167,13 @@ function fonts.map.make_name_parser(str) end --~ local parser = fonts.map.make_name_parser("Japan1") +--~ local parser = fonts.map.make_name_parser() --~ local function test(str) --~ local b, a = parser:match(str) --~ print((a and table.serialize(b)) or b) --~ end +--~ test("a.sc") +--~ test("a") --~ test("uni1234") --~ test("uni1234.xx") --~ test("uni12349876") diff --git a/tex/context/base/font-otf.lua b/tex/context/base/font-otf.lua index ab93c73ac..cf3384126 100644 --- a/tex/context/base/font-otf.lua +++ b/tex/context/base/font-otf.lua @@ -500,6 +500,7 @@ otf.enhancers["analyse unicodes"] = function(data,filename) cidcodes = usedmap.unicodes end uparser = fonts.map.make_name_parser() + local aglmap = fonts.map and fonts.map.agl_to_unicode for index, glyph in next, data.glyphs do local name, unic = glyph.name, glyph.unicode or -1 -- play safe if unic == -1 or unic >= private or (unic >= 0xE000 and unic <= 0xF8FF) or unic == 0xFFFE or unic == 0xFFFF then @@ -544,7 +545,8 @@ otf.enhancers["analyse unicodes"] = function(data,filename) if nplit == 0 then -- skip elseif nplit == 1 then - unicode = unicodes[split[1]] + local base = split[1] + unicode = unicodes[base] or (agl and agl[base]) if unicode then if type(unicode) == "table" then unicode = unicode[1] @@ -554,7 +556,8 @@ otf.enhancers["analyse unicodes"] = function(data,filename) else local done = true for l=1,nplit do - local u = unicodes[split[l]] + local base = split[l] + local u = unicodes[base] or (agl and agl[base]) if not u then done = false break diff --git a/tex/context/base/font-run.mkiv b/tex/context/base/font-run.mkiv index 4cc098e2c..fec8a42a4 100644 --- a/tex/context/base/font-run.mkiv +++ b/tex/context/base/font-run.mkiv @@ -109,7 +109,6 @@ \gdef\doshowfont[#1][#2]% {\bgroup \boxrulewidth=.1pt - \setupcolors[\c!state=\v!local]% \iffirstargument \definefont[\s!dummy][#1]\dummy \else\ifdim2.5em>.05\hsize \tx @@ -227,7 +226,6 @@ \@@onlyenglish\showligatures \else \bgroup - \setupcolors[\c!state=\v!local]% \def\show##1{\hbox{\red\ruledhbox{\black##1}}}% \definefont[\s!dummy][#1]\dummy \starttabulate[|*{9}{c|}] diff --git a/tex/context/base/l-xml.lua b/tex/context/base/l-xml.lua index 5164890ae..cd4a797b0 100644 --- a/tex/context/base/l-xml.lua +++ b/tex/context/base/l-xml.lua @@ -8,6 +8,7 @@ if not modules then modules = { } end modules ['l-xml'] = { -- RJ: key=value ... lpeg.Ca(lpeg.Cc({}) * (pattern-producing-key-and-value / rawset)^0) +-- this module needs a cleanup: check latest lpeg, passing args, (sub)grammar, etc etc -- some code may move to l-xmlext -- some day we will really compile the lpaths (just construct functions) -- todo: some things per xml file, like namespace remapping diff --git a/tex/context/base/luat-env.lua b/tex/context/base/luat-env.lua index c4b0f7f00..9f395e862 100644 --- a/tex/context/base/luat-env.lua +++ b/tex/context/base/luat-env.lua @@ -51,7 +51,7 @@ function environment.initialize_arguments(arg) environment.arguments, environment.files, environment.sortedflags = arguments, files, nil for index, argument in pairs(arg) do if index > 0 then - local flag, value = argument:match("^%-+(.+)=(.-)$") + local flag, value = argument:match("^%-+(.-)=(.-)$") if flag then arguments[flag] = string.unquote(value or "") else diff --git a/tex/context/base/lxml-ini.lua b/tex/context/base/lxml-ini.lua index 31068e27b..781478a54 100644 --- a/tex/context/base/lxml-ini.lua +++ b/tex/context/base/lxml-ini.lua @@ -60,7 +60,8 @@ local traverse, lpath = xml.traverse, xml.lpath local xmlfilter, xmlfirst, xmllast, xmlall = xml.filter, xml.first, xml.last, xml.all local xmlcollect, xmlcontent, xmlcollect_texts, xmlcollect_tags, xmlcollect_elements = xml.collect, xml.content, xml.collect_texts, xml.collect_tags, xml.collect_elements -local xmlattribute, xmlindex = xml.filters.attribute, xml.filters.index +local xmlattribute, xmlindex, xmlchainattribute = xml.filters.attribute, xml.filters.index, xml.filters.chainattribute + local xmlelements = xml.elements document = document or { } @@ -608,6 +609,11 @@ function lxml.attribute(id,pattern,a,default) --todo: snelle xmlatt texsprint((str == "" and default) or str) end +function lxml.chainattribute(id,pattern,a,default) --todo: snelle xmlatt + local str = xmlchainattribute(get_id(id),pattern,a) or "" + texsprint((str == "" and default) or str) +end + function lxml.count(id,pattern) texsprint(xml.count(get_id(id),pattern) or 0) end diff --git a/tex/context/base/lxml-ini.mkiv b/tex/context/base/lxml-ini.mkiv index f6cf8d83f..4c5b10327 100644 --- a/tex/context/base/lxml-ini.mkiv +++ b/tex/context/base/lxml-ini.mkiv @@ -25,6 +25,8 @@ \def\xmlall #1#2{\ctxlua{lxml.all("#1","#2")}} \def\xmlatt #1#2{\ctxlua{lxml.attribute("#1","/","#2")}} \def\xmlattdef #1#2#3{\ctxlua{lxml.attribute("#1","/","#2","#3")}} +\def\xmlchainatt #1#2{\ctxlua{lxml.chainattribute("#1","/","#2")}} +\def\xmlchainattdef #1#2#3{\ctxlua{lxml.chainattribute("#1","/","#2","#3")}} \def\xmlattribute #1#2#3{\ctxlua{lxml.attribute("#1","#2","#3")}} \def\xmlattributedef #1#2#3#4{\ctxlua{lxml.attribute("#1","#2","#3","#4")}} \def\xmlcommand #1#2#3{\ctxlua{lxml.command("#1","#2","#3")}} diff --git a/tex/context/base/lxml-pth.lua b/tex/context/base/lxml-pth.lua index ef7f0213e..ab78af1dc 100644 --- a/tex/context/base/lxml-pth.lua +++ b/tex/context/base/lxml-pth.lua @@ -822,6 +822,36 @@ function xml.filters.attributes(root,pattern,arguments) end end +-- new + +local rt, dt, dk + +local function action(r,d,k) rt, dt, dk = r, d, k return true end + +function xml.filters.chainattribute(root,pattern,arguments) -- todo: optional levels + rt, dt, dk = nil, nil, nil + traverse(root, lpath(pattern), action) + local dtk = dt and dt[dk] + local ekat = (dtk and dtk.at) or (rt and rt.at) + local rp = rt + while true do + if ekat then + local a = ekat[arguments] + if a then + return a, rt, dt, dk + end + end + rp = rp.__p__ + if rp then + ekat = rp.at + else + return "", rt, dt, dk + end + end +end + +-- + function xml.filters.reverse(root,pattern) local rt, dt, dk traverse(root, lpath(pattern), function(r,d,k) rt,dt,dk = r,d,k return true end, 'reverse') diff --git a/tex/context/base/lxml-tab.lua b/tex/context/base/lxml-tab.lua index 290c31579..a93aa6149 100644 --- a/tex/context/base/lxml-tab.lua +++ b/tex/context/base/lxml-tab.lua @@ -6,6 +6,8 @@ if not modules then modules = { } end modules ['lxml-tab'] = { license = "see context related readme files" } +-- this module needs a cleanup: check latest lpeg, passing args, (sub)grammar, etc etc + --[[ldx--

The parser used here is inspired by the variant discussed in the lua book, but handles comment and processing instructions, has a different structure, provides diff --git a/tex/context/base/math-arr.mkiv b/tex/context/base/math-arr.mkiv index 5c6cfc294..0b2ee9b66 100644 --- a/tex/context/base/math-arr.mkiv +++ b/tex/context/base/math-arr.mkiv @@ -217,13 +217,13 @@ \def\redefinebotharrow#1#2#3% real dirty, this overload! {\doifdefined{#1} {\pushmacro\dohandlemtharrow - \def\dohandlemtharrow[##1][##2]{\setvalue{#1}{\dohandlemtharrow[#2][##2]}}% + \def\dohandlemtharrow[##1][##2]{\unexpanded\setvalue{#1}{\dohandlemtharrow[#2][##2]}}% % == \def\dohandlemtharrow[##1][##2]{\dodefinebotharrow{#1}{#2}{##2}}% \getvalue{#1}% \popmacro\dohandlemtharrow}} \def\dodefinebotharrow#1#2#3% - {\setvalue{#1}{\dohandlemtharrow[#2][#3]}} + {\unexpanded\setvalue{#1}{\dohandlemtharrow[#2][#3]}} \def\dohandlemtharrow {\dotripleempty\doxmtharrow} @@ -281,34 +281,34 @@ %D arrowfills: \tex{specrightarrowfill} which takes an extra argument, and %D \tex{rightarrowfill} which does not. -\def\specrightarrowfill {\defaultmtharrowfill \relbar \relbar \rightarrow} -\def\specleftarrowfill {\defaultmtharrowfill \leftarrow \relbar \relbar} - -\def\rightarrowfill {\specrightarrowfill \textstyle} -\def\leftarrowfill {\specleftarrowfill \textstyle} - -\def\equalfill {\defaultmtharrowfill \Relbar \Relbar \Relbar} -\def\Rightarrowfill {\defaultmtharrowfill \Relbar \Relbar \Rightarrow} -\def\Leftarrowfill {\defaultmtharrowfill \Leftarrow \Relbar \Relbar} -\def\Leftrightarrowfill {\defaultmtharrowfill \Leftarrow \Relbar \Rightarrow} -\def\leftrightarrowfill {\defaultmtharrowfill \leftarrow \relbar \rightarrow} -\def\mapstofill {\defaultmtharrowfill{\mapstochar\relbar} \relbar \rightarrow} -\def\twoheadrightarrowfill{\defaultmtharrowfill \relbar \relbar \twoheadrightarrow} -\def\twoheadleftarrowfill {\defaultmtharrowfill \twoheadleftarrow \relbar \relbar} -\def\rightharpoondownfill {\defaultmtharrowfill \relbar \relbar \rightharpoondown} -\def\rightharpoonupfill {\defaultmtharrowfill \relbar \relbar \rightharpoonup} -\def\leftharpoondownfill {\defaultmtharrowfill \leftharpoondown \relbar \relbar} -\def\leftharpoonupfill {\defaultmtharrowfill \leftharpoonup \relbar \relbar} -\def\hookleftfill {\defaultmtharrowfill \leftarrow \relbar{\relbar\joinrel\rhook}} -\def\hookrightfill {\defaultmtharrowfill{\lhook\joinrel\relbar}\relbar \rightarrow} -\def\relfill {\defaultmtharrowfill \relbar \relbar \relbar} - -\def\triplerelbar {\mathrel\equiv} -\def\triplerelfill{\defaultmtharrowfill\triplerelbar\triplerelbar\triplerelbar} - -\def\singlebond{{\xrel}} % or \def\singlebond{{\xrel[2]}} -\def\doublebond{{\xequal}} -\def\triplebond{{\xtriplerel}} +\unexpanded\def\specrightarrowfill {\defaultmtharrowfill \relbar \relbar \rightarrow} +\unexpanded\def\specleftarrowfill {\defaultmtharrowfill \leftarrow \relbar \relbar} + +\unexpanded\def\rightarrowfill {\specrightarrowfill \textstyle} +\unexpanded\def\leftarrowfill {\specleftarrowfill \textstyle} + +\unexpanded\def\equalfill {\defaultmtharrowfill \Relbar \Relbar \Relbar} +\unexpanded\def\Rightarrowfill {\defaultmtharrowfill \Relbar \Relbar \Rightarrow} +\unexpanded\def\Leftarrowfill {\defaultmtharrowfill \Leftarrow \Relbar \Relbar} +\unexpanded\def\Leftrightarrowfill {\defaultmtharrowfill \Leftarrow \Relbar \Rightarrow} +\unexpanded\def\leftrightarrowfill {\defaultmtharrowfill \leftarrow \relbar \rightarrow} +\unexpanded\def\mapstofill {\defaultmtharrowfill{\mapstochar\relbar} \relbar \rightarrow} +\unexpanded\def\twoheadrightarrowfill{\defaultmtharrowfill \relbar \relbar \twoheadrightarrow} +\unexpanded\def\twoheadleftarrowfill {\defaultmtharrowfill \twoheadleftarrow \relbar \relbar} +\unexpanded\def\rightharpoondownfill {\defaultmtharrowfill \relbar \relbar \rightharpoondown} +\unexpanded\def\rightharpoonupfill {\defaultmtharrowfill \relbar \relbar \rightharpoonup} +\unexpanded\def\leftharpoondownfill {\defaultmtharrowfill \leftharpoondown \relbar \relbar} +\unexpanded\def\leftharpoonupfill {\defaultmtharrowfill \leftharpoonup \relbar \relbar} +\unexpanded\def\hookleftfill {\defaultmtharrowfill \leftarrow \relbar{\relbar\joinrel\rhook}} +\unexpanded\def\hookrightfill {\defaultmtharrowfill{\lhook\joinrel\relbar}\relbar \rightarrow} +\unexpanded\def\relfill {\defaultmtharrowfill \relbar \relbar \relbar} + +\unexpanded\def\triplerelbar {\mathrel\equiv} +\unexpanded\def\triplerelfill{\defaultmtharrowfill\triplerelbar\triplerelbar\triplerelbar} + +\unexpanded\def\singlebond{{\xrel}} % or \def\singlebond{{\xrel[2]}} +\unexpanded\def\doublebond{{\xequal}} +\unexpanded\def\triplebond{{\xtriplerel}} %D Now we define most commonly used arrows. These include arrows %D defined in \filename{amsmath.sty}, \filename{extarrows.sty}, @@ -363,9 +363,9 @@ \def\dodefinemathoverarrow[#1][#2][#3]% {\ifthirdargument - \setvalue{#1}{\dohandlemathoverarrow[#2][#3]}% + \unexpanded\setvalue{#1}{\dohandlemathoverarrow[#2][#3]}% \else - \setvalue{#1}{\dohandlemathoverarrow[\zeropoint][#2]}% + \unexpanded\setvalue{#1}{\dohandlemathoverarrow[\zeropoint][#2]}% \fi} \def\dohandlemathoverarrow[#1][#2]% @@ -390,9 +390,9 @@ \def\dodefinemathunderarrow[#1][#2][#3]% {\ifthirdargument - \setvalue{#1}{\dohandlemathunderarrow[#2][#3]}% + \unexpanded\setvalue{#1}{\dohandlemathunderarrow[#2][#3]}% \else - \setvalue{#1}{\dohandlemathunderarrow[0.3ex][#2]}% + \unexpanded\setvalue{#1}{\dohandlemathunderarrow[0.3ex][#2]}% \fi} \def\dohandlemathunderarrow[#1][#2]% diff --git a/tex/context/base/math-ext.lua b/tex/context/base/math-ext.lua index 211377f49..fd65592c3 100644 --- a/tex/context/base/math-ext.lua +++ b/tex/context/base/math-ext.lua @@ -100,19 +100,31 @@ mathematics.extras.add(0xFE303, { -- 0xFE321 -- 0xFE340 for missing characters --- mathematics.extras.add(0xFE321, { --- category="sm", --- description="SHORT BAR", --- -- direction="on", --- -- linebreak="nu", --- mathclass="relation", --- mathname="mapstochar", --- unicodeslot=0xFE321, --- } ) - - +mathematics.extras.add(0xFE321, { + category="sm", + description="MATHEMATICAL SHORT BAR", +-- direction="on", +-- linebreak="nu", + mathclass="relation", + mathname="mapstochar", + unicodeslot=0xFE321, +} ) +mathematics.extras.add(0xFE322, { + category="sm", + description="MATHEMATICAL LEFT HOOK", + mathclass="relation", + mathname="lhook", + unicodeslot=0xFE322, +} ) +mathematics.extras.add(0xFE323, { + category="sm", + description="MATHEMATICAL RIGHT HOOK", + mathclass="relation", + mathname="rhook", + unicodeslot=0xFE323, +} ) --~ mathematics.extras.add(0xFE304, { --~ category="sm", diff --git a/tex/context/base/math-ini.mkiv b/tex/context/base/math-ini.mkiv index bb561a483..be343cd39 100644 --- a/tex/context/base/math-ini.mkiv +++ b/tex/context/base/math-ini.mkiv @@ -416,7 +416,7 @@ \mathcode`\_="8000 % \_ %D \macros -%D {\setupmathematics} +%D {setupmathematics} %D %D Configuration for integrals. (If needed we can speed this up and make it %D installable; no processaction is needed then). diff --git a/tex/context/base/math-inl.mkiv b/tex/context/base/math-inl.mkiv index 93168b885..89de0242b 100644 --- a/tex/context/base/math-inl.mkiv +++ b/tex/context/base/math-inl.mkiv @@ -15,339 +15,12 @@ \unprotect -%D \macros -%D {...} -%D -%D New and experimental: snapping big inline math! +% Obsolete, as we do snapping differently now. -\newconditional\halfcrazymathlines % \settrue\halfcrazymathlines -\newconditional\crazymathsnapping % \settrue\crazymathsnapping - -\appendtoks - \doifelse\@@mtgrid\v!yes \settrue\setfalse\crazymathsnapping - \doifelse\@@mtstep\v!halfline\settrue\setfalse\halfcrazymathlines -\to \everysetuptextformulas - -\setuptextformulas - [\c!grid=\v!yes, - \c!step=\v!line] - -\newcount\crazymathhack - -\let\lastcrazymathline \!!zeropoint -\let\lastcrazymathpage \!!zerocount -\let\lastcrazymathprelines \!!zerocount -\let\lastcrazymathpostlines\!!zerocount - -\def\crazymathtag{amh:\the\crazymathhack} -\def\crazytexttag{\v!text:\lastcrazymathpage} - -\def\crazymathindent{\hskip\MPx\crazymathtag\hskip-\MPx\crazytexttag} - -\def\flushcrazymathbox - {\nextboxht\strutheight - \nextboxdp\strutdepth - \hbox{\iftracegridsnapping\ruledhbox\fi{\flushnextbox}}} - -\def\snappedinlineformula - {\dosingleempty\dosnappedinlineformula} - -%D \starttabulate[|Tl|l|] -%D \NC - \NC half lines \NC \NR -%D \NC + \NC full lines \NC \NR -%D \NC = \NC force \NC \NR -%D \NC < \NC force, minus pre \NC \NR -%D \NC > \NC force, minus post \NC \NR -%D \stoptabulate - -\def\inlinemathmargin{1pt} - -\settrue\autocrazymathsnapping - -% FROM NOW ON, CHANGES AS OPTIONS - -% TODO: SKYLINE (PREV LINE POS SCAN) - -% we can rewrite this in lua but maybe we don't need it -% any more when we have proper snapping anyway - -\def\dosnappedinlineformula[#1]#2% - {\ifvmode\dontleavehmode\fi % tricky - \strut % prevents funny space at line break - \begingroup % interesting: \bgroup can make \vadjust disappear - \ifconditional\crazymathsnapping - \ifgridsnapping - \checktextbackgrounds % we need pos tracking, to be made less redundant - \donetrue - \else - \donefalse - \fi - \else - \donefalse - \fi - \!!doneafalse % forced or not auto - \!!donebfalse % too heigh - \!!donecfalse % too low - \!!donedfalse % less before - \!!doneefalse % less after - \ifdone - \setbox\nextbox\hbox{$#2$}% - \iftracegridsnapping - \setbox\nextbox\ruledhbox - {\backgroundline[gray]{\showstruts\strut\flushnextbox}}% - \fi - \def\docommand##1% - {\doif{##1}-{\settrue \halfcrazymathlines}% - \doif{##1}+{\setfalse\halfcrazymathlines}% - \doif{##1}={\!!doneatrue}% - \doif{##1}<{\!!donedtrue}% - \doif{##1}>{\!!doneetrue}}% - \processcommalist[#1]\docommand - \if!!doneb - \if!!donec \else - \setfalse\halfcrazymathlines - \fi - \else - \if!!donec - \setfalse\halfcrazymathlines - \fi - \fi - \donefalse - \if!!donea - \donetrue - \scratchdimen \nextboxht - \advance\scratchdimen .5\lineheight - \nextboxht\scratchdimen - \scratchdimen \nextboxdp - \advance\scratchdimen .5\lineheight - \nextboxdp\scratchdimen - \else\ifdim\nextboxht>\strutht - \donetrue - \else\ifdim\nextboxdp>\strutdp - \donetrue - \fi\fi\fi - \ifconditional\autocrazymathsnapping \else \if!!donea \else - % don't compensate, just snap to strut - \donefalse - % signal for next else, snap line to strut - \!!doneatrue - \fi \fi - \fi - \ifdone - % analyze height - \scratchdimen\inlinemathmargin - \advance\scratchdimen \strutht - \ifdim\nextboxht<\scratchdimen \else \!!donebtrue \fi - % analyze depth - \scratchdimen\inlinemathmargin - \advance\scratchdimen \strutdp - \ifdim\nextboxdp<\scratchdimen \else \!!donectrue \fi - % analyzed or forced - \ifdone - \global\advance\crazymathhack\plusone - \donefalse - \ifnum\MPp\crazymathtag=\lastcrazymathpage\relax - \ifdim\MPy\crazymathtag=\lastcrazymathline\relax - \donetrue - \fi - \fi - \ifnum\MPp\crazymathtag=\zerocount \donefalse \fi - \ifdim\MPy\crazymathtag=\zeropoint \donefalse \fi - \ifdone - % same page and same line - \else - \global\let\lastcrazymathprelines \!!zerocount - \global\let\lastcrazymathpostlines\!!zerocount - \xdef\lastcrazymathpage{\MPp\crazymathtag}% - \xdef\lastcrazymathline{\MPy\crazymathtag}% - \fi - \if!!doneb - % \getrawnoflines\nextboxht - \scratchdimen\nextboxht - \advance\scratchdimen-\strutht - \getnoflines\scratchdimen - \if!!doned \advance\noflines\minusone \fi - \scratchcounter\noflines - \advance\noflines-\lastcrazymathprelines\relax - \ifnum\noflines>\zerocount - \xdef\lastcrazymathprelines{\the\scratchcounter}% - \scratchdimen\noflines\lineheight - \ifconditional\halfcrazymathlines - \advance\scratchdimen-.5\lineheight - \fi - \advance\scratchdimen-\strutdepth - \setbox\scratchbox\null - \wd\scratchbox2\bodyfontsize - \ht\scratchbox\scratchdimen - \dp\scratchbox\strutdepth - %%% top correction code (see below) - \normalvadjust pre - {%\allowbreak % sometimes breaks spacing - \forgetall - \crazymathindent - \iftracegridsnapping - \setbox\scratchbox\hbox{\green\ruledhbox{\box\scratchbox}}% - \fi - \box\scratchbox - \endgraf - \nobreak}% - \else\ifnum\scratchcounter>\zerocount - \normalvadjust pre - {\nobreak}% - \fi\fi - \fi - \if!!donec - % \getrawnoflines\nextboxdp - \scratchdimen\nextboxdp - \advance\scratchdimen-\strutdp - \getnoflines\scratchdimen - \if!!donee \advance\noflines\minusone \fi - \scratchcounter\noflines - \advance\noflines-\lastcrazymathpostlines\relax - \ifnum\noflines>\zerocount - \donetrue - \else\ifnum\lastcrazymathpostlines=\zerocount - \donetrue - \else - \donefalse - \fi\fi - \else - \donefalse - \fi - \ifdone - \xdef\lastcrazymathpostlines{\the\scratchcounter}% - \ifnum\lastcrazymathpostlines=\zerocount - \global\let\lastcrazymathpostlines\!!plusone - \fi - \hbox{\setposition\crazymathtag\flushcrazymathbox}% - \scratchdimen\noflines\lineheight - \advance\scratchdimen-\lineheight - \advance\scratchdimen+\strutheight - \ifdim\scratchdimen>\zeropoint \else - \scratchdimen\strutheight % todo : test for half lines - \fi - \ifconditional\halfcrazymathlines - \advance\scratchdimen-.5\lineheight - \fi - \setbox\scratchbox\null - \wd\scratchbox2\bodyfontsize - \ht\scratchbox\scratchdimen - \dp\scratchbox\strutdepth - \normalvadjust - {\forgetall - \crazymathindent - \iftracegridsnapping - \setbox\scratchbox\hbox{\blue\ruledhbox{\box\scratchbox}}% - \fi - \box\scratchbox - \endgraf - % precaution: else we stick below the text bottom - \ifconditional\halfcrazymathlines - \allowbreak - \else - \vskip-\lineheight - \vskip \lineheight - \fi}% - \else - \hbox{\setposition\crazymathtag\flushcrazymathbox}% - \fi - \else - \flushcrazymathbox - \fi - \else\if!!donea - \flushcrazymathbox - \else - \mathematics{#2}% - \fi\fi - \endgroup} - -\let\tform\mathematics -\let\gform\snappedinlineformula - -% test set: -% -% \startbuffer -% Crazy math \gform {1+x} or \gform {\dorecurse {100} {1+} 1 = -% 101} and even gore crazy \gform {2^{2^2}_{1_1}} -% again\dorecurse {20} { and again} \gform {\sqrt {\frac -% {x^{5^5}} {\frac {1} {2}}}} even gore\dorecurse {50} { and -% gore} \tform {\dorecurse {12} {\gform {\sqrt {\frac -% {x^{5^5}} {3}}}+\gform {\sqrt {\frac {x^{5^5}} {\frac {1} -% {2}}}}+}x=10}\dorecurse{20} { super crazy math}: \tform -% {\dorecurse {30} {\gform {\sqrt {\frac {x^{5^5}} {3}}}+ -% \gform {\sqrt {\frac {x^{5^5}} {\frac {1} {2}}}}+ }x = 10}, -% and we're\dorecurse {20} { done}! -% \stopbuffer -% -% \setupcolors[state=start] \setuppapersize[S6][S6] -% -% \showgrid \tracegridsnappingtrue \showstruts -% -% \starttext -% \setuplayout[grid=yes,lines=15]\getbuffer \page -% \setuplayout[grid=yes,lines=16]\getbuffer \page -% \setuplayout[grid=yes,lines=17]\getbuffer \page -% \setuplayout[grid=yes,lines=18]\getbuffer \page -% \setuplayout[grid=yes,lines=19]\getbuffer \page -% \stoptext -% -% test -% -% \startregels -% \gform[<]{35 \cdot p^{\frac{3}{4}} = 70} -% \gform{12{,}4 \cdot d^3 = 200} -% \gform{a \cdot x^b}. -% \gform{12x^6 \cdot \negative 3x^4} -% \gform{\frac{12x^6}{\negative 3x^4}} -% \gform{(4x^2)^3} -% \gform{4x \sqrt{x} \cdot 3x^2} -% \gform{\frac{2x^4}{4x \sqrt{x}}} -% \gform{y = a \cdot x^b}. -% \gform{y_1 = \frac{15x^2}{x}} -% \gform{y_2 = x \cdot \sqrt{x}} -% \gform{y_3 = \frac{6x^3}{x^2}} -% \gform[<]{y_4 = \left(2x^2\right)^{\frac{1}{2}}} -% \gform{y_1 = \frac{4x^5}{x^2}} -% \gform{y_2 = 4 \cdot \sqrt{x}} -% \gform{y_3 = 4x^3} -% \gform{y_4 = \frac{100x}{\sqrt{x}}} -% \gform[<]{y_5 = 4 \cdot x^{\frac{1}{2}}} -% \gform{y_6 = \frac{1}{2} x \cdot 4x^2} -% \gform{y_7 = 2 \cdot x^3} -% \gform{y_8 = 100 \cdot x^{\frac{1}{2}}} -% \gform{4x^8 \cdot 8x^3} -% \gform{\frac{4x^8}{8x^3}} -% \gform{\left(\negative3x^4\right)^3} -% \gform{x^3 \sqrt{x} \cdot 3x^2} -% \gform{\frac{6x^3}{x^2 \sqrt{x}}} -% \gform{\frac{6}{2x^4}} -% \gform{\frac{1}{3x^6}} -% \gform{\frac{12x^8}{4x^{10}}} -% \gform{\frac{4}{\sqrt{x}}} -% \gform{\frac{1}{2x \sqrt{x}}} -% \gform{\frac{2{,}25}{p} = 0{,}35} -% \gform{4{,}50 + \frac{300}{k} = 4{,}70} -% \gform{\frac{1200}{k+12} - 42 = 6} -% \stopregels - -%D \macros -%D {enableautomath} -%D -%D The next one can be dangerous, but handy in controlled -%D situations. - -\bgroup \catcode`\$=\active - -\gdef\enableautomath - {\catcode`\$=\active - \def$##1${\snappedinlineformula{##1}}} - -% \gdef\enableautomath -% {\catcode`\$=\active -% \def${\doifnextcharelse$\doautodmath\doautoimath}% -% \def\doautoimath##1${\snappedinlineformula{##1}}% -% \def\doautodmath$##1$${\startformula##1\stopformula}} - -\egroup +\def\snappedinlineformula {\dosingleempty\dosnappedinlineformula} +\def\dosnappedinlineformula[#1]#2{\mathematics{#2}} +\let\tform \mathematics +\let\gform \snappedinlineformula +\let\enableautomath \relax \protect \endinput diff --git a/tex/context/base/math-scr.mkiv b/tex/context/base/math-scr.mkiv index 43355679f..a8e381e73 100644 --- a/tex/context/base/math-scr.mkiv +++ b/tex/context/base/math-scr.mkiv @@ -22,6 +22,8 @@ %D subscript mode. We want however a bit more control than %D normally provided, and therefore provide \type {\super} %D and \type{sub}. +%D +%D The grid snapping has been removed. \global\let\normalsuper=^ \global\let\normalsuber=_ @@ -32,98 +34,17 @@ \appendtoks \advance\supersubmode \plusone \to \everysupersub -\appendtoks - \gridsupsubstyle -\to \everysupersub - -\appendtoks - \doifelse\@@mtsize\v!small - {\let\gridsupsubstyle \scriptscriptstyle - \let\gridsupsubbodyfont \setsmallbodyfont}% - {\let\gridsupsubstyle \scriptstyle - \let\gridsupsubbodyfont \relax}% -\to \everysetuptextformulas - \setuptextformulas [\c!size=\v!normal] -\def\dogridsupsub#1#2% - {\begingroup - \setbox\nextbox\iftracegridsnapping\ruledhbox\else\hbox\fi - {\gridsupsubbodyfont - $\strut^{\the\everysupersub#1}_{\the\everysupersub#2}$}% - \nextboxht\strutheight - \nextboxdp\strutdepth - \flushnextbox - \endgroup} - -\def\gridsupsub - {\ifconditional\crazymathsnapping - \ifgridsnapping - \@EAEAEA\dogridsupsub - \else - \@EAEAEA\normalsupsub - \fi - \else - \@EA\normalsupsub - \fi} - \def\normalsupsub#1#2% {^{\the\everysupersub#1}_{\the\everysupersub#2}} -\appendtoks - \let\gridsupsubstyle \relax - \let\gridsupsubbodyfont\relax - \let\gridsupsub \normalsupsub -\to \everydisplay - \def\super#1{^{\the\everysupersub#1}} \def\suber#1{_{\the\everysupersub#1}} \def\supsub#1#2{\super{#1}\suber{#2}} \def\subsup#1#2{\suber{#1}\super{#2}} -%\def\super#1{\gridsupsub{#1}{}} % -%\def\suber#1{\gridsupsub{}{#1}} % -% -%\def\supsub#1#2{\gridsupsub{#1}{#2}} -%\def\subsup#1#2{\gridsupsub{#2}{#1}} - -\def\gridsuper#1{\gridsupsub{#1}{}} -\def\gridsuber#1{\gridsupsub{}{#1}} - -% \let\sup\super % math char -% \let\sub\suber - -% test set: -% -% \startbuffer -% \sform{x\frac{1}{2}} -% \sform{x\sup{\frac{1}{2}} + x\sup{2} + 2} -% \sform{x\supsub{\frac{1}{2}}{\frac{1}{2}} + x\sup{2} + 2} -% \stopbuffer -% -% \typebuffer -% -% \startlines -% \getbuffer -% \stoplines -% -% \startbuffer -% $x\frac{1}{2}$ -% $x\sup{\frac{1}{2}} + x^2 + 2$ -% $x\supsub{\frac{1}{2}}{\frac{1}{2}} + x^2 + 2$ -% \stopbuffer -% -% \typebuffer -% -% \start -% \enablesupersub -% \enableautomath -% \startlines -% \getbuffer -% \stoplines -% \stop - %D \macros %D {enablesupersub,enablesimplesupersub} %D diff --git a/tex/context/base/math-vfu.lua b/tex/context/base/math-vfu.lua index 67deef21b..3db60c4ee 100644 --- a/tex/context/base/math-vfu.lua +++ b/tex/context/base/math-vfu.lua @@ -689,8 +689,8 @@ fonts.enc.math["tex-mi"] = { [0x021BD] = 0x29, -- leftharpoondown [0x021C0] = 0x2A, -- righttharpoonup [0x021C1] = 0x2B, -- rightharpoondown - -- 0x2C, -- lhook (hook for combining arrows) - -- 0x2D, -- rhook (hook for combining arrows) + [0xFE322] = 0x2C, -- lhook (hook for combining arrows) + [0xFE323] = 0x2D, -- rhook (hook for combining arrows) [0x022B3] = 0x2E, -- triangleright (TODO: which one is right?) [0x022B2] = 0x2F, -- triangleleft (TODO: which one is right?) -- [0x00041] = 0x30, -- 0 diff --git a/tex/context/base/meta-ini.mkiv b/tex/context/base/meta-ini.mkiv index eab739d04..706c3ceb0 100644 --- a/tex/context/base/meta-ini.mkiv +++ b/tex/context/base/meta-ini.mkiv @@ -435,7 +435,7 @@ \xdef\MPlly{#3}% ugly as well \xdef\MPurx{#4}% \xdef\MPury{#5}% - \forcecolorhack\getobject{MP}{#1}} % else no proper color intent + \hbox{\forcecolorhack\getobject{MP}{#1}}} % else no proper color intent \long\def\handleuniqueMPgraphic#1#2#3% {\begingroup @@ -774,7 +774,7 @@ {\iffirstargument \startuseMPgraphic{#1}#2\stopuseMPgraphic \else - \startuseMPgraphic{mprun}#1\stopuseMPgraphic + \startuseMPgraphic{mprun}#2\stopuseMPgraphic \fi} % for old time sake @@ -1247,7 +1247,7 @@ \stopMPinitializations %D \macros -%D {\setupMPgraphics} +%D {setupMPgraphics} %D %D Here is a generic setup command: diff --git a/tex/context/base/mult-de.tex b/tex/context/base/mult-de.tex index ea3644751..c36777887 100644 --- a/tex/context/base/mult-de.tex +++ b/tex/context/base/mult-de.tex @@ -269,11 +269,15 @@ \setinterfacevariable{mathcases}{mathcases} \setinterfacevariable{mathmatrix}{mathmatrix} \setinterfacevariable{max}{max} +\setinterfacevariable{maxdepth}{maxdepth} +\setinterfacevariable{maxheight}{maxheight} +\setinterfacevariable{maxwidth}{maxwidth} \setinterfacevariable{may}{Mai} \setinterfacevariable{mediaeval}{mittelalterlich} \setinterfacevariable{medium}{mittel} \setinterfacevariable{middle}{mittig} \setinterfacevariable{min}{min} +\setinterfacevariable{mindepth}{mindepth} \setinterfacevariable{minheight}{minhoehe} \setinterfacevariable{minwidth}{minbreite} \setinterfacevariable{mirrored}{gespiegelt} @@ -730,6 +734,7 @@ \setinterfaceconstant{marking}{beschriftung} \setinterfaceconstant{marstyle}{beschrstil} \setinterfaceconstant{max}{max} +\setinterfaceconstant{maxdepth}{maxdepth} \setinterfaceconstant{maxheight}{maxhoehe} \setinterfaceconstant{maxwidth}{maxbreite} \setinterfaceconstant{maybeyear}{maybeyear} diff --git a/tex/context/base/mult-def.lua b/tex/context/base/mult-def.lua index 20438a484..3c6227943 100644 --- a/tex/context/base/mult-def.lua +++ b/tex/context/base/mult-def.lua @@ -8705,6 +8705,9 @@ return { ["pe"]="بیشترین‌ارتفاع", ["ro"]="inaltimemaxima", }, + ["maxdepth"]={ + ["en"]="maxdepth", + }, ["maxwidth"]={ ["cs"]="maxsirka", ["de"]="maxbreite", @@ -11136,6 +11139,24 @@ return { }, }, ["variables"]={ + ["maxheight"]={ + ["en"]="maxheight", + }, + ["maxdepth"]={ + ["en"]="maxdepth", + }, + ["maxwidth"]={ + ["en"]="maxwidth", + }, + ["minheight"]={ + ["en"]="minheight", + }, + ["mindepth"]={ + ["en"]="mindepth", + }, + ["minwidth"]={ + ["en"]="minwidth", + }, ["short"]={ ["nl"]="kort", ["en"]="short", diff --git a/tex/context/base/mult-en.tex b/tex/context/base/mult-en.tex index 8ffcd96ec..27e8105e5 100644 --- a/tex/context/base/mult-en.tex +++ b/tex/context/base/mult-en.tex @@ -269,11 +269,15 @@ \setinterfacevariable{mathcases}{mathcases} \setinterfacevariable{mathmatrix}{mathmatrix} \setinterfacevariable{max}{max} +\setinterfacevariable{maxdepth}{maxdepth} +\setinterfacevariable{maxheight}{maxheight} +\setinterfacevariable{maxwidth}{maxwidth} \setinterfacevariable{may}{May} \setinterfacevariable{mediaeval}{mediaeval} \setinterfacevariable{medium}{medium} \setinterfacevariable{middle}{middle} \setinterfacevariable{min}{min} +\setinterfacevariable{mindepth}{mindepth} \setinterfacevariable{minheight}{minheight} \setinterfacevariable{minwidth}{minwidth} \setinterfacevariable{mirrored}{mirrored} @@ -730,6 +734,7 @@ \setinterfaceconstant{marking}{marking} \setinterfaceconstant{marstyle}{marstyle} \setinterfaceconstant{max}{max} +\setinterfaceconstant{maxdepth}{maxdepth} \setinterfaceconstant{maxheight}{maxheight} \setinterfaceconstant{maxwidth}{maxwidth} \setinterfaceconstant{maybeyear}{maybeyear} diff --git a/tex/context/base/mult-fr.tex b/tex/context/base/mult-fr.tex index 93dd1cd9d..80c2c48c1 100644 --- a/tex/context/base/mult-fr.tex +++ b/tex/context/base/mult-fr.tex @@ -269,11 +269,15 @@ \setinterfacevariable{mathcases}{mathcases} \setinterfacevariable{mathmatrix}{mathmatrix} \setinterfacevariable{max}{max} +\setinterfacevariable{maxdepth}{maxdepth} +\setinterfacevariable{maxheight}{maxheight} +\setinterfacevariable{maxwidth}{maxwidth} \setinterfacevariable{may}{mai} \setinterfacevariable{mediaeval}{medieval} \setinterfacevariable{medium}{moyen} \setinterfacevariable{middle}{milieu} \setinterfacevariable{min}{min} +\setinterfacevariable{mindepth}{mindepth} \setinterfacevariable{minheight}{hauteurmin} \setinterfacevariable{minwidth}{largeurmin} \setinterfacevariable{mirrored}{reflete} @@ -730,6 +734,7 @@ \setinterfaceconstant{marking}{marquage} \setinterfaceconstant{marstyle}{stylemarquage} \setinterfaceconstant{max}{max} +\setinterfaceconstant{maxdepth}{maxdepth} \setinterfaceconstant{maxheight}{hauteurmax} \setinterfaceconstant{maxwidth}{largeurmax} \setinterfaceconstant{maybeyear}{maybeyear} diff --git a/tex/context/base/mult-it.tex b/tex/context/base/mult-it.tex index 1efbb1a00..c7857e29b 100644 --- a/tex/context/base/mult-it.tex +++ b/tex/context/base/mult-it.tex @@ -269,11 +269,15 @@ \setinterfacevariable{mathcases}{mathcases} \setinterfacevariable{mathmatrix}{mathmatrix} \setinterfacevariable{max}{max} +\setinterfacevariable{maxdepth}{maxdepth} +\setinterfacevariable{maxheight}{maxheight} +\setinterfacevariable{maxwidth}{maxwidth} \setinterfacevariable{may}{maggio} \setinterfacevariable{mediaeval}{medievale} \setinterfacevariable{medium}{medio} \setinterfacevariable{middle}{centro} \setinterfacevariable{min}{min} +\setinterfacevariable{mindepth}{mindepth} \setinterfacevariable{minheight}{altezzamin} \setinterfacevariable{minwidth}{ampiezzamin} \setinterfacevariable{mirrored}{riflesso} @@ -730,6 +734,7 @@ \setinterfaceconstant{marking}{marcatura} \setinterfaceconstant{marstyle}{stilemarcatura} \setinterfaceconstant{max}{max} +\setinterfaceconstant{maxdepth}{maxdepth} \setinterfaceconstant{maxheight}{altezzamax} \setinterfaceconstant{maxwidth}{ampiezzamax} \setinterfaceconstant{maybeyear}{maybeyear} diff --git a/tex/context/base/mult-nl.tex b/tex/context/base/mult-nl.tex index 2c465ca46..a42d9c80f 100644 --- a/tex/context/base/mult-nl.tex +++ b/tex/context/base/mult-nl.tex @@ -269,11 +269,15 @@ \setinterfacevariable{mathcases}{mathcases} \setinterfacevariable{mathmatrix}{wiskundematrix} \setinterfacevariable{max}{max} +\setinterfacevariable{maxdepth}{maxdepth} +\setinterfacevariable{maxheight}{maxheight} +\setinterfacevariable{maxwidth}{maxwidth} \setinterfacevariable{may}{mei} \setinterfacevariable{mediaeval}{mediaeval} \setinterfacevariable{medium}{middel} \setinterfacevariable{middle}{midden} \setinterfacevariable{min}{min} +\setinterfacevariable{mindepth}{mindepth} \setinterfacevariable{minheight}{minhoogte} \setinterfacevariable{minwidth}{minbreedte} \setinterfacevariable{mirrored}{gespiegeld} @@ -730,6 +734,7 @@ \setinterfaceconstant{marking}{markering} \setinterfaceconstant{marstyle}{marletter} \setinterfaceconstant{max}{max} +\setinterfaceconstant{maxdepth}{maxdepth} \setinterfaceconstant{maxheight}{maxhoogte} \setinterfaceconstant{maxwidth}{maxbreedte} \setinterfaceconstant{maybeyear}{maybeyear} diff --git a/tex/context/base/mult-ro.tex b/tex/context/base/mult-ro.tex index b0c1beadd..17f23e3ca 100644 --- a/tex/context/base/mult-ro.tex +++ b/tex/context/base/mult-ro.tex @@ -269,11 +269,15 @@ \setinterfacevariable{mathcases}{mathcases} \setinterfacevariable{mathmatrix}{mathmatrix} \setinterfacevariable{max}{max} +\setinterfacevariable{maxdepth}{maxdepth} +\setinterfacevariable{maxheight}{maxheight} +\setinterfacevariable{maxwidth}{maxwidth} \setinterfacevariable{may}{mai} \setinterfacevariable{mediaeval}{medieval} \setinterfacevariable{medium}{mediu} \setinterfacevariable{middle}{centru} \setinterfacevariable{min}{min} +\setinterfacevariable{mindepth}{mindepth} \setinterfacevariable{minheight}{inaltimeminima} \setinterfacevariable{minwidth}{latimeminima} \setinterfacevariable{mirrored}{oglindit} @@ -730,6 +734,7 @@ \setinterfaceconstant{marking}{marcaje} \setinterfaceconstant{marstyle}{stilmarcaj} \setinterfaceconstant{max}{max} +\setinterfaceconstant{maxdepth}{maxdepth} \setinterfaceconstant{maxheight}{inaltimemaxima} \setinterfaceconstant{maxwidth}{latimemaxima} \setinterfaceconstant{maybeyear}{maybeyear} diff --git a/tex/context/base/mult-sys.tex b/tex/context/base/mult-sys.tex index 123ff79bd..0fc975816 100644 --- a/tex/context/base/mult-sys.tex +++ b/tex/context/base/mult-sys.tex @@ -461,6 +461,7 @@ \definesystemvariable {fu} % FontSolution \definesystemvariable {fv} % FontVariant \definesystemvariable {fx} % FoXet +\definesystemvariable {gr} % GRid \definesystemvariable {ha} % HAng \definesystemvariable {hs} % HSpace \definesystemvariable {ht} % HiddenText @@ -595,6 +596,7 @@ \definesystemvariable {tm} % TypesynonyM \definesystemvariable {tp} % TyPen \definesystemvariable {tx} % TeXtflow +\definesystemvariable {to} % TOlerance \definesystemvariable {tr} % TRacer \definesystemvariable {ts} % TypeScript \definesystemvariable {tt} % TabulaTe diff --git a/tex/context/base/node-ini.mkiv b/tex/context/base/node-ini.mkiv index 210f21229..76a714704 100644 --- a/tex/context/base/node-ini.mkiv +++ b/tex/context/base/node-ini.mkiv @@ -29,6 +29,7 @@ \registerctxluafile{node-ser}{1.001} \registerctxluafile{node-ext}{1.001} \registerctxluafile{node-inj}{1.001} % we might split it off +\registerctxluafile{node-typ}{1.001} % experimental \newtoks \attributesresetlist diff --git a/tex/context/base/node-res.lua b/tex/context/base/node-res.lua index 6f845be7a..f147981ed 100644 --- a/tex/context/base/node-res.lua +++ b/tex/context/base/node-res.lua @@ -60,6 +60,8 @@ local glyph = nodes.register(new_node("glyph",0)) local textdir = nodes.register(new_node("whatsit",7)) local rule = nodes.register(new_node("rule")) local latelua = nodes.register(new_node("whatsit",35)) +--~ local user = nodes.register(new_node("user_defined")) +local user = nodes.register(new_node(44)) function nodes.glyph(fnt,chr) local n = copy_node(glyph) @@ -109,6 +111,31 @@ function nodes.latelua(code) return n end +function nodes.usernumber(num) + local n = copy_node(user) + n.type = 100 + if num then n.value = num end + return n +end +function nodes.userstring(str) + local n = copy_node(user) + n.type = 115 + if str then n.value = str end + return n +end +function nodes.userlist(list) + local n = copy_node(user) + n.type = 110 + if list then n.value = list end + return n +end +function nodes.usertokens(tokens) + local n = copy_node(user) + n.type = 116 + if tokens then n.value = tokens end + return n +end + statistics.register("cleaned up reserved nodes", function() return format("%s nodes, %s lists of %s", nodes.cleanup_reserved(tex.count["lastallocatedbox"])) end) -- \topofboxstack diff --git a/tex/context/base/node-typ.lua b/tex/context/base/node-typ.lua new file mode 100644 index 000000000..2562378d1 --- /dev/null +++ b/tex/context/base/node-typ.lua @@ -0,0 +1,51 @@ +if not modules then modules = { } end modules ['node-typ'] = { + version = 1.001, + comment = "companion to node-ini.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local utfvalues = string.utfvalues + +local newglyph = nodes.glyph +local newglue = nodes.glue + +local hpack, vpack = node.hpack, node.vpack + +typesetting = typesetting or { } + +local function tonodes(str,fontid,spacing) + local head, prev = nil, nil + for s in utfvalues(str) do + local next + if spacing and s == 32 then + next = newglue(spacing or 64*1024*10) + else + next = newglyph(fontid or 1,s) + end + if not head then + head = next + else + prev.next = next + next.prev = prev + end + prev = next + end + return head +end + +typesetting.tonodes = tonodes + +function typesetting.hpack(str,fontid,spacing) + return hpack(tonodes(str,fontid,spacing)) +end + +function typesetting.vpack(str,fontid,spacing) + -- vpack is just a hack, and a proper implentation is on the agenda + -- as it needs more info etc than currently available + return vpack(tonodes(str,fontid,spacing)) +end + +--~ node.write(typesetting.hpack("Hello World!")) +--~ node.write(typesetting.hpack("Hello World!",1,100*1024*10)) diff --git a/tex/context/base/pack-lyr.mkiv b/tex/context/base/pack-lyr.mkiv index 2e1bd2a11..1312948b2 100644 --- a/tex/context/base/pack-lyr.mkiv +++ b/tex/context/base/pack-lyr.mkiv @@ -649,13 +649,13 @@ % The next mechanism is obsolete and will be removed in \MKIV\ (or move to % the compatibility module. -% \newskip\xposition \newskip\yposition -% \newskip\xdimension \newskip\ydimension -% \newskip\xoffset \newskip\yoffset +\newskip\xposition \newskip\yposition +\newskip\xdimension \newskip\ydimension +\newskip\xoffset \newskip\yoffset % already defined \newbox\positionbox -\def\startpositioning +\unexpanded\def\startpositioning {\bgroup \xposition \zeropoint \yposition \zeropoint \xdimension\zeropoint \ydimension\zeropoint @@ -663,7 +663,7 @@ \hfuzz \paperwidth \vfuzz \paperheight \setbox\positionbox\hbox\bgroup} -\def\stoppositioning +\unexpanded\def\stoppositioning {\doifnot\@@psoffset\v!yes {\global\xoffset\zeropoint \global\yoffset\zeropoint}% diff --git a/tex/context/base/page-ini.mkiv b/tex/context/base/page-ini.mkiv index e9d744b19..96590d9a1 100644 --- a/tex/context/base/page-ini.mkiv +++ b/tex/context/base/page-ini.mkiv @@ -508,8 +508,7 @@ % but does not hurt either (we're still in the otr!) \inpagebodytrue % needed for enabling \blank ! \flushsavedfloats % was \dosetbothinserts; only otr one ! - \setvsize % this is needed for interacting components, like floats and multicolumns - \adaptfuzzypagegoal} % watch this hack! + \setvsize} % this is needed for interacting components, like floats and multicolumns \def\dofinaloutput#1#2% \vbox: prevents spurious spaces in every..pagebody {\forgetall diff --git a/tex/context/base/page-lay.mkiv b/tex/context/base/page-lay.mkiv index 18972c350..179d9a29f 100644 --- a/tex/context/base/page-lay.mkiv +++ b/tex/context/base/page-lay.mkiv @@ -434,6 +434,8 @@ {\expanded{\dododosetuppapersize[\layoutparameter\c!page][\layoutparameter\c!paper]}}% \dorecalculatelayout} +\ifdefined\docheckgridsnapping \else \let\docheckgridsnapping\relax \fi + \def\dorecalculatelayout {%\the\everybeforelayout \setups[\layoutparameter\c!preset]% @@ -448,12 +450,7 @@ \global\backspace \layoutparameter\c!backspace \global\topspace \layoutparameter\c!topspace \setlayoutdimensions % the rest of the `dimensions' - \doifelse\@@lygrid\v!yes\gridsnappingtrue\gridsnappingfalse - \ifgridsnapping - \setsystemmode\v!grid - \else - \resetsystemmode\v!grid - \fi + \docheckgridsnapping \setups[\layoutparameter\c!setups]% depends on gridsnapping ! \simplesetupwhitespace \simplesetupblank @@ -535,7 +532,6 @@ \calculatehsizes \calculatevsizes \calculatepseudocolumns - \checkgridsnapping \recalculatebackgrounds} \def\calculatepseudocolumns diff --git a/tex/context/base/page-one.mkiv b/tex/context/base/page-one.mkiv index 4c7ea8dfa..6e078596f 100644 --- a/tex/context/base/page-one.mkiv +++ b/tex/context/base/page-one.mkiv @@ -33,61 +33,6 @@ \def\OTRONEsethsize {\global\hsize\textwidth} -% keep (original one) -% -% \def\OTRONEsetvsize -% {\ifdim\vsize=\teksthoogte \else -% \bgroup -% \scratchdimen-\vsize -% \advance\scratchdimen \teksthoogte -% \global\advance\vsize \scratchdimen -% \relax \ifdim\pagegoal<\maxdimen -% \advance\scratchdimen \pagegoal -% \global\pagegoal\scratchdimen -% \fi -% \egroup -% \fi} -% -% no (keep) -% -% \def\OTRONEsetvsize -% {\ifdim\vsize=\teksthoogte \else -% \bgroup -% \scratchdimen-\vsize -% \advance\scratchdimen \teksthoogte -% \ifgridsnapping -% \getrawnoflines\scratchdimen -% \scratchdimen\noflines\openlineheight -% \ifdim\scratchdimen>\noflinesheight % available afterwards -% \advance\scratchdimen-\openlineheight -% \fi -% \ifdim\scratchdimen<\zeropoint -% \scratchdimen\zeropoint -% \fi -% \fi -% \global\advance\vsize \scratchdimen -% \relax \ifdim\pagegoal<\maxdimen -% \advance\scratchdimen \pagegoal -% \global\pagegoal\scratchdimen -% \fi -% \egroup -% \fi} - -% \def\OTRONEsetvsize -% {\ifgridsnapping -% \ifcase\layoutlines -% \getrawnoflines\teksthoogte -% \else -% \noflines\layoutlines -% \fi -% \global\vsize\noflines\openlineheight -% \else -% \global\vsize\teksthoogte -% \fi -% \ifdim\pagegoal<\maxdimen -% \global\pagegoal\vsize -% \fi} - \newdimen\oldvsize \def\OTRONEsetvsize @@ -362,17 +307,6 @@ \fi \fi} -% \def\OTRONEdotopinsertions -% {\ifvoid\topins\else -% \ifgridsnapping -% \box\topins -% \vskip-\topskip \vskip\strutheight % [xx] new: see icare topbleed -% \else -% \unvbox\topins -% \fi -% \fi -% \global\topinserted\zeropoint} - \chardef\topinserttopskipmode=0 % 1 no topskip \def\OTRONEdotopinsertions diff --git a/tex/context/base/page-sid.mkiv b/tex/context/base/page-sid.mkiv index 3de537787..26cc9c026 100644 --- a/tex/context/base/page-sid.mkiv +++ b/tex/context/base/page-sid.mkiv @@ -784,7 +784,7 @@ \def\doadjustsidefloatdisplaylines {\par - \vskip-\parskip + % not in mkiv: \vskip-\parskip \noindent \ignorespaces} diff --git a/tex/context/base/scrn-but.mkiv b/tex/context/base/scrn-but.mkiv index 6beaee757..895603c07 100644 --- a/tex/context/base/scrn-but.mkiv +++ b/tex/context/base/scrn-but.mkiv @@ -121,6 +121,7 @@ \c!color=\@@iacolor, \c!contrastcolor=\@@iacontrastcolor, \c!samepage=\v!yes, - \c!unknownreference=\v!yes] + \c!unknownreference=\v!yes, + \c!distance=\zeropoint] % for menubuttons \protect \endinput diff --git a/tex/context/base/scrn-men.mkiv b/tex/context/base/scrn-men.mkiv index ae95a5c04..9fed11291 100644 --- a/tex/context/base/scrn-men.mkiv +++ b/tex/context/base/scrn-men.mkiv @@ -546,6 +546,7 @@ \c!state=\v!start, \c!samepage=\v!yes, \c!unknownreference=\v!empty, + \c!distance=\bodyfontsize, % 12pt \c!topoffset=\zeropoint, \c!bottomoffset=\zeropoint, \c!leftoffset=\zeropoint, @@ -556,7 +557,6 @@ [\c!before=, \c!after=\vfil, \c!inbetween=\blank, - \c!distance=\bodyfontsize, % 12pt \c!left=\hss, \c!right=\hss, \c!height=\v!broad] @@ -566,7 +566,6 @@ [\c!before=\vss, \c!after=\vss, \c!middle=\hfil, - \c!distance=\bodyfontsize, % 12pt \c!width=\v!fit, \c!height=\v!broad] diff --git a/tex/context/base/spac-ali.mkiv b/tex/context/base/spac-ali.mkiv index 47d44e24b..a684e21c3 100644 --- a/tex/context/base/spac-ali.mkiv +++ b/tex/context/base/spac-ali.mkiv @@ -33,8 +33,7 @@ \unexpanded\def\righttoleft{\textdir TRT\pardir TRT\relax} \def\dodefinehbox[#1][#2]% - {\setvalue{hbox#1}##1% - {\hbox to #2{\begstrut##1\endstrut\hss}}} + {\setvalue{hbox#1}##1{\hbox to #2{\begstrut##1\endstrut\hss}}} \def\definehbox {\dodoubleargument\dodefinehbox} @@ -86,8 +85,8 @@ \def\raggedcommand{\the\everyraggedcommand} \def\dodosetraggedcommand#1% beware: #1=empty is ignored, keep that! - {\everyraggedcommand \emptytoks - \let\raggedtopcommand \empty + {\everyraggedcommand\emptytoks + \let\raggedtopcommand\empty \let\raggedbottomcommand\empty \chardef\raggedoneliner\zerocount \doifsomething{#1} @@ -446,9 +445,6 @@ \installalign \v!verytolerant {\tolerance4500 \relax} \installalign \v!stretch {\emergencystretch\bodyfontsize} -\installalign \v!grid {\doenablegridsnapping } % only mkiv -\installalign \v!nogrid {\dodisablegridsnapping} % only mkiv - \installalign \v!righttoleft {\lefttoright} \installalign \v!lefttoright {\righttoleft} \installalign {l2r} {\lefttoright} @@ -531,10 +527,10 @@ % plain commands -\ifx\undefined\line \def\line {\hbox to\hsize} \fi -\ifx\undefined\leftline \def\leftline #1{\line{#1\hss}} \fi -\ifx\undefined\rightline \def\rightline #1{\line{\hss#1}} \fi -\ifx\undefined\centerline \def\centerline#1{\line{\hss#1\hss}} \fi +\ifdefined\line \else \def\line {\hbox to\hsize} \fi +\ifdefined\leftline \else \def\leftline #1{\line{#1\hss}} \fi +\ifdefined\rightline \else \def\rightline #1{\line{\hss#1}} \fi +\ifdefined\centerline \else \def\centerline#1{\line{\hss#1\hss}} \fi % directe commando's diff --git a/tex/context/base/spac-fnt.mkiv b/tex/context/base/spac-fnt.mkiv index fae32c94b..d8fc46a5e 100644 --- a/tex/context/base/spac-fnt.mkiv +++ b/tex/context/base/spac-fnt.mkiv @@ -13,7 +13,7 @@ \writestatus{loading}{ConTeXt Spacing Macros / Fonts} -%D For historic reasons here, will move: +%D For historic reasons here, will move and/or disappear: \unprotect diff --git a/tex/context/base/spac-gen.mkii b/tex/context/base/spac-gen.mkii index 4f365b498..5fab917f9 100644 --- a/tex/context/base/spac-gen.mkii +++ b/tex/context/base/spac-gen.mkii @@ -2605,6 +2605,9 @@ [ \v!left=>\global\advance\ctxleftskip \@@slleft, \v!middle=>\global\advance\ctxmidskip \@@slmiddle, \v!right=>\global\advance\ctxrightskip \@@slright, + -\v!left=>\global\advance\ctxleftskip -\@@slleft, + -\v!middle=>\global\advance\ctxmidskip -\@@slmiddle, + -\v!right=>\global\advance\ctxrightskip-\@@slright, \v!reset=>\global\ctxleftskip \zeropoint \global\ctxmidskip \zeropoint \global\ctxrightskip\zeropoint, diff --git a/tex/context/base/spac-grd.lua b/tex/context/base/spac-grd.lua deleted file mode 100644 index 81e0c6e16..000000000 --- a/tex/context/base/spac-grd.lua +++ /dev/null @@ -1,41 +0,0 @@ --- educational: snapper - ---~ function demo_snapper(head,where) -- snap_category 105 / nodes.snapvalue = { [1] = { 8*65536, 4*65536, 12*65536 } } ---~ if head then ---~ local current, tail, dummy = head, nil, nil ---~ while current do ---~ local id = current.id ---~ if id == glue and current.subtype == 2 then ---~ local sn = has_attribute(current,snap_category) ---~ if sn then ---~ local sv = nodes.snapvalues[sn] ---~ if sv then ---~ head, current, dummy = node.delete(head, current) ---~ free_node(dummy) ---~ else ---~ current = current.next ---~ end ---~ else ---~ current = current.next ---~ end ---~ else ---~ if id == hlist and where == 'hmode_par' and current.list then ---~ local sn = has_attribute(current.list,snap_category) ---~ if sn then ---~ local sv = nodes.snapvalues[sn] ---~ if sv then ---~ local height, depth, lineheight = sv[1], sv[2], sv[3] ---~ current.height = math.ceil((current.height-height)/lineheight)*lineheight + height ---~ current.depth = math.ceil((current.depth -depth )/lineheight)*lineheight + depth ---~ end ---~ end ---~ end ---~ current = current.next ---~ end ---~ tail = current ---~ end ---~ end ---~ return head ---~ end - ---~ callback.register('buildpage_filter', demo_snapper) diff --git a/tex/context/base/spac-grd.mkiv b/tex/context/base/spac-grd.mkiv index 3fa47de57..e55c7db48 100644 --- a/tex/context/base/spac-grd.mkiv +++ b/tex/context/base/spac-grd.mkiv @@ -11,11 +11,22 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. +%D This module will be merged intio spac-ver.mkiv. + \writestatus{loading}{ConTeXt Spacing Macros / Grid Snapping} -\unprotect +% buff-ver.mkiv: halfline spacing +% strc-mat.mkiv: configure math grid (new code needed) +% page-one.mkiv: to be checked +% page-mul.mkiv: to be checked and redone +% page-sid.mkiv: to be checked +% page-set.mkiv: to be checked +% strc-not.mkiv: to be checked +% strc-ren.mkiv: to be checked +% strc-flt.mkiv: to be checked (captions, probably top/bottom) +% core-mis.mkiv: to be checked (placement, probbaly harmless) -\newif \iffuzzyvskip +\unprotect %D Helpers: @@ -94,13 +105,6 @@ \let\thenegtopbaselinecorrection\!!zeropoint \let\thenegbotbaselinecorrection\!!zeropoint -\definepalet - [grid] - [ one=red, - two=green, - three=blue, - four=gray] - \def\setbaselinecorrections {\setbox0\hbox{\setstrut\strut}% \setbox2\hbox{(}% @@ -140,18 +144,6 @@ \kern\strutdp \prevdepth\strutdp} -% \def\baselinecorrection -% {\endgraf -% \ifvmode -% \ifdim\prevdepth<\maxdimen -% \ifdim\prevdepth<\zeropoint \else -% \ifdim\prevdepth<\strutdp -% \dobaselinecorrection -% \fi -% \fi -% \fi -% \fi} - \def\baselinecorrection {\endgraf \ifvmode @@ -177,31 +169,6 @@ \fi \fi} -% Beware, keep this one as it is, see for instance module -% m-steps.tex, where we apply a \localhsize to the \vbox, in -% order to follow narrower and side floats ! - -% \def\startbaselinecorrection -% {\baselinecorrection -% \ifvmode -% \bgroup -% \setbox\scratchbox\vbox\bgroup -% \ignorespaces -% \let\stopbaselinecorrection\dostopbaselinecorrection -% \else -% \let\stopbaselinecorrection\relax -% \fi} - -% \def\dostopbaselinecorrection % I have to check columns yet. -% {\endgraf -% \egroup -% \topbaselinecorrection -% \box\scratchbox -% \botbaselinecorrection -% \egroup} - -% \let\stopbaselinecorrection=\relax - \def\startbaselinecorrection {\bgroup \let\stopbaselinecorrection\egroup @@ -241,9 +208,6 @@ %D is not needed, but I want to look the visualization as good %D as possible too. -% \def\offbaselinecorrection % Can be used inside correction. -% {\def\startbaselinecorrection{\bgroup\let\stopbaselinecorrection\egroup}} - \chardef\baselinecorrectionmode\plusone \def\onbaselinecorrection {\chardef\baselinecorrectionmode\plusone } @@ -255,17 +219,6 @@ %D %D The actual top and bottom corrections are implemented as: -% \def\topbaselinecorrection -% {\ifvmode \ifdim\pagegoal<\maxdimen -% \bgroup -% \setbaselinecorrections -% \whitespace -% \nointerlineskip -% \dotopbaselinecorrection -% \egroup -% \fi \fi} - - \def\topbaselinecorrection {\ifvmode \ifdim\pagegoal<\maxdimen \forcedtopbaselinecorrection @@ -292,804 +245,15 @@ \fi} \let\forcedbotbaselinecorrection\botbaselinecorrection - -%D Still very experimental and therefore undocumented. - -\newif\ifgridsnapping % UNDER DEVELOPMENT, USE WITH CARE -\newif\ifforcepresnap \forcepresnaptrue % false in mixed single/double -\newif\ifstrutsnapping \strutsnappingtrue % sometimes handy to be false - -\def\positiveextrasnap {\gdef\extrasnapsign{+}} -\def\negativeextrasnap {\gdef\extrasnapsign{-}} - -\def\extrasnapreset {\global\chardef\@@extrasnap0 - \positiveextrasnap} -\def\extrasnapbefore {\global\chardef\@@extrasnap1 } -\def\extrasnaparound {\global\chardef\@@extrasnap2 } -\def\extrasnapafter {\global\chardef\@@extrasnap3 } - -\def\enablepresnapcorrection {\global\chardef\@@presnap\zerocount} -\def\disablepresnapcorrection {\global\chardef\@@presnap\plusone} - -\extrasnapreset \enablepresnapcorrection - -\newif\iftracegridsnapping -\newif\ifshowgridboxes -\newif\ifshowfuzzyskips - -\let\showgridboxes\showgridboxestrue - -\def\showgridsnapping - {\tracegridsnappingtrue - \showgridboxestrue} - -\chardef\@@alignsnap =0 -\chardef\@@alignsnapbox =0 -\chardef\@@alignsnapmethod=0 - -\let\presnapskip \!!zeropoint \def\presnap {-} -\let\postsnapskip\!!zeropoint \let\postsnap\presnap - -\newcount\currentgridsnap - -\def\tracedsnapping - {\iftracegridsnapping - \llap - {\setlayoutcomponentattribute\v!grid\v!test - \hbox \layoutcomponentboxattribute - {\infofont - \global\advance\currentgridsnap\plusone - \color[grid:three] - {\vl\presnapskip - \vl\presnap - \vl\postsnap - \ifcase\@@alignsnapbox\relax\vl\ifcase\@@extrasnap00\or\extrasnapsign0\or\extrasnapsign\extrasnapsign\or0\extrasnapsign\fi\fi - \vl\the\currentgridsnap\vl}}}% - \fi} - -\def\snaptogrid% [#1]#2 -> #2 == \hbox|\vbox - {\dosingleempty\dosnaptogrid} - -% \def\dosnaptogrid[#1]% -% {\ifgridsnapping -% \iffirstargument\doifsomething{#1}{\verplaatsopgrid[#1]}\fi -% \expandafter\dodosnaptogrid -% \fi} - -% \def\dosnaptogrid[#1]% -% {\resetlastlinewidth % maybe in more places, otherwise spacing gets messed up -% \ifgridsnapping -% \iffirstargument\doifsomething{#1}{\moveongrid[#1]}\fi -% \expandafter\dodosnaptogrid -% \fi} - -\def\dosnaptogrid[#1]% - {\resetlastlinewidth % maybe in more places, otherwise spacing gets messed up - \doifinsetelse\v!force{#1}% - {\moveongrid[#1]% - \dodosnaptogrid} - {\ifgridsnapping - \doifsomething{#1}{\moveongrid[#1]}% - \expandafter\dodosnaptogrid - \fi}} - -% \def\forcedpresnapcorrection % test this on 'details' -% {\ifforcepresnap -% \ifvmode \else \par \fi % new -% % we don't want top of page space when 'top' option -% %\verticalstrut\nobreak\vskip-\struttotal -% %\verticalstrut\vskip-\struttotal -% % nobreak really needed -% \allowbreak\verticalstrut\nobreak\vskip-\struttotal -% %\ifdim\pagetotal>\topskip \else -% % eigenlijk signal -% %\writestatus{grid}{removing dummy at top of page}% -% %\bgroup -% %\output{\setbox\scratchbox\box255}% -% %\penalty\outputpenalty -% %\egroup -% %\fi -% \fi} - -\def\forcedpresnapcorrection % test this on 'details' - {\ifforcepresnap - \ifvmode \else \par \fi % new - % we don't want top of page space when 'top' option - % \verticalstrut\nobreak\vskip-\struttotal - % \verticalstrut\vskip-\struttotal - % \nobreak really needed - % \dosomebreak\allowbreak % no: spoils heads, so only under know situation, not in snapper - \verticalstrut - \nobreak - \vskip-\struttotal - %\ifdim\pagetotal>\topskip \else - % eigenlijk signal - %\writestatus{grid}{removing dummy at top of page}% - %\bgroup - %\output{\setbox\scratchbox\box255}% - %\penalty\outputpenalty - %\egroup - %\fi - \fi} - -\def\setgridtracebox#1[#2]% % maybe reverse the order - {\setbox\nextbox#1% - {\hbox - {\hbox to \zeropoint - {\setlayoutcomponentattribute\v!grid\v!test - \color[grid:#2]{\ruledhbox \layoutcomponentboxattribute {\fakebox\nextbox}}% - \hss}% - \flushnextbox}}} -\newif\ifboxedsnapping \boxedsnappingtrue - -\chardef\depthsnapmethod \plusone % downward compatible, minus one line -\chardef\heightsnapmethod\plusone % downward compatible, minus one line - -\def\dodosnaptogrid - {\dowithnextbox - {\bgroup - \ifcase\@@alignsnapmethod \or - % we're dealing with text with a possible big depth/height - \chardef\depthsnapmethod \plustwo - \chardef\heightsnapmethod\plustwo - \fi - \ifdim\nextboxht<\textheight % handle special case (like page fig) - \ifcase\@@alignsnapbox\relax - \ifcase\@@alignsnap\else % 1=top 2=high 3=middle 4=low - \ifshowgridboxes - \setgridtracebox\hbox[two]% - \fi - %\getnoflines{\nextboxht}% - \getnoflines\nextboxht - \setbox\nextbox\vbox to \noflines\lineheight - {\ifnum\@@alignsnap=1 \kern\lineheight\kern-\topskip\fi - \ifnum\@@alignsnap>2 \vfill\fi - \flushnextbox - \ifnum\@@alignsnap<4 \vfill\fi}% - \fi - \ifshowgridboxes - \setgridtracebox\hbox[three]% - \fi - \forgetall - \par - \ifvbox\nextbox - \setbox\nextbox\hbox{\flushnextbox}% don't ask - \fi - \scratchskip\lastskip - \edef\presnapskip{\the\lastskip}% - % mixing single/double columns sometimes goes wrong, - % check 'som' document - \ifinsidecolumns - \forcepresnaptrue - \fi - \forcedpresnapcorrection - \ifdim\nextboxht>\strutht - \scratchdimen\nextboxht - \ifcase\@@presnap\relax - \ifdim\scratchskip>\zeropoint\relax - \scratchcounter\scratchskip - \advance\scratchcounter -\openlineheight - \ifnum\scratchcounter<0 - \scratchcounter-\scratchcounter - \fi - \ifnum\scratchcounter<10 % \lastkip is about \openlineheight - \advance\scratchdimen -\openstrutdepth - \edef\presnapskip{*\presnapskip}% - \else\ifdim\scratchskip>\openlineheight - %<\openlineheight \else - \advance\scratchdimen -\openstrutdepth - \edef\presnapskip{*\presnapskip}% - \fi\fi - \fi - \fi - % \getnoflines\scratchdimen % maybe raw ? - % \advance\noflines -1 - \ifcase\heightsnapmethod - % raw - \or - \advance\scratchdimen-\lineheight % tight (default) - \or - \advance\scratchdimen-\strutheight % fit (text) - \or - \advance\scratchdimen-\strutheight % tolerant - \advance\scratchdimen-\roundingeps - \fi - \getnoflines\scratchdimen - \ifnum\noflines>0 - \scratchdimen\noflines\lineheight - \else - \scratchdimen\zeropoint - \fi - \else - \scratchdimen\zeropoint - \fi - \ifnum\@@extrasnap=1 \advance\scratchdimen \extrasnapsign \lineheight \fi - \ifnum\@@extrasnap=2 \advance\scratchdimen \extrasnapsign.5\lineheight \fi - \edef\presnap{\the\scratchdimen}% - \ifstrutsnapping - \ifboxedsnapping - \getrawnoflines\scratchdimen - \advance\scratchdimen-\noflines\lineheight - \vskip\scratchdimen % disappears at top of page - \dorecurse\noflines{\verticalstrut\nobreak}% - \else \ifdim\scratchdimen=\zeropoint - % nothing to skip - \else % disappears at top of page - \vskip\scratchdimen - \fi \fi - \fi - \ifdim\nextboxdp>\strutdp - % \getnoflines\nextboxdp - % \advance\noflines \minusone - \scratchdimen\nextboxdp\relax - \ifcase\depthsnapmethod - % raw - \or - \advance\scratchdimen-\lineheight % tight (default) - \or - \advance\scratchdimen-\strutdepth % fit (text) - \or - \advance\scratchdimen-\strutdepth % tolerant - \advance\scratchdimen-\roundingeps - \fi - \getnoflines\scratchdimen - \ifnum\noflines>0 - \scratchdimen\noflines\lineheight - \else - \scratchdimen\zeropoint - \fi - \else - \scratchdimen\zeropoint - \fi - \ifnum\@@extrasnap=2 \advance\scratchdimen \extrasnapsign.5\lineheight \fi - \ifnum\@@extrasnap=3 \advance\scratchdimen \extrasnapsign \lineheight \fi - \edef\postsnap{\the\scratchdimen}% - \ifstrutsnapping - \nextboxht\strutht - \nextboxdp\strutdp - \else - \scratchdimen\presnap - \advance\scratchdimen \strutht - \nextboxht\scratchdimen - \scratchdimen\postsnap - \advance\scratchdimen \strutdp - \nextboxdp\scratchdimen - \fi - \hbox{\tracedsnapping\flushnextbox}% - \ifstrutsnapping - \ifdim\scratchdimen=\zeropoint\else\vskip\scratchdimen\fi - \fi - \else - \scratchdimen\nextboxht\relax - \ifcase\@@alignsnapbox - % can't happen here - \or - \getrawnoflines\scratchdimen - \else - \getnoflines \scratchdimen - \fi - \scratchdimen\noflines\lineheight\relax - \advance\scratchdimen-\strutdepth - % spoils the whole game (fit/broad/line) - % \ifnum\pagetotal>\zeropoint \else % disable this as option - % \advance\scratchdimen-\strutheight - % \advance\scratchdimen+\topskip - % \fi - \dimen0=\scratchdimen - \dimen2=\strutdepth - \ifshowgridboxes - \setgridtracebox\hbox[two]% - \fi - \nextboxdp\strutdp - \dimen4=\nextboxht - \dimen6=\nextboxdp - \iftracegridsnapping - \setbox\scratchbox\hbox - {\scratchdimen\@@alignsnapamount\relax - \ifdim\scratchdimen<\zeropoint - \tracedgridamount\zeropoint{-\scratchdimen}% - \else - \tracedgridamount\scratchdimen\zeropoint - \fi}% - \smashbox\scratchbox - \setbox\nextbox\hbox{\box\scratchbox\flushnextbox}% - \fi - \setbox\nextbox\hbox - {\scratchdimen\@@alignsnapamount\relax - \ifcase\@@alignsnapdepth\or - % don't change this ever ! - \ifdim\dimen0<\lineheight - % otherwise it is ok, but ending up inside - % the next paragraph is seldom what we want, - % so we move one line up - \advance\scratchdimen-\lineheight - \advance\scratchdimen\strutheight - \else - % otherwise we can move down to the - % baseline - \advance\scratchdimen\dimen6 % == \strutdepth - \fi - \fi - \lower\scratchdimen\flushnextbox}% - \nextboxht\dimen4 - \nextboxdp\dimen6 - \ifnum\@@alignsnap<4 % 4 = regel - \setbox\nextbox\vbox to \scratchdimen - {\forgetall - \ifnum\@@alignsnap>2 \vfill\fi % 3 4 - \flushnextbox - \nointerlineskip % \offinterlineskip - \ifnum\@@alignsnap<4 \vfill\fi % 2 3 - \kern\zeropoint}% - \fi - \ifshowgridboxes - \setgridtracebox\vbox[three]% - \fi - \scratchdimen\@@alignsnapamount - \edef\presnapskip{\the\scratchdimen}% - \ifnum\@@alignsnap>2 \def\presnap {+}\fi - \ifnum\@@alignsnap<4 \def\postsnap{+}\fi - \setbox\nextbox\hbox{\tracedsnapping\flushnextbox}% - \par - \nextboxht\dimen0 - \nextboxdp\dimen2 - \forcedpresnapcorrection - \nointerlineskip - \flushnextbox - \fi - \else - \setbox\nextbox\vbox to \textheight - {\ifdim\nextboxdp=\zeropoint - \hbox{\lower\strutdepth\flushnextbox} - \else % this branch is yet untested - \vss - \hbox{\lower\nextboxdp\flushnextbox} - \vskip-\strutdepth - \fi}% - \nextboxdp\strutdepth - \flushnextbox - \fi - \extrasnapreset - \enablepresnapcorrection - \global\chardef\@@alignsnap\zerocount - \global\chardef\@@alignsnapbox\zerocount - \egroup}} - -\def\tracedgridamount#1#2% - {\startcolor[grid:four]% - \setlayoutcomponentattribute\v!grid\v!test - \hbox \layoutcomponentboxattribute{\vrule\!!width\nextboxwd\!!height#1\!!depth#2}% - \stopcolor} - -\def\snaptomathgrid % probably not working ok, also kind of obsolete - {\ifgridsnapping - \dowithnextbox - {\blank[\v!line]\snaptogrid\vbox{\flushnextbox}\blank[\v!line]} - \vbox\bgroup - \forgetdisplayskips - \@EA\let\@EA\next - \fi} - -\def\topsnaptogrid - {\ifgridsnapping - \dowithnextbox - {\scratchdimen\nextboxht - \advance\scratchdimen -\strutht - \advance\scratchdimen \topskip - \nextboxht\scratchdimen - \nextboxdp\zeropoint - \flushnextbox - \kern\lineheight - \kern-\topskip - \nointerlineskip} - \hbox - \fi} - -% \def\centertogrid % meant for special situations -% {\ifgridsnapping -% \dowithnextboxcontent -% {\ignorespaces} -% {\bgroup -% \par -% \scratchdimen\nextboxht -% \advance\scratchdimen \nextboxdp -% \getnoflines\scratchdimen -% \setbox\nextbox\vbox to \noflines\lineheight -% {\forgetall -% \vskip\zeropoint \!!plus \nextboxht -% \copy\nextbox -% \kern.5\strutdp % VOORLOPIGE WAARDE -% \vskip\zeropoint \!!plus \nextboxdp}% -% \noindent\snaptogrid\vbox{\flushnextbox}% -% \egroup} -% \vbox % was \hbox -% \fi} - -% The next implementation is sub-optimal -% -% \def\centertogrid % usage: see ie pascal / stepcharts -% {\snaptogrid[\v!midden,.5\strutdp]\vbox} - -\def\centertogrid % meant for special situations - {\ifgridsnapping - \dowithnextboxcontent - {\ignorespaces} - {\bgroup - \par - \scratchdimen\nextboxht - \advance\scratchdimen \nextboxdp - \getnoflines\scratchdimen - \setbox\nextbox\vbox to \noflines\lineheight - {\forgetall - \vss - \topbaselinecorrection - \copy\nextbox - \botbaselinecorrection - \vss}% - \setbox\nextbox\hbox{\lower\strutdp\flushnextbox}% - \forgeteverypar % new per 3/4/2008, prevents duplicate pos nodes resulting in extra whitespace - \noindent\snaptogrid\vbox{\flushnextbox}% - \egroup} - \vbox % was \hbox - \fi} - -% testbed for \centertogrid -% -% \strut Bruggetje -% \startlinecorrection -% \startcombination -% {\framed{test}} {} {\framed{test}} {} -% \stopcombination -% \stoplinecorrection -% \strut Bruggetje -% \startlinecorrection -% \startcombination[2*2] -% {\framed{test}} {} {\framed{test}} {} -% {\framed{test}} {} {\framed{test}} {} -% \stopcombination -% \stoplinecorrection -% \strut Bruggetje -% \startlinecorrection[blank] -% \startcombination -% {\framed{test}} {} {\framed{test}} {} -% \stopcombination -% \stoplinecorrection -% \strut Bruggetje -% \startlinecorrection[blank] -% \startcombination[2*2] -% {\framed{test}} {} {\framed{test}} {} -% {\framed{test}} {} {\framed{test}} {} -% \stopcombination -% \stoplinecorrection -% \strut Bruggetje -% \startlinecorrection -% \startcombination -% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} -% \stopcombination -% \stoplinecorrection -% \strut Bruggetje -% \startlinecorrection -% \startcombination[2*2] -% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} -% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} -% \stopcombination -% \stoplinecorrection -% \strut Bruggetje -% \startlinecorrection[blank] -% \startcombination -% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} -% \stopcombination -% \stoplinecorrection -% \strut Bruggetje -% \startlinecorrection[blank] -% \startcombination[2*2] -% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} -% {\framed[lines=1]{test}} {} {\framed[lines=1]{test}} {} -% \stopcombination -% \stoplinecorrection - -\ifx\startbaselinecorrection\undefined \wait \fi % change order - -\let\normalstartbaselinecorrection=\startbaselinecorrection +\let\normalstartbaselinecorrection\startbaselinecorrection \def\startbaselinecorrection {\ifgridsnapping - \centertogrid\bgroup + \snaptogrid[v!normal]\vbox\bgroup \let\stopbaselinecorrection\egroup \else \normalstartbaselinecorrection \fi} -\chardef\gridboxlinenomode\plusone -\chardef\gridboxlinemode \plusone % 0:nothing 1:all 2:lines 3:frame - -\def\gridboxvbox {\ifcase\gridboxlinemode\vbox\or\ruledvbox\or\vbox\or\ruledvbox\else\ruledvbox\fi} -\def\gridboxwidth{\ifcase\gridboxlinemode0\or.5\or.5\or0\else.5\fi\testrulewidth} - -\def\setgridbox#1#2#3% - {\setbox#1\gridboxvbox to #3 % given size - {\forgetall - \resetteststrut - \offinterlineskip - \hsize#2% - \baselinerulefalse - \gridboxvbox % calculated size - {\getrawnoflines{#3}% \getnoflines{#3}% - \vskip\topskip - \vskip-\strutht - \scratchdimen#2\advance\scratchdimen \lineheight - \dorecurse\noflines - {\strut - \hskip-.5\lineheight - \ifcase\gridboxlinenomode\or - \rlap - {\hskip.2\bodyfontsize\hskip\scratchdimen - \infofont\hbox to 1em{\hss\recurselevel}}% - \or - \llap - {\infofont\hbox to 1em{\hss\recurselevel}% - \hskip.2\bodyfontsize}% - \fi - \vrule - \!!height \gridboxwidth - \!!depth \gridboxwidth - \!!width \scratchdimen - \par}} - \vfill}} - -%D Some intervention macros: - -\def\gridwarning#1{\message{[beware of #1 extra snap]}} - -\global\let\@@alignsnapamount\!!zeropoint -\global\chardef\@@alignsnapdepth0 - -\def\@@unknowngriddisplacement - {\global\chardef\@@alignsnapbox\plusthree - \global\let\@@alignsnapamount\commalistelement} - -\def\domoveongrid[#1]% - {\ifgridsnapping\doifsomething{#1}{\dodomoveongrid[#1]}\fi} - -\def\dodomoveongrid[#1]% some day : speed up - {\global\chardef\@@alignsnap\zerocount - \global\chardef\@@alignsnapbox\zerocount - \global\chardef\@@alignsnapdepth\zerocount - \global\chardef\@@alignsnapmethod\zerocount - \global\let\@@alignsnapamount\!!zeropoint - \donefalse - \expanded{\processallactionsinset[#1]} - [\v!standard=>, - \v!normal=>, % to be sure - \v!yes=>, % to be sure - \v!top=>\gridwarning+\positiveextrasnap\extrasnapbefore, - \v!bottom=>\gridwarning+\positiveextrasnap\extrasnapafter, - \v!both=>\positiveextrasnap\extrasnaparound, - -\v!top=>\gridwarning-\negativeextrasnap\extrasnapbefore, - -\v!bottom=>\gridwarning-\negativeextrasnap\extrasnapafter, - -\v!both=>\negativeextrasnap\extrasnaparound, - \v!text=>\global\chardef\@@alignsnapmethod\plusone, % accurate calculations - \v!page=>\global\chardef\@@alignsnap\plusone, % topskip - \v!high=>\global\chardef\@@alignsnap\plustwo, - \v!middle=>\global\chardef\@@alignsnap\plusthree, - \v!low=>\global\chardef\@@alignsnap\plusfour, - \v!fit=>\global\chardef\@@alignsnapbox\plusone, % new - \v!broad=>\global\chardef\@@alignsnapbox\plustwo, % new - \v!depth=>\global\chardef\@@alignsnapdepth\plusone, % new - \v!line=>\global\chardef\@@alignsnapbox\plusthree -% \global\chardef\@@alignsnapdepth\plusone - \global\chardef\@@alignsnap\plusfour, - \v!reset=>\positiveextrasnap\extrasnapreset, - \v!none=>\global\chardef\@@alignsnap\zerocount - \global\chardef\@@alignsnapbox\zerocount, - \v!force=>, % turns on grid snapping even when not on - \s!default=>, - \s!unknown=>\@@unknowngriddisplacement]} - -\def\moveongrid - {\dosingleempty\domoveongrid} - -\def\doplaceongrid[#1]% - {\domoveongrid[#1]\snaptogrid\vbox} - -\def\placeongrid - {\dosingleempty\doplaceongrid} - -%D Snapping is rather robust as long as we use whole lines. -%D Half lines of white space can however be handled when they -%D come in pairs. The corrections needed when crossing page -%D boundaries in the middle of such a pair, are handled by -%D macros that are (named) sort of fuzzy. This fuzzy mechanism -%D was written as an extension to the grid typesetting needed -%D for typesetting (part of) the \MAPS. -%D -%D \starttyping -%D \setuptyping -%D [before={\blank[halfline]}, -%D after={\blank[halfline]}] -%D \stoptyping - -\newif \iffuzzyvskip -\newif \iffuzzysnapdone -\newif \iffuzzysnapping -\newif \iffuzzysnapped -\chardef \fuzzysnappedleft=0 % ==1 when fuzzybegin still open -\newpersistentmark\fuzzymark % (!) -\newcount \fuzzymarker -\newbox \fuzzysnapbox -\newbox \fuzzysnapsplit - -\def\dosyncfuzzyvskip - {\ifvmode\ifdim\lastskip<\lineheight\ifdim\lastskip>\zeropoint - \bgroup % - added 28/2/2003: check this, there was no - - \endgraf\forgetall\verticalstrut\nobreak\vskip-\struttotal - \egroup - \fi\fi\fi} - -\def\fuzzyvskip#1% - {\iffuzzysnapdone - \dosyncfuzzyvskip % NEWER - \endfuzzysnapping - \vskip#1\relax - \global\fuzzysnapdonefalse - \else - \vskip#1\relax - \beginfuzzysnapping - \global\fuzzysnapdonetrue - \fi} - -\def\setfuzzymark#1#2#3% #1/#2 => error recovery - {\ifgridsnapping - \global\fuzzysnappingtrue - \global\advance\fuzzymarker \ifodd\fuzzymarker#1\else#2\fi - \nobreak - \ifshowfuzzyskips - \hbox{\color[grid:three] - {\llap{\infofont#3\vl\the\fuzzymarker}\nobreak - \vrule\!!width\hsize\!!height.1\lineheight}} - \nobreak - \fi - %[\the\fuzzymarker] - %\expandafter\fuzzymark\expandafter{\the\fuzzymarker}% - \expandafter\rawsetmark\expandafter\fuzzymark\expandafter{\the\fuzzymarker}% - \nobreak - \fi} - -\def\beginfuzzysnapping{\setfuzzymark21\v!start} % odd -\def\endfuzzysnapping {\setfuzzymark12\v!stop } % even - -\def\removelastfuzzyvskip - {\ifgridsnapping - \iffuzzysnapping - \ifdim\lastskip<\openlineheight - \else - \removelastskip - \fi - \else - \removelastskip - \fi - \else - \removelastskip - \fi} - -\def\docheckfuzzysnap#1% - {\bgroup - \dontcomplain - \setbox\fuzzysnapbox\copy#1\relax - \setbox\fuzzysnapsplit\vsplit\fuzzysnapbox to 1\lineheight - \let\topfuzzymark\empty % indeed here ... no real mark - \getsplitmarks\fuzzymark -% \ifcase0\topfuzzymark - \ifcase0\rawgetsplittopmark\fuzzymark - \global\chardef\fuzzysnappedleft\zerocount - \global\fuzzysnappedfalse -% \else\ifodd\topfuzzymark - \else\ifodd\rawgetsplittopmark\fuzzymark - \global\chardef\fuzzysnappedleft\plusone - \global\fuzzysnappedtrue - \else - \global\chardef\fuzzysnappedleft=2 - \global\fuzzysnappedtrue - \fi\fi - \iffuzzysnapped \else - \doloop - {\ifvoid\fuzzysnapbox - \exitloop - \else - \setbox\fuzzysnapsplit=\vsplit\fuzzysnapbox to \lineheight - %\let\topfuzzymark=\empty % ... but not here - \getsplitmarks\fuzzymark -% \ifcase0\topfuzzymark - \ifcase0\rawgetsplittopmark\fuzzymark - % continue -% \else\ifodd\topfuzzymark - \else\ifodd\rawgetsplittopmark\fuzzymark - \exitloop - \else - \global\chardef\fuzzysnappedleft\plusone - \global\fuzzysnappedtrue - \exitloop - \fi\fi - \fi}% - \fi - \egroup} - -\def\getfuzzysnapcorrection#1% - {\global\let\presnapcorrection \relax - \global\let\postsnapcorrection\relax - \ifgridsnapping\iffuzzysnapping - \docheckfuzzysnap{#1}% - \iffuzzysnapped - \iftracegridsnapping - \gdef\presnapcorrection - {\color[grid:four]{\hrule\!!height.5\openlineheight\!!width\hsize}}% - \else - \gdef\presnapcorrection{\kern.5\openlineheight}% - \fi - \gdef\postsnapcorrection{\kern-.5\openlineheight}% get the height ok - \fi - \fi\fi} - -\def\fuzzysnappedbox#1#2% \box \unvbox - {\getfuzzysnapcorrection{#2}% - \presnapcorrection - #1#2% - \postsnapcorrection} - -\def\adaptfuzzypagegoal - {\ifgridsnapping\iffuzzysnapping\ifcase\fuzzysnappedleft\or % see dopagecontents - \scratchdimen\pagegoal - \advance\scratchdimen -.5\openlineheight - \global\pagegoal\scratchdimen - \global\advance\vsize -.5\openlineheight - \global\chardef\fuzzysnappedleft0 - \fi\fi\fi} - -%D New, experimental, used in caption snapping: -%D -%D \starttyping -%D \startcolumnset -%D -%D \setupcaption[figure][style=\tfx\setupinterlinespace,inbetween=,grid=top] -%D -%D \placefigure [lrtb] {\dorecurse{5}{green gras}} -%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]} -%D \placefigure [lrtb] {\dorecurse{15}{green gras}} -%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]} -%D -%D \setupcaption[figure][style=\tfx\setupinterlinespace,inbetween=,grid=bottom] -%D -%D \placefigure [rltb] {\dorecurse{5}{green gras}} -%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]} -%D \placefigure [rltb] {\dorecurse{15}{green gras}} -%D {\externalfigure[dummy][width=\textwidth,height=3cm,grid=height]} -%D -%D \input thuan -%D -%D \stopcolumnset -%D \stoptyping - -\def\moveboxontogrid#1#2#3% box method firstlineht % experimental ! ! ! - {\doifsomething{#2} - {\getnoflines{\ht#1}% no depth taken into account, depth preserved - \scratchdimen\noflines\lineheight - \advance\scratchdimen-\strutdp - \bgroup - \advance\scratchdimen-\onepoint % be a bit tolerant - \ifdim\scratchdimen>\ht#1\relax - \egroup - \doif{#2}\v!top {\setbox#1\vbox to \scratchdimen{\vskip-#3\vskip\strutht\box#1\vfill}}% - \doif{#2}\v!bottom{\setbox#1\vbox to \scratchdimen{\vfill\box#1\removedepth}}% - \dp#1\strutdp - \else - \egroup - \ht#1\scratchdimen - \dp#1\strutdp - \fi}} - -%D New: - -\let\checkgridsnapping\relax - \protect \endinput diff --git a/tex/context/base/spac-hor.mkiv b/tex/context/base/spac-hor.mkiv index 7dd036a22..719167734 100644 --- a/tex/context/base/spac-hor.mkiv +++ b/tex/context/base/spac-hor.mkiv @@ -18,10 +18,10 @@ \let\currentindentation\empty % amount/keyword \let\currentindenting \empty % method -\newdimen\ctxparindent - -\newif\ifindentfirstparagraph % \indentfirstparagraphtrue +\newdimen \ctxparindent +\parindent\ctxparindent % for the show +\newif \ifindentfirstparagraph \indentfirstparagraphtrue \chardef\indentingtoggle\zerocount %D After a blank or comparable situation (left side floats) we @@ -30,15 +30,6 @@ \def\presetindentation {\doifoutervmode{\ifindentfirstparagraph\else\noindentation\fi}} -%D This sets up the (normally) global indentation behavior as well -%D as the amounts. - -\definecomplexorsimple\setupindenting - -\indentfirstparagraphtrue -\parindent\ctxparindent -\chardef\indentingtoggle\zerocount - % we need a better everypar model: for each option a switch, which we % set to false with \forgetall and can enable when needed (context 4); % that way we can control the order of execution of options @@ -48,6 +39,8 @@ \doifsometokselse\everypar\donothing{\appendtoks\checkindentation\to\everypar}% \fi} +\definecomplexorsimple\setupindenting + \def\complexsetupindenting[#1]% {\edef\currentindenting{#1}% \doifsomething\currentindenting % handy when a parameter is passed @@ -62,7 +55,7 @@ \toggleindentation}} \def\docomplexsetupindentingA#1% - {\edefconvertedargument\!!stringa{#1}% can this be doen differently now? + {\edefconvertedargument\!!stringa{#1}% can this be done differently now? \ifcsname\??in:\!!stringa\endcsname \else \edef\currentindentation{#1}% \let\normalindentation\currentindentation @@ -262,6 +255,7 @@ \def\softbreak {\relax\ifhmode\hskip\parfillskip\break\fi} +%D \macros %D {frenchspacing,nonfrenchspacing} %D %D Smehow \type{\frenchspacing} can lead to hyphenation between @@ -432,20 +426,44 @@ \newskip\ctxrightskip \newskip\ctxmidskip -\def\dosinglenarrower#1% - {\processaction - [#1] - [ \v!left=>\global\advance\ctxleftskip \@@slleft, - \v!middle=>\global\advance\ctxmidskip \@@slmiddle, - \v!right=>\global\advance\ctxrightskip \@@slright, - \v!reset=>\global\ctxleftskip \zeropoint - \global\ctxmidskip \zeropoint - \global\ctxrightskip\zeropoint, - \v!none=>, - \s!unknown=>\global\advance\ctxmidskip \commalistelement]} +% \def\dosinglenarrower#1% +% {\processaction +% [#1] +% [ \v!left=>\global\advance\ctxleftskip \@@slleft, +% \v!middle=>\global\advance\ctxmidskip \@@slmiddle, +% \v!right=>\global\advance\ctxrightskip \@@slright, +% \v!reset=>\global\ctxleftskip \zeropoint +% \global\ctxmidskip \zeropoint +% \global\ctxrightskip\zeropoint, +% \v!none=>, +% \s!unknown=>\global\advance\ctxmidskip \commalistelement]} \def\donarrower[#1]% hm, can be dorepeat directly - {\dorepeatwithcommand[#1]\dosinglenarrower} + {\dorepeatwithcommand[#1]\donarrowermethod} + +\def\definenarrowermethod[#1]#2% + {\setvalue{\??sl:#1}{#2}} + +\def\donarrowermethod#1% + {\ifcsname\??sl:#1\endcsname\csname\??sl:#1\endcsname\else\global\advance\ctxmidskip#1\relax\fi} + +\definenarrowermethod[\v!left ]{\global\advance\ctxleftskip \@@slleft \relax} +\definenarrowermethod[\v!middle ]{\global\advance\ctxmidskip \@@slmiddle\relax} +\definenarrowermethod[\v!right ]{\global\advance\ctxrightskip \@@slright \relax} +\definenarrowermethod[-\v!left ]{\global\advance\ctxleftskip -\@@slleft \relax} +\definenarrowermethod[-\v!middle]{\global\advance\ctxmidskip -\@@slmiddle\relax} +\definenarrowermethod[-\v!right ]{\global\advance\ctxrightskip-\@@slright \relax} +\definenarrowermethod[\v!reset ]{\global\ctxleftskip \zeropoint + \global\ctxmidskip \zeropoint + \global\ctxrightskip\zeropoint\relax} +\definenarrowermethod[\v!none ]{} + +% todo: definenarrower + +\definecomplexorsimple\startnarrower + +\def\simplestartnarrower + {\startnarrower[\v!middle]} \def\complexstartnarrower[#1]% {\@@slbefore % was hard coded \par @@ -454,19 +472,10 @@ \global\ctxrightskip\zeropoint \global\ctxmidskip \zeropoint \processcommalistwithparameters[#1]\donarrower - \advance\leftskip \ctxleftskip - \advance\rightskip \ctxrightskip - \advance\leftskip \ctxmidskip - \advance\rightskip \ctxmidskip + \advance\leftskip \dimexpr\ctxleftskip +\ctxmidskip\relax + \advance\rightskip \dimexpr\ctxrightskip+\ctxmidskip\relax \seteffectivehsize} -% todo: definenarrower - -\def\simplestartnarrower - {\startnarrower[\v!middle]} - -\definecomplexorsimple\startnarrower - \def\stopnarrower {\@@slafter % was hard coded \par / needed, else skips forgotten \egroup} @@ -529,20 +538,31 @@ %D Tolerance: +\def\definetolerancemethod + {\dodoubleargument\dodefinetolerancemethod} + +\def\dodefinetolerancemethod[#1][#2]#3% + {\setvalue{\??to:#1:#2}{#3}} + +\definetolerancemethod [\v!vertical] [\v!verystrict ] {\let\bottomtolerance\empty} +\definetolerancemethod [\v!vertical] [\v!strict ] {\def\bottomtolerance{.050}} +\definetolerancemethod [\v!vertical] [\v!tolerant ] {\def\bottomtolerance{.075}} +\definetolerancemethod [\v!vertical] [\v!verytolerant] {\def\bottomtolerance{.100}} + +\definetolerancemethod [\v!horizontal] [\v!stretch ] {\emergencystretch\bodyfontsize} +\definetolerancemethod [\v!horizontal] [\v!space ] {\spaceskip.5em\!!plus.25em\!!minus.25em\relax} +\definetolerancemethod [\v!horizontal] [\v!verystrict ] {\tolerance 200 } +\definetolerancemethod [\v!horizontal] [\v!strict ] {\tolerance1500 } +\definetolerancemethod [\v!horizontal] [\v!tolerant ] {\tolerance3000 } +\definetolerancemethod [\v!horizontal] [\v!verytolerant] {\tolerance4500 } + +\def\dotolerancencemethodvertical #1{\csname\??to:\v!vertical :#1\endcsname} +\def\dotolerancencemethodhorizontal#1{\csname\??to:\v!horizontal:#1\endcsname} + \def\dosetuptolerance[#1]% {\doifinsetelse\v!vertical{#1}% - {\normalexpanded{\noexpand\processallactionsinset[#1]} - [ \v!verystrict=>\def\bottomtolerance{}, - \v!strict=>\def\bottomtolerance{.050}, - \v!tolerant=>\def\bottomtolerance{.075}, - \v!verytolerant=>\def\bottomtolerance{.100}]}% - {\normalexpanded{\noexpand\processallactionsinset[#1]} - [ \v!stretch=>\emergencystretch\bodyfontsize, - \v!space=>\spaceskip.5em\!!plus.25em\!!minus.25em\relax, - \v!verystrict=>\tolerance 200, - \v!strict=>\tolerance1500, - \v!tolerant=>\tolerance3000, - \v!verytolerant=>\tolerance4500]}} + {\processcommacommand[#1]\dotolerancencemethodvertical} + {\processcommacommand[#1]\dotolerancencemethodhorizontal}} \def\setuptolerance {\dosingleargument\dosetuptolerance} @@ -774,6 +794,8 @@ %D bla bla \TEX bla bla \TEX (bla) bla (\TEX) %D \stoptyping +%D This will become a proper mkiv method: (user node with attribute) + \def\autoinsertnextspace{\futurelet\nexttoken\doautoinsertnextspace} \def\doautoinsertnextspace % slightly extended version of a user supplied macro diff --git a/tex/context/base/spac-pag.mkiv b/tex/context/base/spac-pag.mkiv index c32992351..10b2bd315 100644 --- a/tex/context/base/spac-pag.mkiv +++ b/tex/context/base/spac-pag.mkiv @@ -25,8 +25,6 @@ \def\setalignmentswitch#1% {\chardef\alignmentswitch0\csname\??as#1\endcsname\relax} -%D - \newcount \noftrackedpagestates \newif \ifpagestatemismatch \newcount \realpagestateno diff --git a/tex/context/base/spac-par.mkiv b/tex/context/base/spac-par.mkiv index 92ea945f7..edcf8e564 100644 --- a/tex/context/base/spac-par.mkiv +++ b/tex/context/base/spac-par.mkiv @@ -15,7 +15,6 @@ \unprotect - %D The dreadful sequence \type {\bgroup} \unknown\ %D \type {\carryoverpar} \unknown\ \type {\egroup} is needed %D when for instance sidefloats are used in combination with @@ -35,7 +34,6 @@ \leftskip \the\leftskip \rightskip \the\rightskip}} - \newconditional \parbasedattributes \def\finishparbasedattributes @@ -160,18 +158,6 @@ \let\normalvadjust\vadjust -% \def\graphicvadjust % bad, those low level color calls here -% {\dowithnextboxcontent -% {\forgetall} -% {\normalvadjust -% {\unvbox\nextbox -% % corrects for one line paragraphs -% \nointerlineskip -% \kern-\struttotal -% \nointerlineskip -% \verticalstrut}}% -% \vbox} - \def\graphicvadjust % nasty bidi handling {\dowithnextboxcontent {\forgetall} @@ -193,7 +179,7 @@ \smashedbox\nextbox}% \vtop} -\def\localvbox#1#% +\def\localvbox#1#% used? {\vbox#1\bgroup \forgetparskip \setlocalhsize diff --git a/tex/context/base/spac-ver.lua b/tex/context/base/spac-ver.lua index 16291df27..408b310f4 100644 --- a/tex/context/base/spac-ver.lua +++ b/tex/context/base/spac-ver.lua @@ -8,10 +8,17 @@ if not modules then modules = { } end modules ['spac-ver'] = { -- this code dates from the beginning and is kind of experimental; it -- will be optimized and improved soon +-- +-- the collapser will be redone with user nodes; also, we might get make +-- parskip into an attribute and appy it explicitly thereby getting rid +-- of automated injections; eventually i want to get rid of the currently +-- still needed tex -> lua -> tex > lua chain (needed because we can have +-- expandable settings at the tex end -local next, type = next, type -local format, gmatch, concat = string.format, string.gmatch, table.concat -local texsprint, texlists = tex.sprint, tex.lists +local next, type, tonumber = next, type, tonumber +local format, gmatch, concat, match = string.format, string.gmatch, table.concat, string.match +local ceil, floor, max, min, round = math.ceil, math.floor, math.max, math.min, math.round +local texsprint, texlists, texdimen, texbox, texht, texdp = tex.sprint, tex.lists, tex.dimen, tex.box, tex.ht, tex.dp local ctxcatcodes = tex.ctxcatcodes local variables = interfaces.variables @@ -24,12 +31,15 @@ local trace_vbox_vspacing = false trackers.register("nodes.vbox_vspacing", local trace_page_vspacing = false trackers.register("nodes.page_vspacing", function(v) trace_page_vspacing = v end) local trace_collect_vspacing = false trackers.register("nodes.collect_vspacing", function(v) trace_collect_vspacing = v end) local trace_vspacing = false trackers.register("nodes.vspacing", function(v) trace_vspacing = v end) +local trace_vsnapping = false trackers.register("nodes.vsnapping", function(v) trace_vsnapping = v end) local skip_category = attributes.private('skip-category') local skip_penalty = attributes.private('skip-penalty') local skip_order = attributes.private('skip-order') local snap_category = attributes.private('snap-category') local display_math = attributes.private('display-math') +local snap_method = attributes.private('snap-method') +local snap_done = attributes.private('snap-done') local has_attribute = node.has_attribute local unset_attribute = node.unset_attribute @@ -38,13 +48,17 @@ local find_node_tail = node.tail local free_node = node.free local copy_node = node.copy local traverse_nodes = node.traverse +local traverse_nodes_id = node.traverse_id local insert_node_before = node.insert_before local insert_node_after = node.insert_after local remove_node = nodes.remove local make_penalty_node = nodes.penalty +local make_kern_node = nodes.kern +local make_rule_node = nodes.rule local count_nodes = nodes.count local node_ids_to_string = nodes.ids_to_string local hpack_node = node.hpack +local vpack_node = node.vpack local glyph = node.id("glyph") local penalty = node.id("penalty") @@ -54,7 +68,164 @@ local hlist = node.id('hlist') local vlist = node.id('vlist') local adjust = node.id('adjust') -vspacing = vspacing or { } +vspacing = vspacing or { } +vspacing.data = vspacing.data or { } + +vspacing.data.snapmethods = vspacing.data.snapmethods or { } + +storage.register("vspacing/data/snapmethods", vspacing.data.snapmethods, "vspacing.data.snapmethods") + +local snapmethods, snapht, snapdp, snaphtdp = vspacing.data.snapmethods, 0, 0, 0 + +local default = { + maxheight = true, + maxdepth = true, + strut = true, + hfraction = 1, + dfraction = 1, +} + +local fractions = { + minheight = "hfraction", maxheight = "hfraction", + mindepth = "dfraction", maxdepth = "dfraction", +} + +local colonsplitter = lpeg.splitat(":") + +function interfaces.listtohash(str) + local t = { } + for s in gmatch(str,"[^, ]+") do + local key, fraction = colonsplitter:match(s) + local v = variables[key] + if v then + t[v] = true + if fraction then + local k = fractions[key] + if k then + fraction = tonumber("0" .. fraction) + if fraction then + t[k] = fraction + end + end + end + else + fraction = tonumber("0" .. key) + if fraction then + t.hfraction, t.dfraction = fraction, fraction + end + end + end + if next(t) then + t.hfraction = t.hfraction or 1 + t.dfraction = t.dfraction or 1 + return t + else + return default + end +end + +function vspacing.define_snap_method(name,method) + local n = #snapmethods + 1 + local t = interfaces.listtohash(method) + snapmethods[n] = t + t.name, t.specification = name, method + tex.write(n) +end + +function vspacing.freeze_snap_method(ht,dp) + snapht, snapdp = ht or texdimen.strutht, dp or texdimen.strutdp + snaphtdp = snapht + snapdp +end + +local function snap_hlist(current,method) -- method.strut is default + local h, d = current.height, current.depth + local hr, dr, ch, cd = method.hfraction or 1, method.dfraction or 1, h, d + local done, plusht, plusdp = false, snapht, snapdp + if method.none then + plusht, plusdp = 0, 0 + end + if method.halfline then + plusht, plusdp = plusht + snaphtdp/2, plusdp + snaphtdp/2 + end + if method.line then + plusht, plusdp = plusht + snaphtdp, plusdp + snaphtdp + end + if method.first then + if current.id == vlist then + local list, lh, ld = current.list + for n in traverse_nodes_id(hlist,list) do + lh, ld = n.height, n.depth + break + end + if lh then + local x = max(ceil((lh-hr*snapht)/snaphtdp),0)*snaphtdp + plusht + local n = make_kern_node(x-lh) + n.next, list.prev, current.list = list, n, n + ch = x + snaphtdp + cd = max(ceil((d+h-lh-dr*snapdp-hr*snapht)/snaphtdp),0)*snaphtdp + plusdp + done = true + end + end + elseif method.last then + if current.id == vlist then + local list, lh, ld = current.list + for n in traverse_nodes_id(hlist,list) do + lh, ld = n.height, n.depth + end + if lh then + local baseline_till_top = h + d - ld + local x = max(ceil((baseline_till_top-hr*snapht)/snaphtdp),0)*snaphtdp + plusht + local n = make_kern_node(x-baseline_till_top) + n.next, list.prev, current.list = list, n, n + ch = x + cd = max(ceil((ld-dr*snapdp)/snaphtdp),0)*snaphtdp + plusdp + done = true + end + end + end + if done then + -- first or last + elseif method.minheight then + ch = max(floor((h-hr*snapht)/snaphtdp),0)*snaphtdp + plusht + elseif method.maxheight then + ch = max(ceil((h-hr*snapht)/snaphtdp),0)*snaphtdp + plusht + else + ch = plusht + end + if done then + -- first or last + elseif method.mindepth then + cd = max(floor((d-dr*snapdp)/snaphtdp),0)*snaphtdp + plusdp + elseif method.maxdepth then + cd = max(ceil((d-dr*snapdp)/snaphtdp),0)*snaphtdp + plusdp + else + cd = plusdp + end + current.height, current.depth = ch, cd + return h, d, ch, cd, (ch+cd)/snaphtdp +end + +local function snap_topskip(current,method) + local spec = current.spec + local w = spec.width + local wd = w + if spec then + wd = 0 -- snapht - w + spec.width = wd + end + return w, wd +end + +local function snapped_spec(current) + local spec = current.spec + if spec then + local w = ceil(spec.width/snaphtdp)*snaphtdp + spec.width = w + return w + else + return 0 + end +end vspacing.categories = { [0] = 'discard', @@ -90,7 +261,6 @@ function vspacing.tocategory(str) end end -vspacing.data = vspacing.data or { } vspacing.data.map = vspacing.data.map or { } vspacing.data.skip = vspacing.data.skip or { } @@ -117,8 +287,6 @@ do -- todo: interface.variables local k_fixed, k_flexible, k_category, k_penalty, k_order = variables.fixed, variables.flexible, "category", "penalty", "order" local function analyse(str,oldcategory,texsprint) ---~ print(table.serialize(map)) ---~ print(table.serialize(skip)) for s in gmatch(str,"([^ ,]+)") do local amount, keyword, detail = splitter:match(s) if not keyword then @@ -149,7 +317,6 @@ do -- todo: interface.variables local penalty = tonumber(detail) if penalty then texsprint(ctxcatcodes,format("\\setblankpenalty{%s}",penalty)) - texsprint(ctxcatcodes,"\\flushblankhandling") end else amount = tonumber(amount) or 1 @@ -189,11 +356,11 @@ end -- implementation -nodes.snapvalues = { } +--~ nodes.snapvalues = { } -function nodes.setsnapvalue(n,ht,dp) - nodes.snapvalues[n] = { ht, dp, ht+dp } -end +--~ function nodes.setsnapvalue(n,ht,dp) +--~ nodes.snapvalues[n] = { ht, dp, ht+dp } +--~ end local trace_list, tracing_info, before, after = { }, false, "", "" @@ -342,26 +509,134 @@ local free_glue_node = free_node local free_glue_spec = free_node local discard, largest, force, penalty, add, disable, nowhite, goback = 0, 1, 2, 3, 4, 5, 6, 7 -local function collapser(head,where,what,trace) -- maybe also pass tail +function vspacing.snap_box(n,how) + local sv = snapmethods[how] + if sv then + local list = texbox[n].list + if list and (list.id == hlist or list.id == vlist) then + local h, d, ch, cd, lines = snap_hlist(list,sv) + texht[n], texdp[n] = ch, cd + if trace_vsnapping then + logs.report("snapper", "hlist snapped from (%s,%s) to (%s,%s) using method '%s' (%s) for '%s' (%s lines)",h,d,ch,cd,sv.name,sv.specification,"direct",lines) + end + end + end +end + +local function forced_skip(head,current,width,where,trace) + if where == "after" then + head, current = insert_node_after(head,current,make_rule_node(0,0,0)) + head, current = insert_node_after(head,current,make_kern_node(width)) + head, current = insert_node_after(head,current,make_rule_node(0,0,0)) + else + local c = current + head, current = insert_node_before(head,current,make_rule_node(0,0,0)) + head, current = insert_node_before(head,current,make_kern_node(width)) + head, current = insert_node_before(head,current,make_rule_node(0,0,0)) + current = c + end + if trace then + logs.report("vspacing", "inserting forced skip of %s",width) + end + return head, current +end + +local function collapser(head,where,what,trace,snap) -- maybe also pass tail if trace then reset_tracing(head) trace_info("start analyzing",where,what) end local current = head - local glue_order, glue_data = 0, nil + local glue_order, glue_data, force_glue = 0, nil, false local penalty_order, penalty_data, natural_penalty = 0, nil, nil local parskip, ignore_parskip, ignore_following, ignore_whitespace = nil, false, false, false + local function flush(why) + if penalty_data then + local p = make_penalty_node(penalty_data) + if trace then trace_done("flushed due to " .. why,p) end + head, _ = insert_node_before(head,current,p) + end + if glue_data then + if force_glue then + if trace then trace_done("flushed due to " .. why,glue_data) end + head, _ = forced_skip(head,current,glue_data.spec.width,"before",trace) + free_glue_node(glue_data) + elseif glue_data.spec then + if trace then trace_done("flushed due to " .. why,glue_data) end + head, _ = insert_node_before(head,current,glue_data) + else + free_glue_node(glue_data) + end + end + if trace then trace_node(current) end + glue_order, glue_data, force_glue = 0, nil, false + penalty_order, penalty_data, natural_penalty = 0, nil, nil + parskip, ignore_parskip, ignore_following, ignore_whitespace = nil, false, false, false + end while current do - local id = current.id -- has each node a subtype ? - if id == glue and current.subtype == 0 then -- todo, other subtypes, like math + local id, subtype = current.id, current.subtype + if id == hlist or id == vlist then + if snap then + local s = has_attribute(current,snap_method) + if s then + unset_attribute(current,snap_method) + if not has_attribute(current,snap_done) then + local sv = snapmethods[s] + if sv then + local h, d, ch, cd, lines = snap_hlist(current,sv) + if trace_vsnapping then + logs.report("snapper", "hlist snapped from (%s,%s) to (%s,%s) using method '%s' (%s) for '%s' (%s lines)",h,d,ch,cd,sv.name,sv.specification,where,lines) + end + elseif trace_vsnapping then + logs.report("snapper", "hlist not snapped due to unknown snap specification") + end + set_attribute(current,snap_done,s) + elseif trace_vsnapping then + logs.report("snapper", "hlist not snapped, already done") + end + elseif trace_vsnapping then + -- logs.report("snapper", "hlist not snapped") + end + else + -- + end + -- tex.prevdepth = 0 + flush("list") + current = current.next + elseif id == penalty then + --~ natural_penalty = current.penalty + --~ if trace then trace_done("removed penalty",current) end + --~ head, current = remove_node(head, current, true) + current = current.next + elseif id == kern then + if snap and trace_vsnapping and current.kern ~= 0 then + --~ current.kern = 0 + logs.report("snapper", "kern of %s (kept)",current.kern) + end + flush("kern") + current = current.next + elseif id ~= glue then + flush("something else") + current = current.next + elseif subtype == user_skip then -- todo, other subtypes, like math local sc = has_attribute(current,skip_category) -- has no default, no unset (yet) local so = has_attribute(current,skip_order ) or 1 -- has 1 default, no unset (yet) - local sp = has_attribute(current,skip_penalty ) -- has no degault, no unset (yet) - if not sc then + local sp = has_attribute(current,skip_penalty ) -- has no default, no unset (yet) + if sp and sc == penalty then + if not penalty_data then + penalty_data = sp + elseif penalty_order < so then + penalty_order, penalty_data = so, sp + elseif penalty_order == so and sp > penalty_data then + penalty_data = sp + end + head, current = remove_node(head, current, true) + elseif not sc then -- if not sc then if glue_data then if trace then trace_done("flush",glue_data) end head, current = nodes.before(head,current,glue_data) if trace then trace_natural("natural",current) end + current = current.next else -- not look back across head local previous = current.prev @@ -375,174 +650,203 @@ local function collapser(head,where,what,trace) -- maybe also pass tail ps.width, ps.stretch, ps.shrink = pw + cw, pp + cp, pm + cm if trace then trace_natural("removed",current) end head, current = remove_node(head, current, true) - current = previous - if trace then trace_natural("collapsed",current) end + -- current = previous + if trace then trace_natural("collapsed",previous) end + -- current = current.next else if trace then trace_natural("filler",current) end + current = current.next end else if trace then trace_natural("natural (no prev spec)",current) end + current = current.next end else if trace then trace_natural("natural (no prev)",current) end + current = current.next end end glue_order, glue_data = 0, nil - if current then - current = current.next - end - else - if sc == disable then - ignore_following = true - if trace then trace_skip("disable",sc,so,sp,current) end - head, current = remove_node(head, current, true) - elseif sc == nowhite then - ignore_whitespace = true + elseif sc == disable then + ignore_following = true + if trace then trace_skip("disable",sc,so,sp,current) end + head, current = remove_node(head, current, true) + elseif sc == nowhite then + ignore_whitespace = true + head, current = remove_node(head, current, true) + elseif sc == discard then + if trace then trace_skip("discard",sc,so,sp,current) end + head, current = remove_node(head, current, true) + elseif ignore_following then + if trace then trace_skip("disabled",sc,so,sp,current) end + head, current = remove_node(head, current, true) + elseif not glue_data then + if trace then trace_skip("assign",sc,so,sp,current) end + glue_order = so + head, current, glue_data = remove_node(head, current) + elseif glue_order < so then + if trace then trace_skip("force",sc,so,sp,current) end + glue_order = so + free_glue_node(glue_data) + head, current, glue_data = remove_node(head, current) + elseif glue_order == so then + -- is now exclusive, maybe support goback as combi, else why a set + if sc == largest then + local cs, gs = current.spec, glue_data.spec + local cw = (cs and cs.width) or 0 + local gw = (gs and gs.width) or 0 + if cw > gw then + if trace then trace_skip('largest',sc,so,sp,current) end + free_glue_node(glue_data) -- also free spec + head, current, glue_data = remove_node(head, current) + else + if trace then trace_skip('remove smallest',sc,so,sp,current) end + head, current = remove_node(head, current, true) + end + elseif sc == goback then + if trace then trace_skip('goback',sc,so,sp,current) end + free_glue_node(glue_data) -- also free spec + head, current, glue_data = remove_node(head, current) + elseif sc == force then + -- todo: inject kern + if trace then trace_skip('force',sc,so,sp,current) end + free_glue_node(glue_data) -- also free spec + head, current, glue_data = remove_node(head, current) + elseif sc == penalty then + -- ? ? ? ? + if trace then trace_skip('penalty',sc,so,sp,current) end + free_glue_node(glue_data) -- also free spec + glue_data = nil head, current = remove_node(head, current, true) - elseif sc == discard then - if trace then trace_skip("discard",sc,so,sp,current) end + elseif sc == add then + if trace then trace_skip('add',sc,so,sp,current) end + local old, new = glue_data.spec, current.spec + old.width = old.width + new.width + old.stretch = old.stretch + new.stretch + old.shrink = old.shrink + new.shrink + -- toto: order head, current = remove_node(head, current, true) else - if sp then - if not penalty_data then - penalty_data = sp - elseif penalty_order < so then - penalty_order, penalty_data = so, sp - elseif penalty_order == so and sp > penalty_data then - penalty_data = sp - end - end - if ignore_following then - if trace then trace_skip("disabled",sc,so,sp,current) end - head, current = remove_node(head, current, true) - elseif not glue_data then - if trace then trace_skip("assign",sc,so,sp,current) end - glue_order = so - head, current, glue_data = remove_node(head, current) - elseif glue_order < so then - if trace then trace_skip("force",sc,so,sp,current) end - glue_order = so - free_glue_node(glue_data) - head, current, glue_data = remove_node(head, current) - elseif glue_order == so then - -- is now exclusive, maybe support goback as combi, else why a set - if sc == largest then - local cs, gs = current.spec, glue_data.spec - local cw = (cs and cs.width) or 0 - local gw = (gs and gs.width) or 0 - if cw > gw then - if trace then trace_skip('largest',sc,so,sp,current) end - free_glue_node(glue_data) -- also free spec - head, current, glue_data = remove_node(head, current) - else - if trace then trace_skip('remove smallest',sc,so,sp,current) end - head, current = remove_node(head, current, true) - end - elseif sc == goback then - if trace then trace_skip('goback',sc,so,sp,current) end - free_glue_node(glue_data) -- also free spec - head, current, glue_data = remove_node(head, current) - elseif sc == force then - -- todo: inject kern - if trace then trace_skip('force',sc,so,sp,current) end - free_glue_node(glue_data) -- also free spec - head, current, glue_data = remove_node(head, current) - elseif sc == penalty then - if trace then trace_skip('penalty',sc,so,sp,current) end - free_glue_node(glue_data) -- also free spec - glue_data = nil - head, current = remove_node(head, current, true) - elseif sc == add then - if trace then trace_skip('add',sc,so,sp,current) end - local old, new = glue_data.spec, current.spec - old.width = old.width + new.width - old.stretch = old.stretch + new.stretch - old.shrink = old.shrink + new.shrink - -- toto: order - head, current = remove_node(head, current, true) - else - if trace then trace_skip("unknown",sc,so,sp,current) end - head, current = remove_node(head, current, true) + if trace then trace_skip("unknown",sc,so,sp,current) end + head, current = remove_node(head, current, true) + end + else + if trace then trace_skip("unknown",sc,so,sp,current) end + head, current = remove_node(head, current, true) + end + if sc == force then + force_glue = true + end + elseif subtype == line_skip then + if snap then + local sn = has_attribute(current,snap_method) + if sn then + unset_attribute(current,snap_method) + local spec = current.spec + if spec then + spec.width = 0 + if trace_vsnapping then + logs.report("snapper", "lineskip set to zero") end - else - if trace then trace_skip("unknown",sc,so,sp,current) end - head, current = remove_node(head, current, true) end + else + if trace then trace_skip("lineskip",sc,so,sp,current) end + flush("lineskip") end + else + if trace then trace_skip("lineskip",sc,so,sp,current) end + flush("lineskip") end - elseif id == penalty then - --~ natural_penalty = current.penalty - --~ if trace then trace_done("removed penalty",current) end - --~ head, current = remove_node(head, current, true) current = current.next - elseif id == glue and current.subtype == 2 then - local sn = has_attribute(current,snap_category) - if sn then - -- local sv = nodes.snapvalues[sn] - -- if sv then - if trace then trace_natural("removed baselineskip",current) end - head, current = remove_node(head, current, true) - -- else - -- current = current.next - -- end + elseif subtype == baseline_skip then + if snap then + local sn = has_attribute(current,snap_method) + if sn then + unset_attribute(current,snap_method) + local spec = current.spec + if spec then + spec.width = 0 + if trace_vsnapping then + logs.report("snapper", "baselineskip set to zero") + end + end + else + if trace then trace_skip("baselineskip",sc,so,sp,current) end + flush("baselineskip") + end else - if trace then trace_natural("keep baselineskip",current) end - current = current.next + if trace then trace_skip("baselineskip",sc,so,sp,current) end + flush("baselineskip") end - elseif id == glue and current.subtype == 3 then + current = current.next + elseif subtype == par_skip then -- parskip always comes later if ignore_whitespace then if trace then trace_natural("ignored parskip",current) end - head, current = remove_node(head,current,true) + head, current = remove_node(head, current, true) elseif glue_data then local ps, gs = current.spec, glue_data.spec if ps and gs and ps.width > gs.width then - -- free_glue_spec(glue_data.spec) -- result in double free glue_data.spec = copy_node(ps) if trace then trace_natural("taking parskip",current) end else if trace then trace_natural("removed parskip",current) end end - head, current = remove_node(head, current,true) + head, current = remove_node(head, current, true) else if trace then trace_natural("honored parskip",current) end head, current, glue_data = remove_node(head, current) end - --~ if trace then trace_natural("removed parskip",current) end - --~ current.spec = nil - --~ current = current.next - else --- reversed - if penalty_data then - local p = make_penalty_node(penalty_data) - if trace then trace_done("flushed",p) end - head, current = insert_node_before(head,current,p) - -- penalty_data = nil - end - if glue_data then - if trace then trace_done("flushed",glue_data) end - head, current = insert_node_before(head,current,glue_data) - -- glue_order, glue_data = 0, nil - end - if trace then trace_node(current) end - if id == hlist and where == 'hmode_par' then - local list = current.list - if list then - local sn = has_attribute(list,snap_category) - if sn then - local sv = nodes.snapvalues[sn] - if sv then - local height, depth, lineheight = sv[1], sv[2], sv[3] - -- is math.ceil really needed? - current.height = math.ceil((current.height-height)/lineheight)*lineheight + height - current.depth = math.ceil((current.depth -depth )/lineheight)*lineheight + depth - end + elseif subtype == top_skip_code or subtype == split_top_skip_code then + if snap then + local s = has_attribute(current,snap_method) + if s then + unset_attribute(current,snap_method) + local sv = snapmethods[s] + local w, cw = snap_topskip(current,sv) + if trace_vsnapping then + logs.report("snapper", "topskip snapped from %s to %s for '%s'",w,cw,where) end + else + if trace then trace_skip("topskip",sc,so,sp,current) end + flush("topskip") end + else + if trace then trace_skip("topskip",sc,so,sp,current) end + flush("topskip") end - glue_order, glue_data = 0, nil - penalty_order, penalty_data, natural_penalty = 0, nil, nil - parskip, ignore_parskip, ignore_following, ignore_whitespace = nil, false, false, false + current = current.next + elseif subtype == above_display_skip then + -- +if trace then trace_skip("above display skip (normal)",sc,so,sp,current) end +flush("above display skip (normal)") +current = current.next + -- + elseif subtype == below_display_skip then + -- +if trace then trace_skip("below display skip (normal)",sc,so,sp,current) end +flush("below display skip (normal)") +current = current.next + -- + elseif subtype == above_display_short_skip then + -- +if trace then trace_skip("above display skip (short)",sc,so,sp,current) end +flush("above display skip (short)") +current = current.next + -- + elseif subtype == below_display_short_skip then + -- +if trace then trace_skip("below display skip (short)",sc,so,sp,current) end +flush("below display skip (short)") +current = current.next + -- + else -- other glue + if snap and trace_vsnapping and current.spec and current.spec.width ~= 0 then + logs.report("snapper", "%s of %s (kept)",skips[subtype],current.spec.width) + --~ current.spec.width = 0 + end + if trace then trace_skip(format("some glue (%s)",subtype),sc,so,sp,current) end + flush("some glue") current = current.next end end @@ -563,7 +867,13 @@ local function collapser(head,where,what,trace) -- maybe also pass tail if glue_data then if not tail then tail = find_node_tail(head) end if trace then trace_done("result",glue_data) end - head, tail = insert_node_after(head,tail,glue_data) +--~ snapped_spec(glue_data) + if force_glue then + head, tail = forced_skip(head,tail,glue_data.spec.width,"after",trace) + free_glue_node(glue_data) + else + head, tail = insert_node_after(head,tail,glue_data) + end end if trace then if glue_data or penalty_data then @@ -596,6 +906,7 @@ function nodes.handle_page_spacing(where) starttiming(vspacing) local newtail = find_node_tail(newhead) local flush = false +stackhack = true -- todo: only when grid snapping once enabled for n in traverse_nodes(newhead) do -- we could just look for glue nodes local id = n.id if id == glue then @@ -623,7 +934,7 @@ function nodes.handle_page_spacing(where) if stackhack then stackhack = false if trace_collect_vspacing then report("processing %s nodes: %s",newhead) end - texlists.contrib_head = collapser(newhead,"page",where,trace_page_vspacing) + texlists.contrib_head = collapser(newhead,"page",where,trace_page_vspacing,true) else if trace_collect_vspacing then report("flushing %s nodes: %s",newhead) end texlists.contrib_head = newhead @@ -653,12 +964,21 @@ local ignore = table.tohash { function nodes.handle_vbox_spacing(head,where) if head and not ignore[where] and head.next then starttiming(vspacing) - head = collapser(head,"vbox",where,trace_vbox_vspacing) + head = collapser(head,"vbox",where,trace_vbox_vspacing,false) stoptiming(vspacing) end return head end +function nodes.collapse_vbox(n) -- for boxes + local list = texbox[n].list + if list then + starttiming(vspacing) + texbox[n].list = vpack_node(collapser(list,"snapper","vbox",trace_vbox_vspacing,true)) + stoptiming(vspacing) + end +end + statistics.register("v-node processing time", function() if statistics.elapsedindeed(vspacing) then return format("%s seconds", statistics.elapsedtime(vspacing)) @@ -689,6 +1009,7 @@ local vlist = node.id('vlist') local remove_node = nodes.remove local hpack_node = node.hpack +local vpack_node = node.vpack local has_attribute = node.has_attribute function nodes.repackage_graphicvadjust(head,groupcode) -- we can make an actionchain for mvl only diff --git a/tex/context/base/spac-ver.mkiv b/tex/context/base/spac-ver.mkiv index 8e612579d..a2d081141 100644 --- a/tex/context/base/spac-ver.mkiv +++ b/tex/context/base/spac-ver.mkiv @@ -156,20 +156,16 @@ \def\doifoutervmode#1% {\ifvmode\ifinner\else#1\fi\fi} -\ifx\dosomebreak\undefined % defined in mkiv - - \def\dosomebreak#1% - {\doifoutervmode - {\scratchskip\lastskip - \removelastskip - %\leavevmode\type{#1}% - #1\relax - \ifdim\scratchskip=\zeropoint % else interference with footnotes - \else - \vskip\scratchskip - \fi}} - -\fi +\def\dosomebreak#1% + {\doifoutervmode + {\scratchskip\lastskip + \removelastskip + %\leavevmode\type{#1}% + #1\relax + \ifdim\scratchskip=\zeropoint % else interference with footnotes + \else + \vskip\scratchskip + \fi}} \def\packed {\nointerlineskip} @@ -209,14 +205,16 @@ {\par \scratchdimen\prevdepth \hrule\!!height\zeropoint - \nobreak\vskip\scratchskip + \nobreak + \vskip\scratchskip \prevdepth\scratchdimen} \def\dohglue {\dontleavehmode % \leavevmode \scratchcounter\spacefactor \vrule\!!width\zeropoint - \nobreak\hskip\scratchskip + \nobreak + \hskip\scratchskip \spacefactor\scratchcounter} \fi @@ -371,9 +369,6 @@ \definewhitespacemethod [\s!default] {\simplesetupwhitespace} % {\stelwitruimteopnieuwin} -% \def\dowhitespacemethod#1% -% {\executeifdefined{\??ws\??ws#1}{\ctxparskip#1}\relax} - \def\dowhitespacemethod#1% {\ifcsname\??ws\??ws#1\endcsname\csname\??ws\??ws#1\endcsname\else\ctxparskip#1\fi\relax} @@ -384,35 +379,12 @@ % \vskip-\parskip % \fi % \fi} - -\def\nowhitespace - {} - -\def\nowhitespaceunlessskip - {\ifdim\lastskip>\zeropoint \else - \nowhitespace - \fi} - -\def\redowhitespace - {\ifdim\lastskip>-\parskip \else - \vskip\parskip - \fi} - -\def\savecurrentwhitespace {\edef\savedcurrentwhitespace{\currentwhitespace}} -\def\restorecurrentwhitespace{\edef\currentwhitespace{\savedcurrentwhitespace}} - -\def\savedcurrentwhitespace{\currentwhitespace} - -% deze variant is nodig binnen \startopelkaar -% steeds testen: % -% \hoofdstuk{..} -% \plaatslijst[..] -% \hoofdstuk{..} -% \input tufte +% \def\nowhitespaceunlessskip +% {\ifdim\lastskip>\zeropoint \else +% \nowhitespace +% \fi} % -% met/zonder witruimte - % \def\whitespace % {\par % \ifdim\parskip>\zeropoint\relax @@ -422,16 +394,20 @@ % %\fi % \fi} -\def\whitespace - {\vspacing[\v!white]} +\def\nowhitespace{\vspacing[\v!nowhite]} +\def\whitespace {\vspacing[\v!white]} + +% obsolete: +% +% \def\savedcurrentwhitespace{\currentwhitespace} +% \def\savecurrentwhitespace {\edef\savedcurrentwhitespace{\currentwhitespace}} +% \def\restorecurrentwhitespace{\edef\currentwhitespace{\savedcurrentwhitespace}} % De onderstaande macro handelt ook de situatie dat er geen % tekst tussen \start ... \stop is geplaatst. Daartoe wordt de % laatste skip over de lege tekst heen gehaald. Dit komt goed % van pas bij het plaatsen van (mogelijk lege) lijsten. -\newif\ifopelkaar - \newsignal \noparskipsignal % \def\noparskipsignal {0.00001pt} \def\lastdoneparskip {0pt} @@ -527,7 +503,7 @@ % commando \leavevmode. Binnen een \vbox geeft dit echter % niet altijd het gewenste resultaat, vandaar het commando % -% \leaveoutervmode +% \dontleavehmode % Pas op: niet zomaar \topskip en \baselineskip aanpassen % en zeker niet \widowpenalty. Dit kan ernstige gevolgen @@ -570,14 +546,12 @@ \def\systemtopskipfactor {\topskipfactor} \def\systemmaxdepthfactor {\maxdepthfactor} -% De onderstaande definitie wordt in de font-module overruled - \ifdefined\globalbodyfontsize\else \newdimen\globalbodyfontsize \globalbodyfontsize=12pt \fi -\ifx\normalizedbodyfontsize\undefined +\ifdefined\normalizedbodyfontsize\else \def\normalizedbodyfontsize{12pt} \fi @@ -602,18 +576,21 @@ \ifgridsnapping \else \ifr@ggedbottom\!!plus5\globalbodyfontsize\fi \fi +\ifgridsnapping + \topskip\zeropoint +\fi \relax % the skip \topskipgap\topskip \advance\topskipgap -\openstrutheight\relax -\ifdim\minimumstrutheight>\zeropoint - \ifdim\topskip<\minimumstrutheight - \topskip\minimumstrutheight\relax - \fi -\else - \ifdim\topskip<\strutheightfactor\openlineheight - \topskip\strutheightfactor\openlineheight\relax - \fi -\fi} + \ifdim\minimumstrutheight>\zeropoint + \ifdim\topskip<\minimumstrutheight + \topskip\minimumstrutheight\relax + \fi + \else + \ifdim\topskip<\strutheightfactor\openlineheight + \topskip\strutheightfactor\openlineheight\relax + \fi + \fi} \def\setmaxdepth {\maxdepth\systemmaxdepthfactor\globalbodyfontsize} @@ -648,8 +625,7 @@ \fi \normallineskip\minimumlinedistance\relax % \onepoint\relax \normallineskiplimit\zeropoint\relax - \normalbaselines - \dosetupgridsnapping} + \normalbaselines} \def\spacing#1% {\ifgridsnapping @@ -944,7 +920,7 @@ {\let\strutwidth\zeropoint \setstrut} -\ifx\setfontparameters\undefined +\ifdefined\setfontparameters\else % problems ! ! ! ! \def\setfontparameters{\the\everybodyfont} \fi @@ -998,19 +974,17 @@ \fi\fi} % We stellen enkele penalties anders in dan Plain TEX: - -% oud % % \widowpenalty=\defaultwidowpenalty\relax % \clubpenalty =\defaultclubpenalty \relax \def\resetpenalties#1% - {\ifx#1\undefined\else + {\ifdefined#1% #1\minusone \fi} \def\setpenalties#1#2#3% - {\ifx#1\undefined\else % space before #3 prevents lookahead problems, needed when #3=text + {\ifdefined#1% space before #3 prevents lookahead problems, needed when #3=text #1\numexpr#2+\plusone\relax\space\doexpandedrecurse{\the\numexpr#2\relax}{ #3}\zerocount\relax \fi} @@ -1163,30 +1137,271 @@ % % \let\normalbottom =\alignbottom -%D Good old blank: +%D Good old blank redone: \definesystemattribute[kern-chars] \definesystemattribute[skip-category] \chardef\skipcategoryattribute \dogetattributeid{skip-category} \definesystemattribute[skip-penalty] \chardef\skippenaltyattribute \dogetattributeid{skip-penalty} \definesystemattribute[skip-order] \chardef\skiporderattribute \dogetattributeid{skip-order} -\definesystemattribute[snap-category] \definesystemattribute[display-math] +\definesystemattribute[snap-method] \chardef\snapmethodattribute \dogetattributeid{snap-method} +\definesystemattribute[snap-done] \chardef\snapdoneattribute \dogetattributeid{snap-done} -% \start \dosetstretch{.25em} \setuptolerance[tolerant,stretch] \input tufte \endgraf \stop -% \start \dosetstretch{.5em} effe flink doorfietsen \stop +%definesystemattribute[snap-category] + +% TODO: NAMED SNAPPERS + +\newdimen \bodyfontlineheight +\newdimen \bodyfontstrutheight +\newdimen \bodyfontstrutdepth + +\appendtoks + \bodyfontlineheight \normallineheight + \bodyfontstrutheight \strutheight + \bodyfontstrutdepth \strutdepth + \dosetupgridsnapping +\to \everysetupbodyfont + +\def\installsnapvalues#1#2% todo: a proper define + {\edef\currentsnapper{#1:#2}% + \ifcsname\currentsnapper\endcsname \else + \setevalue\currentsnapper{\ctxlua{vspacing.define_snap_method("#1","#2")}}% + \fi + \setevalue{\??gr:#1}{\dosetattribute{snap-method}{\csname\currentsnapper\endcsname}}} + +\def\definegridsnapping + {\dodoubleargument\dodefinegridsnapping} + +\def\dodefinegridsnapping[#1][#2]% + {\installsnapvalues{#1}{#2}} + +\edef\resetsnapvalue + {%\gridsnappingfalse + \doresetattribute{snap-method}} + +\def\setsnapvalue#1% + {%\gridsnappingtrue + \ifcsname\??gr:#1\endcsname\csname\??gr:#1\endcsname\fi} + +\def\autosetsnapvalue#1% + {\ifcsname\??gr:#1\endcsname + \csname\??gr:#1\endcsname + \else + \installsnapvalues\s!dummy{#1}% + \csname\??gr:\s!dummy\endcsname + \fi} + +% \installsnapvalues{loose} {\v!maxdepth:0.8,\v!maxheight:0.8,\v!strut} +% \installsnapvalues{normal}{\v!maxdepth:1.0,\v!maxheight:1.0,\v!strut} +% \installsnapvalues{tight} {\v!maxdepth:1.2,\v!maxheight:1.2,\v!strut} + +% none don't enlarge +% halfline enlarge by halfline/halfline +% line enlarge by line/line +% strut enlarge by ht/dp (default) +% first align to top line +% last align to bottom line +% mindepth round depth down +% maxdepth round depth up +% minheight round height down +% maxheight round height up + +%D We're not downward compatible with \MKII ! + +\definegridsnapping[\v!normal] [\v!maxheight,\v!maxdepth,\v!strut] +\definegridsnapping[\v!standard] [\v!maxheight,\v!maxdepth,\v!strut] +\definegridsnapping[\v!yes] [\v!maxheight,\v!maxdepth,\v!strut] + +\definegridsnapping[\v!strict] [\v!maxdepth:0.8,\v!maxheight:0.8,\v!strut] +\definegridsnapping[\v!tolerant] [\v!maxdepth:1.2,\v!maxheight:1.2,\v!strut] + +\definegridsnapping[\v!top] [\v!minheight,\v!maxdepth,\v!strut] +\definegridsnapping[\v!bottom] [\v!maxheight,\v!mindepth,\v!strut] +\definegridsnapping[\v!both] [\v!minheight,\v!mindepth,\v!strut] + +\definegridsnapping[\v!broad] [\v!maxheight,\v!maxdepth,\v!strut,0.8] % maybe 0.85 +\definegridsnapping[\v!fit] [\v!maxheight,\v!maxdepth,\v!strut,1.2] % tight 0.15 + +\definegridsnapping[\v!first] [\v!first] +\definegridsnapping[\v!last] [\v!last] +\definegridsnapping[\v!high] [\v!minheight,\v!maxdepth,\v!none] +\definegridsnapping[\v!low] [\v!maxheight,\v!mindepth,\v!none] +\definegridsnapping[\v!line] [\v!line] +\definegridsnapping[\v!strut] [\v!strut] -\def\dosetupgridsnapping % calls too often, only needed in gridsnapping - {\ctxlua{nodes.setsnapvalue(1,\number\openstrutheight,\number\openstrutdepth)}} +\definegridsnapping[\v!max] [\v!maxdepth,\v!maxheight,\v!strut] +\definegridsnapping[\v!min] [\v!mindepth,\v!minheight,\v!strut] -\def\doenablegridsnapping - {\dosetattribute{snap-category}{1}% - \topskip\strutht - \offinterlineskip} +\newtoks\everysetupgridsnapping -\def\dodisablegridsnapping - {\doresetattribute{snap-category}% - % reset topskip - \oninterlineskip} +\def\dosetupgridsnapping{\the\everysetupgridsnapping} + +\appendtoks + \ctxlua{vspacing.freeze_snap_method(\number\bodyfontstrutheight,\number\bodyfontstrutdepth)}% +\to \everysetupgridsnapping + +% \appendtoks +% \resetsnapvalues +% \to \everyforgetall + +%D Snapping. + +\newif\ifgridsnapping + +\let\showgridsnapping\relax + +\def\snaptogrid {\dosingleempty\dosnaptogrid} +\def\moveongrid {\dosingleempty\domoveongrid} +\def\placeongrid{\dosingleempty\doplaceongrid} + +\def\dodomoveongrid[#1]% + {} % gone, unless we set an attribute + +\def\doplaceongrid[#1]% + {\snaptogrid[#1]\vbox} + +\def\dosnaptogrid[#1]% list or predefined + {\ifgridsnapping + \expandafter\dodosnaptogrid + \else + \expandafter\gobbleoneargument + \fi{#1}} + +\def\dodosnaptogrid#1% + {\bgroup + \resetsnapvalue + \dowithnextbox{\dododosnaptogrid{#1}}} + +\def\dododosnaptogrid#1% + {\ifvbox\nextbox + \ctxlua{nodes.collapse_vbox(\number\nextbox)}% + \fi + \doifelsenothing{#1}{\setsnapvalue\v!normal}{\autosetsnapvalue{#1}}% + \ctxlua{vspacing.snap_box(\number\nextbox,\number\attribute\snapmethodattribute)}% + \box\nextbox + \egroup} + +% no off + +% \def\docheckgridsnapping +% {\doifelse\@@lygrid\v!yes\gridsnappingtrue\gridsnappingfalse +% \ifgridsnapping +% \setsnapvalue\v!normal +% \setsystemmode\v!grid +% \else +% \resetsnapvalue +% \resetsystemmode\v!grid +% \fi} + +\def\docheckgridsnapping + {\doifelse\@@lygrid\v!no + {\gridsnappingfalse + \resetsystemmode\v!grid + \resetsnapvalue} + {\gridsnappingtrue + \setsystemmode\v!grid + \autosetsnapvalue\@@lygrid}} + +%D Visualization: + +\definepalet + [grid] + [ one=red, + two=green, + three=blue, + four=gray] + +\def\setgridtracebox#1[#2]% % maybe reverse the order + {\setbox\nextbox#1% + {\hbox + {\hbox to \zeropoint + {\setlayoutcomponentattribute\v!grid\v!test + \color[grid:#2]{\ruledhbox \layoutcomponentboxattribute {\fakebox\nextbox}}% + \hss}% + \flushnextbox}}} + +\chardef\gridboxlinenomode\plusone +\chardef\gridboxlinemode \plusone % 0:nothing 1:all 2:lines 3:frame + +\def\gridboxvbox {\ifcase\gridboxlinemode\vbox\or\ruledvbox\or\vbox\or\ruledvbox\else\ruledvbox\fi} +\def\gridboxwidth{\ifcase\gridboxlinemode0\or.5\or.5\or0\else.5\fi\testrulewidth} + +\def\setgridbox#1#2#3% maybe ifgridsnapping at outer level + {\setbox#1\gridboxvbox to #3 % given size + {\forgetall + \resetteststrut + \offinterlineskip + \hsize#2% + \baselinerulefalse + \gridboxvbox % calculated size + {\getrawnoflines{#3}% \getnoflines{#3}% +% \ifgridsnapping \else +% \vskip\topskip +% \vskip-\strutht +% \fi + \scratchdimen#2\advance\scratchdimen \lineheight + \dorecurse\noflines + {\strut + \hskip-.5\lineheight + \ifcase\gridboxlinenomode\or + \rlap + {\hskip.2\bodyfontsize\hskip\scratchdimen + \infofont\hbox to 1em{\hss\recurselevel}}% + \or + \llap + {\infofont\hbox to 1em{\hss\recurselevel}% + \hskip.2\bodyfontsize}% + \fi + \vrule + \!!height \gridboxwidth + \!!depth \gridboxwidth + \!!width \scratchdimen + \par}} + \vfill}} + +%D This has become obsolete: + +\def\fuzzysnappedbox#1#2% \box \unvbox + {#1#2} + +% \def\moveboxontogrid#1#2#3% will become obsolete +% {\doif{#2}\v!top {\setbox#1\hbox{\snaptogrid[\v!first]\box#1}}% +% \doif{#2}\v!bottom{\setbox#1\hbox{\snaptogrid[\v!last ]\box#1}}} + +\def\moveboxontogrid#1#2#3% will become obsolete + {} + +%D Helper: + +\def\doassignsomeskip#1\to#2% ook nog \v!halfline+fuzzysnap + {\doifelse{#1}\v!line + {#2\ifgridsnapping + \bodyfontlineheight + \else + \openlineheight + \fi} + {\ifgridsnapping + \assigndimension{#1}{#2}{.25\bodyfontlineheight}{.5\bodyfontlineheight}\bodyfontlineheight + \else + \assigndimension{#1}{#2}\smallskipamount\medskipamount\bigskipamount + \fi}% + \relax} + +% \start \dosetstretch{.25em} \setuptolerance[tolerant,stretch] \input tufte \endgraf \stop +% \start \dosetstretch{.5em} effe flink doorfietsen \stop + +% \def\dosetupgridsnapping % calls too often, only needed in gridsnapping +% {\ctxlua{nodes.setsnapvalue(1,\number\openstrutheight,\number\openstrutdepth)}} +% +% \def\doenablegridsnapping +% {\dosetattribute{snap-category}{1}% +% \topskip\strutht +% \offinterlineskip} +% +% \def\dodisablegridsnapping +% {\doresetattribute{snap-category}% +% % reset topskip +% \oninterlineskip} % experimental code, not yet interfaced: @@ -1204,10 +1419,6 @@ % order: larger wins % category:2,order:5,penalty:10000,skip:value|kw % -% always -- obsolete -% none -- obsolete -% outer -- obsolete -% reset -- obsolete % \defineblankmethod [\v!joinedup] {\ifvmode\nointerlineskip\fi} % todo, in grid mode: vspacing.fixed = false @@ -1218,6 +1429,8 @@ \newtoks\everybeforeblankhandling \newtoks\everyafterblankhandling +\newconditional\someblankdone + \appendtoks \blankskip\zeropoint \attribute\skipcategoryattribute\plusone @@ -1238,25 +1451,58 @@ \fi \to \everyafterblankhandling -\def\setblankcategory#1{\attribute\skipcategoryattribute#1\relax} -\def\setblankorder #1{\attribute\skiporderattribute #1\relax} -\def\setblankpenalty #1{\attribute\skippenaltyattribute #1\relax} -\def\addblankskip#1#2#3{\advance\blankskip#1\dimexpr\ifgridsnapping#3\else#2\fi\relax\relax} -\def\fixedblankskip {\settrue \blankisfixed} % \blankskip1\blankskip} -\def\flexibleblankskip {\setfalse\blankisfixed} % \blankskip1\blankskip\!!plus\skipgluefactor\blankskip\!!minus\skipgluefactor\blankskip} +% \ifgridsnapping will go + +\appendtoks + \ifgridsnapping + \settrue\blankisfixed + \else + \setfalse\blankisfixed + \fi +\to \everybeforeblankhandling + +\def\setblankcategory#1% + {\settrue\someblankdone + \attribute\skipcategoryattribute#1\relax} + +\def\setblankorder#1% + {\attribute\skiporderattribute#1\relax} + +\def\fixedblankskip + {\settrue\blankisfixed} + +\def\flexibleblankskip + {\setfalse\blankisfixed} + +\def\addblankskip#1#2#3% + {\settrue\someblankdone + \advance\blankskip#1\dimexpr\ifgridsnapping#3\else#2\fi\relax\relax} + +\def\setblankpenalty #1% + {\flushblankhandling + \settrue\someblankdone + \attribute\skipcategoryattribute \plusthree + \attribute\skippenaltyattribute #1\relax + \flushblankhandling} \def\startblankhandling {\begingroup + \setfalse\someblankdone \the\everybeforeblankhandling} \def\stopblankhandling {\the\everyafterblankhandling - \vskip\blankskip + \ifconditional\someblankdone + \vskip\blankskip + \fi \endgroup} \def\flushblankhandling {\the\everyafterblankhandling - \vskip\blankskip + \ifconditional\someblankdone + \vskip\blankskip + \fi + \setfalse\someblankdone \the\everybeforeblankhandling} % % % % @@ -1279,7 +1525,7 @@ \def\dovspacing[#1]% {\ctxlua{vspacing.analyse("\iffirstargument#1\else\s!default\fi")}} -% todo: checm them and make them faster: +% todo: check them and make them faster: \definecomplexorsimple\setupvspacing @@ -1308,15 +1554,25 @@ % category:4 is default -\definevspacingamount[\v!big] [\bigskipamount] [\openlineheight] -\definevspacingamount[\v!medium] [\medskipamount] [0.50\openlineheight] -\definevspacingamount[\v!small] [\smallskipamount] [0.25\openlineheight] -\definevspacingamount[\v!line] [\openlineheight] [\openlineheight] -\definevspacingamount[\v!halfline][0.50\openlineheight][0.50\openlineheight] -\definevspacingamount[\v!formula] [\medskipamount] [0.50\openlineheight] -\definevspacingamount[\v!white] [\parskip] [\openlineheight] -\definevspacingamount[\v!height] [\strutheight] [\strutheight] -\definevspacingamount[\v!depth] [\strutdepth] [\strutdepth] +% \definevspacingamount[\v!big] [\bigskipamount] [\openlineheight] +% \definevspacingamount[\v!medium] [\medskipamount] [0.50\openlineheight] +% \definevspacingamount[\v!small] [\smallskipamount] [0.25\openlineheight] +% \definevspacingamount[\v!line] [\openlineheight] [\openlineheight] +% \definevspacingamount[\v!halfline][0.50\openlineheight][0.50\openlineheight] +% \definevspacingamount[\v!formula] [\medskipamount] [0.50\openlineheight] +% \definevspacingamount[\v!white] [\parskip] [\openlineheight] +% \definevspacingamount[\v!height] [\strutheight] [\strutheight] +% \definevspacingamount[\v!depth] [\strutdepth] [\strutdepth] + +\definevspacingamount[\v!big] [\bigskipamount] [\bodyfontlineheight] +\definevspacingamount[\v!medium] [\medskipamount] [0.50\bodyfontlineheight] +\definevspacingamount[\v!small] [\smallskipamount] [0.25\bodyfontlineheight] +\definevspacingamount[\v!line] [\openlineheight] [\bodyfontlineheight] +\definevspacingamount[\v!halfline][0.50\openlineheight][0.50\bodyfontlineheight] +\definevspacingamount[\v!formula] [\medskipamount] [0.50\bodyfontlineheight] +\definevspacingamount[\v!white] [\parskip] [\bodyfontlineheight] +\definevspacingamount[\v!height] [\strutheight] [\bodyfontstrutheight] +\definevspacingamount[\v!depth] [\strutdepth] [\bodyfontstrutdepth] \definevspacing[\v!samepage][penalty:10000] \definevspacing[\v!max] [category:1] @@ -1350,8 +1606,9 @@ \ctxlua{vspacing.disable()}% \to \everydisablevspacing -\global\let\blank \vspacing -\global\let\defineblank\definevspacing +\let\blank \vspacing +\let\defineblank \definevspacing +\let\defineblankmethod\definevspacingamount % moved from page-lin diff --git a/tex/context/base/strc-des.mkiv b/tex/context/base/strc-des.mkiv index 1313ce097..c72db1899 100644 --- a/tex/context/base/strc-des.mkiv +++ b/tex/context/base/strc-des.mkiv @@ -545,7 +545,8 @@ \else \letvalue{\??dd#1\s!counter}\currentdescriptioncounter % ? \doifstructurecounterelse{\currentdescriptioncounter}{}{\dodefineenumerationcounter\currentdescriptioncounter}% - \fi\fi\fi} + \fi\fi\fi + \dosetupenumerationcounter{#1}} % new \newtoks\everysetupenumerationcounter \let\currentenumerationcountername\empty diff --git a/tex/context/base/strc-doc.lua b/tex/context/base/strc-doc.lua index 225ad62d8..7239cffc2 100644 --- a/tex/context/base/strc-doc.lua +++ b/tex/context/base/strc-doc.lua @@ -609,7 +609,7 @@ function sections.typesetnumber(entry,kind,...) -- kind='section','number','pref processors.sprint(ctxcatcodes,stopper) end else - report("error: no numbers") + -- report("error: no numbers") end end end diff --git a/tex/context/base/strc-flt.mkiv b/tex/context/base/strc-flt.mkiv index b41a25e5b..90f8011f6 100644 --- a/tex/context/base/strc-flt.mkiv +++ b/tex/context/base/strc-flt.mkiv @@ -618,7 +618,6 @@ \dowithnextboxcontent % better a \the\everyfloattoks {\setlocalfloathsize \floatparameter\c!inner - \fuzzysnappingfalse \postponenotes} % new {\doifsomething{\floatparameter\c!criterium} {\ifdim\wd\nextbox>\floatparameter\c!criterium\relax @@ -809,10 +808,6 @@ \dogetfloatdata \to \everyinsidefloat -%\appendtoks -% \fuzzysnappingfalse -%\to \everyinsidefloat - \def\doifrightpagefloatelse {\ifdoublesided \ifsinglesided @@ -2103,6 +2098,8 @@ % no \registerotrcommand\placesome* here!, this has to be cleaned up: +\def\somesidefloat{\OTRcommand\somesidefloat} + \def\someleftsidefloat [#1]{\somesidefloat[#1]\presetindentation} \def\somerightsidefloat [#1]{\somesidefloat[#1]} \def\sometopfloat [#1]{\someelsefloat[#1]\nonoindentation} diff --git a/tex/context/base/strc-lst.lua b/tex/context/base/strc-lst.lua index 64788e40e..9f15f5e83 100644 --- a/tex/context/base/strc-lst.lua +++ b/tex/context/base/strc-lst.lua @@ -211,7 +211,7 @@ local function filter_collected(names, criterium, number, collected) local cnumbers = sectionnumber.numbers local metadata = v.metadata if cnumbers then -print(#cnumbers, depth, table.concat(cnumbers)) +--~ print(#cnumbers, depth, table.concat(cnumbers)) if metadata and not metadata.nolist and (all or hash[metadata.name or false]) and #cnumbers >= depth then local ok = true for d=1,depth do diff --git a/tex/context/base/strc-mat.mkiv b/tex/context/base/strc-mat.mkiv index 451ea60b4..38c75c840 100644 --- a/tex/context/base/strc-mat.mkiv +++ b/tex/context/base/strc-mat.mkiv @@ -109,14 +109,6 @@ \def\dododoformulanumber#1#2#3#4% (#1,#2)=outer(ref,sub) (#3,#4)=inner(ref,sub) {\hbox\bgroup \ifconditional\handleformulanumber -% \ifconditional\incrementformulanumber -% \ifconditional\insidesubformulas -% \incrementsubstructurecounter[\v!formula][2]% -% \else -% \incrementstructurecounter[\v!formula]% -% \fi -% \fi - % % main counter \setbox0\hbox{\ignorespaces#2\unskip}% \ifdim\wd0>\zeropoint @@ -326,7 +318,6 @@ \def\rightdisplayskip {\rightskip} \def\leftdisplaymargin {\formulaparameter\c!leftmargin} \def\rightdisplaymargin {\formulaparameter\c!rightmargin} -\def\displaygridsnapping{\formulaparameter\c!grid} \def\beforedisplayspace {\doifnot{\formulaparameter\c!spacebefore}\v!none{\blank[\formulaparameter\c!spacebefore]}} @@ -441,89 +432,62 @@ \setfalse\handleformulanumber \dorechecknextindentation} % here ? +% \def\startdisplaymath +% {\bgroup +% \parskip\formulaparskip % ! ! +% \informulatrue +% %\forgetall % otherwise backgrounds fail +% \ifdim\lastskip<\zeropoint\else +% \par +% \ifvmode \ifdim\parskip>\zeropoint\relax +% \whitespace \vskip-\parskip % kind of forces and cancels again +% \fi \fi +% \fi +% \beforedisplayspace +% \par +% \ifvmode +% \prevdepth-\maxdimen % texbook pagina 79-80 +% % otherwise problems at the top of a page +% \verticalstrut +% \vskip-\struttotal +% \vskip-\baselineskip +% \fi +% $$\setdisplaydimensions +% \setpredisplaysize\lastlinewidth +% \startinnermath} + +% \def\stopdisplaymath +% {\stopinnermath +% $$% +% \par\ifvmode\ifdim\parskip>\zeropoint\whitespace\vskip-\parskip\fi\fi +% \afterdisplayspace +% \egroup} + \def\startdisplaymath - {\ifgridsnapping - \beforedisplayspace - \snapmathtogrid\vbox - \bgroup - \informulatrue - %\forgetall % breaks side floats - \else - \bgroup - \parskip\formulaparskip % ! ! - \informulatrue - %\forgetall % otherwise backgrounds fail - \ifdim\lastskip<\zeropoint\else - \par - \ifvmode \ifdim\parskip>\zeropoint\relax - \whitespace \vskip-\parskip % kind of forces and cancels again - \fi \fi - \fi - \doif\displaygridcorrection{-\v!top}{\kern-\strutht}% new, currently only option/default - \beforedisplayspace - \par - \ifvmode - \prevdepth-\maxdimen % texbook pagina 79-80 - % otherwise problems at the top of a page - \verticalstrut - \vskip-\struttotal - \vskip-\baselineskip - \fi + {\bgroup + \par + \informulatrue + \beforedisplayspace + \par + \ifvmode + \prevdepth-\maxdimen % texbook pagina 79-80 \fi - $$\setdisplaydimensions + $$ + \setdisplaydimensions \setpredisplaysize\lastlinewidth \startinnermath} \def\stopdisplaymath {\stopinnermath $$% - \ifgridsnapping - \egroup - \afterdisplayspace - \else - \par\ifvmode\ifdim\parskip>\zeropoint\whitespace\vskip-\parskip\fi\fi - \afterdisplayspace - \egroup - \fi - \globallet\displaylinecorrection\empty - \gdef\displaygridcorrection{\displaygridsnapping}} + \par + \afterdisplayspace + \par + \egroup} \newif\ifclipdisplaymath \clipdisplaymathtrue \def\displaymathclipfactor{1.1} -\def\snapmathtogrid % to do \dp - {\dowithnextbox - {\bgroup - \donefalse - \ifclipdisplaymath - \ifdim\nextboxht<\displaymathclipfactor\lineheight - \donetrue - \fi - \fi - \ifdone - \nextboxht\lineheight - \else - \getnoflines\nextboxht - \setbox\nextbox\vbox to \noflines\lineheight{\vfill\flushnextbox\vfill}% - \setbox\nextbox\hbox{\lower\strutdepth\flushnextbox}% - \fi - \snaptogrid[\displaygridcorrection]\hbox{\flushnextbox}% - \egroup}} - -\def\displaygridcorrection{\displaygridsnapping} -\let\displaygridcorrection\empty - -\def\moveformula - {\dosingleempty\domoveformula} - -\def\domoveformula[#1]% brr gaat mogelijk fout - {\iffirstargument - \xdef\displaygridcorrection{#1}% - \else - \gdef\displaygridcorrection{-\v!top}% handy with short preline - \fi - \globallet\displaylinecorrection\displaygridcorrection} - \let\startinnermath\empty \let\stopinnermath \empty diff --git a/tex/context/base/strc-pag.mkiv b/tex/context/base/strc-pag.mkiv index 192972d87..b21ae8bc4 100644 --- a/tex/context/base/strc-pag.mkiv +++ b/tex/context/base/strc-pag.mkiv @@ -241,7 +241,7 @@ % Hooks: \appendtoks - \xdef\currentpage{\the\realpageno}% + \xdef\currentpage{\the\realpageno}% rather useless \ifnum\realpageno>\lastpage \globallet\lastpage\lastrealpage \fi \to \everyinitializepagecounters diff --git a/tex/context/base/strc-ref.lua b/tex/context/base/strc-ref.lua index 16f5b6c41..a145098df 100644 --- a/tex/context/base/strc-ref.lua +++ b/tex/context/base/strc-ref.lua @@ -810,13 +810,25 @@ end -- +function jobreferences.get_current_kind() + local data = currentreference and currentreference.i + if data then + local kind = data.metadata and data.metadata.kind + if kind then + texsprint(ctxcatcodes,kind) + end + end +end + +-- + jobreferences.filters = jobreferences.filters or { } local filters = jobreferences.filters local helpers = structure.helpers local sections = structure.sections -function jobreferences.filter(name) -- number page title ... +function jobreferences.filter(name,...) -- number page title ... local data = currentreference and currentreference.i if data then local kind = data.metadata and data.metadata.kind @@ -824,7 +836,7 @@ function jobreferences.filter(name) -- number page title ... local filter = filters[kind] or filters.generic filter = filter and (filter[name] or filter.unknown or filters.generic[name] or filters.generic.unknown) if filter then - filter(data,name) + filter(data,name,...) elseif trace_referencing then logs.report("referencing","no (generic) filter.name for '%s'",name) end @@ -856,11 +868,11 @@ function filters.generic.text(data) end end -function filters.generic.number(data) -- todo: spec and then no stopper +function filters.generic.number(data,what,...) -- todo: spec and then no stopper if data then local numberdata = data.numberdata if numberdata then - helpers.prefix(data) + helpers.prefix(data,...) sections.typesetnumber(numberdata,"number",numberdata or false) else local useddata = data.useddata diff --git a/tex/context/base/strc-ren.mkiv b/tex/context/base/strc-ren.mkiv index 8890ec8e6..98cdca097 100644 --- a/tex/context/base/strc-ren.mkiv +++ b/tex/context/base/strc-ren.mkiv @@ -159,7 +159,6 @@ \def\beginheadplacement {\bgroup \setsystemmode\currentstructurehead - \ifgridsnapping\iftracegridsnapping\showstruts\fi\fi \xdef\localheadheight {\the\strutht}% \xdef\localheaddepth {\the\strutdp}% \xdef\localheadlineheight{\the\lineheight}% diff --git a/tex/context/base/syst-aux.mkiv b/tex/context/base/syst-aux.mkiv index 513f1c5e8..a7c83f246 100644 --- a/tex/context/base/syst-aux.mkiv +++ b/tex/context/base/syst-aux.mkiv @@ -4385,19 +4385,6 @@ %D a row. In both commands, the \type{n*} is optional. When this %D specification is missing, the command executes once. -% this one is obsolete: - -\def\dorepeat[#1]% - {\dodorepeat#1*\empty*\relax} - -\long\def\dodorepeat#1*#2#3*#4\relax - {\ifx#2\empty#1\else\dorecurse{#1}{#2#3}\fi} - -\def\repeater - {\recurselevel} - -% this one will be kept - \def\dorepeatwithcommand[#1]% {\dodorepeatwithcommand#1*\empty*\relax} @@ -4408,8 +4395,7 @@ {\ifx#2\empty % redundant but gives cleaner extensions #4{#1}% \else\ifnum#1<\zerocount - \bgroup\scratchcounter#1% - \normalexpanded{\egroup\noexpand\dorecurse{\number-\scratchcounter}}{#4{-#2#3}}% + \normalexpanded{\noexpand\dorecurse{\number-\number#1}}{#4{-#2#3}}% \else\ifx#2+% \dorecurse{#1}{#4{#3}}% \else diff --git a/tex/context/interface/cont-cs.xml b/tex/context/interface/cont-cs.xml index f85a07d73..c22ededd8 100644 --- a/tex/context/interface/cont-cs.xml +++ b/tex/context/interface/cont-cs.xml @@ -7055,6 +7055,10 @@ + + + + diff --git a/tex/context/interface/cont-de.xml b/tex/context/interface/cont-de.xml index 77c8d62f7..af98387fc 100644 --- a/tex/context/interface/cont-de.xml +++ b/tex/context/interface/cont-de.xml @@ -7055,6 +7055,10 @@ + + + + diff --git a/tex/context/interface/cont-en.xml b/tex/context/interface/cont-en.xml index 97b3b4e15..01feb5e50 100644 --- a/tex/context/interface/cont-en.xml +++ b/tex/context/interface/cont-en.xml @@ -7055,6 +7055,10 @@ + + + + diff --git a/tex/context/interface/cont-fr.xml b/tex/context/interface/cont-fr.xml index 11a7c89b3..22011cd9f 100644 --- a/tex/context/interface/cont-fr.xml +++ b/tex/context/interface/cont-fr.xml @@ -7055,6 +7055,10 @@ + + + + diff --git a/tex/context/interface/cont-it.xml b/tex/context/interface/cont-it.xml index 0c8a1e6c2..14b9cbaa4 100644 --- a/tex/context/interface/cont-it.xml +++ b/tex/context/interface/cont-it.xml @@ -7055,6 +7055,10 @@ + + + + diff --git a/tex/context/interface/cont-nl.xml b/tex/context/interface/cont-nl.xml index fa710019c..401fe14e1 100644 --- a/tex/context/interface/cont-nl.xml +++ b/tex/context/interface/cont-nl.xml @@ -7055,6 +7055,10 @@ + + + + diff --git a/tex/context/interface/cont-pe.xml b/tex/context/interface/cont-pe.xml index 6c6edc594..e0d3f7ce5 100644 --- a/tex/context/interface/cont-pe.xml +++ b/tex/context/interface/cont-pe.xml @@ -7055,6 +7055,10 @@ + + + + diff --git a/tex/context/interface/cont-ro.xml b/tex/context/interface/cont-ro.xml index e1a27912a..ba83586a1 100644 --- a/tex/context/interface/cont-ro.xml +++ b/tex/context/interface/cont-ro.xml @@ -7055,6 +7055,10 @@ + + + + diff --git a/tex/context/interface/keys-cs.xml b/tex/context/interface/keys-cs.xml index 15ff191b9..7bbc18d57 100644 --- a/tex/context/interface/keys-cs.xml +++ b/tex/context/interface/keys-cs.xml @@ -272,11 +272,15 @@ + + + + @@ -736,6 +740,7 @@ + diff --git a/tex/context/interface/keys-de.xml b/tex/context/interface/keys-de.xml index 7e700570e..753f6a737 100644 --- a/tex/context/interface/keys-de.xml +++ b/tex/context/interface/keys-de.xml @@ -272,11 +272,15 @@ + + + + @@ -736,6 +740,7 @@ + diff --git a/tex/context/interface/keys-en.xml b/tex/context/interface/keys-en.xml index 942bc6ba3..c96040b66 100644 --- a/tex/context/interface/keys-en.xml +++ b/tex/context/interface/keys-en.xml @@ -272,11 +272,15 @@ + + + + @@ -736,6 +740,7 @@ + diff --git a/tex/context/interface/keys-fr.xml b/tex/context/interface/keys-fr.xml index 653a49bf4..cabfd3d87 100644 --- a/tex/context/interface/keys-fr.xml +++ b/tex/context/interface/keys-fr.xml @@ -272,11 +272,15 @@ + + + + @@ -736,6 +740,7 @@ + diff --git a/tex/context/interface/keys-it.xml b/tex/context/interface/keys-it.xml index 1f0d73af2..c41046492 100644 --- a/tex/context/interface/keys-it.xml +++ b/tex/context/interface/keys-it.xml @@ -272,11 +272,15 @@ + + + + @@ -736,6 +740,7 @@ + diff --git a/tex/context/interface/keys-nl.xml b/tex/context/interface/keys-nl.xml index a6f527ec9..0ce4d1247 100644 --- a/tex/context/interface/keys-nl.xml +++ b/tex/context/interface/keys-nl.xml @@ -272,11 +272,15 @@ + + + + @@ -736,6 +740,7 @@ + diff --git a/tex/context/interface/keys-pe.xml b/tex/context/interface/keys-pe.xml index 98e37b6f4..b38e3607f 100644 --- a/tex/context/interface/keys-pe.xml +++ b/tex/context/interface/keys-pe.xml @@ -272,11 +272,15 @@ + + + + @@ -736,6 +740,7 @@ + diff --git a/tex/context/interface/keys-ro.xml b/tex/context/interface/keys-ro.xml index fde4533d1..9e38fbc96 100644 --- a/tex/context/interface/keys-ro.xml +++ b/tex/context/interface/keys-ro.xml @@ -272,11 +272,15 @@ + + + + @@ -736,6 +740,7 @@ + diff --git a/tex/generic/context/luatex-fonts-merged.lua b/tex/generic/context/luatex-fonts-merged.lua index b58c25a92..3ca17ac6d 100644 --- a/tex/generic/context/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex-fonts-merged.lua @@ -1,6 +1,6 @@ -- merged file : c:/data/develop/context/texmf/tex/generic/context/luatex-fonts-merged.lua -- parent file : c:/data/develop/context/texmf/tex/generic/context/luatex-fonts.lua --- merge date : 09/16/09 20:09:33 +-- merge date : 09/21/09 17:40:59 do -- begin closure to overcome local limits and interference @@ -2245,6 +2245,8 @@ local glyph = nodes.register(new_node("glyph",0)) local textdir = nodes.register(new_node("whatsit",7)) local rule = nodes.register(new_node("rule")) local latelua = nodes.register(new_node("whatsit",35)) +--~ local user = nodes.register(new_node("user_defined")) +local user = nodes.register(new_node(44)) function nodes.glyph(fnt,chr) local n = copy_node(glyph) @@ -2294,6 +2296,31 @@ function nodes.latelua(code) return n end +function nodes.usernumber(num) + local n = copy_node(user) + n.type = 100 + if num then n.value = num end + return n +end +function nodes.userstring(str) + local n = copy_node(user) + n.type = 115 + if str then n.value = str end + return n +end +function nodes.userlist(list) + local n = copy_node(user) + n.type = 110 + if list then n.value = list end + return n +end +function nodes.usertokens(tokens) + local n = copy_node(user) + n.type = 116 + if tokens then n.value = tokens end + return n +end + statistics.register("cleaned up reserved nodes", function() return format("%s nodes, %s lists of %s", nodes.cleanup_reserved(tex.count["lastallocatedbox"])) end) -- \topofboxstack @@ -5566,6 +5593,7 @@ otf.enhancers["analyse unicodes"] = function(data,filename) cidcodes = usedmap.unicodes end uparser = fonts.map.make_name_parser() + local aglmap = fonts.map and fonts.map.agl_to_unicode for index, glyph in next, data.glyphs do local name, unic = glyph.name, glyph.unicode or -1 -- play safe if unic == -1 or unic >= private or (unic >= 0xE000 and unic <= 0xF8FF) or unic == 0xFFFE or unic == 0xFFFF then @@ -5610,7 +5638,8 @@ otf.enhancers["analyse unicodes"] = function(data,filename) if nplit == 0 then -- skip elseif nplit == 1 then - unicode = unicodes[split[1]] + local base = split[1] + unicode = unicodes[base] or (agl and agl[base]) if unicode then if type(unicode) == "table" then unicode = unicode[1] @@ -5620,7 +5649,8 @@ otf.enhancers["analyse unicodes"] = function(data,filename) else local done = true for l=1,nplit do - local u = unicodes[split[l]] + local base = split[l] + local u = unicodes[base] or (agl and agl[base]) if not u then done = false break @@ -11002,7 +11032,7 @@ local match, format, find, concat = string.match, string.format, string.find, ta local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end) -local ctxcatcodes = tex.ctxcatcodes +local ctxcatcodes = tex and tex.ctxcatcodes --[[ldx--

Eventually this code will disappear because map files are kind @@ -11133,13 +11163,15 @@ end local hex = lpeg.R("AF","09") local hexfour = (hex*hex*hex*hex) / function(s) return tonumber(s,16) end -local dec = (lpeg.R("09")^1) / tonumber +local hexsix = (hex^1) / function(s) return tonumber(s,16) end +local dec = (lpeg.R("09")^1) / tonumber local period = lpeg.P(".") local unicode = lpeg.P("uni") * (hexfour * (period + lpeg.P(-1)) * lpeg.Cc(false) + lpeg.Ct(hexfour^1) * lpeg.Cc(true)) +local ucode = lpeg.P("u") * (hexsix * (period + lpeg.P(-1)) * lpeg.Cc(false) + lpeg.Ct(hexsix ^1) * lpeg.Cc(true)) local index = lpeg.P("index") * dec * lpeg.Cc(false) -local parser = unicode + index +local parser = unicode + ucode + index local parsers = { } @@ -11157,10 +11189,13 @@ function fonts.map.make_name_parser(str) end --~ local parser = fonts.map.make_name_parser("Japan1") +--~ local parser = fonts.map.make_name_parser() --~ local function test(str) --~ local b, a = parser:match(str) --~ print((a and table.serialize(b)) or b) --~ end +--~ test("a.sc") +--~ test("a") --~ test("uni1234") --~ test("uni1234.xx") --~ test("uni12349876") -- cgit v1.2.3