summaryrefslogtreecommitdiff
path: root/metapost/context/base/mp-form.mp
diff options
context:
space:
mode:
Diffstat (limited to 'metapost/context/base/mp-form.mp')
-rw-r--r--metapost/context/base/mp-form.mp288
1 files changed, 147 insertions, 141 deletions
diff --git a/metapost/context/base/mp-form.mp b/metapost/context/base/mp-form.mp
index bad87651c..a65ab6d73 100644
--- a/metapost/context/base/mp-form.mp
+++ b/metapost/context/base/mp-form.mp
@@ -1,58 +1,58 @@
-% Hans Hagen / October 2000
+% Hans Hagen / October 2000
%
-% This file is mostly a copy from the file format.mp, that
-% comes with MetaPost and is written by John Hobby. This file
-% is meant to be compatible, but has a few more features,
-% controlled by the variables:
+% This file is mostly a copy from the file format.mp, that
+% comes with MetaPost and is written by John Hobby. This file
+% is meant to be compatible, but has a few more features,
+% controlled by the variables:
%
% fmt_initialize when false, initialization is skipped
% fmt_precision the default accuracy (default=3)
% fmt_separator the pattern separator (default=%)
-% fmt_zerocheck activate extra sci notation zero check
+% fmt_zerocheck activate extra sci notation zero check
%
% instead of a picture, one can format a number in a for TeX
% acceptable input string
-boolean mant_font ; mant_font := true ; % signals graph not to load form
+boolean mant_font ; mant_font := true ; % signals graph not to load form
-if known fmt_loaded : expandafter endinput fi ;
+if known fmt_loaded : expandafter endinput fi ;
boolean fmt_loaded ; fmt_loaded := true ;
-if unknown fmt_precision :
- numeric fmt_precision ; fmt_precision := 3 ;
+if unknown fmt_precision :
+ numeric fmt_precision ; fmt_precision := 3 ;
fi ;
-if unknown fmt_initialize :
- boolean fmt_initialize ; fmt_initialize := true ;
-fi ;
+if unknown fmt_initialize :
+ boolean fmt_initialize ; fmt_initialize := true ;
+fi ;
-if unknown fmt_separator :
- string fmt_separator ; fmt_separator := "%" ;
-fi ;
+if unknown fmt_separator :
+ string fmt_separator ; fmt_separator := "%" ;
+fi ;
-if unknown fmt_zerocheck :
- boolean fmt_zerocheck ; fmt_zerocheck := false ;
-fi ;
+if unknown fmt_zerocheck :
+ boolean fmt_zerocheck ; fmt_zerocheck := false ;
+fi ;
-boolean fmt_metapost ; fmt_metapost := true ; % == use old method
+boolean fmt_metapost ; fmt_metapost := true ; % == use old method
-% As said, all clever code is from John, the more stupid
-% extensions are mine. The following string variables are
-% responsible for the TeX formatting.
+% As said, all clever code is from John, the more stupid
+% extensions are mine. The following string variables are
+% responsible for the TeX formatting.
-% TeX specs when using TeX instead of pseudo TeX.
+% TeX specs when using TeX instead of pseudo TeX.
-string sFebraise_ ; sFebraise_ := "{" ;
-string sFeeraise_ ; sFeeraise_ := "}" ;
-string sFebmath_ ; sFebmath_ := "$" ;
-string sFeemath_ ; sFeemath_ := "$" ;
+string sFebraise_ ; sFebraise_ := "{" ;
+string sFeeraise_ ; sFeeraise_ := "}" ;
+string sFebmath_ ; sFebmath_ := "$" ;
+string sFeemath_ ; sFeemath_ := "$" ;
-string sFmneg_ ; sFmneg_ := "-" ;
-string sFemarker_ ; sFemarker_ := "{\times}10^" ;
-string sFeneg_ ; sFeneg_ := "-" ;
-string sFe_plus ; sFe_plus := "" ; % "+"
+string sFmneg_ ; sFmneg_ := "-" ;
+string sFemarker_ ; sFemarker_ := "{\times}10^" ;
+string sFeneg_ ; sFeneg_ := "-" ;
+string sFe_plus ; sFe_plus := "" ; % "+"
-def sFe_base = Fline_up_("1", sFemarker_) enddef ;
+def sFe_base = Fline_up_("1", sFemarker_) enddef ;
% Macros for generating typeset pictures of computed numbers
%
@@ -64,19 +64,19 @@ def sFe_base = Fline_up_("1", sFemarker_) enddef ;
% Fe_plus plus sign if any for typesetting positive exponents
% Ten_to[] powers of ten for indices 0,1,2,3,4
%
-% New are:
+% New are:
%
% formatstr(f,x) TeX string representing x using format f
% Mformatstr(f,x) like Mformatstr, but x is in Mlog form
% Other than the above-documented user interface, all
-% externally visible names start with F and end with _.
+% externally visible names start with F and end with _.
% Allow big numbers in token lists
-begingroup interim warningcheck := 0 ;
+begingroup interim warningcheck := 0 ;
-%%% Load auxiliary macros.
+%%% Load auxiliary macros.
input string
input marith
@@ -87,24 +87,24 @@ picture Fmneg_, Femarker_, Feneg_, Fe_base, Fe_plus ;
string Fmfont_, Fefont_ ;
numeric Fmscale_, Fescale_, Feraise_ ;
-% Argument
+% Argument
%
% s is a leading minus sign
% m is a 1-digit mantissa
-% x is whatever follows the mantissa
-% sn is a leading minus for the exponent, and
-% e is a 1-digit exponent.
-%
+% x is whatever follows the mantissa
+% sn is a leading minus for the exponent, and
+% e is a 1-digit exponent.
+%
% Numbers in scientific notation are constructed by placing
% these pieces side-by-side; decimal numbers use only m
% and/or s. To get exponents with leading plus signs, assign
% to Fe_plus after calling init_numbers. To do something
% special with a unit mantissa followed by x, assign to
-% Fe_base after calling init_numbers.
+% Fe_base after calling init_numbers.
-vardef init_numbers(expr s, m, x, sn, e) =
+vardef init_numbers(expr s, m, x, sn, e) =
Fmneg_ := s ;
- for p within m :
+ for p within m :
Fmfont_ := fontpart p ;
Fmscale_ := xxpart p ;
exitif true ;
@@ -117,34 +117,34 @@ vardef init_numbers(expr s, m, x, sn, e) =
Feraise_ := ypart llcorner p ;
exitif true ;
endfor
- if fmt_metapost :
+ if fmt_metapost :
Fe_base := Fline_up_("1" infont Fmfont_ scaled Fmscale_, Femarker_) ;
- % else :
+ % else :
% sFe_base := Fline_up_("1", sFemarker_) ;
- fi ;
+ fi ;
Fe_plus := nullpicture ;
enddef ;
%%% Low-Level Typesetting %%%
vardef Fmant_(expr x) = %%% adapted by HH %%%
- if fmt_metapost :
+ if fmt_metapost :
(decimal abs x infont Fmfont_ scaled Fmscale_)
- else :
- (decimal abs x)
- fi
+ else :
+ (decimal abs x)
+ fi
enddef ;
vardef Fexp_(expr x) = %%% adapted by HH %%%
- if fmt_metapost :
+ if fmt_metapost :
(decimal x infont Fefont_ scaled Fescale_ shifted (0,Feraise_))
- else :
- (decimal x)
- fi
+ else :
+ (decimal x)
+ fi
enddef ;
vardef Fline_up_(text t_) = %%% adapted by HH %%%
- if fmt_metapost :
+ if fmt_metapost :
save p_, c_ ;
picture p_ ; p_ = nullpicture ;
pair c_ ; c_ = (0,0) ;
@@ -154,63 +154,69 @@ vardef Fline_up_(text t_) = %%% adapted by HH %%%
c_ := (xpart lrcorner p_, 0) ;
endfor
p_
- else :
- "" for q_ = t_ : & q_ endfor
- fi
+ else :
+ "" for q_ = t_ : & q_ endfor
+ fi
enddef ;
vardef Fdec_o_(expr x) = %%% adapted by HH %%%
- if x<0 :
+ if x<0 :
Fline_up_(if fmt_metapost : Fmneg_ else : sFmneg_ fi, Fmant_(x))
- else :
+ else :
Fmant_(x)
fi
enddef ;
vardef Fsci_o_(expr x, e) = %%% adapted by HH %%%
- if fmt_metapost :
+ if fmt_metapost :
Fline_up_
(if x < 0 : Fmneg_,fi
if abs x = 1 : Fe_base else : Fmant_(x), Femarker_ fi,
if e < 0 : Feneg_ else : Fe_plus fi,
- Fexp_(abs e))
- else :
+ Fexp_(abs e))
+ else :
Fline_up_
(if x < 0 : sFmneg_, fi
if abs x = 1 : sFe_base else : Fmant_(x), sFemarker_ fi,
- sFebraise_,
+ sFebraise_,
if e < 0 : sFeneg_ else : sFe_plus fi,
- Fexp_(abs e),
+ Fexp_(abs e),
sFeeraise_)
- fi
+ fi
enddef ;
% Assume prologues=1 implies troff mode. TeX users who want
% prologues on should use some other positive value. The mpx
-% file mechanism requires separate input files here.
+% file mechanism requires separate input files here.
+%
+% if fmt_initialize : %%% adapted by HH
+% if prologues = 1 : input troffnum else : input texnum fi
+% fi ;
+%
+% wrong assumption, so we need:
-if fmt_initialize : %%% adapted by HH
- if prologues = 1 : input troffnum else : input texnum fi
+if fmt_initialize :
+ input texnum ;
fi ;
%%% Scaling and Rounding %%%
% Find a pair p where x = xpart p*10**ypart p and either p =
% (0,0) or xpart p is between 1000 and 9999.99999. This is
-% the `exponent form' of x.
+% the `exponent form' of x.
-vardef Feform_(expr x) =
+vardef Feform_(expr x) =
interim warningcheck := 0 ;
if string x :
Meform(Mlog_str x)
else :
save b, e ;
b = x ; e = 0 ;
- if abs b >= 10000 :
+ if abs b >= 10000 :
(b/10, 1)
- elseif b = 0 :
+ elseif b = 0 :
origin
- else :
+ else :
forever :
exitif abs b >= 1000 ;
b := b*10 ; e := e-1 ;
@@ -223,16 +229,16 @@ enddef ;
% The marith.mp macros include a similar macro Meform that
% converts from `Mlog form' to exponent form. In case
% rounding has made the xpart of an exponent form number too
-% large, fix it.
+% large, fix it.
-vardef Feadj_(expr x, y) =
+vardef Feadj_(expr x, y) =
if abs x >= 10000 : (x/10, y+1) else : (x,y) fi
enddef ;
% Round x to d places right of the decimal point. When d<0,
-% round to the nearest multiple of 10 to the -d.
+% round to the nearest multiple of 10 to the -d.
-vardef roundd(expr x, d) =
+vardef roundd(expr x, d) =
if abs d > 4 :
if d > 0 : x else : 0 fi
elseif d > 0 :
@@ -243,23 +249,23 @@ vardef roundd(expr x, d) =
fi
enddef ;
-Ten_to0 = 1 ;
-Ten_to1 = 10 ;
-Ten_to2 = 100 ;
-Ten_to3 = 1000 ;
+Ten_to0 = 1 ;
+Ten_to1 = 10 ;
+Ten_to2 = 100 ;
+Ten_to3 = 1000 ;
Ten_to4 = 10000 ;
-% Round an exponent form number p to k significant figures.
+% Round an exponent form number p to k significant figures.
-primarydef p Fprec_ k =
- Feadj_(roundd(xpart p,k-4), ypart p)
+primarydef p Fprec_ k =
+ Feadj_(roundd(xpart p,k-4), ypart p)
enddef ;
% Round an exponent form number p to k digits right of the
-% decimal point.
+% decimal point.
-primarydef p Fdigs_ k =
- Feadj_(roundd(xpart p,k+ypart p), ypart p)
+primarydef p Fdigs_ k =
+ Feadj_(roundd(xpart p,k+ypart p), ypart p)
enddef ;
%%% High-Level Routines %%%
@@ -267,30 +273,30 @@ enddef ;
% The following operators convert z from exponent form and
% produce typeset output: Formsci_ generates scientific
% notation; Formdec_ generates decimal notation; and
-% Formgen_ generates whatever is likely to be most compact.
+% Formgen_ generates whatever is likely to be most compact.
vardef Formsci_(expr z) = %%% adapted by HH %%%
- if fmt_zerocheck and (z = origin) :
- Fsci_o_(0,0)
- else :
- Fsci_o_(xpart z/1000, ypart z + 3)
- fi
+ if fmt_zerocheck and (z = origin) :
+ Fsci_o_(0,0)
+ else :
+ Fsci_o_(xpart z/1000, ypart z + 3)
+ fi
enddef ;
-vardef Formdec_(expr z) =
- if ypart z > 0 :
+vardef Formdec_(expr z) =
+ if ypart z > 0 :
Formsci_(z)
else :
Fdec_o_
- (xpart z if ypart z >= -4 :
+ (xpart z if ypart z >= -4 :
/Ten_to[-ypart z]
- else :
- for i = ypart z upto -5 : /(10) endfor /10000
+ else :
+ for i = ypart z upto -5 : /(10) endfor /10000
fi)
fi
enddef ;
-vardef Formgen_(expr q) =
+vardef Formgen_(expr q) =
clearxy ; (x,y) = q ;
if x = 0 : Formdec_
elseif y >= -6 : Formdec_
@@ -299,17 +305,17 @@ vardef Formgen_(expr q) =
enddef ;
def Fset_item_(expr s) = %%% adapted by HH %%%
- if s <> "" :
+ if s <> "" :
if fmt_metapost :
s infont defaultfont scaled defaultscale,
- else :
- s,
- fi
- fi
+ else :
+ s,
+ fi
+ fi
enddef ;
% For each format letter, the table below tells how to
-% round and typeset a quantity z in exponent form.
+% round and typeset a quantity z in exponent form.
%
% e scientific, p significant figures
% p decimal, p digits right of the point
@@ -318,80 +324,80 @@ enddef ;
string fmt_[] ;
-fmt_[ASCII "e"] = "Formsci_(z Fprec_ p)" ;
+fmt_[ASCII "e"] = "Formsci_(z Fprec_ p)" ;
fmt_[ASCII "f"] = "Formdec_(z Fdigs_ p)" ;
-fmt_[ASCII "g"] = "Formgen_(z Fprec_ p)" ;
-fmt_[ASCII "G"] = "Formgen_(z Fdigs_ p)" ;
+fmt_[ASCII "g"] = "Formgen_(z Fprec_ p)" ;
+fmt_[ASCII "G"] = "Formgen_(z Fdigs_ p)" ;
% The format and Mformat macros take a format string f and
% generate typeset output for a numeric quantity x. String f
% should contain a `%' followed by an optional number and one
% of the format letters defined above. The number should be
-% an integer giving the precision (default 3).
+% an integer giving the precision (default 3).
vardef isfmtseparator primary c = %%% added by HH %%%
- ((c <> fmt_separator) and (c <> "%"))
-enddef ;
+ ((c <> fmt_separator) and (c <> "%"))
+enddef ;
-def initialize_form_numbers =
+def initialize_form_numbers =
initialize_numbers ; % in context: do_initialize_numbers ;
enddef ;
vardef dofmt_@#(expr f, x) = %%% adapted by HH %%%
- initialize_form_numbers ;
- if f = "" :
- if fmt_metapost : nullpicture else : "" fi
+ initialize_form_numbers ;
+ if f = "" :
+ if fmt_metapost : nullpicture else : "" fi
else :
interim warningcheck := 0 ;
save k, l, s, p, z ;
pair z ; z = @#(x) ;
- % the next adaption is okay
+ % the next adaption is okay
% k = 1 + cspan(f, fmt_separator <> ) ;
- % but best is to support both % and fmt_separator
+ % but best is to support both % and fmt_separator
k = 1 + cspan(f, isfmtseparator) ;
- %
+ %
l-k = cspan(substring(k,infinity) of f, isdigit) ;
- p = if l > k :
- scantokens substring(k,l) of f
- else :
- fmt_precision
+ p = if l > k :
+ scantokens substring(k,l) of f
+ else :
+ fmt_precision
fi ;
string s ; s = fmt_[ASCII substring (l,l+1) of f] ;
if unknown s :
- if k <= length f :
- errmessage("No valid format letter found in "&f) ;
+ if k <= length f :
+ errmessage("No valid format letter found in "&f) ;
fi
s = if fmt_metapost : "nullpicture" else : "" fi ;
fi
Fline_up_
(Fset_item_(substring (0,k-1) of f)
- if not fmt_metapost : sFebmath_, fi
+ if not fmt_metapost : sFebmath_, fi
scantokens s,
- if not fmt_metapost : sFeemath_, fi
+ if not fmt_metapost : sFeemath_, fi
Fset_item_(substring (l+1,infinity) of f)
- if fmt_metapost : nullpicture else : "" fi)
+ if fmt_metapost : nullpicture else : "" fi)
fi
- hide (fmt_metapost := true)
+ hide (fmt_metapost := true)
enddef ;
-%%% so far %%%
+%%% so far %%%
-vardef format (expr f, x) =
- fmt_metapost := true ; dofmt_.Feform_(f,x)
+vardef format (expr f, x) =
+ fmt_metapost := true ; dofmt_.Feform_(f,x)
enddef ;
-vardef Mformat(expr f, x) =
- fmt_metapost := true ; dofmt_.Meform (f,x)
+vardef Mformat(expr f, x) =
+ fmt_metapost := true ; dofmt_.Meform (f,x)
enddef ;
-vardef formatstr (expr f, x) =
- fmt_metapost := false ; dofmt_.Feform_(f,x)
+vardef formatstr (expr f, x) =
+ fmt_metapost := false ; dofmt_.Feform_(f,x)
enddef ;
-vardef Mformatstr(expr f, x) =
- fmt_metapost := false ; dofmt_.Meform (f,x)
+vardef Mformatstr(expr f, x) =
+ fmt_metapost := false ; dofmt_.Meform (f,x)
enddef ;
% Restore warningcheck to previous value.
-endgroup ;
+endgroup ;