[metapost] ANN: colordef package preview

Dan&Jan Luecking luecking at uark.edu
Fri Feb 6 08:48:52 CET 2009

At 04:40 PM 2/5/2009, you wrote:

>Unfortunately, I have no idea how to implement an operator ! that works
>like this:
>   red!80  = .2[red, white]
>   red!80!blue  = .2[red, blue]
>The former case is simple, roughly
>   primarydef col ! tint=
>     min(1,max(0,tint/100))[white, col]
>   enddef;

You could have ! examine its second operand. If it is a
number, save that number somewhere. If it is a color,
assume it is the second ! of a colA!tint!colB and make
use of the previously saved numeric to recover colA.
This assumes that only the two cases are needed.
For example:

newinternal colorfactor;
primarydef op_i ! op_ii =
   if numeric op_ii:
     colorfactor := min(1,max(0,op_ii/100));
   elseif color op_ii:
     % presume first operand was produced from
     % (colorfactor)[white,somecolor], and find that color
     if colorfactor = 1:
   else: % error case or other color models, etc.

N.B. Not tested.

>In the second case, however, there is the problem that from a MetaPost
>point of view ! has two different meanings.
>   primarydef colA ! tint ! colB=
>doesn't seem to work.

It couldn't possibly, as MP doesn't have trinary operators,
or any means to define them.

Personally, I don't like the notation red!80!blue and prefer
a simple vardef with three arguments:
  vardef !(expr clrA, tint, clrB)=
   % etc.


Dan Luecking
Fayetteville, Arkansas 

More information about the metapost mailing list