Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file: -- http://angg.twu.net/dednat6/dednat6/underbrace2d.lua -- http://angg.twu.net/dednat6/dednat6/underbrace2d.lua.html -- (find-angg "dednat6/dednat6/underbrace2d.lua") -- -- This module supersedes underbrace.lua, that used a stack language -- to draw underbrace diagrams... this one uses a 2D ascii art syntax. -- See this for an example: -- http://angg.twu.net/dednat6/demo-underbrace.pdf -- http://angg.twu.net/dednat6/demo-underbrace.tex -- http://angg.twu.net/dednat6/demo-underbrace.tex.html -- -- This is a hack that I wrote VERY quickly. It is badly written and -- hard to debug when it yield errors! TODO: rewrite it cleanly. -- -- Used by: -- (find-LATEXgrep "grep --color=auto -nH --null -e defub *.tex *.sty *.lua") -- Superseded by: -- (find-angg "LUA/Und2D1.lua") -- Author and version: Eduardo Ochs <eduardoochs@gmail.com>, 2019dec08 -- License: GPL3 -- «.UB» (to "UB") -- «.UB-head» (to "UB-head") -- «.UB-tests» (to "UB-tests") -- _ _ ____ _ _ _ ____ -- | | | | __ )_ | | | |_ __ __| | ___ _ __| __ ) _ __ __ _ ___ ___ -- | | | | _ (_) | | | | '_ \ / _` |/ _ \ '__| _ \| '__/ _` |/ __/ _ \ -- | |_| | |_) | | |_| | | | | (_| | __/ | | |_) | | | (_| | (_| __/ -- \___/|____(_) \___/|_| |_|\__,_|\___|_| |____/|_| \__,_|\___\___| -- -- «UB» (to ".UB") -- UB: a structure for interpreting UnderBrace diagrams. -- UB = Class { type = "UB", from = function (li) li = untabify8(li) local ub = UB {} -- (find-lua53manual "#pdf-utf8.charpattern") -- "[\0-\x7F\xC2-\xF4][\x80-\xBF]*" local pat = "[\1-\127\194-\244][\128-\191]*" local col = 1 for c in li:gmatch(pat) do table.insert(ub, UB {L=col, R=col, c}) col = col + 1 end ub.L, ub.R = 1, #ub return ub end, fromlines = function (lines) lines = map(untabify8, lines) local ub = UB.from(lines[1]) for i = 2,#lines,2 do ub:unds(lines[i], lines[i+1]) end return ub end, __tostring = function (ub) return mapconcat(function (i) return tostring(ub[i]) end, seq(1, #ub)) end, __index = { tostring = function (ub) return tostring(ub) end, tolatex = function (ub) return tostring(ub) end, defub = function (ub, name) output(format("\\defub{%s}{%s}", name, ub:tolatex())) end, -- def = function (ub, name) -- return format("\\def\\%s{%s}", name, ub:tolatex()) -- end, -- outputdef = function (ub, name) output(ub:def(name)) end, innerview = function (ub) local f = function (o) return format("%5s: \"%s\"", o.L.."-"..o.R, o[1]) end return mapconcat(f, ub, "\n") end, -- leftcol = function (ub) return ub.L end, rightcol = function (ub) return ub.R end, column_to_i = function (ub, col) for i=1,#ub do local a,b = ub[i]:leftcol(), ub[i]:rightcol() if a <= col and col <= b then return i end end return #ub end, columns_to_i_j_L_R_t = function (ub, col1, col2) local newub = UB {} local i = ub:column_to_i(col1) local j = ub:column_to_i(col2) local L,R = ub[i]:leftcol(), ub[j]:rightcol() local text = mapconcat(function (i) return tostring(ub[i]) end, seq(i, j)) return i,j, L,R, text end, text_l_r = function (ub, l, r) local i,j, L,R, text = ub:columns_to_i_j_L_R_t(l, r-1) return text end, und = function (ub, col1, col2, undtext) local i,j, L,R, oldtext = ub:columns_to_i_j_L_R_t(col1, col2) local newtext = format("\\und{%s}{%s}", oldtext, undtext) local newub = UB {L=L, R=R, newtext} for k=i,j do table.remove(ub, i) end table.insert(ub, i, newub) return ub end, unds = function (ub, li2, li3) local ub3 = UB.from(li3) for l,r in li2:gmatch("()%-+()") do local undtext = ub3:text_l_r(l, r) ub:und(l, r-1, undtext) end return ub end, }, } -- «UB-head» (to ".UB-head") -- (find-LATEX "2018tug-dednat6.lua" "myverbatim-head") registerhead "%UB" { name = "underbrace2d", action = function () local i,j,lines = tf:getblock() ublast = UB.fromlines(lines) PP(ublast) end, } defub = function (name) ublast:defub(name) end -- «UB-tests» (to ".UB-tests") --[==[ • (eepitch-lua51) • (eepitch-kill) • (eepitch-lua51) loaddednat6() dofile "underbrace2d.lua" teststr = [[ a b c d e f --- --- g h --------- i ]] lines = splitlines(teststr) PPV(lines) ub = UB.from(lines[1]) for i=2,#lines,2 do ub:unds(lines[i], lines[i+1]) end print(ub) = ub:innerview() PPV(ub) ub = UB.fromlines(lines) = ub --]==] -- Local Variables: -- coding: utf-8-unix -- End: