-- This file: -- https://anggtwu.net/LUA/DiagTikz1.lua.html -- https://anggtwu.net/LUA/DiagTikz1.lua -- (find-angg "LUA/DiagTikz1.lua") -- Author: Eduardo Ochs -- (With a lot of help from Leandro Abib) -- Version: 2026jun21 -- -- (defun e () (interactive) (find-angg "LUA/DiagTikz1.lua")) -- (defun o () (interactive) (find-angg "LUA/DiagForth1.lua")) -- (find-dn6 "diagtikz.lua") -- (find-dn6 "diagforth.lua" "diagram") -- (find-dn6 "diagforth.lua" "enddiagram") -- «.tforths» (to "tforths") -- «.TikzForth» (to "TikzForth") -- «.txyrun» (to "txyrun") -- «.diagram» (to "diagram") -- «.enddiagram» (to "enddiagram") -- «.2D-and-2Dx» (to "2D-and-2Dx") -- «.arrows» (to "arrows") -- «.diagmiddle» (to "diagmiddle") -- «.coords» (to "coords") -- «.Tikz_nodes» (to "Tikz_nodes") -- «.Tikz_arrows» (to "Tikz_arrows") -- «.arrow-modifiers» (to "arrow-modifiers") -- «.Tikz_diag_body» (to "Tikz_diag_body") -- «.tdiag-head» (to "tdiag-head") -- «.preamble» (to "preamble") -- «.test» (to "test") -- (find-angg "LUA/Tikz2.lua") -- (find-angg "LUA/Tikz2.lua" "test-loeliger") require "Tikz2" -- (find-angg "LUA/Tikz2.lua") require "Pict4" -- (find-angg "LUA/Pict4.lua") -- «tforths» (to ".tforths") -- Based on: (find-angg "LUA/DiagForth1.lua" "forths") tforths = tforths or {} -- Similar to forths[], tforthe = {} -- Similar to tforths[], but defines eaters. -- «TikzForth» (to ".TikzForth") -- Based on: (find-angg "LUA/DiagForth1.lua") -- TikzForth = Class { type = "TikzForth", __index = { w = function (tf) return getword() or werror() end, e = function (tf) return getwordasluaexpr() end, r = function (tf) return getrestofline() end, w_w = function (tf) return tf:w(),tf:w() end, w_w_w = function (tf) return tf:w(),tf:w(),tf:w() end, e_e = function (tf) return tf:e(),tf:e() end, e_e_e = function (tf) return tf:e(),tf:e(),tf:e() end, e_e_w = function (tf) return tf:e(),tf:e(),tf:w() end, -- getargs = function (tf,word) local ga = tforthe[word] if not ga then return end if type(ga) == "function" then return ga() end if type(ga) == "string" then local methodname = ga:gsub(",", "_") if not tf[methodname] then error("Bad getargs method in "..word.." -> "..methodname) end return tf[methodname](tf) end error("Bad getargs in word: "..word) end, txyrun1 = function (tf,word) if tforths[word] then tforths[word](tf:getargs(word)) elseif nodes[word] then ds:push(nodes[word]) else Error("Unknown word: "..word) end end, txyrun = function (tf,str,pos_) local oldvalues = pack(subj,startcol,endcol,word,pos) setsubj(str, pos_ or 1) while getword() do tf:txyrun1(word) end subj,startcol,endcol,word,pos = unpack(oldvalues) end, -- run1 = function (tf,cmd) if type(cmd) == "string" then cmd = {cmd} end local word = cmd[1] if not forths[word] then error("Unknown word: "..word) end forths[word](unpack(cmd, 2)) end, -- }, } -- «txyrun» (to ".txyrun") -- Based on: (find-angg "LUA/DiagForth1.lua" "dxyrun") txyrun = function (str, pos_) TikzForth{}:txyrun(str,pos_) end -- «diagram» (to ".diagram") -- Based on: (find-dn6 "diagforth.lua" "diagram") tforthe["diagram"] = "w" tforths["diagram"] = function (name) xys = {} nodes = VerticalTable {} arrows = VerticalTable {} lasty = nil diagramname = name end -- «enddiagram» (to ".enddiagram") -- Based on: (find-dn6 "diagforth.lua" "enddiagram") tforths["enddiagram"] = function () --Tikz_diag_def(diagramname, tf:hyperlink()):output() --Tikz_diag_def(diagramname):output() Tikz_def_diag(diagramname):output() end -- «2D-and-2Dx» (to ".2D-and-2Dx") -- Based on: (find-dn6 "diagforth.lua" "2D-and-2Dx") tforths["2Dx"] = dxy2Dx tforths["2D"] = dxy2D -- Based on: (find-dn6 "diagforth.lua" "forths") tforthe["#"] = "r" tforths["#"] = function () end -- Based on: (find-dn6 "diagforth.lua" "dxyren") tforthe["ren"] = "r" tforths["ren"] = function (restofline) dxyren(restofline) end -- Based on: (find-dn6 "diagforth.lua" "metastack") tforths["(("] = function () depths:ppush() end tforths["))"] = function () depths:ppop() end -- «arrows» (to ".arrows") -- Based on: (find-dn6 "diagforth.lua" "arrows") tpusharrow = function (drawopts, pathop) local from, to = ds:pick(1), ds:pick(0) from.used = 1 to .used = 1 ds:push(storearrow(DxyArrow { from = from.noden, to = to .noden, drawopts = drawopts, pathop = pathop or "--" })) end -- See: (find-es "tikz" "leandro-abib") tforths["->"] = function () tpusharrow("->") end tforths["|->"] = function () tpusharrow("|->") end tforths["<-"] = function () tpusharrow("<-") end tforths["<-|"] = function () tpusharrow("<-|") end tforths["<->"] = function () tpusharrow("<->") end -- «diagmiddle» (to ".diagmiddle") -- Based on: (find-angg "LUA/DiagForth1.lua" "diagmiddle") tforthe["harrownodes"] = "e,e,e" tforthe["varrownodes"] = "e,e,e" tforthe["dharrownodes"] = "e,e,e" tforthe["dvarrownodes"] = "e,e,e" tforths["harrownodes"] = function (dx0, dx1, dx2) harrownodes(dx0, dx1, dx2) end tforths["varrownodes"] = function (dx0, dx1, dx2) varrownodes(dx0, dx1, dx2) end tforths["dharrownodes"] = function (dx0, dx1, dx2) dharrownodes(dx0, dx1, dx2) end tforths["dvarrownodes"] = function (dx0, dx1, dx2) dvarrownodes(dx0, dx1, dx2) end -- «coords» (to ".coords") -- Based on: (find-dn6 "diagtex.lua" "coords") txyorigx = 100 txyorigy = 100 txyscale = 0.064 trealx = function (x) return txyscale * (x - txyorigx) end trealy = function (y) return -txyscale * (y - txyorigy) end trealxy = function (x, y) return trealx(x), trealy(y) end -- «Tikz_nodes» (to ".Tikz_nodes") -- See: (find-es "tikz" "leandro-abib") -- \node[anchor = center] (RC) at (3,2) {$RC$}; Tikz_node_tag = function (node) return node.tag or node.noden end Tikz_node_tex = function (node) return node.TeX or node.tex or node.tag end Tikz_node_decl = function (node) local x,y = trealxy(node.x, node.y) local tag = Tikz_node_tag(node) local tex = Tikz_node_tex(node) return pformat("\\node [anchor=center] (%s) at (%s,%s) {$%s$};\n", tag, x,y, tex) end Tikz_nodes = function () local decls = VTable {} for i=1,#nodes do if nodes[i].used then table.insert(decls, Tikz_node_decl(nodes[i])) end end return table.concat(decls) end -- «Tikz_arrows» (to ".Tikz_arrows") -- Based on: (find-dn6 "diagtex.lua" "arrow_to_TeX") -- See: (find-es "tikz" "leandro-abib") -- \draw [<-] (A4) -- (A5) node[midway,above] {$\scriptstyle L$}; Tikz_arrow_plabel = function (arrow) local placement = arrow.placement local label = arrow.label if not (placement and label) then return "" end local expand = {a="above", b="below", l="left", r="right"} local fmt = " node[midway,%s] {$\\scriptstyle %s$}" return format(fmt, expand[placement] or placement, label) end Tikz_arrow_tex = function (arrow) local tag_from = Tikz_node_tag(nodes[arrow.from]) local tag_to = Tikz_node_tag(nodes[arrow.to]) local drawopts = arrow.drawopts local pathop = arrow.pathop local plabel = Tikz_arrow_plabel(arrow) return format("\\draw [%s] (%s) %s (%s)%s;\n", drawopts, tag_from, pathop, tag_to, plabel) end Tikz_arrows = function () return mapconcat(Tikz_arrow_tex, arrows) end -- «arrow-modifiers» (to ".arrow-modifiers") -- Based on: (find-angg "LUA/DiagForth1.lua" "arrow-modifiers") tforthe[".plabel="] = "w,w" tforths[".plabel="] = function (p,label) ds:pick(0).placement = p ds:pick(0).label = label end -- No-ops at this moment: tforths["sl^^"] = function () ds:pick(0).slide = "5pt" end tforths["sl^"] = function () ds:pick(0).slide = "2.5pt" end tforths["sl_"] = function () ds:pick(0).slide = "-2.5pt" end tforths["sl__"] = function () ds:pick(0).slide = "-5pt" end -- «Tikz_diag_body» (to ".Tikz_diag_body") -- See: (find-angg "LUA/PictRect1.lua" "Pict") -- (find-angg "LUA/PictRect1.lua" "Pict" "wrapbe") -- (find-dn6 "diagtex.lua" "arrows_to_defdiag") Tikz_diag_body = function () return Pict(Rect.from(Tikz_nodes()..Tikz_arrows())) end Tikz_diag = function () return Tikz_diag_body():wrapbe("\\begin{tikzpicture}", "\\end{tikzpicture}") end Tikz_def_diag_topline = function (name) return format("\\def\\TikzDiag%s{", name) end Tikz_def_diag = function (name, hyperlink) --local topline = format("\\deftdiag {%s} { %% %s", name, hyperlink or "") local topline = format("\\deftdiag {%s} {", name) local topline = format("\\deftdiag{%s}{", name) local topline = Tikz_def_diag_topline(name) return Tikz_diag():wrapbe(topline, "}") end -- «tdiag-head» (to ".tdiag-head") -- Based on: (find-dn6 "heads6.lua" "diag-head") registerhead "%T" { name = "tdiag", action = function () local i,j,diaglines = tf:getblock() --for n=i,j do txyrun(untabify(texlines:line(n)), 3, n) end for n=i,j do txyrun(untabify(tf:line(n)), 3, n) end end, } -- «preamble» (to ".preamble") -- (find-LATEX "2026diagtikz-test.tex" "diagtikz-preamble") --[==[ % Based on: (find-dn6 "preamble6.lua" "preamble1" "defdiag") \def\deftdiag #1#2{\expandafter\def\csname tdiag-#1\endcsname{#2}} \def\iftdiagundefined#1{\expandafter\ifx\csname tdiag-#1\endcsname\relax} \def\tdiag#1{\iftdiagundefined{#1} \errmessage{UNDEFINED TIKZ DIAGRAM: #1} \else \csname tdiag-#1\endcsname \fi } --]==] -- (find-dn6 "diagtex.lua" "DxyArrow") -- (find-dn6 "diagtex.lua" "arrow_to_TeX") -- «test» (to ".test") --[==[  (eepitch-lua51)  (eepitch-kill)  (eepitch-lua51) loaddednat7() -- (find-angg "LUA/lua50init.lua" "loaddednat7") dednat7oldheads() -- (find-angg "LUA/dednat7load.lua" "requires") require "DiagTikz1" -- (find-efunction 'find-dednat7debug-links) -- tf = TeXFile.read("/dev/null") -- texlines = tf txyrun [[ diagram Foo ]] txyrun [[ 2Dx 100 +20 ]] txyrun [[ 2D 100 A0 <-| A1 ]] txyrun [[ 2D | | ]] txyrun [[ 2D | <-> | ]] txyrun [[ 2D v v ]] txyrun [[ 2D +20 A2 |-> A3 ]] txyrun [[ 2D ]] txyrun [[ ren A0 A1 ==> LA A ]] txyrun [[ ren A2 A3 ==> B RB ]] txyrun [[ ]] txyrun [[ (( A0 A1 <-| ]] txyrun [[ A0 A2 -> ]] txyrun [[ A1 A3 -> ]] txyrun [[ A2 A3 |-> ]] txyrun [[ )) ]] txyrun [[ enddiagram ]] = nodes = arrows = Tikz_nodes() txyscale = 0.1 = Tikz_nodes() = Tikz_arrows() = Tikz_diag_body() = Tikz_diag() = Tikz_diag_def("foo") = Tikz_diag_def("foo", "(bar)") = Rect.from(Tikz_nodes()..Tikz_arrows()) = Pict(Rect.from(Tikz_nodes()..Tikz_arrows())) -- (find-angg "LUA/Tos.lua") --]==] -- Local Variables: -- coding: utf-8-unix -- End: