Re: METAPOST environment taking advantage of the SVG support for previewing?
luigi scarso <[email protected]>
| Newsgroups | gmane.comp.tex.metapost |
|---|---|
| Message-ID | <CAG5iGsDNgzfNArnaifr315=zwJBDmcGFSy8g9uuxzzNuNmBxpA@mail.gmail.com> |
On Thu, Feb 16, 2017 at 9:13 PM, William Adams <[email protected]> wrote: > I was wondering if anyone had done this sort of thing, or given it any > thoughts --- I think it'd be easier to set up and design and work up than > some of the other options. > > I want a nice graphical tool for METAPOST editing / coding / drawing, and I > think it's finally time I tried to just make my own if there aren't any > other options besides METAGRAF. Also http://ipe.otfried.org/ There is mplib; API is in mplibapi.pdf at http://tug.org/svn/texlive/trunk/Master/texmf-dist/doc/metapost/base/ This is a simple example of the Lua API; you have to put plain.mp and cmr10.tfm in the same folder of test.lua . --[==[ test.lua ]==] local mplib = require('mplib') local mp = mplib.new ({ ini_version = false, mem_name = 'plain' }) if mp then local l local tracingall=[[tracingonline:=1; showstopping:=1; tracingcommands:=3; tracingtitles:=1; tracingequations:=1; tracingcapsules:=1; tracingspecs:=2; tracingchoices:=1; tracinglostchars:=1; tracingstats:=1; tracingoutput:=1; tracingmacros:=1; tracingrestores:=1; ]] l = mp:execute([[input plain;]]) -- for k,v in pairs(l) do print('k='.. tostring(k),'v='..tostring(v)) end --l = mp:execute(tracingall) -- for k,v in pairs(l) do print('k='.. tostring(k),'v='..tostring(v)) end l = mp:execute([[ beginfig(1); fill fullcircle scaled 20; label("Hello", (100,100) ); currentpicture := currentpicture scaled 20; endfig; ]]) --[=[ log and term out ]=] -- for k,v in pairs(l) do print(k,v) end if l and l.fig and l.fig[1] then local fpng = io.open("test.png",'w') local fps = io.open("test.ps",'w') local fsvg = io.open("test.svg",'w') --print (l.fig[1]:postscript()) fps:write(l.fig[1]:postscript()); fps:close() --print (l.fig[1]:png()); fpng:write(l.fig[1]:png()); fpng:close() --print (l.fig[1]:svg()) fsvg:write(l.fig[1]:svg()); fsvg:close() for k1, v1 in pairs(l.fig[1]:objects()) do print(k1,v1.type) end end mp:finish(); end The most important is objects() because it gives the complete list of objects in abstract way, but one can also parse the ps backend. mplib is embedded in luatex, so you can run the example with $> luatex --luaonly test.lua Be careful that pictures like this picture p; p := btex $\displaystyle\int_0^\infty e^{-x} \, \sin x \, dx $ etex; draw p; require a TeX engine (basically Context does exactly this: combine objects of mplib and the tex typesetting engine of luatex) Also, we are planning to drop the png and svg interface in the mplib embedded in luatex -- *not* in Metapost nor mplib . -- luigi -- http://tug.org/metapost/