[metapost] Recent bug report

Boguslaw Jackowski B_Jackowski at GUST.org.pl
Mon Sep 1 12:17:02 CEST 2008


Dan Luecking:
> I did not report that grid.mp fails; I reported that the
> "bug occurs". Naturally I used a test file trimmed down to
> only one relevant command:
> % test.mp
> beginfig(0);
>    drawarrow (0,0)--(50,50)
>      if 2=2: withcolor red elseif 3=2: withcolor blue fi;
> endfig;
> end
> % end of test.mp
> All 4 versions mentioned above (on windows XP, if that matters)
> produced the error message: "! Extra elseif".

I could not believe that it is an MP bug... Just in case I tested
the archaic version 0.641 -- with the same result. Ufff... ;-)

The problem is in the definition of drawarrow (thanks to Piotr
Strzelczyk for the suggestion):

   path _apth;
   def drawarrow expr p = _apth:=p; _finarr enddef;

   def _finarr text t =
     draw _apth t;
     filldraw arrowhead _apth  t

Namely, `drawarrow' swallows the longest text that could/might represent 
an expression. In our case, it is `(0,0)--(50,50) if 2=2:'; the keyword
`withcolor' ends the paths expression. Therefore, the text parameter of
`_finarr' reads `withcolor red elseif 3=2: withcolor blue fi' which for
obvious reason is bound to cause issuing the error message
"! Extra elseif".

Note that the following alteration works:

% test.mp
    drawarrow (0,0)--(50,50) withcolor if 2=2: red elseif 3=2: blue fi;
% end of test.mp

I cannot see another method for finishing explicitly the path expression 
in this case.

Cheers -- Jacko

  Bogus\l{}aw Jackowski: B_Jackowski at GUST.ORG.PL
  Hofstadter's Law: It always takes longer than you expect, even
                    when you take into account Hofstadter's Law.

More information about the metapost mailing list