[metapost] Question: [MPLib, MetaFun, ConTeXt, LuaTeX] metapost logging and message primitive?

Colin Fraizer metapost at cfraizer.com
Tue Feb 26 07:39:31 CET 2013


Aditya, thank you for your kind response. I fear I did not completely
understand it, being Lua-illiterate.

My problem (this is mostly contextual information):
1. I have a METAPOST program of modest complexity that runs fine with
   regular mpost version 1.504 (from TeXLive 2012).
2. I would like to use ConTeXt to generate both my figures and my
   document. (Two reasons: I'd prefer a single source file and I would
   like to be able to use OpenType fonts in my labels.)
3. When run within ConTeXt, my document fails to generate the correct
   figure.  I suspect this is because of the "extrapass" mechanism,
   but it is difficult to tell for sure without being able to see the
   METAPOST logging.
4. When running with TeXLive 2012's ConTeXt, "loggingall;" didn't
   work.
5. I installed stand-alone ConTeXt which improved some things, but
   generated only blank figures when "loggingall;" or "tracingall;
   tracingonline:=0;" was added to the METAPOST.  If
   "tracingonline:=1;" is added, then the figures contain the
   appropriate graphics. Most importantly, the log files and the
   screen show all the METAPOST info I need.

BOTTOM LINE (i.e., the problem I currently face):
When "tracingonline:=1;", the program runs unbearable slower! A run
that takes 20 seconds in stand-alone METAPOST takes more than AN HOUR
in ConTeXt. I believe much of this is related to I/O and occurs even
when the STDOUT is redirected to /dev/null (CygWin) or NUL: (Windows
CMD equivalent).

Does anyone know of a way to:
1. make ConTeXt/MPLIB *not* generate blank figures when "loggingall;"
   is used; AND/OR
2. make "tracingall;" not take *forever*?


-----Original Message-----
From: Aditya Mahajan [mailto:adityam at umich.edu] 
Sent: Wednesday, February 20, 2013 4:47 AM
To: Colin Fraizer
Cc: MetaPost List
Subject: Re: [metapost] Question: [MPLib, MetaFun, ConTeXt, LuaTeX] metapost
logging and message primitive?

On Mon, 18 Feb 2013, Colin Fraizer wrote:

> I have a METAPOST program that works fine with mpost, but fails when I 
> try to run it inline in ConTeXt. In order to debug it, I would like to 
> see the usual METAPOST logging and/or to use the METAPOST "message"
primitive.
>
> However, whenever I add "loggingall;" or a message statement to my 
> ConTeXt file, I encounter errors like this
>
> %------
> metapost        > initializing instance 'metafun' using format 'metafun'
> metapost        > loading 'metafun':
> D:/texlive/2012/texmf-dist/metapost/context/base/metafun.mpiv
> ! terminal:
> %-------

You can get rid of the error message by setting

\disabledirectives[mplib.texerrors]

but that results in an equally useless:

~~~~
metapost        > terminal:

metapost        > error: unknown, no error, terminal or log messages
~~~

The logic in metapost.reporterror(...) function in mlib-run.lua is a bit
weird. It assumes that metapost.texerrors is always set to false!

> What is the appropriate way to debug problems with inline METAPOST 
> code in ConTeXt?

I think that it is better to redefine metapost.reporterror as follows:

\startluacode

local report_metapost = logs.reporter("metapost") local texerrormessage =
logs.texerrormessage

-- metapost.showlog = true

function metapost.reporterror(result)
     if not result then
         report_metapost("error: no result object returned")
     elseif result.status > 0 then
         local t, e, l = result.term, result.error, result.log
         if t and t ~= "" and metapost.showlog then
             report_metapost("terminal: %s",t)
         end
         if e then
             (metapost.texerrors and texerrormessage or
report_metapost)("error: %s",(e=="" and "?") or e)
         elseif l then
             if metapost.showlog then
                 metapost.lastlog = metapost.lastlog .. "\n" .. l
                 report_metapost("log: %s",l)
             end
         else
             report_metapost("error: unknown, no error, terminal or log
messages")
         end
     else
         return false
     end
     return true
end
\stopluacode


That way, when you enable metapost.showlog and set loggingall at the
metapost end, the logging messages will be shown on the terminal as well in
the log file.

Aditya



More information about the metapost mailing list