# [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));
(colorfactor)[white,op_i]
elseif color op_ii:
% presume first operand was produced from
% (colorfactor)[white,somecolor], and find that color
if colorfactor = 1:
op_i
else:
(colorfactor)[op_ii,(1/(1-colorfactor))[white,op_i]]
fi
else: % error case or other color models, etc.
fi
enddef;

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.
enddef

Dan

Dan Luecking
Fayetteville, Arkansas

```