diff options
Diffstat (limited to 'Master/texmf-dist/tex/context/base/phys-dim.lua')
-rw-r--r-- | Master/texmf-dist/tex/context/base/phys-dim.lua | 92 |
1 files changed, 62 insertions, 30 deletions
diff --git a/Master/texmf-dist/tex/context/base/phys-dim.lua b/Master/texmf-dist/tex/context/base/phys-dim.lua index c47821b1c3e..45a99978dc3 100644 --- a/Master/texmf-dist/tex/context/base/phys-dim.lua +++ b/Master/texmf-dist/tex/context/base/phys-dim.lua @@ -82,8 +82,15 @@ local space = P(" ") local lparent = P("(") local rparent = P(")") +local lbrace = P("{") +local rbrace = P("}") + local digits = digit^1 +local powerdigits = plus * C(digits) / context.digitspowerplus + + minus * C(digits) / context.digitspowerminus + + C(digits) / context.digitspower + local ddigitspace = digitspace / "" / context.digitsspace local ddigit = digits / context.digitsdigit local dsemicomma = semicolon / "" / context.digitsseparatorspace @@ -100,11 +107,8 @@ local dnegative = negative / "" / context.digitsnegative local dhighspace = highspace / "" / context.digitshighspace local dsomesign = plus / "" / context.digitsplus + minus / "" / context.digitsminus -local dpower = power / "" * ( - plus * C(digits) / context.digitspowerplus - + minus * C(digits) / context.digitspowerminus - + C(digits) / context.digitspower - ) +local dpower = power / "" * ( powerdigits + lbrace * powerdigits * rbrace ) + local dpadding = padding / "" / context.digitszeropadding -- todo local dleader = (dpositive + dnegative + dhighspace + dsomesign + dsignspace)^0 @@ -116,27 +120,51 @@ local dnumber = (ddigitspace + ddigit)^1 -- : ; for the moment not used, maybe for invisible fraction . , when no leading number -local c_p = (ddigitspace^1 * dskipcomma)^0 -- ___, - * (ddigitspace^0 * ddigit * dintercomma)^0 -- _00, 000, - * ddigitspace^0 * ddigit^0 -- _00 000 +-- local c_p = (ddigitspace^1 * dskipcomma)^0 -- ___, +-- * (ddigitspace^0 * ddigit * dintercomma)^0 -- _00, 000, +-- * ddigitspace^0 * ddigit^0 -- _00 000 +-- * ( +-- dfinalperiod * ddigit -- .00 +-- + dskipperiod * dpadding^1 -- .== +-- + dsemiperiod * ddigit -- :00 +-- + dsemiperiod * dpadding^1 -- :== +-- )^0 +-- + ddigit -- 00 +-- +-- local p_c = (ddigitspace^1 * dskipperiod)^0 -- ___. +-- * (ddigitspace^0 * ddigit * dinterperiod)^0 -- _00. 000. +-- * ddigitspace^0 * ddigit^0 -- _00 000 +-- * ( +-- dfinalcomma * ddigit -- ,00 +-- + dskipcomma * dpadding^1 -- ,== +-- + dsemicomma * ddigit -- :00 +-- + dsemicomma * dpadding^1 -- :== +-- )^0 +-- + ddigit -- 00 +-- +-- fix by WS/SB (needs further testing) + +local c_p = (ddigitspace^1 * dskipcomma)^0 -- ___, + * (ddigitspace^0 * ddigit * dintercomma)^0 -- _00, 000, + * ddigitspace^0 * ddigit^0 -- _00 000 * ( - dfinalperiod * ddigit -- .00 - + dskipperiod * dpadding^1 -- .== - + dsemiperiod * ddigit -- :00 - + dsemiperiod * dpadding^1 -- :== + dfinalperiod * ddigit * (dintercomma * ddigit)^0 -- .00 + + dskipperiod * dpadding^1 -- .== + + dsemiperiod * ddigit * (dintercomma * ddigit)^0 -- :00 + + dsemiperiod * dpadding^1 -- :== )^0 - + ddigit -- 00 + + ddigit -- 00 -local p_c = (ddigitspace^1 * dskipperiod)^0 -- ___. - * (ddigitspace^0 * ddigit * dinterperiod)^0 -- _00. 000. - * ddigitspace^0 * ddigit^0 -- _00 000 +local p_c = (ddigitspace^1 * dskipperiod)^0 -- ___. + * (ddigitspace^0 * ddigit * dinterperiod)^0 -- _00. 000. + * ddigitspace^0 * ddigit^0 -- _00 000 * ( - dfinalcomma * ddigit -- ,00 - + dskipcomma * dpadding^1 -- ,== - + dsemicomma * ddigit -- :00 - + dsemicomma * dpadding^1 -- :== + dfinalcomma * ddigit * (dinterperiod * ddigit)^0 -- 00 + + dskipcomma * dpadding^1 -- ,== + + dsemicomma * ddigit * (dinterperiod * ddigit)^0 -- :00 + + dsemicomma * dpadding^1 -- :== )^0 - + ddigit -- 00 + + ddigit -- 00 local p_c_dparser = math_one + math_two + dleader * p_c * dtrailer * dfinal local c_p_dparser = math_one + math_two + dleader * c_p * dtrailer * dfinal @@ -409,6 +437,8 @@ local short_units = { -- I'm not sure about casing -- a = "ampere", A = "ampere", + min = "minute", + [utfchar(0x2103)] = "celsius", [utfchar(0x2109)] = "fahrenheit", } @@ -482,7 +512,7 @@ local unitsNspace = context.unitsNspace local labels = languages.data.labels -labels.prefixes = { +labels.prefixes = allocate { yocto = { labels = { en = [[y]] } }, -- 10^{-24} zepto = { labels = { en = [[z]] } }, -- 10^{-21} atto = { labels = { en = [[a]] } }, -- 10^{-18} @@ -515,7 +545,7 @@ labels.prefixes = { root = { labels = { en = [[√]] } }, -- 0x221A } -labels.units = { +labels.units = allocate { meter = { labels = { en = [[m]] } }, gram = { labels = { en = [[g]] } }, -- strictly kg is the base unit second = { labels = { en = [[s]] } }, @@ -597,14 +627,14 @@ labels.units = { micron = { labels = { en = [[\textmu m]] } }, } -labels.operators = { +labels.operators = allocate { times = { labels = { en = [[\unitsTIMES]] } }, solidus = { labels = { en = [[\unitsSOLIDUS]] } }, per = { labels = { en = [[\unitsSOLIDUS]] } }, outof = { labels = { en = [[\unitsOUTOF]] } }, } -labels.suffixes = { +labels.suffixes = allocate { linear = { labels = { en = [[1]] } }, square = { labels = { en = [[2]] } }, cubic = { labels = { en = [[3]] } }, @@ -616,7 +646,7 @@ labels.suffixes = { local function dimpus(p,u,s) if trace_units then - report_units("p: [%s], u: [%s], s: [%s]",p or "?",u or "?",s or "?") + report_units("prefix %a, unit %a, suffix %a",p,u,s) end -- if p ~= "" then if u ~= "" then @@ -653,7 +683,7 @@ end local function dimop(o) if trace_units then - report_units("o: [%s]",o or "?") + report_units("operator %a",o) end if o then unitsO(o) @@ -662,7 +692,7 @@ end local function dimsym(s) if trace_units then - report_units("s: [%s]",s or "?") + report_units("symbol %a",s) end s = symbol_units[s] or s if s then @@ -672,7 +702,7 @@ end local function dimpre(p) if trace_units then - report_units("p: [%s]",p or "?") + report_units("prefix [%a",p) end p = packaged_units[p] or p if p then @@ -787,6 +817,8 @@ local function update_parsers() -- todo: don't remap utf sequences local stop = Cc(nil) / unitsNstop local space = Cc(nil) / unitsNspace + -- todo: avoid \unitsNstart\unitsNstop (weird that it can happen .. now catched at tex end) + local p_c_combinedparser = P { "start", number = start * dleader * (p_c_dparser + number) * stop, rule = V("number")^-1 * unitparser, @@ -849,7 +881,7 @@ local t_shortcuts = { suffixes = setmetatablenewindex(short_suffixes,trigger), } -physics.units.tables = { +physics.units.tables = allocate { units = t_units, shortcuts = t_shortcuts, } |