[Therion] metapost map-connection

Yann Gardère gardere.yann at gmail.com
Fri Oct 10 17:13:40 CEST 2025


Hi Tarquin and Bruce

Thanks a lot for your answer, it work great

Finaly i use this, for a dashed line with circle at 0 and infinity point
(not try arrows)

def l_mapconnection_REDESSINE (expr P) =
T:=identity;
  pickup pencircle scaled 2;
  thdraw P dashed evenly scaled optical_zoom withcolor (0.4, 0.4, 0.4);
  thdraw point infinity of P withpen pencircle scaled 0.4u;
  thdraw point 0 of P withpen pencircle scaled 0.4u;
enddef;
initsymbol("l_mapconnection_REDESSINE");
symbol-assign line map-connection REDESSINE

[image: 3.png]

Le jeu. 9 oct. 2025 à 20:36, <bruce at tomo.co.nz> a écrit :

> - Is it possible to modifiy in metapost the line which is dessined into 2
> *points* map-connection ?:
>
>
>
> I took what maybe a simpler approach to that Tarquin describes, minimally
> altering the default metapost, but adding a clear start and end point to
> the map-connection line.
>
> What I discovered when attempting this was that arrow heads are intimately
> connected, in the default metapost, to map-connection lines.
>
> The example below is complicated by a change we made to refine the
> alignment of arrow heads when the incoming line is curved.
>
> If you want I could dig out the code prior to the arrow head change, but
> you can probably extract that from your own installation.
>
>
>
> Bruce
>
>
>
> #ARROW and MAP-CONNECTION REDEFINITIONS
>
> #--------------------------
>
> #Edited Bruce Mutton Apr2018 Redefinition of map-connection line and arrow
> heads
>
> code metapost
>
> % Q = 0 -- none (no arrows)
>
> %     1 -- end  (default)
>
> %     2 -- begin
>
> %     3 -- both
>
> def l_arrow (expr P, Q) =
>
> % Arrow heads rotated so that line path intersects middle of back of
> arrowhead.  Johnny Willis 3Jun2023
>
>   T:=identity;
>
>   pickup PenC;
>
>   path Pcircle_s, Pcircle_e, ah_start, ah_end, p, P_mod, errcheck;
>
>   pair sp, ep, int_start, int_end;
>
>   numeric alength, c_diam;
>
>
>
> ep = point 0 of P;
>
> sp = point infinity of P;
>
> alength = 0.5u;
>
> c_diam = 2*alength;
>
> Pcircle_s = fullcircle scaled c_diam shifted sp;
>
> Pcircle_e = fullcircle scaled c_diam shifted ep;
>
>
>
> p := (-0.1u,-alength)--(-0,0)--(.1u,-alength)--cycle;
>
>
>
> errcheck = (ep) -- (sp);
>
>
>
> if arclength(errcheck) < alength: %if end points P shorter than arrow
> head, don't trim P
>
> int_end   = ep;
>
> int_start = sp;
>
> ah_end   = (sp) -- (ep);
>
> ah_start = (ep) -- (sp);
>
>
>
> else: %set up for trimming P at back of arrowheads
>
>
>
> int_end   = Pcircle_e intersectionpoint P;
>
> int_start = Pcircle_s intersectionpoint P;
>
> ah_end   = (int_end) -- (ep);
>
> ah_start = (int_start) -- (sp);
>
>
>
> fi;
>
>
>
> if Q = 0: % -head none
>
> P_mod = P;
>
> fi;
>
>
>
> if Q = 1: %arrow at end of line -head end
>
> draw p rotated (angle(thdir(ah_end,0))-90) shifted (point 0 of P);
>
> fill p rotated (angle(thdir(ah_end,0))-90) shifted (point 0 of P);
>
>  P_mod = P cutbefore int_end;
>
> fi;
>
>
>
> if Q = 2: %arrow at start of line -head begin
>
> draw p rotated (angle(thdir(ah_start,0))-90) shifted (point infinity of P);
>
> fill p rotated (angle(thdir(ah_start,0))-90) shifted (point infinity of P);
>
>  P_mod = P cutafter int_start;
>
> fi;
>
> if Q = 3: %arrow at both ends of line -head both
>
> draw p rotated (angle(thdir(ah_start,0))-90) shifted (point infinity of P);
>
> fill p rotated (angle(thdir(ah_start,0))-90) shifted (point infinity of P);
>
> draw p rotated (angle(thdir(ah_end,0))-90) shifted (point 0 of P);
>
> fill p rotated (angle(thdir(ah_end,0))-90) shifted (point 0 of P);
>
>  P_mod = (P cutbefore int_end) cutafter int_start;
>
> fi;
>
>  thdraw P_mod;
>
> enddef;
>
>
>
> def l_mapconnection (expr P) =
>
>   thdrawoptions(dashed dashpattern(on 1bp off 2bp on 1bp off 2bp)
>
>                 scaled (2 * optical_zoom) withpen PenA);
>
>
>
>   %draw map-connection line with arrowhead at end
>
>   l_arrow(P,1); %How to double or triple arrowhead size with this call?
>
>
>
>   %draw dot at start of map-connection line
>
>   thdraw point infinity of P withpen pencircle scaled 0.3u;
>
>   %Why infinity and not 0 for start??
>
>   %If point before arrow head, then point does not render in legend but
> does on map??
>
>
>
>   thdrawoptions();
>
> enddef;
>
> endcode
>
>
>
> # and if necessary in some other layout…
>
> symbol-colour line map-connection [54 7 60] #purple
>
> symbol-show line map-connection
>
>
>
> #And then in th-config but outside of a layout…
>
> text en "line map-connection"    "passage offset connection"
>
>
>
> #END
>
>
>
>
> _______________________________________________
> Therion mailing list
> Therion at speleo.sk
> https://mailman.speleo.sk/listinfo/therion
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.speleo.sk/pipermail/therion/attachments/20251010/730c433f/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: image001.png
Type: image/png
Size: 96489 bytes
Desc: not available
URL: <http://mailman.speleo.sk/pipermail/therion/attachments/20251010/730c433f/attachment-0002.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 3.png
Type: image/png
Size: 56615 bytes
Desc: not available
URL: <http://mailman.speleo.sk/pipermail/therion/attachments/20251010/730c433f/attachment-0003.png>


More information about the Therion mailing list