[metapost] METAPOST environment taking advantage of the SVG support for previewing?

luigi scarso luigi.scarso at gmail.com
Fri Feb 17 09:00:16 CET 2017

On Thu, Feb 16, 2017 at 9:13 PM, William Adams <will.adams at frycomm.com> 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.

There is mplib; API is  in  mplibapi.pdf at

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;
      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([[
                     fill fullcircle scaled 20;
                     label("Hello", (100,100) );
                     currentpicture := currentpicture scaled 20;
--[=[ 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

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 .


More information about the metapost mailing list