From bcc5f422cb282c78b890ae719ac1a63eaa5e62aa Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Mon, 7 Jan 2019 13:28:56 +0100 Subject: 2019-01-07 10:16:00 --- metapost/context/base/mpiv/mp-base.mpiv | 92 ++++++++++++++++++--------------- metapost/context/base/mpiv/mp-mlib.mpiv | 34 ++++++------ 2 files changed, 70 insertions(+), 56 deletions(-) (limited to 'metapost') diff --git a/metapost/context/base/mpiv/mp-base.mpiv b/metapost/context/base/mpiv/mp-base.mpiv index 20d747a25..617855473 100644 --- a/metapost/context/base/mpiv/mp-base.mpiv +++ b/metapost/context/base/mpiv/mp-base.mpiv @@ -330,53 +330,18 @@ primarydef w dotprod z = (xpart w * xpart z + ypart w * ypart z) enddef ; -primarydef x**y = - if y = 2 : - x*x - else : - takepower y of x - fi -enddef ; - -def takepower expr y of x = - if x>0 : - mexp(y*mlog x) - elseif (x=0) and (y>0) : - 0 - else : - 1 - if y = floor y : - if y >= 0 : - for n=1 upto y : - *x - endfor - else : - for n=-1 downto y : - /x - endfor - fi - else : - hide(errmessage "Undefined power: " & decimal x & "**" & decimal y) - fi - fi -enddef ; - -% for big number systems: -% % primarydef x**y = -% if y = 1 : -% x -% elseif y = 2 : +% if y = 2 : % x*x -% elseif y = 3 : -% x*x*x % else : % takepower y of x % fi % enddef ; -% -% vardef takepower expr y of x = -% if (x=0) and (y>0) : +% +% def takepower expr y of x = +% if x>0 : +% mexp(y*mlog x) +% elseif (x=0) and (y>0) : % 0 % else : % 1 @@ -396,6 +361,51 @@ enddef ; % fi % enddef ; +% for big number systems: + +primarydef x**y = + if y = 0 : + 1 + elseif x = 0 : + 0 + elseif y < 0 : + 1/(x**-y) + elseif y = 1 : + x + elseif y = 2 : + x*x + elseif y = 3 : + x*x*x + else : + takepower y of x + fi +enddef ; + +def takepower expr y of x = + if y=0 : % isn't x**0 = 1 even if x=0 ? + 1 + elseif x=0 : + 0 + else : + if y = floor y : + 1 + if y >= 0 : + for n=1 upto y : + *x + endfor + else : + for n=-1 downto y : + /x + endfor + fi + elseif x>0 : + mexp(y*mlog x) + else : + -mexp(y*mlog -x) + fi + fi +enddef ; + vardef direction expr t of p = postcontrol t of p - precontrol t of p enddef ; diff --git a/metapost/context/base/mpiv/mp-mlib.mpiv b/metapost/context/base/mpiv/mp-mlib.mpiv index 41ec64cf2..f9f5e3877 100644 --- a/metapost/context/base/mpiv/mp-mlib.mpiv +++ b/metapost/context/base/mpiv/mp-mlib.mpiv @@ -407,15 +407,15 @@ vardef installlabel@# (expr type, x, y, offset) = enddef ; vardef mfun_labshift@#(expr p) = - (labxf@#*lrcorner p + - labyf@#*ulcorner p + - (1-labxf@#-labyf@#)*llcorner p) + (mfun_labxf@#*lrcorner p + + mfun_labyf@#*ulcorner p + + (1-mfun_labxf@#-mfun_labyf@#)*llcorner p) enddef ; vardef mfun_picshift@#(expr p) = - (labxf@#*ulcorner p + - labyf@#*lrcorner p + - (1-labxf@#-labyf@#)*urcorner p) + (mfun_labxf@#*ulcorner p + + mfun_labyf@#*lrcorner p + + (1-mfun_labxf@#-mfun_labyf@#)*urcorner p) enddef ; % we save the plain variant @@ -468,7 +468,7 @@ plain_compatibility_data := plain_compatibility_data & "save label, thelabel ;" % fi % enddef ; -newinternal anchortextexts ; anchortextexts := 1 ; % so we can disable it +newinternal anchortextexts ; anchortextexts := 0 ; % disabled by default vardef thetextext@#(expr p,z) = % interim labeloffset := textextoffset ; @@ -479,7 +479,7 @@ vardef thetextext@#(expr p,z) = elseif pair p : thetextext@#(rawtextext(ddecimal p),z) else : - if anchortextexts = 1 : + if anchortextexts > 0 : image(draw p withprescript "tx_anchor=" & ddecimal z) else : p @@ -502,6 +502,8 @@ enddef ; % formatted text +pair mfun_tt_z ; + if mfun_use_one_pass : vardef rawfmttext(text t) = @@ -526,8 +528,6 @@ if mfun_use_one_pass : else : - pair mfun_tt_z ; - vardef rawfmttext(text t) = % todo: avoid currentpicture mfun_tt_n := mfun_tt_n + 1 ; mfun_tt_c := nullpicture ; @@ -575,9 +575,13 @@ else : fi ; vardef thefmttext@#(text t) = - mfun_tt_z := origin ; + mfun_tt_z := origin ; % initialization save p ; picture p ; p := rawfmttext(t) ; - p + if anchortextexts > 0 : + image(draw p withprescript "tx_anchor=" & ddecimal mfun_tt_z) + else : + p + fi if (mfun_labtype@# >= 10) : shifted (0,ypart center p) fi @@ -633,10 +637,10 @@ vardef theoffset@#(expr z) = enddef; vardef thelabel@#(expr p,z) = - if numeric p : - thelabel@#(decimal p,z) - elseif string p : + if string p : thelabel@#(rawtextext("\definedfont[" & defaultfont & "]" & p) scaled defaultscale,z) + elseif numeric p : + thelabel@#(decimal p,z) elseif pair p : thelabel@#("(" & decimal(xpart p) & "," & decimal(ypart p) & ")",z) else : -- cgit v1.2.3