|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- picture.lua: the Picture class for dednat6
-- This file:
-- http://angg.twu.net/dednat5/picture.lua
-- http://angg.twu.net/dednat5/picture.lua.html
-- (find-angg "dednat5/picture.lua")
--
-- This file defines a class that generates LaTeX picture-mode
-- diagrams, and that can also output them as 2D ascii diagrams.
-- Older version: (find-angg "LUA/picture.lua" "Picture")
--
-- «.Picture» (to "Picture")
-- «.Picture-tests» (to "Picture-tests")
-- Min = function (a, b) return (a and b and min(a, b)) or a or b end
-- Max = function (a, b) return (a and b and max(a, b)) or a or b end
-- ____ _ _ _
-- | _ \(_) ___| |_ _ _ _ __ ___ ___| | __ _ ___ ___
-- | |_) | |/ __| __| | | | '__/ _ \ / __| |/ _` / __/ __|
-- | __/| | (__| |_| |_| | | | __/ | (__| | (_| \__ \__ \
-- |_| |_|\___|\__|\__,_|_| \___| \___|_|\__,_|___/___/
--
-- «Picture» (to ".Picture")
-- We can ":put" things one by one into a Picture object, and ":totex"
-- will generate a "\begin{picture}...\end{picture}" LaTeX block with
-- the right size and offset. Also, ":toascii" generates an ascii
-- rendering of that picture object, great for debugging and stuff.
Picture = Class {
type = "Picture",
new = function (opts)
local p = {whats={}, other={}} -- start empty
for k,v in pairs(opts or {}) do p[k] = v end -- copy options
return Picture(p) -- set metatable
end,
__index = {
adjustbounds = function (p, x, y)
p.minx, p.maxx = Min(p.minx, x), Max(x, p.maxx)
p.miny, p.maxy = Min(p.miny, y), Max(y, p.maxy)
end,
put = function (p, x, y, what, what0)
p:adjustbounds(x, y)
-- p.minx = p.minx and min(x, p.minx) or x
-- p.miny = p.miny and min(y, p.miny) or y
-- p.maxx = p.maxx and max(p.maxx, x) or x
-- p.maxy = p.maxy and max(p.maxy, y) or y
table.insert(p.whats, {x=x, y=y, what=what, what0=what0})
return p
end,
lrput = function (p, l, r, what, what0)
local x = r - l
local y = r + l
p:put(x, y, what, what0)
return p
end,
lrputline = function (p, l, r, dxdy, len)
return p:lrput(l, r, nil, format("\\line(%s){%s}", dxdy, len))
end,
togrid = function (p)
local lines = {}
for y=p.miny,p.maxy do lines[y] = {} end
for _,what in ipairs(p.whats) do
lines[what.y][what.x] = what.what
end
return lines
end,
toasciilines = function (p, whitespace)
local asciilines = {}
local grid = p:togrid()
for y=p.miny,p.maxy do
for x=p.minx,p.maxx do
local ascii = grid[y][x] or whitespace or " "
asciilines[y] = (asciilines[y] or "")..ascii
end
end
return asciilines
end,
toascii = function (p, whitespace)
local asciilines = p:toasciilines(whitespace)
local lines = {}
for y=p.maxy,p.miny,-1 do
table.insert(lines, asciilines[y])
end
return table.concat(lines, "\n")
end,
--
-- (find-es "tex" "dags")
-- (find-kopkadaly4page (+ 12 289) "13.1.3 The positioning commands")
-- (find-kopkadaly4text (+ 12 289) "13.1.3 The positioning commands")
-- (find-kopkadaly4page (+ 12 298) "\\put")
-- (find-kopkadaly4text (+ 12 298) "\\put")
totex1 = function (p, what)
-- local fmt = " \\put(%s,%s){%s}\n"
if what.what0 then
return format(" \\put(%s,%s){%s}\n", what.x, what.y, what.what0)
end
local fmt = " \\put(%s,%s){\\hbox to 0pt{\\hss %s%s\\hss}}\n"
return format(fmt, what.x, what.y, p.font or "", what.what)
end,
totexputs = function (p)
local f = function (what) return p:totex1(what) end
return mapconcat(f, p.whats)
end,
--
-- (find-kopkadaly4page (+ 12 301) "13.1.6 Shifting a picture environment")
-- (find-kopkadaly4text "13.1.6 Shifting a picture environment")
-- (find-texbookpage (+ 12 66) "\\raise")
-- (find-texbooktext (+ 12 66) "\\raise")
totex = function (p)
local a = {}
a.scale = p.scale or "1ex"
a.xdimen = p.maxx - p.minx + 1
a.ydimen = p.maxy - p.miny + 1
a.xoffset = p.minx - 0.5
-- a.yoffset = (p.miny + p.maxy + 1) / 2
a.yoffset = p.miny
a.lower = (p.maxy - p.miny) / 2
-- a.body = p:totexputs()
a.body = p:totexputs()..table.concat(p.other)
local fmt = "{\\unitlength=!scale\n"..
"\\lower!lower\\unitlength\\hbox{"..
"\\begin{picture}(!xdimen,!ydimen)(!xoffset,!yoffset)\n"..
"!body"..
"\\end{picture}\n"..
"}}"
return (fmt:gsub("!([a-z]+)", a))
end,
},
}
-- «Picture-tests» (to ".Picture-tests")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "picture.lua"
p = Picture.new()
p:put(2, 3, "23")
p:put(4, 7, "47")
PP(p)
PP(p:togrid())
= p:toascii()
= p:totexputs()
p.scale = "10pt"
= p:totex()
-- (find-LATEX "tmp.tex")
f1 = function (p, lr)
local l = lr:sub(1,1)+0
local r = lr:sub(2,2)+0
p:lrput(l, r, lr)
end
f = function (p, str)
for _,lr in ipairs(split(str)) do
f1(p, lr)
end
end
p = Picture {whats={}}
f(p, "00 01 02 03 04")
f(p, "10 11 12 13 14")
f(p, "22 23 24")
f(p, "32 33 34")
= p:toascii()
p.scale = "10pt"
= p:totex()
--]]
-- Local Variables:
-- coding: raw-text-unix
-- End: