diff options
Diffstat (limited to 'tex/context/base/mkxl/meta-imp-kaktovik.mkxl')
-rw-r--r-- | tex/context/base/mkxl/meta-imp-kaktovik.mkxl | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/tex/context/base/mkxl/meta-imp-kaktovik.mkxl b/tex/context/base/mkxl/meta-imp-kaktovik.mkxl new file mode 100644 index 000000000..40e9f826c --- /dev/null +++ b/tex/context/base/mkxl/meta-imp-kaktovik.mkxl @@ -0,0 +1,251 @@ +%D \module +%D [ file=meta-imp-kaktovik, +%D version=2023.04.18, +%D title=\METAPOST\ Graphics, +%D subtitle=Kaktovik Numbers, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D Just a quick hack for Hraban (after a post on the mailing list). + +\startMPcalculation{simplefun} + + path kaktovik_glyphs[] ; + + def InitializeKaktovik = + + save p, d, u ; + + pair p[] ; numeric d ; d := .1 ; numeric u ; u := .15 ; + + % d := getparameterdefault "mpsfont" "d" .10 ; + % u := getparameterdefault "mpsfont" "u" .15 ; + + p[0] := (0,1) ; + p[1] := (1,0) ; + p[2] := (2,1 - d) ; + p[3] := (3,0) ; + p[4] := (4,1 - 2d) ; + + p[5] := (4,1 + u) ; + p[6] := (0,1 + 2u) ; + p[7] := (4,1 + 4u) ; + + kaktovik_glyphs[0] := (1,1) { right } .. { left } (2,1/2) { left } .. { right } (3,1); + + for i= 1 upto 4 : + kaktovik_glyphs[i] := p[0] for j=1 upto i : -- p[j] endfor ; + endfor ; + + kaktovik_glyphs[ 5] := p[5] -- p[0] ; for i= 6 upto 9 : kaktovik_glyphs[i] := p[5] -- kaktovik_glyphs[i-5] ; endfor ; + kaktovik_glyphs[10] := p[6] -- kaktovik_glyphs[ 5] ; for i=11 upto 14 : kaktovik_glyphs[i] := p[6] -- kaktovik_glyphs[i-5] ; endfor ; + kaktovik_glyphs[15] := p[7] -- kaktovik_glyphs[10] ; for i=16 upto 19 : kaktovik_glyphs[i] := p[7] -- kaktovik_glyphs[i-5] ; endfor ; + + enddef ; + + vardef Kaktovik(expr i) = + draw image ( + draw kaktovik_glyphs[i] + xscaled (10/20 -1/20) + yscaled (25/20 -2/20) + withpen (pencircle xscaled 1/20 yscaled 5/20) rotated -(2*20) + % withpen (pencircle xscaled 1/40 yscaled 5/40) rotated -(2*20) + % withpen (pencircle xscaled 2.5/40 yscaled 5/40) rotated -(2*20) + ; + ) shifted (2/20,2/20) + enddef ; + + lmt_registerglyphs [ + name = "kaktovik", + units = 2, + usecolor = true, + width = 2, + height = 2, + depth = 0, + preamble = "InitializeKaktovik" + ] ; + + for i=0 upto 19 : + lmt_registerglyph [ + category = "kaktovik", + unicode = 119488 + i, % "0x1D2C0" + code = "Kaktovik(" & decimal i & ")" + ] ; + endfor ; + +\stopMPcalculation + +\startluacode + local kaktovik = moduledata.kaktovik or { } + moduledata.kaktovik = kaktovik + + local tonumber = tonumber + local load = load + local reverse = table.reverse + local utfchar = utf.char + local gsub = string.gsub + local concat = table.concat + local utfvalues = string.utfvalues + local lpegmatch = lpeg.match + + function kaktovik.tointeger(s) + local n = 0 + for b in utfvalues(s) do + local k = b - 0x1D2C0 + n = n * 20 + k + end + return n + end + +-- function kaktovik.tostring(n) +-- local digits = { } +-- local count = 1 +-- while true do +-- digits[count] = utfchar(0x1D2C0 + (n % 20)) +-- n = n // 20 +-- if n == 0 then +-- break; +-- end +-- count = count + 1 +-- end +-- return concat(reverse(digits)) +-- end + + local f = string.formatters["%N"] + + function kaktovik.tostring(n) + if n >= 0 and n <= 19 then + return utfchar(0x1D2C0 + n) + else + -- no need to optimize + local result = gsub(f(n),"(%d+)",function(s) + local digits = { } + local count = 1 + local n = tonumber(s) + while true do + digits[count] = utfchar(0x1D2C0 + (n % 20)) + n = n // 20 + if n == 0 then + break; + end + count = count + 1 + end + return concat(reverse(digits)) + end) + return result + end + end + + do + + local k = { } + local n = 0 + for i=0x1D2C0,0x1D2C0+19 do + k[utf.char(i)] = n + n = n + 1 + end + + local p = lpeg.Cs ( + lpeg.Cc("return ") + * ( + lpeg.utfchartabletopattern(k) / k + + lpeg.P(1) + )^0 + ) + + local t = setmetatable({ },{ __index = math }) + + function kaktovik.calculate(old) + local new = lpegmatch(p,old) + if new then + new = load(new,nil,nil,t) + if type(new) == "function" then + new = new() + if new then + return new + end + end + end + return old + end + + end + + interfaces.implement { + name = "kaktoviknumerals", + arguments = "integer", + actions = { kaktovik.tostring, context } + } + interfaces.implement { + name = "kaktovikcalculate", + public = true, + arguments = "string", + actions = { kaktovik.calculate, kaktovik.tostring, context } + } +\stopluacode + +\unprotect + +\permanent\def\kaktoviknumerals#1{\clf_kaktoviknumerals\numexpr#1\relax} + +\defineconversion [kaktoviknumerals] [\kaktoviknumerals] +\defineconversion [K] [\kaktoviknumerals] + +\definefontfeature + [kaktovik] + [metapost=kaktovik] + +\protect + +\continueifinputfile{meta-imp-kaktovik.mkxl} + +\definefontfeature + [default] + [default] + [metapost=kaktovik] +% [metapost={category=kaktovik,u=.25,d=.20,x=}] + +\setupbodyfont[dejavu] + +% \nopdfcompression + +\startTEXpage[offset=1ts,width=3es] + + \start + \showglyphs + KAKTOVIK + \dostepwiserecurse{0}{19}{1}{\kaktoviknumerals{#1}\space } + \stop + + kaktovik \start + \red\glyphxscale 700 + \dostepwiserecurse{0}{19}{1}{\kaktoviknumerals{#1}\space } + \stop + + \startitemize[packed,K][color=orange,stopper=] + \startitem first \stopitem + \startitem second \stopitem + \startitem third \stopitem + \stopitemize + + KAKTOVIK \start + \red \kaktoviknumerals{2023} -- + \green\kaktoviknumerals{4} -- + \blue \kaktoviknumerals{18} + \stop + + KAKTOVIK + + 𝋂 + 𝋂 = \kaktovikcalculate{𝋂 + 𝋂} = \kaktoviknumerals{4} + + \protected\def\ForWilli#1{#1 = \kaktovikcalculate{#1}} + + \ForWilli{(𝋂 + 𝋂) ^ (𝋂 + 𝋂)} + + \ForWilli{(sin ( 𝋂𝋓 ) )} +\stopTEXpage |