Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
-- diagtikz.lua:
-- This file:
--   http://angg.twu.net/dednat6/dednat6/diagtikz.lua.html
--   http://angg.twu.net/dednat6/dednat6/diagtikz.lua
--           (find-angg "dednat6/dednat6/diagtikz.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
-- Version: 2020feb16
-- License: GPL3

-- The default back-end for 2D diagrams in dednat6 is the file
-- "diagtex.lua", that generates code for diagxy. This is an
-- alternative back-end that generates code for Tikz instead of
-- diagxy. Note: THIS IS A SKELETON/PROTOTYPE, and it is not
-- loaded by default!
--
-- See: (find-angg "dednat6/dednat6/diagtex.lua")

-- «.tikzdiagram»	(to "tikzdiagram")
-- «.endtikzdiagram»	(to "endtikzdiagram")
-- «.tikzshape»		(to "tikzshape")
-- «.tikzshapes-test»	(to "tikzshapes-test")
-- «.tikzcoords»	(to "tikzcoords")
-- «.defdiagtikz»	(to "defdiagtikz")
-- «.tikzdiagram-test»	(to "tikzdiagram-test")







-- require "diagtex"    -- (find-dn6 "diagtex.lua")
require "diagforth"     -- (find-dn6 "diagforth.lua")



-- «tikzdiagram»  (to ".tikzdiagram")
-- «endtikzdiagram»  (to ".endtikzdiagram")
-- See: (find-dednat6 "dednat6/diagforth.lua" "diagram")
--      (find-dednat6 "dednat6/diagforth.lua" "enddiagram")
--      (to "defdiagtikz")
--
forths["tikzdiagram"] = function ()
    diagramname = getword() or derror("No diagram name")
    xys = {}
    nodes  = VerticalTable {}
    arrows = VerticalTable {}
    lasty = nil
  end
forths["endtikzdiagram"] = function ()
    -- output(arrows_to_defdiag(diagramname, tf:hyperlink()))
    output(defdiagtikz())
    -- print(arrows)
  end




-- «tikzshape»  (to ".tikzshape")
-- One of the optional arguments to the diagxy macro "\morphism" is
-- called "shape", and it is given like this: "/|->/"...
--   (find-diagxypage 7 "The shape parameter sh")
--   (find-diagxytext 7 "The shape parameter sh")
--   (find-dednat6 "dednat6/diagforth.lua" "arrows")
--   (find-dednat6 "dednat6/diagforth.lua" "arrows")
--
tikzshapes   = VerticalTable {}
tikzshape    = function (diagxysh) return tikzshapes[diagxysh].to end
tikzshapedef = function (word, diagxysh, tikzarrowspec)
    local sh = diagxysh or word   -- can be better
    tikzshapes[sh] = {word=word, from=sh, to=tikzarrowspec}
  end

tikzshapedef("->",   nil,       "->")
tikzshapedef("|->",  nil,       "{|}-{>}")
tikzshapedef("=>",   nil,       "{}-{>},double")
tikzshapedef("`->",  "^{ (}->", "{}-{>},double")

-- «tikzshapes-test»  (to ".tikzshapes-test")
--[[
 (eepitch-lua51)
 (eepitch-kill)
 (eepitch-lua51)
dofile "diagtikz.lua"
= tikzshapes
= tikzshape  "^{ (}->"

--]]



-- «tikzcoords»  (to ".tikzcoords")
-- Convert diagxy coordinates to tikz coordinates.
tikzx = function (x) return (x - 100) / 20 end
tikzy = function (y) return (100 - y) / 20 end
tikznodename = function (node)
    return node.x.." "..node.y
  end
tikznodedef = function (node)
    local tex = node.tex or node.tag
    local TeX = node.TeX or (tex and unabbrev(tex))
    return format("    \\node (%s) at (%s,%s) {$%s$};",
                  tikznodename(node),
                  tikzx(node.x), tikzy(node.y),
                  TeX)
  end
tikznodedefs = function ()
    local A = {}
    for i=1,#nodes do
      table.insert(A, tikznodedef(nodes[i]).."\n")
    end
    return table.concat(A)
  end


tikzarrow0 = function (arrowspec, nodenamefrom, nodenameto)
    return format("    \\draw [%s] (%s) -- (%s);",
                  arrowspec, nodenamefrom, nodenameto)
  end
tikzarrow = function (arrow)
    local nodefrom     = nodes[arrow.from]
    local nodeto       = nodes[arrow.to]
    local nodenamefrom = tikznodename(nodefrom) 
    local nodenameto   = tikznodename(nodeto) 
    local arrowspec    = tikzshape(arrow.shape)
    return tikzarrow0(arrowspec, nodenamefrom, nodenameto)
  end
tikzarrows = function ()
    local A = {}
    for i=1,#arrows do
      table.insert(A, tikzarrow(arrows[i]).."\n")
    end
    return table.concat(A)
  end

tikzdiagram = function ()
    return "  \\begin{tikzpicture}\n"..
      tikznodedefs()..
      tikzarrows()..
      "  \\end{tikzpicture}"
  end



-- «defdiagtikz»  (to ".defdiagtikz")
-- (find-dn6 "diagtex.lua" "arrows_to_defdiag")
defdiagtikz0 = function (name, hyperlink)
    return format("\\defdiagtikz{%s}{   %% %s\n%s}",
                  name, hyperlink or "",
                  tikzdiagram())
  end
defdiagtikz = function ()
    return defdiagtikz0(diagramname, tf and tf:hyperlink())
  end



-- «tikzdiagram-test»  (to ".tikzdiagram-test")
-- (find-dednat6 "dednat6/diagforth.lua" "high-level-tests")

--[==[
 (eepitch-lua51)
 (eepitch-kill)
 (eepitch-lua51)
dofile "diagtikz.lua"
forths["endtikzdiagram"] = function () print(arrows) end

dxyrun [[ tikzdiagram NAME           ]]
dxyrun [[ 2Dx     100   +40          ]]
dxyrun [[ 2D  100 A --> B            ]]
dxyrun [[ 2D            |            ]]
dxyrun [[ 2D  +30       C            ]]
dxyrun [[ 2D                         ]]
dxyrun [[ (( A B ->  .plabel= a foo  ]]
dxyrun [[    B C =>  .plabel= r bar  ]]
dxyrun [[    A C |-> .plabel= m plic ]]
dxyrun [[                            ]]
dxyrun [[ ))                         ]]
dxyrun [[ endtikzdiagram             ]]

-- (find-dednat6 "dednat6/diagtex.lua" "arrows_to_defdiag")
-- (find-dednat6 "dednat6/diagtex.lua" "arrow_to_TeX")

print(arrows)
PP(arrows[1])
PP(arrows[1].from)
PP(arrows[1].to)
PP(nodes[arrows[1].from])
PP(nodes[arrows[1].to])

= tikznodedef(nodes[arrows[1].to])
= tikzarrow(arrows[1])
= nodes
= tikznodedefs()
= arrows
= tikzarrows()
= defdiagtikz0("foo", "hyper")
= defdiagtikz0("foo")
= defdiagtikz()

--]==]






-- Local Variables:
-- coding:             utf-8-unix
-- End: