Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file: -- http://angg.twu.net/LATEX/2021fitch.lua.html -- http://angg.twu.net/LATEX/2021fitch.lua -- (find-angg "LATEX/2021fitch.lua") -- Author: Eduardo Ochs <eduardoochs@gmail.com> -- -- (defun e () (interactive) (find-angg "LATEX/2021fitch.tex")) -- (defun f () (interactive) (find-angg "LATEX/2021fitch.lua")) -- -- See: (find-angg "LUA/Fitch.lua") -- See: (find-angg "LUA/Fitch.lua") -- «.fitch_gram» (to "fitch_gram") -- «.fitch_gram-tests» (to "fitch_gram-tests") -- «.FitchGrid» (to "FitchGrid") -- «.fitch-head» (to "fitch-head") -- «.defftch» (to "defftch") re = require "re" -- ____ -- | _ \ __ _ _ __ ___ ___ -- | |_) / _` | '__/ __|/ _ \ -- | __/ (_| | | \__ \ __/ -- |_| \__,_|_| |___/\___| -- -- «fitch_gram» (to ".fitch_gram") -- fitch_gram = [=[ s <- ' ' eol <- !. left <- {~ leftchar+ ~} leftchar <- [^ /|\] vbars <- { firstbar anotherbar* } firstbar <- barchar anotherbar <- var? s? barchar var <- varchar+ varchar <- [A-Za-z] barchar <- [/|\] vbarlist <- {| vbar+ |} vbar <- {| ({:v: var :}? s*) {:b: barchar :} |} middle <- {~ middlechar+ (s middlechar+)* ~} middlechar <- [^ ] hline <- {~ '-' '-'+ ~} right <- {~ rightchar+ (s rightchar+)* ~} rightchar <- [^ ] sleft <- {:left: s* left s* :} / s* svbars <- {:vbars: vbars :} smiddle <- {:hline: hline :} / {:middle: middle :} sright <- (s s+ {:right: right :} s*) / s* fitchline <- {| sleft svbars s* smiddle sright |} ]=] fitch_reP = Re { print = PP, grammar = fitch_gram } fitch_re0 = Re { grammar = fitch_gram } fitch_parseline = fitch_re0:cc 'top <- fitchline' fitch_parsevbars = fitch_re0:cc 'top <- vbarlist' -- «fitch_gram-tests» (to ".fitch_gram-tests") --[==[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "2021fitch.lua" pli = fitch_reP:cc 'top <- fitchline' pvb = fitch_reP:cc 'top <- vbarlist' pli = fitch_reP:cc 'top <- {| sleft svbars |}' pli [=[ 4 | | .vdots foo ]=] pli [=[ 4 | | . vdots foo ]=] pli [=[ 4 | | vd\ot s foo ]=] pli [=[ 4 | | \vdot s foo ]=] pli [=[ 4 | | {\vdot s} foo ]=] pli [=[ ab|c| de {\vdot s} foo ]=] pli [=[ ab|c| de {\vdot s} foo ]=] pli [=[ ab|c | de {\vdot s} foo ]=] pli [=[ ab|c | de {\vdot s} foo ]=] pli [=[ ab| c| de {\vdot s} foo ]=] pli [=[ ab| c| de {\vdot s} foo ]=] pli [=[ ab|c |de {\vdot s} foo ]=] pli [=[ ab|c |---- foo ]=] --]==] -- _____ _ _ _ ____ _ _ -- | ___(_) |_ ___| |__ / ___|_ __(_) __| | -- | |_ | | __/ __| '_ \| | _| '__| |/ _` | -- | _| | | || (__| | | | |_| | | | | (_| | -- |_| |_|\__\___|_| |_|\____|_| |_|\__,_| -- -- «FitchGrid» (to ".FitchGrid") FitchGrid = Class { type = "FitchGrid", from = function (bigstr) fg = FitchGrid {lines={}} for _,line in ipairs(splitlines(bigstr)) do local pline = fitch_parseline(line) local pvbars = pline and fitch_parsevbars(pline.vbars) if pline then table.insert(fg.lines, line) pline.vbs = pvbars table.insert(fg, VTable(pline)) end end return fg end, __tostring = function (fg) return table.concat(fg.lines, "\n") end, __index = { maxy = function (fg) return #fg end, maxx = function (fg, y) return #(fg[y].vbs) end, vb = function (fg, x, y) return fg[y] and fg[y].vbs[x] end, v = function (fg, x, y) return (fg:vb(x, y) or {}).v end, b = function (fg, x, y) return (fg:vb(x, y) or {}).b end, ishline = function (fg, y) return fg[y] and fg[y].hline end, kluwerletter = function (fg, x, y) local isfirst = (fg:b(x,y) == "/") local isaboveline = (x == fg:maxx(y)) and fg:ishline(y + 1) if isfirst and isaboveline then return "h" end if isfirst then return "b" end if isaboveline then return "j" end return "a" end, kluwervbars = function (fg, y) str = "" for x=1,fg:maxx(y) do str = str .. "\\f"..fg:kluwerletter(x, y).." " end return str end, texmiddle = function (fg, str) return str end, texright = function (fg, str) return str end, kluwerline = function (fg, y) if fg:ishline(y) then return nil end local lefttex = fg[y].left or "" local vbarstex = fg:kluwervbars(y) local middletex = fg:texmiddle(fg[y].middle) local righttex = fg:texright(fg[y].right or "") local body = format("\\ftag{%s}{%s%s} & %s \\\\", lefttex, vbarstex, middletex, righttex) return body end, kluwer = function (fg, prefix) local lines = {} for y=1,fg:maxy() do local body = fg:kluwerline(y) if body then table.insert(lines, (prefix or " ")..body) end end return table.concat(lines, "\n") end, defftch = function (fg, name) local body = fg:kluwer() local def = format("\\defftch{%s}{\n \\begin{fitch}\n%s\n \\end{fitch}}", name, body) return def end, }, } fitch_bigstr1 = [=[ 1 / ∃x∀y.P(x,y) | -------- 2 |v/u/ ∀y.P(u,y) | | | ----- 3 | | | P(u,v) $∀$E, 2 | | \ \vdots 4 | | \ ∃x.P(x,v) $∃$I, 3 5 | \ ∃x.P(x,v) $∃$E, 1, 2--5 6 \ ∀y∃x.P(x,y) $∀$I, 2--5 ]=] --[[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "2021fitch.lua" fg = FitchGrid.from(fitch_bigstr1) = fg = fg[2] = fg[3] = fg[4] = fg[5] = fg[6] = fg:b(2, 3) = fg:kluwer() = fg:defftch("Foo bar") for _,li in ipairs(splitlines(fitch_bigstr1)) do print(li) pli = fitch_parseline(li) pvb = pli and pli.vbars and fitch_parsevbars(pli.vbars) PP("parseline:", pli) PP("parsevbars:", pvb) print() end --]] -- «fitch-head» (to ".fitch-head") -- (find-dednat6 "myverbatim.lua" "myverbatim-head") registerhead = registerhead or function () return nop end registerhead "%F" { name = "ftch", action = function () local i,j,origlines = tf:getblock() ftch_lines = origlines end, } -- «defftch» (to ".defftch") defftch = function (name) local bigstr = table.concat(ftch_lines, "\n") local fg = FitchGrid.from(bigstr) local def = fg:defftch(name) print(bigstr) output(def) end