|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- zdags..lua: an experimental extension to dednat5, using picture mode.
-- This file:
-- http://angg.twu.net/dednat5/zdags.lua.html
-- http://angg.twu.net/dednat5/zdags.lua
-- (find-dn5 "zdags.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
-- Version: 2011may16
-- License: GPL3
--
-- «.zdag_preamble» (to "zdag_preamble")
-- «.simpledef» (to "simpledef")
-- «.complexdef» (to "complexdef")
require "eoo" -- (find-dn5 "eoo.lua")
require "prefixes" -- (find-dn5 "prefixes.lua")
-- (find-dn4ex "edrx08.sty" "dags")
-- (find-angg "LUA/canvas3.lua" "Scale")
-- «complexdef_preamble» (to ".complexdef_preamble")
-- «zdag_preamble» (to ".zdag_preamble")
-- (find-angg "LUA/canvas3.lua" "defpictureFrom")
complexdef_preamble = [[
% (find-es "tex" "more-than-9-args")
\def\sa#1#2{\expandafter\def\csname myarg#1\endcsname{#2}}
\def\ga#1{\csname myarg#1\endcsname}
]]
-- \newdimen\mypictureunit
-- \setbox0=\hbox{\rm0}
-- \mypictureunit=.085\wd0
-- \mypictureunit=.084\wd0
-- %
-- \def\dagput(#1,#2)#3{\put(#1,#2){\hbox to 0pt{\hss\scriptsize#3\hss}}}
-- \def\dagpicture(#1,#2)(#3,#4)[#5]#6{{%
-- %\unitlength=.1ex%
-- %\setbox0\hbox{x}\unitlength=.1\wd0%
-- %\setbox0\hbox{x}\unitlength=.095\wd0%
-- %\setbox0\hbox{x}\unitlength=.090\wd0%
-- \unitlength=\mypictureunit
-- \lower #5\unitlength\hbox{%
-- \begin{picture}(#1,#2)(#3,#4)
-- #6
-- \end{picture}%
-- }}}
-- (find-angg "LUA/canvas3.lua" "simpledef")
-- (find-angg "LUA/canvas3.lua" "complexdef")
-- «Scale» (to ".Scale")
Scale = Class {
type = "Scale",
__index = {
-- Defaults for a thin Zdag:
sx = 6, x0 = 1,
sy = -12, -- y0 = zdag.height,
w0 = 2, h0 = 0,
xadj = 0, yadj = 0,
-- Methods:
xytopxpy = function (s, x, y)
return s.sx * (x - s.x0) + s.xadj, s.sy * (y - s.y0) + s.yadj end,
whtopwph = function (s, w, h) return s.sx * w + s.w0, -s.sy * h + s.h0 end,
put = function (s, x, y, mathbody)
local px, py = s:xytopxpy(x, y)
return format(" \\dagput(%3d,%3d){$%s$}\n", px, py, mathbody)
end,
puts = function (s, coords, ga)
local T = {}
for i,xy in ipairs(coords) do
table.insert(T, s:put(xy[1], xy[2], ga(i)))
end
return table.concat(T)
end,
arrowxybody = function (s, coords, arrow)
local src, tgt = arrow[1], arrow[2]
local srcx, srcy = coords[src][1], coords[src][2]
local tgtx, tgty = coords[tgt][1], coords[tgt][2]
local x, y = (srcx + tgtx)/2, (srcy + tgty)/2
local dx = tgtx - srcx
local possiblebodies = {
[-1] = "\\swarrow",
[0] = "\\downarrow",
[1] = "\\searrow",
}
local body = possiblebodies[dx]
return x, y, body
end,
putarrows = function (s, zdag)
local T = {}
for i,arrow in ipairs(zdag.arrows) do
table.insert(T, s:put(s:arrowxybody(zdag.coords, arrow)))
end
return table.concat(T)
end,
body = function (s, zdag, ga)
return s:puts(zdag.coords, ga)
.. (s.drawarrows and s:putarrows(zdag) or "")
end,
-- bodyandarrows = function (s, zdag, ga)
-- return s:puts(zdag.coords, ga) .. s:putarrows(zdag)
-- end,
dagpicture = function (s, body)
local plower = -s.sy * (s.lower or 0)
local pw, ph = s:whtopwph(s.w, s.h)
return format(" \\dagpicture(%d,%d)(-4,0)[%d]{\n%s }%%\n",
pw, ph, plower, body)
end,
picture = function (s, zdag, ga)
return s:dagpicture(s:body(zdag, ga))
end,
defpicture = function (s, zdag, name)
local nargs = zdag.n
local def, ga = nargstodefga(nargs)
local body = s:picture(zdag, ga)
return def(name, nargs, body) .. "%\n"
end,
},
}
-- «simpledef» (to ".simpledef")
simpledef = function (name, nargs, body)
local ha, han
ha = function (myn) return format("#%d", myn) end
han = function (np) return mapconcat(ha, seq(1, np)) end
return format("\\def\\%s%s{%%\n%s}", name, han(nargs), body)
end
simplega = function (myn) return format("#%d", myn) end
-- «complexdef» (to ".complexdef")
complexdef = function (name, nargs, body)
local ha, han, sa, saf, san, na, bg, da, dal
ha = function (hn) return format("#%d", hn) end
han = function (np) return mapconcat(ha, seq(1, np)) end
sa = function (myn, hn) return format("\\sa{%d}{#%d}", myn, hn) end
saf = function (n)
return function (hn) return sa(5*n + hn, hn) end
end
san = function (n, np) return mapconcat(saf(n), seq(1, np)) end
na = function (n) return format("\\%s%s", name, ("@"):rep(n)) end
bg = function (n) return n==0 and "\\begingroup" or "" end
da = function (n)
return format("\\def%s%s{%s%%\n", na(n), han(5), bg(n))
.. format(" %s%s}\n", san(n, 5), na(n + 1))
end
dal = function (n, np)
return format("\\def%s%s{%%\n", na(n), han(np))
.. format(" %s%%\n", san(n, np))
.. body
.. " \\endgroup}\n"
end
local T = {}
local np = nargs
tinsert(T, "\\makeatletter\n") -- hacky
for n=0,10000 do -- hacky
if np > 5
then tinsert(T, da(n)); np = np - 5
else tinsert(T, dal(n, np)); break
end
end
tinsert(T, "\\makeatother\n") -- hacky
return table.concat(T, "")
end
complexga = function (myn) return format("\\ga{%d}", myn) end
nargstodefga = function (nargs)
if nargs <= 9 then
return simpledef, simplega
else
return complexdef, complexga
end
end
-- dump-to: tests
--[==[
-- «complexdef-tests» (to ".complexdef-tests")
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
require "zdags"
= simpledef ("nam", 9, "% body\n")
--> \def\nam#1#2#3#4#5#6#7#8#9{%
-- % body
-- }
= complexdef("name", 10, "% body\n")
--> \makeatletter
-- \def\name#1#2#3#4#5{\begingroup%
-- \sa{1}{#1}\sa{2}{#2}\sa{3}{#3}\sa{4}{#4}\sa{5}{#5}\name@}
-- \def\name@#1#2#3#4#5{%
-- \sa{6}{#1}\sa{7}{#2}\sa{8}{#3}\sa{9}{#4}\sa{10}{#5}%
-- %body
-- \endgroup}
-- \makeatother
--]==]
-- Local Variables:
-- coding: raw-text-unix
-- ee-anchor-format: "«%s»"
-- End: