summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/context/base/phys-dim.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/context/base/phys-dim.lua')
-rw-r--r--Master/texmf-dist/tex/context/base/phys-dim.lua92
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,
}