> On 3 May 2020, at 15:01, Gerben Wierda <gerben.wie...@rna.nl> wrote: > >>>>> Am 01.05.2020 um 10:26 schrieb Gerben Wierda <gerben.wie...@rna.nl >>>>> <mailto:gerben.wie...@rna.nl>>: >>>>> >>>>> I have been looking at lmt_followtext and followtext to get typesetting >>>>> done along a path. That works fine, except that in my case, I need the >>>>> text to not be exactly on that path, I need it to hover slightly above >>>>> tor below he path. Given that the path may have an unpredictable form, >>>>> that means that all the glyphs need to be shifted a bit, there is no >>>>> generic transfrom of the entire text string that will work, >>>> >>>> Can’t you duplicate and shift the path, i.e. keep the original visible and >>>> make the copy that carries the text invisible? That’s what I would do in a >>>> graphical application, but I would be surprised if MP wouldn’t know a >>>> transformation for this purpose. >>> >>> No, that is what I did in the example, fiddling, but there is no >>> transformation that will work in all cases. E.g. on the left side of the >>> bump, I need to go to the upper left, on the right side to the upper right. >>> There is no single shift that helps me. Nor a scale rotation or shift >>> combination. That could be managed by only going up (though the distance to >>> the path would vary, on the sides the text would be very close or on the >>> top it would be too far.) >>> >> >> There is an example, at the link below, of creating a parallel path that >> claims to cope with sharp bends in the original path. You might be able to >> adapt it? >> <https://therion.speleo.sk/wiki/metapost#shuttering_two_parallel_lines >> <https://therion.speleo.sk/wiki/metapost#shuttering_two_parallel_lines>> > > That looks great. I’m going to investigate.
That approach works fine. Example trial code: \starttext \startMPpage vardef parallelpath (expr P, gap)= % adapted from https://therion.speleo.sk/wiki/metapost#shuttering_two_parallel_lines save pathlength, linegap, testdiameter, testpath, innerpath, newpoint, curlength, intersections, samplepoint, sampledir, accuracy; % work out a parallel path % the easy way is to sample direction every few units, and add a parallel point into a new path % however, this causes weird loops at sharp corners, so check if a sharp corner is coming up within % the length of the gap between lines, and ignore that point if so pathlength:=arclength P; linegap:=gap; accuracy:=2; testdiameter:=linegap; path testpath; testpath:=(halfcircle rotated 180) scaled testdiameter; pair newpoint; pair sampledir; path innerpath; pair intersections; curlength:=0; forever: samplepoint:=arctime curlength of P; sampledir:=direction samplepoint of P; newpoint:=((point samplepoint of P) shifted (linegap * unitvector(sampledir rotated -90))); if curlength = 0: innerpath:=newpoint{sampledir}; fi % every now and then along the line, place a semicircle, rotated to face away from the line, offset by the thickness of the line, % with a radius the same as the gap between the lines - if its ends touch the main line's centre, the corner is too sharp to use % this point save truetestpath; path truetestpath; truetestpath := (testpath rotated (angle sampledir) shifted (point samplepoint of P)); intersections:=P intersectiontimes truetestpath; % if there are no intersections, intersectiontimes returns (-1,-1), otherwise it returns the distance along each path (P,testpath) % where the intersection happened >=0 if (xpart intersections) = -1: show "ADDED", newpoint{sampledir}; innerpath:=innerpath .. newpoint{sampledir}; else: show "REJECTED", newpoint{sampledir}; draw truetestpath withcolor green withtransparency (1,0.1); fi; exitif curlength = pathlength; % move in small steps, to take account of tight backwards curves, and to get points near a corner curlength:=curlength + testdiameter/accuracy; if curlength > pathlength: curlength:=pathlength; fi; endfor; if known innerpath: if cycle P: innerpath:=innerpath .. cycle; fi; fi; innerpath enddef; path testIn, testOut; testIn := (0,0)..(100,50)..(50,100)..(130,0); testOut := parallelpath( testIn, 2); draw testIn withpen pencircle scaled 1; %draw testOut withpen pencircle scaled 1 withcolor red; draw lmt_followtext [ text = "How well does it work? {\it It works very well!} {\bf It looks good enough.}", path = reverse testOut, spread = false, ]; Going to work with it. Thanks again. G
___________________________________________________________________________________ If your question is of interest to others as well, please add an entry to the Wiki! maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context webpage : http://www.pragma-ade.nl / http://context.aanhet.net archive : https://bitbucket.org/phg/context-mirror/commits/ wiki : http://contextgarden.net ___________________________________________________________________________________