|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- zhas.lua: ZHAs, cuts, and mixed LaTeX/ascii pictures of ZHAs and cuts.
-- This file:
-- http://angg.twu.net/dednat6/dednat6/zhas.lua
-- http://angg.twu.net/dednat6/dednat6/zhas.lua.html
-- (find-angg "dednat6/dednat6/zhas.lua")
--
-- This is a hack that I use in the papers of my "Planar Heyting
-- Algebras for Children" series:
-- http://angg.twu.net/math-b.html#zhas-for-children-2
-- http://angg.twu.net/LATEX/2017planar-has-1.pdf
-- http://angg.twu.net/LATEX/2017planar-has-1.tgz
--
-- The code in this file and in zhaspecs.lua creates and manipulates
-- ZHAs in several ways, and draws them in ASCII and in LaTeX/pict2e.
-- There are many things in "Planar Heyting Algebras for Children"
-- that I was only able to discover because I had this to do the
-- calculations for me... but as I implemented more and more functions
-- here this file grew too much, and became almost unmanageable. =(
-- «.ZHA» (to "ZHA")
-- «.ZHA-connectives» (to "ZHA-connectives")
-- «.ZHA-getcuts» (to "ZHA-getcuts")
-- «.ZHA-walls» (to "ZHA-walls")
-- «.ZHA-shrinktop» (to "ZHA-shrinktop")
-- «.ZHA-tests» (to "ZHA-tests")
-- «.ZHA-tests-walls» (to "ZHA-tests-walls")
-- «.ZHA-test-connectives» (to "ZHA-test-connectives")
-- «.ZHA-test-generators» (to "ZHA-test-generators")
-- «.ZHA-test-shrinktop» (to "ZHA-test-shrinktop")
-- «.shortoperators» (to "shortoperators")
-- «.shortoperators-tests» (to "shortoperators-tests")
-- «.Cuts» (to "Cuts")
-- «.Cuts-tests» (to "Cuts-tests")
-- «.MixedPicture» (to "MixedPicture")
-- «.mpnew» (to "mpnew")
-- «.mpnewJ» (to "mpnewJ")
-- «.MixedPicture-cuts» (to "MixedPicture-cuts")
-- «.MixedPicture-zha» (to "MixedPicture-zha")
-- «.MixedPicture-tests» (to "MixedPicture-tests")
-- «.MixedPicture-zhalrf-tests» (to "MixedPicture-zhalrf-tests")
-- «.MixedPicture-arch-tests» (to "MixedPicture-arch-tests")
-- «.MixedPicture-zset-tests» (to "MixedPicture-zset-tests")
-- «.MixedPicture-J-tests» (to "MixedPicture-J-tests")
-- «.drawtwocolgraph» (to "drawtwocolgraph")
-- «.drawtwocolgraph-tests» (to "drawtwocolgraph-tests")
-- «.VCuts» (to "VCuts")
-- «.VCuts-tests» (to "VCuts-tests")
-- «.TCG» (to "TCG")
-- «.TGC-tests» (to "TGC-tests")
-- «.asciirectpoints» (to "asciirectpoints")
-- «.asciirectpoints-tests» (to "asciirectpoints-tests")
require "picture" -- (find-dn6 "picture.lua")
checkrange = function(a, b, c, err)
if a <= b and b <= c then return true end
if err then error(format("%s", err, a, b, c)) end
end
isint = function (n) return math.floor(n) == n end
-- ______ _ _
-- |__ / | | | / \
-- / /| |_| | / _ \
-- / /_| _ |/ ___ \
-- /____|_| |_/_/ \_\
--
-- «ZHA» (to ".ZHA")
specwidths = function (spec)
local copydigit = function (s) return s:sub(1, 1):rep(#s) end
return (spec:gsub("[1-9][LRV]+", copydigit))
end
specx0 = function (spec) return -(ZHA.fromspec(spec).minx) end
ZHA = Class {
type = "ZHA",
fromspec = function (spec)
return ZHA.fromspec0(spec):calcminmaxlr()
end,
fromspec0 = function (spec, x0)
x0 = x0 or 0
local widths = specwidths(spec)
local z = ZHA {spec=spec, widths=widths,
maxy=#spec-1, minx=x0, maxx=x0,
L={[0]=x0}, R={[0]=x0}}
local getc = function (y) return spec :sub(y+1, y+1) end
local getw = function (y) return widths:sub(y+1, y+1)+0 end
local w, LR = 1, V{x0, x0}
local getdeltaLRw = function (y)
local c = getc(y)
if c == "L" then return V{-1, -1} end -- move left
if c == "R" then return V{ 1, 1} end -- move right
if c == (w+1).."" then w = w+1; return V{-1, 1} end -- become wider
if c == (w-1).."" then w = w-1; return V{ 1, -1} end -- become thinner
error("Bad char: "..c.." in spec: "..z.spec)
end
for y=1,z.maxy do
-- PP(y, getc(y), w)
-- LR = LR + PP(getdeltaLRw(y))
LR = LR + getdeltaLRw(y)
local xL, xR = LR[1], LR[2]
z.L[y], z.R[y] = xL, xR
z.minx = min(z.minx, xL)
z.maxx = max(z.maxx, xR)
end
return z
end,
--
-- A high-level method that uses the class LR in zhaspecs.lua.
-- See: (find-dn6 "zhaspecs.lua" "LR")
-- (find-dn6 "zhaspecs.lua" "LR" "fromtcgspec =")
-- (find-dn6 "zhaspecs.lua" "LR-fromtcgspec-tests")
fromtcgspec = function (spec)
return LR.fromtcgspec(spec):zha()
end,
--
__tostring = function (z) return z:tostring() end,
--
__index = {
-- PP = function (z) PP(z); return z end,
PP = function (z) print(mytabletostring(z)); return z end,
print = function (z) print(z); return z end,
hasxy = function (z, x,y)
local x, y = v(x, y):to12()
local L, R = z.L[y], z.R[y]
if not L then return false end
if not checkrange(L, x, R) then return false end
if not isint((x-L)/2) then return false end
return true
end,
xycontents = function (z, x,y)
local xy = v(x, y)
if z:hasxy(xy) then return xy:xytolr():todd() end
end,
tolines = function (z)
local lines = {}
for y=z.maxy,0,-1 do
local f = function (x) return z:xycontents(x, y) or " " end
table.insert(lines, mapconcat(f, seq(z.minx, z.maxx)))
end
return lines
end,
tostring = function (z) return table.concat(z:tolines(), "\n") end,
--
-- Compute minl[], maxl[], minr[], maxr[], lrtop
-- (find-dn6file "zha.lua" "calclrminmax =")
leftpoint = function (z, y) return v(z.L[y], y) end,
rightpoint = function (z, y) return v(z.R[y], y) end,
setminmaxlr0 = function (z, v)
local l, r = v:to_l_r()
z.minl[r], z.maxl[r] = minmax(z.minl[r], l, z.maxl[r])
z.minr[l], z.maxr[l] = minmax(z.minr[l], r, z.maxr[l])
end,
calcminmaxlr = function (z)
z.minl, z.minr, z.maxl, z.maxr = {}, {}, {}, {}
for y=0,z.maxy do
z:setminmaxlr0(z:leftpoint(y))
z:setminmaxlr0(z:rightpoint(y))
end
z.top = z:leftpoint(z.maxy)
z.topl, z.topr = z.top:to_l_r()
return z
end,
-- z:Imp(P,Q) uses ne and nw
sw = function (z, v) local l,r = v:to_l_r(); return lr(l, z.minr[l]) end,
ne = function (z, v) local l,r = v:to_l_r(); return lr(l, z.maxr[l]) end,
se = function (z, v) local l,r = v:to_l_r(); return lr(z.minl[r], r) end,
nw = function (z, v) local l,r = v:to_l_r(); return lr(z.maxl[r], r) end,
--
-- Generate all points and all arrows of the ZHA
points = function (z)
return cow(function ()
for l=z.topl,0,-1 do
for r=z.minr[l],z.maxr[l] do
coy(lr(l, r)) -- coy returns: lr(l,r)
end
end
end)
end,
arrows = function (z, usewhitemoves)
local tar = texarrow_smart(usewhitemoves)
return cow(function ()
for y=z.maxy,1,-1 do
for x=z.L[y],z.R[y],2 do
if z:hasxy(x-1, y-1) then coy(v(x, y), -1, -1, tar.sw) end
if z:hasxy(x+1, y-1) then coy(v(x, y), 1, -1, tar.se) end
-- coy returns: v(x,y), dx, dy, tex
end
end
end)
end,
--
-- For left generators, genp returns "L"; for right generators, "R"
genp = function (z, P)
local x,y = P:to_x_y()
if z.L[y] and z.L[y-1] then
local la,ma,ra = z.L[y], x, z.R[y] -- above
local lb,mb,rb = z.L[y-1], x, z.R[y-1] -- below
if la == ma and la + 1 == lb then return "L" end -- left gen
if ma == ra and rb + 1 == ra then return "R" end -- right gen
end
end,
pointslrg = function (z)
return cow(function ()
for P in z:points() do
local gen, l, r = z:genp(P), P:to_l_r()
coy(P, l, r, gen)
end
end)
end,
--
-- «ZHA-connectives» (to ".ZHA-connectives")
-- (to "ZHA-test-connectives")
-- Logical operations: <=, T, F, &, v, ->, <->, not
Le = function (z, P, Q) return P:below(Q) end,
T = function (z) return z.top end,
F = function (z) return V{0, 0} end,
And = function (z, P, Q) return P:And(Q) end,
Or = function (z, P, Q) return P:Or(Q) end,
Imp = function (z, P, Q)
if P:below(Q) then return z.top
elseif P:leftof(Q) then return z:ne(P:And(Q))
elseif P:rightof(Q) then return z:nw(P:And(Q))
else return Q
end
end,
Bic = function (z, P, Q) return z:And(z:Imp(P, Q), z:Imp(Q, P)) end,
Not = function (z, P) return z:Imp(P, z:F()) end,
--
-- «ZHA-getcuts» (to ".ZHA-getcuts")
-- See: (find-angg "LUA/lua50init.lua" "eval-and-L")
-- For a J-operator J, test the points of the upper-left and
-- upper-right walls to determine where are the cuts.
getcuts = function (z, J)
if type(J) == "string" then J = L(J) end
local cuts = ""
local add = function (c) cuts = cuts..c end
local ltoP = function (l) return lr(l, z.maxr[l]) end
local rtoP = function (r) return lr(z.maxl[r], r) end
local isstable = function (P) return J(P):lr() == P:lr() end
add(z.topl)
for l=z.topl-1,0,-1 do
if isstable(ltoP(l)) then add("/") end
add(l)
end
add(" ")
for r=0,z.topr-1 do
add(r)
if isstable(rtoP(r)) then add("|") end
end
add(z.topr)
return cuts
end,
--
-- «ZHA-walls» (to ".ZHA-walls")
-- (to "ZHA-tests-walls")
rightwallgenerators = function (z, all)
local A = {}
for r=1,z.topr do
if all or z.minl[r-1] < z.minl[r] then
table.insert(A, lr(z.minl[r], r))
end
end
return A
end,
leftwallgenerators = function (z, all)
local A = {}
for l=1,z.topl do
if all or z.minr[l-1] < z.minr[l] then
table.insert(A, lr(l, z.minr[l]))
end
end
return A
end,
totcgspec = function (z)
local maxl = z.topl
local maxr = z.topr
local tolr = function (v) return v:lr() end
local leftgens = mapconcat(tolr, z:leftwallgenerators(), " ")
local rightgens = mapconcat(tolr, z:rightwallgenerators(), " ")
return format("%s, %s; %s, %s", maxl, maxr, leftgens, rightgens)
end,
--
rightwallcorners = function (z)
local l, r = 0, 0
local A = {}
-- local dbg = function (str) PP(str, l, r) end
local push = function () table.insert(A, lr(l, r)) end
local nextoutercorner = function () r = z.maxr[l]; push() end
local nextinnercorner = function ()
if r < z.topr then l = z.minl[r+1]; push(); return true end
end
push()
nextoutercorner()
while nextinnercorner() do nextoutercorner() end
l, r = z.topl, z.topr
push()
return A
end,
leftwallcorners = function (z)
local l, r = 0, 0
local A = {}
-- local dbg = function (str) PP(str, l, r) end
local push = function () table.insert(A, lr(l, r)) end
local nextoutercorner = function () l = z.maxl[r]; push() end
local nextinnercorner = function ()
if l < z.topl then r = z.minr[l+1]; push(); return true end
end
push()
nextoutercorner()
while nextinnercorner() do nextoutercorner() end
l, r = z.topl, z.topr
push()
return A
end,
--
-- «ZHA-shrinktop» (to ".ZHA-shrinktop")
-- These methods use the class LR in zhaspecs.lua.
-- See: (find-dn6 "zhaspecs.lua" "LR")
toLR = function (z)
return LR.fromtcgspec(z:totcgspec())
end,
shrinktop = function (z, P)
return z:toLR():shrinktop(P):zha()
end,
},
}
-- «ZHA-tests» (to ".ZHA-tests")
--[[
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
dofile "zhas.lua"
ZHA.fromspec("12L1RRR2RL1"):PP():print()
ZHA.fromspec("123LLR432L1"):PP():print()
ZHA.fromspec("123RRL432R1"):PP():print()
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
dofile "zhas.lua"
dofile "zhaspecs.lua"
= ZHA.fromspec("123RRL432R1")
= ZHA.fromspec("123RRL432R1"):totcgspec()
= ZHA.fromtcgspec("4, 6; 32, 15 36")
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
dofile "zhas.lua"
z = ZHA.fromspec("123RRL432R1"):PP()
= z
for y=z.maxy-1,0,-1 do
for x=z.minx,z.maxx do
printf(z:xycontents(x, y) or " ")
end
print()
end
= z
z:PP()
PPV(z:tolines())
PP(z:tostring())
= z:hasxy(0,0)
= z
-- «ZHA-tests-walls» (to ".ZHA-tests-walls")
-- (to "ZHA-walls")
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
-- (find-dn6 "zha.lua" "ZHA")
dofile "zhas.lua"
pris = function (o) printf("%s ", tostring(o)) end
z = ZHA.fromspec("12RRL1LLRR")
= z
for y=z.maxy,0,-1 do pris(z:leftpoint(y):lr()) end; print()
for y=z.maxy,0,-1 do pris(z:rightpoint(y):lr()) end; print()
for _,P in ipairs(z:rightwallgenerators("all")) do pris(P:lr()) end; print()
for _,P in ipairs(z:rightwallgenerators()) do pris(P:lr()) end; print()
for _,P in ipairs(z:leftwallgenerators("all")) do pris(P:lr()) end; print()
for _,P in ipairs(z:leftwallgenerators()) do pris(P:lr()) end; print()
for _,P in ipairs(z:rightwallcorners()) do pris(P:lr()) end; print()
for _,P in ipairs(z:leftwallcorners()) do pris(P:lr()) end; print()
-- 45
-- 44
-- 43
-- 33
-- 23
-- 22 13
-- 12 03
-- 11 02
-- 10 01
-- 00
-- «ZHA-test-connectives» (to ".ZHA-test-connectives")
-- (to "ZHA-connectives")
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
-- (find-dn6 "zha.lua" "ZHA")
dofile "zhas.lua"
z = ZHA.fromspec("12RRL1LLRR"):print()
= z:Imp(v"11", v"02"):lr() --> 03
= z:Imp(v"03", v"12"):lr() --> 22
= z:Imp(v"23", v"12"):lr() --> 12
= z:Imp(v"12", v"23"):lr() --> 45
= z:ne(v"10"):lr() --> 13
= z:nw(v"02"):lr() --> 22
= v"12":And(v"03"):lr() --> 02
= v"11":And(v"02"):lr()
= z:ne(v"11":And(v"02")):lr() --> 03
= v("11"):leftof(v"02")
= v("11"):above(v"02")
= v("11"):below(v"02")
= v("23"):below(v"12")
= v("23"):above(v"12")
-- 45
-- 44
-- 43
-- 33
-- 23
-- 22 13
-- 12 03
-- 11 02
-- 10 01
-- 00
-- «ZHA-test-generators» (to ".ZHA-test-generators")
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
dofile "zhas.lua"
z = ZHA.fromspec("123RRL432R1"):print()
for v in z:points() do printf("%s ", v:lr()) end; print()
ap = AsciiPicture.new(" ")
for v in z:points() do ap:put(v, v:lr()) end
= ap
ap = AsciiPicture.new(" ")
for P in z:points() do ap:put(P, P:And(v"23"):lr()) end
= ap
z = ZHA.fromspec("121L"):print()
for P,dx,dy,tex in z:arrows() do print(P:lr().."->"..(P+v(dx,dy)):lr(), tex) end
-- «ZHA-test-shrinktop» (to ".ZHA-test-shrinktop")
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
dofile "zhas.lua"
dofile "zhaspecs.lua"
z = ZHA.fromtcgspec("4, 5; 32, 14 25"):print()
z = ZHA.fromtcgspec("4, 5; 32, 14 25"):shrinktop("34"):print()
--]]
-- _ _ _
-- ___| |__ ___ _ __| |_ ___ _ __ ___ _ __ __ _| |_ ___ _ __ ___
-- / __| '_ \ / _ \| '__| __/ _ \| '_ \ / _ \ '__/ _` | __/ _ \| '__/ __|
-- \__ \ | | | (_) | | | || (_) | |_) | __/ | | (_| | || (_) | | \__ \
-- |___/_| |_|\___/|_| \__\___/| .__/ \___|_| \__,_|\__\___/|_| |___/
-- |_|
-- «shortoperators» (to ".shortoperators")
function shortoperators ()
True = function () return z:T() end
False = function () return z:F() end
And = function (P, Q) return P:And(Q) end
Or = function (P, Q) return P:Or(Q) end
Imp = function (P, Q) return z:Imp(P, Q) end
Not = function (P) return Imp(P, False()) end
Bic = function (P, Q) return z:Bic(P, Q) end
--
Cloq = function (A) return function (P) return Or(A, P) end end
Opnq = function (A) return function (P) return Imp(A, P) end end
Booq = function (A) return function (P) return Imp(Imp(P, A), A) end end
Forq = function (A, B) return function (P) return And(Or(A, P), Imp(B, P)) end end
Jand = function (J, K) return function (P) return And(J(P), K(P)) end end
--
Mixq = function (A) return function (P) return Imp(Imp(P, A), P) end end
Mixq2 = function (A) return function (P) return Jand(Booq(A), Opnq(A))(P) end end
Truq = function () return function (P) return True() end end
Falq = function () return function (P) return P end end
end
-- «shortoperators-tests» (to ".shortoperators-tests")
--[[
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
dofile "zhas.lua"
shortoperators()
= mpnewJ({}, "1234567654321", Opnq(v"23")):zhaPs("23")
= mpnewJ({}, "1234567654321", Cloq(v"23")):zhaPs("23")
= mpnewJ({}, "1234567654321", Booq(v"23")):zhaPs("23")
= mpnewJ({}, "1234567654321", Forq(v"42", v"24")):zhaPs("42 24")
= mpnewJ({}, "1234567654321", Jand(Booq(v"21"), Booq(v"12"))):zhaPs("21 12")
= mpnewJ({}, "1234567654321", Mixq (v"33")):zhaPs("33")
= mpnewJ({}, "1234567654321", Mixq2(v"33")):zhaPs("33")
= mpnewJ({}, "1234567654321", Truq()):zhaPs("")
= mpnewJ({}, "1234567654321", Falq()):zhaPs("")
--]]
-- ____ _
-- / ___| _| |_ ___
-- | | | | | | __/ __|
-- | |__| |_| | |_\__ \
-- \____\__,_|\__|___/
--
-- «Cuts» (to ".Cuts")
Cuts = Class {
type = "Cuts",
new = function ()
return Cuts {minicuts = VerticalTable {},
asciibb=BoundingBox.new(),
latex="", latexbb=BoundingBox.new()}
end,
__tostring = function (c) return c:tostring() end,
__index = {
get = function (c, v)
return (c.minicuts[v[2]] or {})[v[1]] or " "
end,
tolines = function (c)
local x0, x1, y0, y1 = c.asciibb:x0x1y0y1()
local lines = {}
for y=y1,y0,-1 do
local s = ""
for x=x0,x1 do
local char = (c.minicuts[y] or {})[x] or " "
s = s..char
end
table.insert(lines, s)
end
return lines
end,
tostring = function (c) return table.concat(c:tolines(), "\n") end,
print = function (c) print(c); return c end,
--
-- Low-level functions for adding cuts
addminicut = function (c, x, y, slash)
c.minicuts[y] = c.minicuts[y] or {}
c.minicuts[y][x] = slash
c.asciibb:addpoint(v(x, y))
end,
addcut0 = function (c, src, tgt)
c.latexbb:addpoint(src)
c.latexbb:addpoint(tgt)
--
local x0, y0 = src:to_x_y()
local x1, y1 = tgt:to_x_y()
if y1 < y0 then x0, y0, x1, y1 = x1, y1, x0, y0 end
local dx, dy = x1-x0, y1-y0
if dy == dx then -- northeast, with "/"s
for a=0.5,dy-0.5 do
c:addminicut(x0+a, y0+a, "/")
end
elseif dy == -dx then -- northwest, with "\"s
for a=0.5,dy-0.5 do
c:addminicut(x0-a, y0+a, "\\")
end
else PP("dx=", dx, "dy=", dy); error()
end
c:addlatexcut(src, tgt) -- defined below
return c
end,
addcuts0 = function (c, list)
for i=1,#list-1 do c:addcut0(list[i], list[i+1]) end
return c
end,
--
-- Medium-level functions for adding cuts
addcontour = function (c, zha)
local leftwall = zha:leftwallcorners()
local rightwall = zha:rightwallcorners()
local corners = {}
table.insert(corners, leftwall[1]:s())
for i=2,#leftwall-1 do table.insert(corners, leftwall[i]:w()) end
table.insert(corners, leftwall[#leftwall]:n())
for i=#rightwall-1,2,-1 do table.insert(corners, rightwall[i]:e()) end
table.insert(corners, rightwall[1]:s())
c:addcuts0(corners)
return c
end,
addlcut = function (c, zha, l)
if l+1 > zha.topl then return c end
local westcell = lr(l+1, zha.minr[l+1])
local eastcell = lr(l, zha.maxr[l])
c:addcut0(westcell:s(), eastcell:n())
return c
end,
addrcut = function (c, zha, r)
if r+1 > zha.topr then return c end
local eastcell = lr(zha.minl[r+1], r+1)
local westcell = lr(zha.maxl[r], r)
c:addcut0(westcell:n(), eastcell:s())
return c
end,
--
-- A high-level function for adding (all kinds of) cuts.
addcuts = function (c, zha, str)
if str:match"c" then c:addcontour(zha) end
for l in str:gmatch"/(%d)" do c:addlcut(zha, l+0) end
for r in str:gmatch"(%d)|" do c:addrcut(zha, r+0) end
--
local f = function (lr, dir) local P = v(lr); return P[dir](P) end
local pat = "(%d%d)([ensw])-(%d%d)([ensw])"
for src,sdir,tgt,tdir in str:gmatch(pat) do
c:addcut0(f(src, sdir), f(tgt, tdir))
end
return c
end,
--
-- Communication with Picture objects
-- Similar to: (find-dn6 "zhas.lua" "LPicture" "addlineorvector =")
addlatexcut = function (c, src, tgt)
local x0, y0 = src:to_x_y()
local x1, y1 = tgt:to_x_y()
local dx, dy = x1-x0, y1-y0
local len = math.abs(dx)
local udx, udy = dx/len, dy/len
-- (find-pict2epage 9 "\\Line( X1,Y1 )( X2,Y2 )")
-- local put = " \\put("..x0..","..y0..")"..
-- "{\\line("..udx..","..udy.."){"..len.."}}"
local put = " \\Line("..x0..","..y0..")("..x1..","..y1..")"
c.latex = c.latex..put.."\n"
end,
-- copylatexcuts = function (c, pic)
-- end,
},
}
--[[
-- «Cuts-tests» (to ".Cuts-tests")
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
dofile "zhas.lua"
c = Cuts.new()
z = ZHA.fromspec("12RRL1LLRR")
= z
= c:addcuts0{v"00":w(), v"01":n(), v"01":e()}
= mytabletostring(c)
= c:addcontour(z)
= c.latex
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
dofile "zhas.lua"
c = Cuts.new()
z = ZHA.fromspec("12RRL1LLRR")
= c:addcontour(z)
= c:addlcut(z, 0)
= c:addlcut(z, 1)
= c:addlcut(z, 2)
= c:addrcut(z, 0)
= c:addrcut(z, 1)
= c:addrcut(z, 2)
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
dofile "zhas.lua"
c = Cuts.new()
z = ZHA.fromspec("12RRL1LLRR"):print()
= c:addcuts(z, "c 432/1/0 0|1|2|345")
z = ZHA.fromspec("1234567654321"):print()
c = Cuts.new()
= c:addcuts(z, "c 01e-41n 40w-44n 14n-64n 11n-16n")
--]]
-- __ __ _ _ ____ _ _
-- | \/ (_)_ _____ __| | _ \(_) ___| |_ _ _ _ __ ___
-- | |\/| | \ \/ / _ \/ _` | |_) | |/ __| __| | | | '__/ _ \
-- | | | | |> < __/ (_| | __/| | (__| |_| |_| | | | __/
-- |_| |_|_/_/\_\___|\__,_|_| |_|\___|\__|\__,_|_| \___|
--
-- «MixedPicture» (to ".MixedPicture")
-- A MixedPicture object has both an ascii representation and a LaTeX
-- representation. Most MixedPicture objects I use have a ZHA, and sometimes
-- a Cuts.
strtotex = function (str) -- Used by MixedPicture:put(...)
if str:match"^%.+$" then return "\\cdot" end
if str:match"^%*+$" then return "\\bullet" end
if str:match"^%o+$" then return "\\circ" end
end
celltotex = function (str, f) -- used by MixedPicture:addcells(...)
return (type(f)=="table" and f[str])
or (type(f)=="function" and f(str))
or (str:gsub("!", "\\"))
end
MixedPicture = Class {
type = "MixedPicture",
new = function (options, zha, J, asciirect)
return MixedPicture {
ap = AsciiPicture.new(options.s or " "),
lp = LPicture.new(options),
cuts = Cuts.new(),
zha = zha,
J = J,
ar = asciirect,
}
end,
__tostring = function (mp) return mp:tostring() end,
__index = {
tolines_mixed = function (mp)
local x0, x1, y0, y1 = mp.ap .bb:x0x1y0y1()
local cx0, cx1, cy0, cy1 = mp.cuts.asciibb:x0x1y0y1()
local lines = {}
for y=max(y1, cy1),min(y0, cy0),-.5 do
local line = ""
for x=min(x0, cx0),max(x1, cx1),.5 do
if isint(x)
then line = line..mp.ap:get(v(x, y))
else line = line..mp.cuts:get(v(x, y))
end
end
table.insert(lines, line)
end
return lines
end,
tolines = function (mp)
local hascuts = mp.cuts.asciibb.x0y0
local hasnodes = mp.ap.bb.x0y0
if hasnodes and hascuts then return mp:tolines_mixed() end
if hasnodes then return mp.ap:tolines() end
if hascuts then return mp.cuts:tolines() end
return {"empty"}
end,
tostring = function (mp) return table.concat(mp:tolines(), "\n") end,
tolatex = function (mp)
local body = mp.cuts.latex .. mp.lp.latex
local bb = BoundingBox.new():merge(mp.lp.bb):merge(mp.cuts.latexbb)
return makepicture(mp.lp, bb, body)
end,
print = function (mp) print(mp); return mp end,
lprint = function (mp) print(mp:tolatex()); return mp end,
output = function (mp) output(mp:tolatex()); return mp end,
--
put = function (mp, v, str, tex)
mp.ap:put(v, str)
mp.lp:put(v, tex or strtotex(str) or str)
return mp
end,
--
-- «MixedPicture-cuts» (to ".MixedPicture-cuts")
addcontour = function (mp) mp.cuts:addcontour(mp.zha); return mp end,
addlcut = function (mp, ...) mp.cuts:addlcut(mp.zha, ...); return mp end,
addrcut = function (mp, ...) mp.cuts:addrcut(mp.zha, ...); return mp end,
addcuts = function (mp, ...) mp.cuts:addcuts(mp.zha, ...); return mp end,
--
addcutssub = function (mp, newtop, ...)
mp.cuts:addcuts(mp.zha:shrinktop(newtop), ...)
return mp
end,
--
-- OBSOLETE.
-- zfunction and zsetbullets were replaced by methods using
-- the ar field (which holds an AsciiRect)
zfunction = function (mp, asciirect)
for x,y,c in asciirectpoints(asciirect) do
if c:match"%d" then
mp:put(v(x, y), "#"..c)
mp.lp.def = mp.lp.def.."#"..c
end
end
return mp
end,
zsetbullets = function (mp, asciirect)
for x,y,c in asciirectpoints(asciirect) do
if c:match"%d" then mp:put(v(x, y), "**") end
end
return mp
end,
--
-- New methods (2015sep06)
-- points = function (mp, ...) return mp.zha:points() end,
points = function (mp) return (mp.zha or mp.ar):points() end,
arrows = function (mp, w) return (mp.zha or mp.ar):arrows(w) end,
addarrows = function (mp, w)
for v,dx,dy,tex in mp:arrows(w) do mp.lp:putarrow(v, dx, dy, tex) end
return mp
end,
addarrowsexcept = function (mp, w, omit)
if type(omit) == "string" then omit = Set.from(split(omit)) end
if type(omit) == "table" then
local o = omit
omit = function (vdx) return o:has(vdx) end
end
for v,dx,dy,tex in mp:arrows(w) do
if not omit(v:xy()..dx, v, dx) then mp.lp:putarrow(v, dx, dy, tex) end
end
return mp
end,
addbullets = function (mp)
for v in mp:points() do mp:put(v, "**") end
return mp
end,
adddots = function (mp)
for v in mp:points() do mp:put(v, "..") end
return mp
end,
addlrs = function (mp) -- for zhas
for v in mp.zha:points() do mp:put(v, v:lr()) end
return mp
end,
addgens = function (mp) -- for zhas
for P,l,r,gen in mp.zha:pointslrg() do
if gen == "L" then mp:put(P, l.."_", l.."\\_")
elseif gen == "R" then mp:put(P, "_"..r, "\\_"..r)
else mp:put(P, "..")
end
end
return mp
end,
addcells = function (mp, f) -- for asciirects
for v,str in mp.ar:points() do mp:put(v, celltotex(str, f)) end
return mp
end,
addxys = function (mp)
for v,str in mp:points() do mp:put(v, v:xy()) end
return mp
end,
--
-- «MixedPicture-zha» (to ".MixedPicture-zha")
zhabullets = function (mp)
for v in mp.zha:points() do mp:put(v, "**") end
return mp
end,
zhadots = function (mp)
for v in mp.zha:points() do mp:put(v, "..") end
return mp
end,
zhalr = function (mp)
for v in mp.zha:points() do mp:put(v, v:lr()) end
return mp
end,
zhaPs = function (mp, str)
for _,w in ipairs(split(str)) do mp:put(v(w), w) end
return mp
end,
--
setz = function (mp) z = mp.zha; return mp end, -- set the global z
zhalrf0 = function (mp, f)
if type(f) == "string" then f = L(f) end
for v in mp.zha:points() do mp:put(v, tostring(f(v))) end
return mp
end,
zhalrf = function (mp, f)
if type(f) == "string" then f = L(f) end
for v in mp.zha:points() do mp:put(v, f(v):lr()) end
return mp
end,
zhaJ = function (mp) return mp:zhalrf(mp.J) end,
zhaJcuts = function (mp) return mp:addcuts(mp.zha:getcuts(mp.J)) end,
--
putpiledef = function (mp, v)
local L, R = mp.zha.topl, mp.zha.topr
local l, r = v:to_l_r()
local pile = function (h, n) return ("0"):rep(h-n)..("1"):rep(n) end
local piledef = function (A, B, a, b)
return "\\foo{"..a..b.."}{"..pile(A, a).." "..pile(B, b).."}"
end
mp:put(v, v:lr(), piledef(L, R, l, r))
return mp
end,
zhapiledefs = function (mp)
for v in mp.zha:points() do mp:putpiledef(v) end
return mp
end,
--
-- (find-angg "LUA/lua50init.lua" "eval-and-L")
},
}
--
-- _ __ ___ _ __ _ __ _____ __
-- | '_ ` _ \| '_ \| '_ \ / _ \ \ /\ / /
-- | | | | | | |_) | | | | __/\ V V /
-- |_| |_| |_| .__/|_| |_|\___| \_/\_/
-- |_|
--
-- «mpnew» (to ".mpnew")
-- «mpnewJ» (to ".mpnewJ")
-- (to "MixedPicture-J-tests")
-- See: (find-dn6 "luarects.lua" "AsciiRect")
-- (find-dn6 "luarects.lua" "AsciiRect-tests")
--
-- Mpnew and mpnewJ are shorthands that create MixedPicture objects
-- with or without a J-operator...
mpnew = function (opts, spec, J, asciirect)
local z = ZHA.fromspec(spec)
local mp = MixedPicture.new(opts, z, J, asciirect)
return mp, z
end
mpnewJ = function (opts, spec, J)
return mpnew(opts, spec, J):setz():zhaJcuts():addcontour()
end
-- «MixedPicture-tests» (to ".MixedPicture-tests")
--[[
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
dofile "zhas.lua"
z = ZHA.fromspec("12RRL1LLRR"):print()
mp = MixedPicture.new({}, z)
mp = MixedPicture.new({bhbox=1, paren=1, scale="10pt", def="foo"}, z)
= mp:put(v"02", "02")
= mp:tolatex()
for v in z:points() do mp:put(v, v:lr()) end
= mp:addcontour()
= mp:addlcut(0):addrcut(2)
latex = mp:tolatex()
= latex
writefile("/tmp/o.tex", latex) -- (find-fline "/tmp/o.tex")
-- (find-ist "-handouts.tex" "mixedpicture-tests")
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
dofile "zhas.lua"
z = ZHA.fromspec("1234R3L21L"):print()
mp = MixedPicture.new({bhbox=1, paren=1, scale="10pt", def="foo"}, z)
mp = MixedPicture.new({def="foo"}, z)
for v in z:points() do mp:put(v, v:lr()) end -- optional
= mp:addcontour()
= mp:addrcut(0):addrcut(2)
= mp:addlcut(1)
= mp:put(v"20", "P")
= mp:put(v"30", "P*", "P^*")
= mp:put(v"11", "Q")
= mp:put(v"12", "Q*", "Q^*")
= mp:put(v"03", "R")
= mp:put(v"14", "R*", "R^*")
latex = mp:tolatex()
= latex
writefile("/tmp/o.tex", latex) -- (find-fline "/tmp/o.tex")
-- (find-ist "-handouts.tex" "mixedpicture-tests")
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
dofile "zhas.lua"
z = ZHA.fromspec("121L"):print()
mp = MixedPicture.new({bhbox=1, paren=1, scale="20pt", def="foo"}, z)
mp = MixedPicture.new({bhbox=1, scale="14pt", cellfont="\\scriptsize", def="foo"}, z)
-- for v in z:points() do mp:put(v, v:lr()) end
for v in z:points() do mp:put(v, v:xy()) end
= mp
for v,dx,dy in mp.zha:arrows() do print(v, dx, dy) end
for v,dx,dy in mp.zha:arrows() do
local tex = (dx==-1) and "\\swarrow" or "\\searrow"
mp.lp:putarrow(v, dx, dy, tex)
end
= mp.lp
latex = mp:tolatex()
latex = "\\def\\foo{"..latex.."}"
= latex
writefile("/tmp/o.tex", latex) -- (find-fline "/tmp/o.tex")
-- (find-ist "-handouts.tex" "mixedpicture-tests")
-- «MixedPicture-zhalrf-tests» (to ".MixedPicture-zhalrf-tests")
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
dofile "zhas.lua"
z = ZHA.fromspec("123454321"):print()
mp = MixedPicture.new({}, z)
mp = mpnew({}, "123454321")
= mp:zhalrf0("lr -> 23")
= mp:zhalrf0("lr -> '23'")
= mp:zhalrf0("lr -> v'23'")
= mp:zhalrf0("lr -> v'23':lr()")
= mp:zhalrf0("lr -> otype(lr)")
= mp:zhalrf ("lr -> lr")
= mp:zhalrf0("lr -> lr:And(v'12'):lr()")
= mp:zhalrf ("lr -> lr:And(v'12')")
= mp:zhalrf0("P -> P:below(v'12') and 1 or 0")
= mp:zhalrf0("P -> P:And(v'22')")
= mp:zhalrf0("P -> P:And(v'22'):lr()")
= v"31":And(v"12"):lr()
-- «MixedPicture-arch-tests» (to ".MixedPicture-arch-tests")
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
dofile "zhas.lua"
-- The (v*) cube
mp = mpnew({def="orStarCubeArchetypal"}, "12321L"):addcuts("c 21/0 0|12")
mp:put(v"10", "P"):put(v"20", "P*", "P^*")
mp:put(v"01", "Q"):put(v"02", "Q*", "Q^*"):print()
-- The (&*) cube
mp = mpnew({def="andStarCubeArchetypal"}, "12321"):addcuts("c 2/10 01|2")
mp:put(v"20", "P"):put(v"21", "P*", "P^*")
mp:put(v"02", "Q"):put(v"12", "Q*", "Q^*"):print()
-- The (->*) cube
mp = mpnew({def="impStarCubeArchetypal"}, "12321"):addcuts("c 2/10 01|2")
mp:put(v"10", "P")
mp:put(v"00", "Q"):print()
-- (&R) is *-functorial
mp = mpnew({def="andRIsStarFunctorial"}, "1234R321"):addcuts("c 32/10 01|23|4")
mp:put(v"30", "P"):put(v"31", "P*", "P^*")
mp:put(v"22", "Q"):put(v"33", "Q*", "Q^*")
mp:put(v"04", "R"):put(v"14", "R*", "R^*"):print()
-- (Pv) is *-functorial
mp = mpnew({def="PvIsStarFunctorial"}, "1234R3L21L"):addcuts("c 5432/10 0|12|34")
mp:put(v"20", "P"):put(v"30", "P*", "P^*")
mp:put(v"11", "Q"):put(v"12", "Q*", "Q^*")
mp:put(v"03", "R"):put(v"14", "R*", "R^*"):print()
-- «MixedPicture-zset-tests» (to ".MixedPicture-zset-tests")
-- (find-dn6file "zhas.lua" "zfunction =")
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
dofile "zhas.lua"
z = ZHA.fromspec("12321L"):print()
house = ".1.|2.3|4.5"
mp = MixedPicture.new({def="dagHouse"}):zfunction(house):print():lprint()
mp = MixedPicture.new({def="dagHouse", meta="t", scale="5pt"}, z):zfunction(house):lprint()
mp = MixedPicture.new({def="House"}):zsetbullets(house):print():lprint()
mp = MixedPicture.new({def="Ten"}, z):zhabullets():print()
mp = MixedPicture.new({def="Ten"}, z):zhadots():print()
mp = MixedPicture.new({def="Ten"}, z):zhalr():print()
mp = mpnew({scale="15pt"}, "121L"):zhapiledefs():print():lprint()
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
dofile "zhas.lua"
threefour = "..1|2.3|4.5|6.7"
MixedPicture.new({def="dagThreeFour", meta="s"}):zfunction(threefour):print():lprint()
-- «MixedPicture-J-tests» (to ".MixedPicture-J-tests")
-- (to "mpnewJ")
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
dofile "zhas.lua"
= mpnewJ({}, "1234RR321", "P -> z:Or(P, v'12')")
= mpnewJ({}, "1234RR321", "P -> z:Imp(v'12', P)")
mp = mpnewJ({}, "1234RR321", "P -> z:Imp(v'12', P)")
= mp.zha:getcuts(mp.J)
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
dofile "zhas.lua"
--]]
-- _ ____ _ _
-- __| |_ __ __ ___ _|___ \ ___ ___ | | __ _ _ __ __ _ _ __ | |__
-- / _` | '__/ _` \ \ /\ / / __) / __/ _ \| |/ _` | '__/ _` | '_ \| '_ \
-- | (_| | | | (_| |\ V V / / __/ (_| (_) | | (_| | | | (_| | |_) | | | |
-- \__,_|_| \__,_| \_/\_/ |_____\___\___/|_|\__, |_| \__,_| .__/|_| |_|
-- |___/ |_|
--
-- «drawtwocolgraph» (to ".drawtwocolgraph")
dxyrunf = function (...) print("%D "..format(...)); dxyrun(format(...)) end
drawtwocolgraph = function (dx, dy, maxl, maxr, leftgens, rightgens, ltexs, rtexs)
local D = dxyrunf
local y = function (i) return 100+dy*(i-1) end
local ltex = function (i) return ltexs and split(ltexs)[i] or i.."\\_" end
local rtex = function (i) return rtexs and split(rtexs)[i] or "\\_"..i end
D "(("
for i=1,maxl do D("node: %d,%d L%d .tex= %s", 100, y(i), i, ltex(i)) end
for i=1,maxr do D("node: %d,%d R%d .tex= %s", 100+dx, y(i), i, rtex(i)) end
for i=maxl,2,-1 do D("L%d L%d ->", i, i-1) end
for i=maxr,2,-1 do D("R%d R%d ->", i, i-1) end
for l,r in leftgens :gmatch "(%d)(%d)" do D("L%d R%d ->", l, r) end
for l,r in rightgens:gmatch "(%d)(%d)" do D("L%d R%d <-", l, r) end
D "))"
end
-- «drawtwocolgraph-tests» (to ".drawtwocolgraph-tests")
--[==[
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
dofile "zhas.lua"
dxyrunf = function (...) print("%D "..format(...)) end
drawtwocolgraph(40, 20, 4, 6, "24", "24 35")
--]==]
-- __ ______ _
-- \ \ / / ___| _| |_ ___
-- \ \ / / | | | | | __/ __|
-- \ V /| |__| |_| | |_\__ \
-- \_/ \____\__,_|\__|___/
--
-- «VCuts» (to ".VCuts")
-- For drawing slashings as V-shaped diagrams.
-- (phap 27 "piccs-and-slashings")
-- (pha "piccs-and-slashings")
VCuts = Class {
type = "VCuts",
new = function (options, l, r)
local vc = VCuts {mp=MixedPicture.new(options)}
if l then vc:putls(l) end
if r then vc:putrs(r) end
return vc
end,
__tostring = function (vc) return tostring(vc.mp) end,
__index = {
tostring = function (vc) return tostring(vc.mp) end,
tolatex = function (vc) return vc.mp:tolatex() end,
output = function (vc) output(vc:tolatex()); return vc end,
print = function (vc) print(tostring(vc)); return vc end,
putl = function (vc, n) vc.mp:put(v((n+1).."0"), n.."", n..""); return vc end,
putr = function (vc, n) vc.mp:put(v("0"..(n+1)), n.."", n..""); return vc end,
cutl = function (vc, n) vc.mp:addcuts(format("%d0w-%d0n", n+1, n+1)); return vc end,
cutr = function (vc, n) vc.mp:addcuts(format("0%dn-0%de", n+1, n+1)); return vc end,
putls = function (vc, n) for i=0,n+0 do vc:putl(i) end; return vc end,
putrs = function (vc, n) for i=0,n+0 do vc:putr(i) end; return vc end,
},
}
-- «VCuts-tests» (to ".VCuts-tests")
--[[
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
dofile "zhas.lua"
vc = VCuts.new({scale="7pt", def="foo"}, 4, 6)
= vc
vc:cutl(0)
vc:cutr(3):cutr(5)
= vc
= vc:tolatex()
--]]
--[==[
-- _____ ____ ____
-- |_ _/ ___/ ___|
-- | || | | | _
-- | || |__| |_| |
-- |_| \____\____|
--
-- «TCG» (to ".TCG")
-- Draw two-column graphs.
-- Code commented out! Too messy!
-- Moved to:
-- (find-LATEX "edrxpict.lua" "TCG")
-- Sort of superseded by this, that has a different interface:
-- (find-dn6file "tcgs.lua")
TCG = Class {
type = "TCG",
new = function (opts, def, l, r, lrarrows, rlarrows)
local dims = opts -- was opts.dims
local lp = LPicture.new(opts)
lp.def = def
local tcg = {lp=lp, dh=dims.dh, dv=dims.dv, eh=dims.eh, ev=dims.ev,
l=l+0, r=r+0, lrarrows=lrarrows, rlarrows=rlarrows}
return TCG(tcg)
end,
__tostring = function (tcg) return tcg:tostring() end,
__index = {
tostring = function (tcg)
return format("(%s, %s, %q, %q)", tcg.l, tcg.r, tcg.lrarrows, tcg.rlarrows)
end,
tolatex = function (tcg) return tcg.lp:tolatex() end,
L = function (tcg, y) return v(0, tcg.dv*y) end,
R = function (tcg, y) return v(tcg.dh, tcg.dv*y) end,
arrow = function (tcg, A, B, e)
tcg.lp:addtex(Line.newAB(A, B, e, 1-e):pictv())
end,
lrs = function (tcg)
for y=1,tcg.l do tcg.lp:put(tcg:L(y), y.."\\_") end
for y=1,tcg.r do tcg.lp:put(tcg:R(y), "\\_"..y) end
return tcg
end,
bus = function (tcg)
for y=1,tcg.l do tcg.lp:put(tcg:L(y), "\\bullet") end
for y=1,tcg.r do tcg.lp:put(tcg:R(y), "\\bullet") end
return tcg
end,
strs = function (tcg, strsl, strsr)
if type(strsl) == "string" then strsl = split(strsl) end
if type(strsr) == "string" then strsr = split(strsr) end
for y,str in ipairs(strsl) do tcg.lp:put(tcg:L(y), str) end
for y,str in ipairs(strsr) do tcg.lp:put(tcg:R(y), str) end
return tcg
end,
cs = function (tcg, charsl, charsr)
return tcg:strs(split(charsl, "."), split(charsr, "."))
end,
cq = function (tcg, charsl, charsr)
local lc = function (y) return charsl:sub(y, y) end
local rc = function (y) return charsr:sub(y, y) end
local lstr = function (y) return lc(y)=="L" and y.."\\_" or lc(y) end
local rstr = function (y) return rc(y)=="R" and "\\_"..y or rc(y) end
for y=1,#charsl do tcg.lp:put(tcg:L(y), lstr(y)) end
for y=1,#charsr do tcg.lp:put(tcg:R(y), rstr(y)) end
return tcg
end,
vs = function (tcg)
for y=1,tcg.l-1 do tcg:arrow(tcg:L(y+1), tcg:L(y), tcg.ev) end
for y=1,tcg.r-1 do tcg:arrow(tcg:R(y+1), tcg:R(y), tcg.ev) end
return tcg
end,
hs = function (tcg)
for l,r in tcg.lrarrows:gmatch("(%d)(%d)") do
tcg:arrow(tcg:L(l), tcg:R(r), tcg.eh)
end
for l,r in tcg.rlarrows:gmatch("(%d)(%d)") do
tcg:arrow(tcg:R(r), tcg:L(l), tcg.eh)
end
return tcg
end,
print = function (tcg) print(tcg); return tcg end,
lprint = function (tcg) print(tcg:tolatex()); return tcg end,
output = function (tcg) output(tcg:tolatex()); return tcg end,
},
}
-- «TGC-tests» (to ".TGC-tests")
--[[
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
dofile "zhas.lua"
-- dims = {dv=2, dh=3, ev=0.32, eh=0.2}
opts = {scale="10pt", dims={dv=2, dh=3, ev=0.32, eh=0.2}}
opts = {scale="10pt", dv=2, dh=3, ev=0.32, eh=0.2 }
tcg = TCG.new(opts, "foo", 4, 6, "12", "23 34"):lrs():vs():hs():lprint()
= tcg
= tcg:tolatex()
--]]
--]==]
-- _ _ _ _ _
-- __ _ ___ ___(_|_)_ __ ___ ___| |_ _ __ ___ (_)_ __ | |_ ___
-- / _` / __|/ __| | | '__/ _ \/ __| __| '_ \ / _ \| | '_ \| __/ __|
-- | (_| \__ \ (__| | | | | __/ (__| |_| |_) | (_) | | | | | |_\__ \
-- \__,_|___/\___|_|_|_| \___|\___|\__| .__/ \___/|_|_| |_|\__|___/
-- |_|
--
-- Asciirects are a good way to specify ZSets and ZFunctions - for
-- example, ".1.|2.3|4.5" is (reading order on) the "House" ZSet.
-- THIS IS OBSOLETE, and has been superseded by:
-- (find-dn6 "luarects.lua" "AsciiRect")
--
-- «asciirectpoints» (to ".asciirectpoints")
asciirectpoints = function (lines)
return cow(function ()
if type(lines) == "string" then
lines = splitlines((lines:gsub("|", "\n")))
end
for y=#lines-1,0,-1 do
local line = lines[#lines-y]
for x=0,#line-1 do
local c = line:sub(x+1, x+1)
coy(x, y, c)
end
end
end)
end
-- «asciirectpoints-tests» (to ".asciirectpoints-tests")
--[[
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
dofile "zhas.lua"
str = ".1.|2.3|4.5"
for x,y,c in asciirectpoints(str) do print(x, y, c) end
for x,y,c in asciirectpoints(str) do
if c:match"%d" then
local p = "#"..c
print(v(x, y), c)
end
end
opts = {def="dagHouse", scale="4pt", meta="p b s"}
mp = MixedPicture.new(opts)
PP(mp.lp)
for x,y,c in asciirectpoints(str) do
if c:match"%d" then
mp:put(v(x, y), "#"..c)
mp.lp.def = mp.lp.def.."#"..c
end
end
= mp
= mp:tolatex()
opts = {def="PvSTbullets", meta="p b s", scale="4pt"}
z = ZHA.fromspec("1234R3L21L"):print()
mp = MixedPicture.new(opts, z)
for v in z:points() do mp:put(v, "**") end
= mp
= mp:tolatex()
opts = {def="dagHouse", scale="4pt", meta="p b s"}
str = ".1.|2.3|4.5"
mp = MixedPicture.new(opts):zfunction(str)
= mp
= mp:tolatex()
mp = MixedPicture.new(opts):zsetbullets(str)
= mp
= mp:tolatex()
-- (find-istfile "1.org" "* 2-column graphs")
-- (find-istfile "1.org" "* 2-column graphs" "how to convert between proper")
z = ZHA.fromspec("12RR1234321L"):print()
-- 56 56
-- 46 ..
-- 45 36 .. ..
-- 44 35 26 .. .. ..
-- 43 34 25 16 43 .. .. 16
-- 33 24 15 33 .. 15
-- 23 14 23 14
-- 13 ..
-- 12 03 .. 03
-- 11 02 .. 02
-- 10 01 10 01
-- 00 ..
-- (find-istfile "1.org" "* ZQuotients")
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
dofile "zhas.lua"
z = ZHA.fromspec("12345RR4321"):print()
z = ZHA.fromspec("1234543RR21"):print()
z = ZHA.fromspec("1234543RR21"):print()
z = ZHA.fromspec("1R2R3212RL1"):print()
mp = MixedPicture.new({def="foo"}, z):zhalr()
mp:addcuts("c 4321/0 0123|45|6"):print()
--]]
--[[
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
-- See: (find-LATEX "istanbul-july.tex" "partitiongraph")
dofile "zhas.lua"
opts = {def="graphid", scale="6pt", meta="p b s"}
mp = MixedPicture.new(opts)
spec = "012345"
for y=0,5 do mp:put(v(-1, y), y.."") end
for x=0,5 do mp:put(v(x, -1), x.."") end
for a=0,5 do local aP = spec:sub(a+1, a+1)+0; mp:put(v(a, aP), "*") end
mp.lp:addlineorvector(v(0, 0), v(6, 0), "vector")
mp.lp:addlineorvector(v(0, 0), v(0, 6), "vector")
mp:put(v(7, 0), "a")
mp:put(v(0, 7), "aP", "a^P")
= mp.lp
= mp
= mp.lp
= mp
• (eepitch-lua51)
• (eepitch-kill)
• (eepitch-lua51)
dofile "zhas.lua"
z = ZHA.fromspec("1R2R3212RL1"):print()
mp = MixedPicture.new({def="ZQ", scale="1pt", meta="b ss"}, z)
mp:zhadots()
mp:lprint()
--]]
-- Local Variables:
-- coding: utf-8-unix
-- End: