diff options
author | Hans Hagen <pragma@wxs.nl> | 2013-11-01 15:02:00 +0100 |
---|---|---|
committer | Hans Hagen <pragma@wxs.nl> | 2013-11-01 15:02:00 +0100 |
commit | 642ffccd526fab491d23efce30f40c35a13262cd (patch) | |
tree | 019ee93fbb5a8aca8922d2c2aa30009fb8ab3989 /tex/context/base/meta-tex.lua | |
parent | 9cb5e3dcce51a3c07bd482b7c0575496434017e1 (diff) | |
download | context-642ffccd526fab491d23efce30f40c35a13262cd.tar.gz |
beta 2013.11.01 15:02
Diffstat (limited to 'tex/context/base/meta-tex.lua')
-rw-r--r-- | tex/context/base/meta-tex.lua | 113 |
1 files changed, 90 insertions, 23 deletions
diff --git a/tex/context/base/meta-tex.lua b/tex/context/base/meta-tex.lua index 94815495d..e1398e7ed 100644 --- a/tex/context/base/meta-tex.lua +++ b/tex/context/base/meta-tex.lua @@ -7,8 +7,10 @@ if not modules then modules = { } end modules ['meta-tex'] = { } local format, gsub, find, match = string.format, string.gsub, string.find, string.match +local formatters = string.formatters +local P, S, R, C, Cs, lpegmatch = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cs, lpeg.match -local P, C, Cs, lpegmatch = lpeg.P, lpeg.C, lpeg.Cs, lpeg.match +metapost = metapost or { } -- local left = P("[") -- local right = P("]") @@ -70,31 +72,96 @@ local simplify = true -- todo: proper lpeg -local function strip(n,e) - -- get rid of e(0) - -- get rid of e(+*) - e = gsub(e,"^+","") - -- remove leading zeros - e = gsub(e,"^([+-]*)0+(%d)","%1%2") - if not simplify then - -- take it as it is - elseif n == "1" then - return format("\\mathematics{10^{%s}}",e) - end - return format("\\mathematics{%s\\times10^{%s}}",n,e) +-- local function strip(n,e) +-- -- get rid of e(0) +-- -- get rid of e(+*) +-- e = gsub(e,"^+","") +-- -- remove leading zeros +-- e = gsub(e,"^([+-]*)0+(%d)","%1%2") +-- if not simplify then +-- -- take it as it is +-- elseif n == "1" then +-- return format("\\mathematics{10^{%s}}",e) +-- end +-- return format("\\mathematics{%s\\times10^{%s}}",n,e) +-- end +-- +-- function metapost.format_n(fmt,...) +-- fmt = gsub(fmt,"@","%%") +-- if find(fmt,"%%") then +-- str = format(fmt,...) +-- else -- yes or no +-- str = format("%"..fmt,...) +-- end +-- str = gsub(str,"([%-%+]-[%.%d]+)e([%-%+]-[%.%d]+)",strip) +-- context(str) +-- end +-- +-- function metapost.format_v(fmt,str) +-- metapost.format_n(fmt,metapost.untagvariable(str,false)) +-- end + +-- -- -- + +local number = C((S("+-")^0 * R("09","..")^1)) +local enumber = number * S("eE") * number + +local cleaner = Cs((P("@@")/"@" + P("@")/"%%" + P(1))^0) + +function format_n(fmt,...) + return end -function metapost.format_n(fmt,...) - fmt = gsub(fmt,"@","%%") - if find(fmt,"%%") then - str = format(fmt,...) - else -- yes or no - str = format("%"..fmt,...) +context = context or { exponent = function(...) print(...) end } + +function metapost.format_string(fmt,...) + context(lpegmatch(cleaner,fmt),...) +end + +function metapost.format_number(fmt,num) + local number = tonumber(num) + if number then + local base, exponent = lpegmatch(enumber,formatters[lpegmatch(cleaner,fmt)](number)) + if base and exponent then + context.MPexponent(base,exponent) + else + context(number) + end + else + context(tostring(num)) end - str = gsub(str,"([%-%+]-[%.%d]+)e([%-%+]-[%.%d]+)",strip) - context(str) end -function metapost.format_v(fmt,str) - metapost.format_n(fmt,metapost.untagvariable(str,false)) +function metapost.svformat(fmt,str) + metapost.format_string(fmt,metapost.untagvariable(str,false)) +end + +function metapost.nvformat(fmt,str) + metapost.format_number(fmt,metapost.untagvariable(str,false)) end + +-- local function test(fmt,n) +-- logs.report("mp format test","fmt: %s, n: %s, result: %s, \\exponent{%s}{%s}",fmt,n, +-- formatters[lpegmatch(cleaner,fmt)](n), +-- lpegmatch(enumber,formatters[lpegmatch(cleaner,fmt)](n)) +-- ) +-- end +-- +-- test("@j","1e-8") +-- test("@j",1e-8) +-- test("@j","1e+8") +-- test("@j","1e-10") +-- test("@j",1e-10) +-- test("@j","1e+10") +-- test("@j","1e-12") +-- test("@j","1e+12") +-- test("@j","1e-0") +-- test("@j","1e+0") +-- test("@j","1") +-- test("@j test","1") +-- test("@j","-1") +-- test("@j","1e-102") +-- test("@1.4j","1e+102") +-- test("@j","1.2e+102") +-- test("@j","1.23e+102") +-- test("@j","1.234e+102") |