summaryrefslogtreecommitdiff
path: root/tex/context/base/mkxl/meta-imp-kaktovik.mkxl
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkxl/meta-imp-kaktovik.mkxl')
-rw-r--r--tex/context/base/mkxl/meta-imp-kaktovik.mkxl251
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