prologues := 2; defaultfont:="Helvetica"; input boxes; pen blockpen; blockpen = pencircle scaled 2pt; def block(suffix s)(expr str) = boxit.s(str infont defaultfont); enddef; vardef drawblock(suffix s) = save currentpen; pen currentpen; currentpen := blockpen; drawboxed(s); enddef; % % Pointer: suffix.ptr = the pointing slot % vardef pointer(suffix s)(expr name, timestamp) = save np,tsp,whole; boxjoin(a.sw=b.nw; a.se=b.ne); boxit.s.nam(name infont defaultfont); boxit.s.tim(timestamp infont defaultfont); boxit.s.ptr(); boxjoin(); boxit.s(); s.nw=s.nam.nw; s.ne=s.nam.ne; s.sw=s.ptr.sw; s.se=s.ptr.se; s.ptr.nw - s.ptr.sw = s.tim.nw - s.tim.sw; % picture np,tsp,whole; % np := name infont defaultfont; % tsp := timestamp infont defaultfont; % whole := np; % addto whole also tsp shifted (-1.5*(ulcorner np)); % boxit.s(whole); enddef; def boxwidth(suffix s) = (xpart(s.e-s.w))-2*s.dx enddef; vardef drawpointer(suffix s) = % Must fix size of wider box first if boxwidth(s.tim) > boxwidth(s.nam): drawboxed(s.tim,s.nam,s.ptr); else: drawboxed(s.nam,s.tim,s.ptr); fi; save currentpen; pen currentpen; currentpen := blockpen; drawboxed(s); enddef; beginfig(1); block(a0, "V0"); block(a1, "V1"); pointer(p0, "Slashdot", "3/Dec/2004"); pointer(p1, "Slashdot", "4/Dec/2004"); a0.c = (50,50); a1.c = (100,0); p0.c = (0,50); p1.c = (0,0); drawblock(a0); drawblock(a1); drawpointer(p0); drawpointer(p1); drawarrow p0.ptr.c{right}..a0.s; drawarrow p1.ptr.c{right}..a1.s; endfig; end