Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- Experimental features for diagxy require "diagxy.lua" -- (find-anchor "diagxy.lua") asluaexpr = function (str) return assert(loadstring("return "..str))() end getwordasluaexpr = function () return asluaexpr(getword()) end forths["midpoint"] = function () local node1, node2 = ds[2], ds[1] local midx, midy = (node1.x + node2.x)/2, (node1.y + node2.y)/2 ds[2] = storenode{x=midx, y=midy, TeX="\\phantom{O}"} dspop() end splitdist = function (x1, x2, dx0, dx1, dx2) local dx = x2-x1 local rest = dx-(dx0 or 0)-(dx1 or 0)-(dx2 or 0) local type = (dx0 and "n" or "_")..(dx1 and "n" or "_").. (dx2 and "n" or "_") if type=="_n_" then return x1+rest/2, x2-rest/2 elseif type=="n_n" then return x1+dx0, x2-dx2 elseif type=="nn_" then return x1+dx0+rest/2, x2-rest/2 elseif type=="_nn" then return x1+rest/2, x2-dx2-rest/2 end local p = function (n) return n or "nil" end print("Bad splitdist pattern: "..p(dx0).." "..p(dx1).." "..p(dx2)) end forths["harrownodes"] = function () local node1, node2 = ds[2], ds[1] local midy = (node1.y + node2.y)/2 local dx0 = getwordasluaexpr() local dx1 = getwordasluaexpr() local dx2 = getwordasluaexpr() local x1, x2 = splitdist(node1.x, node2.x, dx0, dx1, dx2) dspush(storenode{x=x1, y=midy, TeX="\\phantom{O}"}) dspush(storenode{x=x2, y=midy, TeX="\\phantom{O}"}) end forths["varrownodes"] = function () local node1, node2 = ds[2], ds[1] local midx = (node1.x + node2.x)/2 local dy0 = getwordasluaexpr() local dy1 = getwordasluaexpr() local dy2 = getwordasluaexpr() local y1, y2 = splitdist(node1.y, node2.y, dy0, dy1, dy2) dspush(storenode{x=midx, y=y1, TeX="\\phantom{O}"}) dspush(storenode{x=midx, y=y2, TeX="\\phantom{O}"}) end placetoTeX = function (arrow) local node = arrow.from return format("\\place(%d,%d)[{%s}]", realx(node.x), realy(node.y), node.TeX) end forths["place"] = function () storearrow {special=placetoTeX, from=ds[1]} end emitTeX = function (arrow) return arrow.TeX end forths["emit\""] = function () storearrow {special=emitTeX, TeX=getuntilquote()} end forths[".plabel="] = function () ds[1].placement = getword() ds[1].label = getword() end forths["@"] = function () dspush(ds[table.getn(ds) - depths[1] - getwordasluaexpr()]) end forths["aliases"] = function () local n = getwordasluaexpr() for dep = n,1,-1 do nodes[getword()] = ds[dep] end end