1if not modules then modules = { } end modules ['meta-tex'] = {
2 version = 1.001,
3 comment = "companion to meta-tex.mkiv",
4 author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
5 copyright = "PRAGMA ADE / ConTeXt Development Team",
6 license = "see context related readme files"
7}
8
9local tostring, tonumber = tostring, tonumber
10local format = string.format
11local formatters = string.formatters
12local P, S, R, C, Cs, lpegmatch = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cs, lpeg.match
13
14metapost = metapost or { }
15local metapost = metapost
16local context = context
17
18local implement = interfaces.implement
19
20do
21
22 local pattern = Cs((P([[\"]]) + P([["]])/"\\quotedbl{}" + P(1))^0)
23
24 function metapost.escaped(str)
25 context(lpegmatch(pattern,str))
26 end
27
28 implement {
29 name = "metapostescaped",
30 actions = metapost.escaped,
31 arguments = "string"
32 }
33
34end
35
36do
37
38 local simplify = true
39 local number = C((S("+-")^0 * R("09","..")^1))
40 local enumber = number * S("eE") * number
41 local cleaner = Cs((P("@@")/"@" + P("@")/"%%" + P(1))^0)
42
43 local function format_string(fmt,...)
44 context(lpegmatch(cleaner,fmt),...)
45 end
46
47 local function format_number(fmt,num)
48 if not num then
49 num = fmt
50 fmt = "%e"
51 end
52 local number = tonumber(num)
53 if number then
54 local base, exponent = lpegmatch(enumber,formatters[lpegmatch(cleaner,fmt)](number))
55 if base and exponent then
56 context.MPexponent(base,exponent)
57 else
58 context(number)
59 end
60 else
61 context(tostring(num))
62 end
63 end
64
65
66
67 metapost.format_string = format_string
68 metapost.format_number = format_number
69
70 function metapost.svformat(fmt,str)
71 format_string(fmt,metapost.untagvariable(str,false))
72 end
73
74 function metapost.nvformat(fmt,str)
75 format_number(fmt,metapost.untagvariable(str,false))
76 end
77
78 local f_exponent = formatters["\\MPexponent{%s}{%s}"]
79
80
81
82 local mpformatters = table.setmetatableindex(function(t,k)
83 local v = formatters[lpegmatch(cleaner,k)]
84 t[k] = v
85 return v
86 end)
87
88 function metapost.texexp(num,bfmt,efmt)
89 local number = tonumber(num)
90 if number then
91 local base, exponent = lpegmatch(enumber,format("%e",number))
92 if base and exponent then
93 if bfmt then
94
95 base = mpformatters[bfmt](base)
96 else
97 base = format("%f",base)
98 end
99 if efmt then
100
101 exponent = mpformatters[efmt](exponent)
102 else
103 exponent = format("%i",exponent)
104 end
105 return f_exponent(base,exponent)
106 elseif bfmt then
107
108 return mpformatters[bfmt](number)
109 else
110 return number
111 end
112 else
113 return num
114 end
115 end
116
117 implement {
118 name = "metapostformatted",
119 actions = metapost.svformat,
120 arguments = "2 strings",
121 }
122
123 implement {
124 name = "metapostgraphformat",
125 actions = metapost.nvformat,
126 arguments = "2 strings",
127 }
128
129 utilities.strings.formatters.add(formatters,"texexp", [[texexp(...)]], { texexp = metapost.texexp })
130
131 local f_textext = formatters[ [[textext("%s")]] ]
132 local f_mthtext = formatters[ [[textext("\mathematics{%s}")]] ]
133 local f_exptext = formatters[ [[textext("\mathematics{%s\times10^{%s}}")]] ]
134
135 local mpprint = mp.print
136
137 function mp.format(fmt,str)
138 fmt = lpegmatch(cleaner,fmt)
139 mpprint(f_textext(formatters[fmt](metapost.untagvariable(str,false))))
140 end
141
142 function mp.formatted(fmt,...)
143 fmt = lpegmatch(cleaner,fmt)
144 mpprint(f_textext(formatters[fmt](...)))
145 end
146
147 function mp.graphformat(fmt,num)
148 fmt = lpegmatch(cleaner,fmt)
149 local number = tonumber(num)
150 if number then
151 local base, exponent = lpegmatch(enumber,number)
152 if base and exponent then
153 mpprint(f_exptext(base,exponent))
154 else
155 mpprint(f_mthtext(num))
156 end
157 else
158 mpprint(f_textext(tostring(num)))
159 end
160 end
161
162end
163 |