summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/metapost
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/metapost')
-rw-r--r--Master/texmf-dist/metapost/automata/automata.mp157
1 files changed, 122 insertions, 35 deletions
diff --git a/Master/texmf-dist/metapost/automata/automata.mp b/Master/texmf-dist/metapost/automata/automata.mp
index 35ed9e6ae73..f3e1e24c4e6 100644
--- a/Master/texmf-dist/metapost/automata/automata.mp
+++ b/Master/texmf-dist/metapost/automata/automata.mp
@@ -1,5 +1,4 @@
% PACKAGE FOR METAPOST TO DRAW FINITE STATE MACHINES, GRAPHS, TREES, ETC.
-% Version 0.2
% Author: gabriele puppis
% declares a grid of equally-spaced nodes
@@ -104,8 +103,8 @@ enddef;
%
% syntax: movepos.<name>(x,y);
%
-% example: movepos.a(100,100);
-% movepos.b[0][0](100,100);
+% example: movepos.a(10,10);
+% movepos.b[0][0](10,10);
vardef movepos@# expr p =
@#.c := @#.c shifted p;
@#.h := @#.h shifted p;
@@ -121,13 +120,13 @@ enddef;
% parameters: size = 7 | ...
% nodemargin = 1.5 | ...
% shape = circle | utriangle | ltriangle | btriangle | rtriangle |
-% box | fixedbox | rbox | rfixedbox | none
+% boxed | fixedbox | roundbox | roundfixedbox | diamond | none
% boxmargin = 5 | ...
-% fixedboxwidth = 7 | ...
-% fixedboxheight = 7 | ...
+% fixedboxwidth = 14 | ...
+% fixedboxheight = 14 | ...
% border = solid | bold | dash | double | none
% bordercolor = black | white | ...
-% filling = none | solid | left | right
+% filling = none | solid | lefthalf | righthalf
% fillingcolor = black | white | ...
% nodelabel = yes | no
% nodelabelcolor = black | white | ...
@@ -171,7 +170,7 @@ vardef node@#(expr l) =
@#.h := @#.c shifted (0.5xpart(@#.s),0);
fs := (size,size);
fm := 4solidsize;
- elseif (shape=box):
+ elseif (shape=boxed):
@#.s := urcorner pic - llcorner pic + (boxmargin,boxmargin);
@#.f := squarepath;
@#.h := @#.c;
@@ -183,18 +182,24 @@ vardef node@#(expr l) =
@#.h := @#.c;
fs := @#.s;
fm := 0;
- elseif (shape=rbox):
+ elseif (shape=roundbox):
@#.s := urcorner pic - llcorner pic;
@#.f := rrectangle(xpart(@#.s),ypart(@#.s));
@#.h := @#.c;
fs := @#.s;
fm := 0;
- elseif (shape=rfixedbox):
+ elseif (shape=roundfixedbox):
@#.s := (fixedboxwidth,fixedboxheight);
@#.f := rrectangle(xpart(@#.s),ypart(@#.s));
@#.h := @#.c;
fs := @#.s;
fm := 0;
+ elseif (shape=diamond):
+ @#.s := (size,size);
+ @#.f := diamondpath;
+ @#.h := @#.c;
+ fs := (size,size);
+ fm := 0;
elseif (shape=none):
@#.s := (0,0);
@#.f := (0,0)..(0,0);
@@ -216,7 +221,7 @@ vardef node@#(expr l) =
fill @#.f xscaled xpart(fs) yscaled ypart(fs)
shifted @#.c withcolor fillingcolor;
fi
- elseif (filling=left):
+ elseif (filling=lefthalf):
if (border=double):
fill buildcycle(@#.f,(0,-1)--(0,1))
xscaled (xpart(fs)-2doublesize) yscaled (ypart(fs)-2doublesize)
@@ -226,7 +231,7 @@ vardef node@#(expr l) =
xscaled xpart(fs) yscaled ypart(fs)
shifted @#.c withcolor fillingcolor;
fi
- elseif (filling=right):
+ elseif (filling=righthalf):
if (border=double):
fill buildcycle(@#.f,(0,-1)--(0,1)) rotated 180
xscaled (xpart(fs)-2doublesize) yscaled (ypart(fs)-2doublesize)
@@ -282,10 +287,11 @@ enddef;
%
% example: arrow.top(0.5, btex $a$ etex)(a[0][0],a[0][1]) a[0][0].c{dir90}..a[0][1].c;
%
-% parameters: style = solid | bold | dash | bolddash
+% parameters: style = solid | bold | dash | bolddash | invisible
% arrowcolor = black | white | ...
% arrowlabel = yes | no
% unfillonarrowlabel = yes | no
+% unfillcolor = white | black | ...
% arrowlabelcolor = black | white | ...
% tipangle = 25 | ...;
% tipsharpness = 10 | ...;
@@ -335,6 +341,7 @@ vardef arrow@#(expr o,l)(suffix a,b) expr p =
elseif (style=bolddash):
draw cutp withpen pencircle scaled boldsize dashed evenly scaled dashsize withcolor arrowcolor;
draw tip withpen pencircle scaled boldsize withcolor arrowcolor;
+ elseif (style=invisible):
else:
errmessage("Arrow style not defined");
fi
@@ -344,7 +351,7 @@ vardef arrow@#(expr o,l)(suffix a,b) expr p =
picture lab;
lab := thelabel.@#(l, point o*length(cutp) of cutp);
if (unfillonarrowlabel=yes):
- unfill (bbox lab);
+ fill (bbox lab) withcolor unfillcolor;
fi
draw lab withcolor arrowlabelcolor;
%label.@#(l, point o*length(cutp) of cutp) withcolor arrowlabelcolor;
@@ -363,8 +370,8 @@ enddef;
% example: loop.top(0.5, btex $a$ etex)(a[0][0]) 90;
%
% parameters: loopsize = 15 | ...
-% looporientation = counterclockwise | clockwise
-% style = solid | bold | dash | bolddash
+% looporientation = counterclockwiseorientation | clockwiseorientation
+% style = solid | bold | dash | bolddash | invisible
% arrowcolor = black | white | ...
% arrowlabel = yes | no
% tipangle = 25 | ...;
@@ -376,9 +383,9 @@ enddef;
vardef loop@#(expr o,l)(suffix a) expr d =
save p;
path p;
- if (looporientation=clockwise):
+ if (looporientation=clockwiseorientation):
p := (-0.5*loopsize,0)..(0,0.5*loopsize)..(0.5*loopsize,0)..(0,-0.5*loopsize)..cycle;
- elseif (looporientation=counterclockwise):
+ elseif (looporientation=counterclockwiseorientation):
p := (-0.5*loopsize,0)..(0,-0.5*loopsize)..(0.5*loopsize,0)..(0,0.5*loopsize)..cycle;
else:
errmessage("Loop orientation not defined");
@@ -445,44 +452,82 @@ vardef outgoing@#(expr o,l)(suffix a) expr d =
enddef;
+% this function can be used to enclose a sequence of points inside a bounding area
+%
+% syntax: enclose <path>;
+% where <path> is a closed path, whose points are listed in clockwise order
+%
+% example: enclose a[0][0].c--a[0][1].c--a[1][1].c--cycle;
+%
+% parameters: style = solid | bold | dash | bolddash
+% enclosurecolor = black | white | ...
+% enclosuremargin = 5 | ...
+% solidsize = 0.9 | ...
+% boldsize = 1.5 | ...
+% dashsize = 0.75 | ...
+vardef enclose expr p =
+ if (style=solid):
+ draw enclosure(p) withpen pencircle scaled solidsize withcolor enclosurecolor;
+ elseif (style=bold):
+ draw enclosure(p) withpen pencircle scaled boldsize withcolor enclosurecolor;
+ elseif (style=dash):
+ draw enclosure(p) withpen pencircle scaled solidsize dashed evenly scaled dashsize withcolor enclosurecolor;
+ elseif (style=bolddash):
+ draw enclosure(p) withpen pencircle scaled boldsize dashed evenly scaled dashsize withcolor enclosurecolor;
+ else:
+ errmessage("Arrow style not defined");
+ fi
+enddef;
+
+
% shorthand macros
def node_circle = with shape(circle) node enddef;
def node_utriangle = with shape(utriangle) node enddef;
def node_ltriangle = with shape(ltriangle) node enddef;
def node_dtriangle = with shape(dtriangle) node enddef;
def node_rtriangle = with shape(rtriangle) node enddef;
+def node_diamond = with shape(diamond) node enddef;
def node_unfilled = with filling(none) node enddef;
def node_filled = with filling(solid) node enddef;
-def node_filledleft = with filling(left) node enddef;
-def node_filledright = with filling(right) node enddef;
+def node_filledleft = with filling(lefthalf) node enddef;
+def node_filledright = with filling(righthalf) node enddef;
def node_solid = with border(solid) node enddef;
def node_bold = with border(bold) node enddef;
def node_dash = with border(dash) node enddef;
def node_double = with border(double) node enddef;
def node_hidden = with border(none) node enddef;
-def node_box = with shape(box) node enddef;
+def node_boxed = with shape(boxed) node enddef;
def node_fixed = with shape(fixedbox) node enddef;
-def node_rbox = with shape(rbox) node enddef;
-def node_rfixed = with shape(rfixedbox) node enddef;
+def node_roundbox = with shape(roundbox) node enddef;
+def node_roundfixed = with shape(roundfixedbox) node enddef;
def node_marker = with shape(none) node enddef;
def arrow_solid = with style(solid) arrow enddef;
def arrow_bold = with style(bold) arrow enddef;
def arrow_dash = with style(dash) arrow enddef;
def arrow_bolddash = with style(bolddash) arrow enddef;
+def arrow_invisible = with style(invisible) arrow enddef;
def loop_solid = with style(solid) loop enddef;
def loop_bold = with style(bold) loop enddef;
def loop_dash = with style(dash) loop enddef;
def loop_bolddash = with style(bolddash) loop enddef;
-def loop_cw = with looporientation(clockwise) loop enddef;
-def loop_ccw = with looporientation(counterclockwise) loop enddef;
+def loop_invisible = with style(invisible) loop enddef;
+def loop_cw = with looporientation(clockwiseorientation) loop enddef;
+def loop_ccw = with looporientation(counterclockwiseorientation) loop enddef;
def incoming_solid = with style(solid) incoming enddef;
def incoming_bold = with style(bold) incoming enddef;
def incoming_dash = with style(dash) incoming enddef;
def incoming_bolddash = with style(bolddash) incoming enddef;
+def incoming_invisible = with style(invisible) incoming enddef;
def outgoing_solid = with style(solid) outgoing enddef;
def outgoing_bold = with style(bold) outgoing enddef;
def outgoing_dash = with style(dash) outgoing enddef;
def outgoing_bolddash = with style(bolddash) outgoing enddef;
+def outgoing_invisible = with style(invisible) outgoing enddef;
+def enclose_solid = with style(solid) enclose enddef;
+def enclose_bold = with style(bold) enclose enddef;
+def enclose_dash = with style(dash) enclose enddef;
+def enclose_bolddash = with style(bolddash) enclose enddef;
+def enclose_thin = with style(dash) dashsize(0.5) enclose enddef;
% e.g. with fillingcolor(black) node ...
vardef with@#(expr v) text e = push.@#; @# := v; e; pop.@# enddef;
% e.g. light.gray, light.light.gray, ...
@@ -502,9 +547,34 @@ def ltrianglepath = (trianglepath rotated 90) enddef;
def btrianglepath = (trianglepath rotated 180) enddef;
def rtrianglepath = (trianglepath rotated 270) enddef;
def squarepath = ((0.5,-0.5)--(-0.5,-0.5)--(-0.5,0.5)--(0.5,0.5)--cycle) enddef;
+def diamondpath = ((0.5,0)--(0,0.5)--(-0.5,0)--(0,-0.5)--cycle) enddef;
+def urdiamondpath = ((0,0.5)--(0.5,0)--(0,0)--cycle) enddef;
+def uldiamondpath = ((-0.5,0)--(0,0.5)--(0,0)--cycle) enddef;
+def lrdiamondpath = ((0.5,0)--(0,-0.5)--(0,0)--cycle) enddef;
+def lldiamondpath = ((0,0)--(0,-0.5)--(-0.5,0)--cycle) enddef;
vardef rrectangle(expr w,h) = (((0.5w-0.25h,-0.5h)---(-0.5w+0.25h,-0.5h)..
(-0.5w+0.25h,0.5h)---(0.5w-0.25h,0.5h)..cycle)
xscaled (1/w) yscaled (1/h)) enddef;
+vardef sqr(expr x) = ((x)*(x)) enddef;
+vardef firstenclosurepoint(expr p,q) = ((ypart(p)-ypart(q)) * sqrt(sqr(enclosuremargin) / (sqr(xpart(p)-xpart(q)) + sqr(ypart(p)-ypart(q)))) + xpart(p),
+ (xpart(q)-xpart(p)) * sqrt(sqr(enclosuremargin) / (sqr(xpart(p)-xpart(q)) + sqr(ypart(p)-ypart(q)))) + ypart(p)) enddef;
+vardef secondenclosurepoint(expr p,q) = ((ypart(p)-ypart(q)) * sqrt(sqr(enclosuremargin) / (sqr(xpart(p)-xpart(q)) + sqr(ypart(p)-ypart(q)))) + xpart(q),
+ (xpart(q)-xpart(p)) * sqrt(sqr(enclosuremargin) / (sqr(xpart(p)-xpart(q)) + sqr(ypart(p)-ypart(q)))) + ypart(q)) enddef; vardef enclosuresegment(expr p,q) = firstenclosurepoint(p,q)---secondenclosurepoint(p,q) enddef;
+vardef enclosure(expr p) =
+ save enc;
+ save i;
+ path enc;
+ if (pair p):
+ enc := circlepath scaled (2*enclosuremargin) shifted point 1 of p;
+ else:
+ enc := enclosuresegment(point 0 of p, point 1 of p);
+ for i=1 upto length(p)-1:
+ enc := enc..enclosuresegment(point i of p, point i+1 of p);
+ endfor;
+ enc := enc..cycle;
+ fi
+ enc
+enddef;
% general appearence constants and variables
@@ -516,19 +586,21 @@ def utriangle = 11 enddef;
def ltriangle = 12 enddef;
def btriangle = 13 enddef;
def rtriangle = 14 enddef;
-def box = 15 enddef;
+def boxed = 15 enddef;
def fixedbox = 16 enddef;
-def rbox = 17 enddef;
-def rfixedbox = 18 enddef;
+def roundbox = 17 enddef;
+def roundfixedbox = 18 enddef;
+def diamond = 19 enddef;
def solid = 20 enddef;
-def left = 21 enddef;
-def right = 22 enddef;
+def lefthalf = 21 enddef;
+def righthalf = 22 enddef;
def bold = 30 enddef;
def dash = 31 enddef;
def bolddash = 32 enddef;
def double = 33 enddef;
-def clockwise = 40 enddef;
-def counterclockwise = 41 enddef;
+def invisible = 34 enddef;
+def clockwiseorientation = 40 enddef;
+def counterclockwiseorientation = 41 enddef;
pair spacing;
pair offset;
@@ -557,11 +629,14 @@ numeric dashsize;
numeric doublesize;
numeric nodemargin;
numeric arrowmargin;
+numeric enclosuremargin;
color bordercolor;
color fillingcolor;
color nodelabelcolor;
color arrowcolor;
color arrowlabelcolor;
+color unfillcolor;
+color enclosurecolor;
spacing = (60,30);
offset = (0,0);
@@ -569,19 +644,20 @@ numbering = (0,0);
size := 5;
shape := circle;
boxmargin := 5;
-fixedboxwidth := 7;
-fixedboxheight := 7;
+fixedboxwidth := 14;
+fixedboxheight := 14;
border := solid;
filling := none;
style := solid;
nodelabel := yes;
arrowlabel := yes;
unfillonarrowlabel := no;
+unfillcolor := white;
tipangle := 20;
tipsharpness := 15;
tipsize := 4;
loopsize := 14;
-looporientation := counterclockwise;
+looporientation := counterclockwiseorientation;
incominglength := 20;
outgoinglength := 20;
solidsize := 0.7;
@@ -590,11 +666,13 @@ dashsize := 0.7;
doublesize := 1.3;
nodemargin := 1.5;
arrowmargin := 3.8;
+enclosuremargin := 5;
bordercolor = black;
fillingcolor = black;
nodelabelcolor = black;
arrowcolor = black;
arrowlabelcolor = black;
+enclosurecolor = gray;
linecap := butt;
linejoin := mitered;
@@ -627,11 +705,14 @@ numeric dashsize.back[];
numeric doublesize.back[];
numeric nodemargin.back[];
numeric arrowmargin.back[];
+numeric enclosuremargin.back[];
color bordercolor.back[];
color fillingcolor.back[];
color nodelabelcolor.back[];
color arrowcolor.back[];
color arrowlabelcolor.back[];
+color unfillcolor.back[];
+color enclosurecolor.back[];
numeric spacing.count;
numeric offset.count;
@@ -647,6 +728,7 @@ numeric style.count;
numeric nodelabel.count;
numeric arrowlabel.count;
numeric unfillonarrowlabel.count;
+numeric unfillcolor.count;
numeric tipangle.count;
numeric tipsharpness.count;
numeric tipsize.count;
@@ -660,11 +742,13 @@ numeric dashsize.count;
numeric doublesize.count;
numeric nodemargin.count;
numeric arrowmargin.count;
+numeric enclosuremargin.count;
numeric bordercolor.count;
numeric fillingcolor.count;
numeric nodelabelcolor.count;
numeric arrowcolor.count;
numeric arrowlabelcolor.count;
+numeric enclosurecolor.count;
spacing.count := 0;
offset.count := 0;
@@ -680,6 +764,7 @@ style.count := 0;
nodelabel.count := 0;
arrowlabel.count := 0;
unfillonarrowlabel.count := 0;
+unfillcolor.count := 0;
tipangle.count := 0;
tipsharpness.count := 0;
tipsize.count := 0;
@@ -693,8 +778,10 @@ dashsize.count := 0;
doublesize.count := 0;
nodemargin.count := 0;
arrowmargin.count := 0;
+enclosuremargin.count := 0;
bordercolor.count := 0;
fillingcolor.count := 0;
nodelabelcolor.count := 0;
arrowcolor.count := 0;
arrowlabelcolor.count := 0;
+enclosurecolor.count := 0;