> (I would love to understand why arclength / width gives eg. 5, but it > will actually have enough space for 5 dots and 5 gaps, which should be > 10 times the width, not 5. Is arclength half the actual length?)
Because "PenA scaled" is a multiplication factor, not an actual size. And pen sizes change with the scale/basescale, so my formula worked only by chance at the specific scale I was using. Oops. This code should work correctly, by measuring the pen: def l_u_route (expr P)= begingroup; save scale, multiplier, linewidth, dotwidth, len, steps, dotgap; T:=identity; multiplier:=5; linewidth:=((xpart (lrcorner PenA)) - (xpart (llcorner PenA))) * multiplier; % If you make the dotwidth too small, MetaPost cannot perform the % dashpattern calculations, and it gets the spacing wrong % minimum limit is 0.0002 dotwidth:=0.001; len:=arclength P; % each dot needs space for the dot, and a gap at each end half % as wide as the dot, so a total space of twice the line width % short lines still need a dot steps:=max(round(len / (2 * linewidth)), 1); % the total amount of gap (with the wasted space for the dot % removed) which will be split into a before half and after half dotgap:=(len / steps) - dotwidth; pickup PenA scaled multiplier; thdraw P dashed dashpattern(off dotgap/2 on dotwidth off dotgap/2) withcolor (0.9,0,1); endgroup; enddef; initsymbol("l_u_route"); This uses the same basic approach as adjust_step, but uses rounding and will always return at least 1 step, while adjust_step uses flooring and will return at least 2 steps. It could be made to use adjust_step, and risk overlaps for very short lines: dotgap:=adjust_step(len, 2 * linewidth) - dotwidth; _______________________________________________ Therion mailing list Therion@speleo.sk https://mailman.speleo.sk/listinfo/therion